SearchDialog.cpp

Go to the documentation of this file.
00001 #include "SearchDialog.h"
00002 #include "icons/editTerm.xpm"
00003 #include "icons/goVocab.xpm"
00004 #include "icons/removeTerm.xpm"
00005 #include "icons/resetQueryForm.xpm"
00006 #include "icons/search.xpm"
00007 
00008 SearchDialog::SearchDialog( QWidget* parent, Controller* controller )
00009     : QDialog( parent, "SearchDialog", true ), controller( controller ) {
00010     init();
00011     updateFonts();
00012 }
00013 
00014 SearchDialog::~SearchDialog() {
00015 }
00016 
00017 void SearchDialog::init() {
00018     queryPanel = new QHBox( this );
00019     queryPanel->setSpacing( 2 );
00020     resetButton = new QPushButton( queryPanel, "ResetButton" );
00021     resetButton->setPixmap( ZPIXMAP( resetQueryForm_xpm ) );
00022     connect( resetButton, SIGNAL( clicked() ), this, SLOT( reset() ) );
00023     queryField = new HistoryField( queryPanel, "QueryField" );
00024     queryField->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
00025     searchButton = new QPushButton( ZPIXMAP( search_xpm ), tr( "Search" ), queryPanel, "SearchButton" );
00026     searchButton->setDefault( true );
00027     connect( searchButton, SIGNAL( clicked() ), queryField->lineEdit(), SIGNAL( returnPressed() ) );
00028     connect( searchButton, SIGNAL( clicked() ), this, SLOT( search() ) );
00029 
00030     int prefHeight = resetButton->sizeHint().height();
00031     queryField->setMaximumHeight( prefHeight );
00032     searchButton->setMaximumHeight( prefHeight ); 
00033 
00034     resultsHeaderPanel = new QHBox( this );
00035     resultsHeaderPanel->setSpacing( 2 );
00036     resultsHeaderLabel = new QLabel( tr( "Results" ), resultsHeaderPanel );
00037     resultsHeaderFiller = new QWidget( resultsHeaderPanel, "ResultsHeaderFiller" );
00038     resultsCounterLabel = new QLabel( resultsHeaderPanel );
00039     resultsCounterLabel->setAlignment( AlignRight );
00040 
00041     resultsListView = new SmartListView( this, "ResultsListView" );
00042     int colFirstLanguage = resultsListView->addColumn( QObject::tr( controller->getPreferences().getFirstLanguage() ) );
00043     int colTestLanguage = resultsListView->addColumn( QObject::tr( controller->getPreferences().getTestLanguage() ) );
00044     resultsListView->setColumnWidthMode( colFirstLanguage, QListView::Manual );
00045     resultsListView->setColumnWidthMode( colTestLanguage, QListView::Manual );
00046     resultsListView->addColumn( tr( "Glossary" ) );
00047     resultsListView->addColumn( tr( "Location" ) );
00048     resultsListView->setAllColumnsWide( true );
00049     resultsListView->setAllColumnsShowFocus( true );
00050     //resultsListView->setStretchColumn( 1 );
00051     resultsListView->setSelectionMode( QListView::Extended );
00052     connect( resultsListView, SIGNAL( selectionChanged() ), this, SLOT( updateUi() ) );
00053 
00054     resultsButtonsPanel = new QHBox( this );
00055     resultsButtonsPanel->setSpacing( 2 );
00056     goResultVocabButton = new QPushButton( ZPIXMAP( goVocab_xpm ), tr( "View Glossary" ), resultsButtonsPanel, "GoResultVocabButton" );
00057     connect( goResultVocabButton, SIGNAL( clicked() ), this, SLOT( goResultVocab() ) );
00058     editResultTermButton = new QPushButton( ZPIXMAP( editTerm_xpm ), tr( "Edit Term" ), resultsButtonsPanel, "EditResultTermButton" );
00059     connect( editResultTermButton, SIGNAL( clicked() ), this, SLOT( editResultTerm() ) );
00060     removeResultTermButton = new QPushButton( ZPIXMAP( removeTerm_xpm ), tr( "Remove Term(s)" ), resultsButtonsPanel, "RemoveTermButton" );
00061     connect( removeResultTermButton, SIGNAL( clicked() ), this, SLOT( removeResultTerms() ) );
00062 
00063     prefHeight = removeResultTermButton->sizeHint().height();
00064     goResultVocabButton->setMaximumHeight( prefHeight );
00065     editResultTermButton->setMaximumHeight( prefHeight );
00066 
00067     mainLayout = new QVBoxLayout( this );
00068     mainLayout->setMargin( 6 );
00069     mainLayout->setSpacing( 2 );
00070     mainLayout->addWidget( queryPanel );
00071     mainLayout->addWidget( resultsHeaderPanel );
00072     mainLayout->addWidget( resultsListView, 1 );
00073     mainLayout->addWidget( resultsButtonsPanel );
00074 
00075     setCaption( tr( "Search..." ) );
00076 
00077     updateUi();
00078 }
00079 
00080 void SearchDialog::show() {
00081     Preferences& prefs = controller->getPreferences();
00082     if( Util::getLanguageCode( resultsListView->columnText( 0 ) ) != prefs.getFirstLanguage() ||
00083         Util::getLanguageCode( resultsListView->columnText( 1 ) ) != prefs.getTestLanguage() ) {
00084         resultsListView->setColumnText( 0, QObject::tr( prefs.getFirstLanguage() ) );
00085         resultsListView->setColumnText( 1, QObject::tr( prefs.getTestLanguage() ) );
00086         reset();
00087     }
00088     QDialog::show();
00089     queryField->setFocus();
00090 }
00091 
00092 void SearchDialog::updateFonts() {
00093     QFont mediumFont( controller->getPreferences().getMediumFont() );
00094     QFont labelsFont( controller->getPreferences().getLabelsFont() );
00095 
00096     queryField->setFont( mediumFont );
00097     searchButton->setFont( labelsFont );
00098     resetButton->setFont( labelsFont );
00099 
00100     resultsHeaderPanel->setFont( labelsFont );
00101     resultsCounterLabel->setFont( labelsFont );
00102 
00103     QFont firstLangFont = controller->getPreferences().getMediumFont( controller->getPreferences().getFirstLanguage() );
00104     QFont testLangFont = controller->getPreferences().getMediumFont( controller->getPreferences().getTestLanguage() );
00105     resultsListView->setFont( mediumFont );
00106     resultsListView->header()->setFont( labelsFont );
00107     for( ResultListItem* item = (ResultListItem*)resultsListView->firstChild(); item; item = (ResultListItem*)item->nextSibling() ) {
00108         item->setFont( 0, firstLangFont );
00109         item->setFont( 1, testLangFont );
00110     }
00111 
00112     goResultVocabButton->setFont( labelsFont );
00113     editResultTermButton->setFont( labelsFont );
00114     removeResultTermButton->setFont( labelsFont );
00115 }
00116 
00117 void SearchDialog::updateUi() {
00118     uint selectedTermCount = getSelectedTermCount();
00119     goResultVocabButton->setEnabled( selectedTermCount == 1 );
00120     editResultTermButton->setEnabled( selectedTermCount == 1 );
00121     removeResultTermButton->setEnabled( selectedTermCount > 0 );
00122 }
00123 
00124 void SearchDialog::retranslateUi() {
00125     searchButton->setText( tr( "Search" ) );
00126     resultsHeaderLabel->setText( tr( "Results" ) );
00127     resultsCounterLabel->setText( tr( "%1 term(s) found" ).arg( controller->getSearchResultsCount() ) );
00128     resultsListView->setColumnText( 0, QObject::tr( controller->getPreferences().getFirstLanguage() ) );
00129     resultsListView->setColumnText( 1, QObject::tr( controller->getPreferences().getTestLanguage() ) );
00130     resultsListView->setColumnText( 2, tr( "Glossary" ) );
00131     resultsListView->setColumnText( 3, tr( "Location" ) );
00132     goResultVocabButton->setText( tr( "View Glossary" ) );
00133     editResultTermButton->setText( tr( "Edit Term" ) );
00134     removeResultTermButton->setText( tr( "Remove Term(s)" ) );
00135     goResultVocabButton->adjustSize();
00136     editResultTermButton->adjustSize();
00137     removeResultTermButton->adjustSize();
00138     setCaption( tr( "Search..." ) );
00139 
00140     updateUi();
00141 }
00142 
00143 void SearchDialog::search() {
00144     const Preferences& prefs = controller->getPreferences();
00145     QValueList<TermKey> results = controller->search( queryField->currentText(), prefs.getFirstLanguage(), prefs.getTestLanguage() );
00146     resultsListView->clear();
00147     for( QValueList<TermKey>::ConstIterator it = results.begin(); it != results.end(); it++ ) {
00148         const TermKey& termKey = *it;
00149         Term* term = controller->getTerm( termKey );
00150         Vocabulary* vocab = controller->getVocabTree()->getVocabulary( termKey.getVocabId() );
00151         if( vocab ) {
00152             ResultListItem* resultItem = new ResultListItem( resultsListView, term, 
00153                 prefs.getFirstLanguage(), prefs.getTestLanguage(), vocab->getTitle(), vocab->getParent()->getHumanReadablePath(),
00154                     prefs.isAltInTermListShown() );
00155             resultItem->setFont( 0, prefs.getMediumFont( prefs.getFirstLanguage() ) );
00156             resultItem->setFont( 1, prefs.getMediumFont( prefs.getTestLanguage() ) );
00157         }
00158     }
00159     resultsListView->verticalScrollBar()->setValue( 0 );
00160     resultsCounterLabel->setText( tr( "%1 term(s) found" ).arg( results.count() ) );
00161     updateUi();
00162 }
00163 
00164 void SearchDialog::reset() {
00165     controller->clearSearch();
00166     resultsListView->clear();
00167     resultsCounterLabel->clear();
00168     updateUi();
00169     queryField->clearEdit();
00170     queryField->setFocus();
00171 }
00172 
00173 void SearchDialog::goResultVocab() {
00174     ResultListItem* currItem = (ResultListItem*)resultsListView->currentItem();
00175     if( currItem ) {
00176         Term* term = currItem->getTerm();
00177         if( term ) {
00178             emit showTermRequested( TermKey( term->getId(), term->getVocabId() ) );
00179             close();
00180         }
00181     }
00182 }
00183 
00184 void SearchDialog::editResultTerm() {
00185     ResultListItem* currItem = (ResultListItem*)resultsListView->currentItem();
00186     if( currItem ) {
00187         Term* term = currItem->getTerm();
00188         if( term ) {
00189             Vocabulary* vocab = controller->getVocabTree()->getVocabulary( term->getVocabId() );
00190             TermDialog dialog( *vocab, controller, this, *term );
00191             dialog.showMaximized();
00192             int result = dialog.exec();
00193             if( result ) { 
00194                 Term newTerm = dialog.getTerm();
00195                 term->addTranslation( newTerm.getTranslation( controller->getPreferences().getFirstLanguage() ) );
00196                 term->addTranslation( newTerm.getTranslation( controller->getPreferences().getTestLanguage() ) );
00197                 BilingualKey commentKey( controller->getPreferences().getFirstLanguage(), controller->getPreferences().getTestLanguage() );
00198                 term->addComment( commentKey, newTerm.getComment( commentKey ) );
00199                 term->setImagePath( newTerm.getImagePath() );
00200                 currItem->updateUi();
00201                 vocab->setModificationDate( QDateTime::currentDateTime() );
00202                 vocab->setDirty( true );
00203             }
00204         }
00205     }
00206 }
00207 
00208 void SearchDialog::removeResultTerms() {
00209     doRemoveTerms();
00210 }
00211 
00212 uint SearchDialog::getSelectedTermCount() const {
00213     uint count = 0;
00214     ResultListItem* termItem = (ResultListItem*)resultsListView->firstChild();
00215     while( termItem ) {
00216         if( resultsListView->isSelected( termItem ) )
00217             count++;
00218         termItem = (ResultListItem*)termItem->nextSibling();
00219     }
00220     return( count );
00221 }
00222 
00223 void SearchDialog::doRemoveTerms( bool allowSelectTrans = true, bool confirmBeforeRemove = true ) {
00224     int selectedItemCount = 0;
00225     // Find all the translation languages of the selected terms.
00226     QStringList translationLanguages;
00227 
00228     for( ResultListItem* termItem = (ResultListItem*)resultsListView->firstChild(); termItem; termItem = (ResultListItem*)termItem->nextSibling() ) {
00229         if( resultsListView->isSelected( termItem ) ) {
00230             selectedItemCount++;
00231             Term* term = termItem->getTerm();
00232             for( Term::TranslationMap::ConstIterator it = term->translationsBegin(); it != term->translationsEnd(); it++ ) {
00233                 const Translation& trans = it.data();
00234                 if( !translationLanguages.contains( trans.getLanguage() ) )
00235                     translationLanguages.append( trans.getLanguage() );
00236             }
00237         }
00238     }
00239 
00240     if( selectedItemCount == 0 )
00241         return;
00242 
00243     if( translationLanguages.count() <= 2 ) {
00244         int response;
00245 
00246         if( confirmBeforeRemove ) {
00247             QMessageBox msgBox( QObject::tr( "Warning" ), tr( "ConfirmRemoveSelectedTerms" ),
00248                 QMessageBox::Warning,
00249                 QMessageBox::Yes,
00250                 QMessageBox::No | QMessageBox::Default | QMessageBox::Escape,
00251                 QMessageBox::NoButton,
00252                 this );
00253             msgBox.setButtonText( QMessageBox::Yes, tr( "Yes" ) );
00254             msgBox.setButtonText( QMessageBox::No, tr( "No" ) );
00255 
00256             response = msgBox.exec();
00257         }
00258         else 
00259             response = QMessageBox::Yes;
00260 
00261         if( response == QMessageBox::Yes ) {
00262             for( ResultListItem* termItem = (ResultListItem*)resultsListView->firstChild(); termItem; ) {
00263                 ResultListItem* nextTermItem = (ResultListItem*)termItem->nextSibling();
00264                 if( resultsListView->isSelected( termItem ) ) {
00265                     Term* term = termItem->getTerm();
00266                     Vocabulary* vocab = controller->getVocabTree()->getVocabulary( term->getVocabId() );
00267                     if( !term->getImagePath().isNull() && term->getImagePath().left( 1 ) != "/" ) {
00268                         const QString& imagePath = controller->getApplicationDirName() + "/" + vocab->getParent()->getPath() +
00269                             "/v-" + QString::number( vocab->getId() ) + "/" + term->getImagePath();
00270                         QFile imageFile( imagePath );
00271                         if( imageFile.exists() ) {
00272                             if( !imageFile.remove() )
00273                                 cerr << "Could not remove image " << imagePath << endl;
00274                         }
00275                     }
00276                     vocab->removeTerm( term->getId() );
00277                     delete( termItem );
00278                     vocab->setModificationDate( QDateTime::currentDateTime() );
00279                     vocab->setDirty( true );
00280                 }
00281                 termItem = nextTermItem;
00282             }
00283 
00284             resultsListView->clearSelection();
00285             updateUi();
00286             emit termsRemoved();
00287         }
00288     }
00289     else {
00290         int response;
00291         QStringList selectedLanguages;
00292         if( allowSelectTrans ) {
00293             TranslationSelectionDialog msgBox( tr( "MultipleTranslationsDetectedForRemoveTermsCaption" ), tr( "MultipleTranslationsDetectedForRemoveTerms" ), 
00294                 translationLanguages, TranslationSelectionDialog::selectionModeTargetLanguage, controller, this );
00295             msgBox.setMaximumHeight( size().height() - 40 );
00296             msgBox.setMaximumWidth( size().width() - 40 );
00297             response = msgBox.exec();
00298             if( response )
00299                 selectedLanguages = msgBox.getSelectedLanguages();
00300         }
00301         else {
00302             selectedLanguages = QStringList();
00303             selectedLanguages.append( controller->getPreferences().getFirstLanguage() );
00304             selectedLanguages.append( controller->getPreferences().getTestLanguage() );
00305         }
00306         if( selectedLanguages.count() == 0 )
00307             return;
00308 
00309         for( ResultListItem* termItem = (ResultListItem*)resultsListView->firstChild(); termItem; ) {
00310             ResultListItem* nextTermItem = (ResultListItem*)termItem->nextSibling();
00311 
00312             if( resultsListView->isSelected( termItem ) ) {
00313                 Term* term = termItem->getTerm();
00314                 Vocabulary* vocab = controller->getVocabTree()->getVocabulary( term->getVocabId() );
00315 
00316                 for( QStringList::ConstIterator it = selectedLanguages.begin(); it != selectedLanguages.end(); it++ ) {
00317                     QString lang = *it;
00318                     term->removeTranslation( lang );
00319                 }
00320                 
00321                 if( term->getTranslationCount() == 0 ) {
00322                     if( !term->getImagePath().isNull() && term->getImagePath().left( 1 ) != "/" ) {
00323                         const QString& imagePath = controller->getApplicationDirName() + "/" + vocab->getParent()->getPath() +
00324                             "/v-" + QString::number( vocab->getId() ) + "/" + term->getImagePath();
00325                         QFile imageFile( imagePath );
00326                         if( imageFile.exists() ) {
00327                             if( !imageFile.remove() )
00328                                 cerr << "Could not remove image " << imagePath << endl;
00329                         }
00330                     }
00331                     vocab->removeTerm( term->getId() );
00332                     delete( termItem );
00333                     vocab->setModificationDate( QDateTime::currentDateTime() );
00334                     vocab->setDirty( true );
00335                 }
00336             }
00337 
00338             termItem = nextTermItem;
00339         }
00340 
00341         resultsListView->clearSelection();
00342         updateUi();
00343     }
00344 }
00345 
00346 void SearchDialog::setDigraphEnabled( bool isDigraphEnabled ) {
00347     queryField->setDigraphEnabled( isDigraphEnabled );
00348 }

Generated on Sun Mar 1 17:30:47 2009 for toMOTko by  doxygen 1.5.6