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
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
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 }