/* -------------------------------------------------------------
matchview . cpp ( part of The KDE Dictionary Client )
Copyright ( C ) 2000 - 2001 Christian Gebauer < gebauer @ kde . org >
This file is distributed under the Artistic License .
See LICENSE for details .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MatchView This widget contains the list of matching definitions
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# include <tqclipboard.h>
# include <tqcombobox.h>
# include <tqpushbutton.h>
# include <tqheader.h>
# include <tqlayout.h>
# include <tqpainter.h>
# include <tqregexp.h>
# include <kpopupmenu.h>
# include <klocale.h>
# include <kapplication.h>
# include <kiconloader.h>
# include <kmessagebox.h>
# include "dict.h"
# include "options.h"
# include "matchview.h"
//********* MatchViewItem ********************************************
MatchViewItem : : MatchViewItem ( TQListView * view , const TQString & text )
: TQListViewItem ( view , text )
{
}
MatchViewItem : : MatchViewItem ( TQListView * view , TQListViewItem * after , const TQString & text )
: TQListViewItem ( view , after , text )
{
}
MatchViewItem : : MatchViewItem ( TQListViewItem * item , const TQString & text , const TQString & commandStr )
: TQListViewItem ( item , text ) , command ( commandStr )
{
}
MatchViewItem : : MatchViewItem ( TQListViewItem * item , TQListViewItem * after , const TQString & text , const TQString & commandStr )
: TQListViewItem ( item , after , text ) , command ( commandStr )
{
}
MatchViewItem : : ~ MatchViewItem ( )
{
}
void MatchViewItem : : setOpen ( bool o )
{
if ( o & & ! childCount ( ) ) {
listView ( ) - > setUpdatesEnabled ( false ) ;
MatchViewItem * sub = 0 ;
TQString command , label ;
TQRegExp exp ( " \" * \" " , true , true ) ;
TQStringList : : iterator it ;
for ( it = subEntrys . begin ( ) ; it ! = subEntrys . end ( ) ; + + it ) {
command = " define " ;
command + = ( * it ) ;
command + = " \r \n " ;
exp . search ( ( * it ) ) ;
label = exp . cap ( ) ;
label = label . mid ( 1 , label . length ( ) - 2 ) ; // remove quotes
if ( sub )
sub = new MatchViewItem ( this , sub , label , command ) ;
else
sub = new MatchViewItem ( this , label , command ) ;
}
subEntrys . clear ( ) ;
listView ( ) - > setUpdatesEnabled ( true ) ;
}
if ( childCount ( ) )
TQListViewItem : : setOpen ( o ) ;
}
void MatchViewItem : : paintCell ( TQPainter * p , const TQColorGroup & cg , int column , int width , int alignment )
{
if ( command . isEmpty ( ) ) {
TQFont font = p - > font ( ) ;
font . setBold ( true ) ;
p - > setFont ( font ) ;
}
TQListViewItem : : paintCell ( p , cg , column , width , alignment ) ;
}
//********* MatchView ******************************************
MatchView : : MatchView ( TQWidget * parent , const char * name )
: TQWidget ( parent , name ) , getOn ( false ) , getAllOn ( false )
{
setCaption ( kapp - > makeStdCaption ( i18n ( " Match List " ) ) ) ;
TQVBoxLayout * boxLayout = new TQVBoxLayout ( this , 1 , 0 ) ;
boxLayout - > addSpacing ( 1 ) ;
w_strat = new TQComboBox ( false , this ) ;
w_strat - > setFixedHeight ( w_strat - > sizeHint ( ) . height ( ) ) ;
connect ( w_strat , TQT_SIGNAL ( activated ( int ) ) , this , TQT_SLOT ( strategySelected ( int ) ) ) ;
boxLayout - > addWidget ( w_strat , 0 ) ;
boxLayout - > addSpacing ( 1 ) ;
w_list = new TQListView ( this ) ;
w_list - > setFocusPolicy ( TQ_StrongFocus ) ;
w_list - > header ( ) - > hide ( ) ;
w_list - > addColumn ( " foo " ) ;
w_list - > setColumnWidthMode ( 0 , TQListView : : Maximum ) ;
w_list - > setColumnWidth ( 0 , 0 ) ;
w_list - > setSelectionMode ( TQListView : : Extended ) ;
w_list - > setTreeStepSize ( 18 ) ;
w_list - > setSorting ( - 1 ) ; // disable sorting
w_list - > setMinimumHeight ( w_strat - > sizeHint ( ) . height ( ) ) ;
connect ( w_list , TQT_SIGNAL ( selectionChanged ( ) ) , TQT_SLOT ( enableGetButton ( ) ) ) ;
connect ( w_list , TQT_SIGNAL ( returnPressed ( TQListViewItem * ) ) , TQT_SLOT ( returnPressed ( TQListViewItem * ) ) ) ;
connect ( w_list , TQT_SIGNAL ( doubleClicked ( TQListViewItem * ) ) , TQT_SLOT ( getOneItem ( TQListViewItem * ) ) ) ;
connect ( w_list , TQT_SIGNAL ( mouseButtonPressed ( int , TQListViewItem * , const TQPoint & , int ) ) ,
TQT_SLOT ( mouseButtonPressed ( int , TQListViewItem * , const TQPoint & , int ) ) ) ;
connect ( w_list , TQT_SIGNAL ( rightButtonPressed ( TQListViewItem * , const TQPoint & , int ) ) , TQT_SLOT ( buildPopupMenu ( TQListViewItem * , const TQPoint & , int ) ) ) ;
boxLayout - > addWidget ( w_list , 1 ) ;
boxLayout - > addSpacing ( 1 ) ;
w_get = new TQPushButton ( i18n ( " &Get Selected " ) , this ) ;
w_get - > setFixedHeight ( w_get - > sizeHint ( ) . height ( ) - 3 ) ;
w_get - > setMinimumWidth ( w_get - > sizeHint ( ) . width ( ) - 20 ) ;
w_get - > setEnabled ( false ) ;
connect ( w_get , TQT_SIGNAL ( clicked ( ) ) , this , TQT_SLOT ( getSelected ( ) ) ) ;
boxLayout - > addWidget ( w_get , 0 ) ;
w_getAll = new TQPushButton ( i18n ( " Get &All " ) , this ) ;
w_getAll - > setFixedHeight ( w_getAll - > sizeHint ( ) . height ( ) - 3 ) ;
w_getAll - > setMinimumWidth ( w_getAll - > sizeHint ( ) . width ( ) - 20 ) ;
w_getAll - > setEnabled ( false ) ;
connect ( w_getAll , TQT_SIGNAL ( clicked ( ) ) , this , TQT_SLOT ( getAll ( ) ) ) ;
boxLayout - > addWidget ( w_getAll , 0 ) ;
connect ( interface , TQT_SIGNAL ( matchReady ( const TQStringList & ) ) , this , TQT_SLOT ( newList ( const TQStringList & ) ) ) ;
rightBtnMenu = new KPopupMenu ( ) ;
}
MatchView : : ~ MatchView ( )
{
}
void MatchView : : updateStrategyCombo ( )
{
w_strat - > clear ( ) ;
w_strat - > insertStringList ( global - > strategies ) ;
w_strat - > setCurrentItem ( global - > currentStrategy ) ;
}
bool MatchView : : selectStrategy ( const TQString & strategy ) const
{
int newCurrent = global - > strategies . findIndex ( strategy ) ;
if ( newCurrent = = - 1 )
return false ;
else {
global - > currentStrategy = newCurrent ;
w_strat - > setCurrentItem ( global - > currentStrategy ) ;
return true ;
}
}
void MatchView : : match ( const TQString & query )
{
interface - > match ( query . utf8 ( ) ) ;
}
void MatchView : : closeEvent ( TQCloseEvent * e )
{
e - > accept ( ) ; // hides the widget
emit ( windowClosed ( ) ) ;
}
void MatchView : : strategySelected ( int num )
{
global - > currentStrategy = num ;
}
void MatchView : : enableGetButton ( )
{
if ( w_getAll - > isEnabled ( ) ) {
w_get - > setEnabled ( true ) ;
getOn = true ;
}
}
void MatchView : : mouseButtonPressed ( int button , TQListViewItem * , const TQPoint & , int )
{
if ( button = = Qt : : MidButton )
emit ( clipboardRequested ( ) ) ;
}
void MatchView : : returnPressed ( TQListViewItem * )
{
getSelected ( ) ;
}
void MatchView : : getOneItem ( TQListViewItem * i )
{
TQStringList defines ;
if ( ( ! i - > childCount ( ) ) & & ( i - > parent ( ) ) )
defines . append ( ( ( MatchViewItem * ) ( i ) ) - > command ) ;
else {
i = i - > firstChild ( ) ;
while ( i ) {
defines . append ( ( ( MatchViewItem * ) ( i ) ) - > command ) ;
i = i - > nextSibling ( ) ;
}
}
doGet ( defines ) ;
}
void MatchView : : getSelected ( )
{
TQStringList defines ;
MatchViewItem * top = static_cast < MatchViewItem * > ( w_list - > firstChild ( ) ) ;
MatchViewItem * sub ;
while ( top ) {
if ( top - > isSelected ( ) & & ( ! top - > subEntrys . isEmpty ( ) ) ) {
TQString command ;
TQStringList : : iterator it ;
for ( it = top - > subEntrys . begin ( ) ; it ! = top - > subEntrys . end ( ) ; + + it ) {
command = " define " ;
command + = ( * it ) ;
command + = " \r \n " ;
defines . append ( command ) ;
}
} else {
sub = static_cast < MatchViewItem * > ( top - > firstChild ( ) ) ;
while ( sub ) {
if ( top - > isSelected ( ) | | sub - > isSelected ( ) )
defines . append ( sub - > command ) ;
sub = static_cast < MatchViewItem * > ( sub - > nextSibling ( ) ) ;
}
}
top = static_cast < MatchViewItem * > ( top - > nextSibling ( ) ) ;
}
doGet ( defines ) ;
}
void MatchView : : getAll ( )
{
TQStringList defines ;
MatchViewItem * top = static_cast < MatchViewItem * > ( w_list - > firstChild ( ) ) ;
MatchViewItem * sub ;
while ( top ) {
if ( ! top - > subEntrys . isEmpty ( ) ) {
TQString command ;
TQStringList : : iterator it ;
for ( it = top - > subEntrys . begin ( ) ; it ! = top - > subEntrys . end ( ) ; + + it ) {
command = " define " ;
command + = ( * it ) ;
command + = " \r \n " ;
defines . append ( command ) ;
}
} else {
sub = static_cast < MatchViewItem * > ( top - > firstChild ( ) ) ;
while ( sub ) {
defines . append ( sub - > command ) ;
sub = static_cast < MatchViewItem * > ( sub - > nextSibling ( ) ) ;
}
}
top = static_cast < MatchViewItem * > ( top - > nextSibling ( ) ) ;
}
doGet ( defines ) ;
}
void MatchView : : doGet ( TQStringList & defines )
{
if ( defines . count ( ) > 0 ) {
if ( defines . count ( ) > global - > maxDefinitions ) {
KMessageBox : : sorry ( global - > topLevel , i18n ( " You have selected %1 definitions, \n but Kdict will fetch only the first %2 definitions. \n You can modify this limit in the Preferences Dialog. " )
. arg ( defines . count ( ) ) . arg ( global - > maxDefinitions ) ) ;
while ( defines . count ( ) > global - > maxDefinitions )
defines . pop_back ( ) ;
}
interface - > getDefinitions ( defines ) ;
}
}
void MatchView : : newList ( const TQStringList & matches )
{
MatchViewItem * top = 0 ;
bool initialOpen = ( matches . count ( ) < 200 ) ;
int numDb = 0 ;
rightBtnMenu - > hide ( ) ;
w_list - > clear ( ) ;
w_list - > setColumnWidth ( 0 , 0 ) ;
w_list - > setUpdatesEnabled ( false ) ;
w_get - > setEnabled ( false ) ;
getOn = false ;
if ( matches . isEmpty ( ) ) {
w_list - > setColumnWidth ( 0 , w_get - > width ( ) - 5 ) ;
w_list - > setRootIsDecorated ( false ) ;
w_getAll - > setEnabled ( false ) ;
getAllOn = false ;
top = new MatchViewItem ( w_list , top , i18n ( " No Hits " ) ) ;
} else {
w_list - > setRootIsDecorated ( true ) ;
w_getAll - > setEnabled ( true ) ;
getAllOn = true ;
TQString lastDb , db , match ;
TQStringList : : const_iterator it ;
for ( it = matches . begin ( ) ; it ! = matches . end ( ) ; + + it ) {
db = ( * it ) . section ( ' ' , 0 , 0 ) ;
if ( db ! = lastDb ) {
numDb + + ;
if ( top ) {
top - > setOpen ( initialOpen ) ;
top = new MatchViewItem ( w_list , top , db ) ;
} else
top = new MatchViewItem ( w_list , db ) ;
top - > setExpandable ( true ) ;
lastDb = db ;
}
if ( top )
top - > subEntrys . append ( * it ) ;
}
if ( ( numDb = = 1 ) | | ( initialOpen ) )
top - > setOpen ( true ) ;
}
w_list - > setUpdatesEnabled ( true ) ;
w_list - > repaint ( ) ;
w_list - > setFocus ( ) ;
}
// construct the right-mouse-button-popup-menu on demand
void MatchView : : buildPopupMenu ( TQListViewItem * i , const TQPoint & _point , int )
{
rightBtnMenu - > clear ( ) ;
if ( ( i ! = 0L ) & & ( i - > isExpandable ( ) | | i - > parent ( ) ) ) {
popupCurrent = ( MatchViewItem * ) ( i ) ;
rightBtnMenu - > insertItem ( i18n ( " &Get " ) , this , TQT_SLOT ( popupGetCurrent ( ) ) ) ;
if ( ! i - > isExpandable ( ) ) { // toplevel item -> only "get"
rightBtnMenu - > insertItem ( i18n ( " &Match " ) , this , TQT_SLOT ( popupMatchCurrent ( ) ) ) ;
rightBtnMenu - > insertItem ( i18n ( " &Define " ) , this , TQT_SLOT ( popupDefineCurrent ( ) ) ) ;
}
rightBtnMenu - > insertSeparator ( ) ;
}
kapp - > clipboard ( ) - > setSelectionMode ( false ) ;
TQString text = kapp - > clipboard ( ) - > text ( ) ;
if ( text . isEmpty ( ) ) {
kapp - > clipboard ( ) - > setSelectionMode ( true ) ;
text = kapp - > clipboard ( ) - > text ( ) ;
}
if ( ! text . isEmpty ( ) ) {
popupClip = kapp - > clipboard ( ) - > text ( ) ;
rightBtnMenu - > insertItem ( i18n ( " Match &Clipboard Content " ) , this , TQT_SLOT ( popupMatchClip ( ) ) ) ;
rightBtnMenu - > insertItem ( SmallIcon ( " define_clip " ) , i18n ( " D&efine Clipboard Content " ) , this , TQT_SLOT ( popupDefineClip ( ) ) ) ;
rightBtnMenu - > insertSeparator ( ) ;
}
int ID = rightBtnMenu - > insertItem ( i18n ( " Get &Selected " ) , this , TQT_SLOT ( getSelected ( ) ) ) ;
rightBtnMenu - > setItemEnabled ( ID , getOn ) ;
ID = rightBtnMenu - > insertItem ( i18n ( " Get &All " ) , this , TQT_SLOT ( getAll ( ) ) ) ;
rightBtnMenu - > setItemEnabled ( ID , getAllOn ) ;
if ( w_list - > childCount ( ) ) {
rightBtnMenu - > insertSeparator ( ) ;
rightBtnMenu - > insertItem ( i18n ( " E&xpand List " ) , this , TQT_SLOT ( expandList ( ) ) ) ;
rightBtnMenu - > insertItem ( i18n ( " C&ollapse List " ) , this , TQT_SLOT ( collapseList ( ) ) ) ;
}
rightBtnMenu - > popup ( _point ) ;
}
void MatchView : : popupGetCurrent ( )
{
getOneItem ( popupCurrent ) ;
}
void MatchView : : popupDefineCurrent ( )
{
emit ( defineRequested ( popupCurrent - > text ( 0 ) ) ) ;
}
void MatchView : : popupMatchCurrent ( )
{
emit ( matchRequested ( popupCurrent - > text ( 0 ) ) ) ;
}
void MatchView : : popupDefineClip ( )
{
emit ( defineRequested ( popupClip ) ) ;
}
void MatchView : : popupMatchClip ( )
{
emit ( matchRequested ( popupClip ) ) ;
}
void MatchView : : expandList ( )
{
TQListViewItem * top = w_list - > firstChild ( ) ;
while ( top ) {
w_list - > setOpen ( top , true ) ;
top = top - > nextSibling ( ) ;
}
}
void MatchView : : collapseList ( )
{
w_list - > setCurrentItem ( w_list - > firstChild ( ) ) ;
TQListViewItem * top = w_list - > firstChild ( ) ;
while ( top ) {
w_list - > setOpen ( top , false ) ;
top = top - > nextSibling ( ) ;
}
}
//--------------------------------
# include "matchview.moc"