VocabularyManagerFrame.cpp

Go to the documentation of this file.
00001 #include "VocabularyManagerFrame.h"
00002 #include "icons/addFolder.xpm"
00003 #include "icons/addVocab.xpm"
00004 #include "icons/removeItem.xpm"
00005 #include "icons/addTerm.xpm"
00006 #include "icons/editTerm.xpm"
00007 #include "icons/removeTerm.xpm"
00008 #include "icons/checkAllTerms.xpm"
00009 #include "icons/inverseCheckedTerms.xpm"
00010 #include "icons/maximize.xpm"
00011 
00012 VocabularyManagerFrame::VocabularyManagerFrame( Controller* controller, QWidget *parent = 0, const char* name = 0 )
00013     : QWidget( parent, name ), searchDialog( NULL ), controller( controller ) {
00014     treePanel = new QVBox( this, "TreePanel" );
00015     treePanel->setSpacing( 2 );
00016 
00017     vocabTreeView = new VocabTreeView( *controller, treePanel, "VocabTreeView" );
00018     vocabTreeView->setTreeStepSize( 24 );
00019     vocabTreeView->addColumn( tr( "Glossaries" ) );
00020     vocabTreeView->setStretchColumn( 0 );
00021     
00022     treeButtonPanel = new QHBox( treePanel, "TreeButtonPanel" );
00023 
00024     addFolderButton = new QPushButton( tr( "AddFolder" ), treeButtonPanel, "AddFolderButton" );
00025     addFolderButton->setPixmap( ZPIXMAP( addFolder_xpm ) );
00026     QToolTip::add( addFolderButton, tr( "AddFolder" ) );
00027     connect( addFolderButton, SIGNAL( clicked() ), this, SLOT( addFolder() ) );
00028 
00029     addVocabButton = new QPushButton( tr( "AddGlossary" ), treeButtonPanel, "AddVocabButton" );
00030     addVocabButton->setPixmap( ZPIXMAP( addVocab_xpm ) );
00031     QToolTip::add( addVocabButton, tr( "AddGlossary" ) );
00032     connect( addVocabButton, SIGNAL( clicked() ), this, SLOT( addVocab() ) );
00033 
00034     removeItemButton = new QPushButton( tr( "RemoveItem" ), treeButtonPanel, "RemoveItemButton" );
00035     removeItemButton->setPixmap( ZPIXMAP( removeItem_xpm ) ); 
00036     QToolTip::add( removeItemButton, tr( "RemoveItem" ) );
00037     connect( removeItemButton, SIGNAL( clicked() ), this, SLOT( removeItem() ) );
00038    
00039     detailsPanel = new QWidgetStack( this, "DetailsPanel" );
00040 
00041     folderDetailsPanel = new QVBox( detailsPanel, "FolderDetailsPanel" );
00042     folderDetailsPanel->setSpacing( 2 );
00043     folderDetailsFolderHeaderPanel = new QHBox( folderDetailsPanel, "FolderDetailsFolderHeaderPanel" );
00044     folderDetailsFolderHeaderPanel->setSpacing( 10 );
00045     folderDetailsTitle = new QLabel( tr( "Folder" ), folderDetailsFolderHeaderPanel, "FolderDetailsTitle" );
00046     folderDetailsFolderTitlePanel = new QHBox( folderDetailsFolderHeaderPanel, "FolderDetailsFolderTitlePanel" );
00047     folderDetailsFolderTitlePanel->setSpacing( 2 );
00048     folderDetailsFolderTitleLabel = new QLabel( tr( "Title" ), folderDetailsFolderTitlePanel, "FolderDetailsFolderTitleLabel" );
00049     folderDetailsFolderTitleLineEdit = new DigraphLineEdit( folderDetailsFolderTitlePanel, "FolderDetailsFolderTitleLineEdit" );
00050 
00051     folderDetailsFolderMaximizeDetailsButton = new QPushButton( tr( "MaximizeDetails" ), folderDetailsFolderTitlePanel, "FolderDetailsFolderMaximizeDetailsButton" );
00052     folderDetailsFolderMaximizeDetailsButton->setPixmap( ZPIXMAP( maximize_xpm ) );
00053     folderDetailsFolderMaximizeDetailsButton->setToggleButton( true );
00054     folderDetailsFolderMaximizeDetailsButton->setMaximumHeight( 
00055         folderDetailsFolderTitleLineEdit->sizeHint().height() > 24 ? folderDetailsFolderTitleLineEdit->sizeHint().height() : 24 );
00056     folderDetailsFolderMaximizeDetailsButton->setMaximumWidth( folderDetailsFolderMaximizeDetailsButton->maximumHeight() );
00057     QToolTip::add( folderDetailsFolderMaximizeDetailsButton, tr( "MaximizeDetails" ) );
00058     connect( folderDetailsFolderMaximizeDetailsButton, SIGNAL( toggled( bool ) ), this, SLOT( toggleMaximizeDetails( bool ) ) );
00059 
00060     folderDetailsPropsPanel = new PropertiesPanel( controller->getPreferences(), folderDetailsPanel );
00061 
00062     vocabDetailsPanel = new QVBox( detailsPanel, "VocabDetailsPanel" );
00063     vocabDetailsPanel->setSpacing( 2 );
00064     vocabDetailsVocabHeaderPanel = new QHBox( vocabDetailsPanel, "VocabDetailsVocabHeaderPanel" );
00065     vocabDetailsVocabHeaderPanel->setSpacing( 10 );
00066     vocabDetailsTitle = new QLabel( tr( "Glossary" ), vocabDetailsVocabHeaderPanel, "VocabDetailsTitle" );
00067     vocabDetailsVocabTitlePanel = new QHBox( vocabDetailsVocabHeaderPanel, "VocabDetailsVocabTitlePanel" );
00068     vocabDetailsVocabTitlePanel->setSpacing( 2 );
00069     vocabDetailsVocabTitleLabel = new QLabel( tr( "Title" ), vocabDetailsVocabTitlePanel, "VocabDetailsVocabTitleLabel" );
00070     vocabDetailsVocabTitleLineEdit = new DigraphLineEdit( vocabDetailsVocabTitlePanel, "VocabDetailsVocabTitleLineEdit" );
00071 
00072     vocabDetailsVocabMaximizeDetailsButton = new QPushButton( tr( "MaximizeDetails" ), vocabDetailsVocabTitlePanel, "FolderDetailsFolderMaximizeDetailsButton" );
00073     vocabDetailsVocabMaximizeDetailsButton->setPixmap( ZPIXMAP( maximize_xpm ) );
00074     vocabDetailsVocabMaximizeDetailsButton->setToggleButton( true );
00075     vocabDetailsVocabMaximizeDetailsButton->setMaximumHeight( 
00076         folderDetailsFolderTitleLineEdit->sizeHint().height() > 24 ? folderDetailsFolderTitleLineEdit->sizeHint().height() : 24 );
00077     vocabDetailsVocabMaximizeDetailsButton->setMaximumWidth( folderDetailsFolderMaximizeDetailsButton->maximumHeight() );
00078     QToolTip::add( vocabDetailsVocabMaximizeDetailsButton, tr( "MaximizeDetails" ) );
00079     connect( vocabDetailsVocabMaximizeDetailsButton, SIGNAL( toggled( bool ) ), this, SLOT( toggleMaximizeDetails( bool ) ) );
00080 
00081     vocabDetailsTabWidget = new QTabWidget( vocabDetailsPanel, "VocabDetailsTabWidget" );
00082 
00083     vocabDetailsPropsPanel = new PropertiesPanel( controller->getPreferences(), vocabDetailsTabWidget );
00084     connect( vocabDetailsTabWidget, SIGNAL( currentChanged( QWidget* ) ), vocabDetailsPropsPanel, SLOT( updateCounters() ) ); 
00085 
00086     vocabDetailsTermsPanel = new QVBox( vocabDetailsTabWidget, "VocabDetailsTermsPanel" );
00087     termList = new SmartListView( vocabDetailsTermsPanel, "TermList" );
00088     termList->setAllColumnsShowFocus( true );
00089     termList->setSelectionMode( QListView::Extended );
00090     int colFirstLanguage = termList->addColumn( QObject::tr( controller->getPreferences().getFirstLanguage() )/*, 188*/ );
00091     int colTestLanguage = termList->addColumn( QObject::tr( controller->getPreferences().getTestLanguage() )/*, 188*/ );
00092     termList->setColumnWidthMode( colFirstLanguage, QListView::Manual );
00093     termList->setColumnWidthMode( colTestLanguage, QListView::Manual );
00094     termList->setAllColumnsWide( true );
00095     connect( termList, SIGNAL( selectionChanged() ), this, SLOT( updateTermList() ) ); 
00096 
00097     termControlPanel = new QWidget( vocabDetailsTermsPanel, "TermControlPanel" );
00098     termControlPanelLayout = new QHBoxLayout( termControlPanel );
00099     termControlPanelLayout->setSpacing( 2 );
00100 
00101     checkControlPanel = new QHBox( termControlPanel, "CheckControlPanel" );
00102 
00103     checkAllTermsButton = new QPushButton( tr( "CheckAllTerms" ), checkControlPanel, "CheckAllTermsButton" );
00104     checkAllTermsButton->setPixmap( ZPIXMAP( checkAllTerms_xpm ) ); 
00105     QToolTip::add( checkAllTermsButton, tr( "CheckAllTerms" ) );
00106     connect( checkAllTermsButton, SIGNAL( clicked() ), this, SLOT( checkAllTerms() ) );
00107 
00108     inverseCheckedTermsButton = new QPushButton( tr( "InverseCheckedTerms" ), checkControlPanel, "InverseCheckedTermsButton" );
00109     inverseCheckedTermsButton->setPixmap( ZPIXMAP( inverseCheckedTerms_xpm ) ); 
00110     QToolTip::add( inverseCheckedTermsButton, tr( "InverseCheckedTerms" ) );
00111     connect( inverseCheckedTermsButton, SIGNAL( clicked() ), this, SLOT( inverseCheckedTerms() ) );
00112 
00113     addRemoveTermPanel = new QHBox( termControlPanel, "AddRemoveTermPanel" );
00114 
00115     addTermButton = new QPushButton( tr( "AddTerm" ), addRemoveTermPanel, "AddTermButton" );
00116     addTermButton->setPixmap( ZPIXMAP( addTerm_xpm ) ); 
00117     QToolTip::add( addTermButton, tr( "AddTerm" ) );
00118     connect( addTermButton, SIGNAL( clicked() ), this, SLOT( addTerm() ) );
00119 
00120     editTermButton = new QPushButton( tr( "EditTerm" ), addRemoveTermPanel, "EditTermButton" );
00121     editTermButton->setPixmap( ZPIXMAP( editTerm_xpm ) ); 
00122     QToolTip::add( editTermButton, tr( "EditTerm" ) );
00123     connect( editTermButton, SIGNAL( clicked() ), this, SLOT( editTerm() ) );
00124     
00125     removeTermButton = new QPushButton( tr( "RemoveTerm" ), addRemoveTermPanel, "RemoveTermButton" );
00126     removeTermButton->setPixmap( ZPIXMAP( removeTerm_xpm ) );
00127     QToolTip::add( removeTermButton, tr( "RemoveTerm" ) );
00128     connect( removeTermButton, SIGNAL( clicked() ), this, SLOT( removeTerms() ) );
00129    
00130     termControlPanelLayout->addWidget( checkControlPanel, 0 );
00131     termControlPanelLayout->addWidget( addRemoveTermPanel, 1 );
00132     vocabDetailsTabWidget->addTab( vocabDetailsPropsPanel, tr( "Properties" ) );
00133     vocabDetailsTabWidget->addTab( vocabDetailsTermsPanel, tr( "Words" ) );
00134 
00135     detailsPanel->addWidget( folderDetailsPanel, panelFolderIndex );
00136     detailsPanel->addWidget( vocabDetailsPanel, panelVocabIndex );
00137 
00138     loadData();
00139     updateTree();
00140     vocabTreeView->setSelected( vocabTreeRoot, true );
00141 
00142     detailsPanel->raiseWidget( panelFolderIndex );
00143 
00144     // We add the tree listener at the end to ignore events generated when creating
00145     // the text widgets.
00146     connect( vocabTreeView, SIGNAL( selectionChanged( QListViewItem* ) ), this, SLOT( updateUi() ) ); 
00147     updateFonts();
00148     updateUi();
00149 }
00150 
00151 VocabularyManagerFrame::~VocabularyManagerFrame() {
00152 }
00153 
00154 void VocabularyManagerFrame::updateShownItems() {
00155     keepSelection();
00156     updateTree();
00157     restoreTreeSelection();
00158     updateUi();
00159     restoreVocabSelection();
00160 }
00161 
00162 void VocabularyManagerFrame::updateTree() {
00163     if( vocabTreeView ) {
00164         vocabTreeView->setUpdatesEnabled( false );
00165         vocabTreeView->clear();
00166     }
00167     vocabTreeRoot = buildTreeRec( vocabTreeView, NULL, controller->getVocabTree() );
00168     //vocabTreeView->setSelected( vocabTreeRoot, true );
00169     //if( currentFolderId != -1 || currentVocabId != -1 )
00170     //    restoreSelection( currentFolderId, currentVocabId, currentTermId, selectedTermIdList );
00171     //else
00172     //    vocabTreeView->setSelected( vocabTreeRoot, true );
00173     if( vocabTreeView )
00174         vocabTreeView->setUpdatesEnabled( true );
00175 }
00176 
00177 void VocabularyManagerFrame::loadData() {
00178     QCopEnvelope busyEnv( "QPE/System", "busy()" ); 
00179     controller->loadData(); // If this returns false, handle the error.
00180     QCopEnvelope freeEnv( "QPE/System", "notBusy()" ); 
00181 }
00182 
00183 bool VocabularyManagerFrame::saveData() {
00184     QCopEnvelope busyEnv( "QPE/System", "busy()" ); 
00185     bool isOk = controller->saveData();
00186     QCopEnvelope freeEnv( "QPE/System", "notBusy()" ); 
00187     return( isOk );
00188 }
00189 
00190 bool VocabularyManagerFrame::isExportAllowed() const {
00191     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00192     if( selectedItem->isFolder() ) {
00193         FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00194         return( !folderItem->getFolder()->isEmpty() );
00195     }
00196     else {
00197         VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00198         return( !vocabItem->getVocabulary()->isEmpty() );
00199     }
00200 }
00201 
00202 bool VocabularyManagerFrame::isImportAllowed() const {
00203     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00204     return( selectedItem && selectedItem->isFolder() );
00205 }
00206 
00207 void VocabularyManagerFrame::cut() {
00208     QWidget* widget = qApp->focusWidget();
00209     if( widget ) {
00210         if( strcmp( widget->name(), "VocabTreeView" ) == 0 ) {
00211             TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00212             if( selectedItem ) {
00213                 if( selectedItem->isFolder() ) {
00214                     FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00215                     Folder* folder = folderItem->getFolder();
00216                     controller->copy( folder );
00217                     doRemoveItem( false );
00218                 }
00219                 else {
00220                     VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00221                     Vocabulary* vocab = vocabItem->getVocabulary();
00222                     controller->copy( vocab );
00223                     doRemoveItem( false );
00224                 }
00225             }
00226         }
00227         else if( strcmp( widget->name(), "TermList" ) == 0 ) {
00228             copyTerms();
00229             doRemoveTerms( false, false );
00230         }
00231     }
00232 }
00233 
00234 void VocabularyManagerFrame::copy() {
00235     QWidget* widget = qApp->focusWidget();
00236     if( widget ) {
00237         if( strcmp( widget->name(), "VocabTreeView" ) == 0 ) {
00238             TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00239             if( selectedItem ) {
00240                 if( selectedItem->isFolder() ) {
00241                     FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00242                     Folder* folder = folderItem->getFolder();
00243                     controller->copy( folder );
00244                 }
00245                 else {
00246                     VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00247                     Vocabulary* vocab = vocabItem->getVocabulary();
00248                     controller->copy( vocab );
00249                 }
00250             }
00251         }
00252         else if( strcmp( widget->name(), "TermList" ) == 0 )
00253             copyTerms();
00254     }
00255 }
00256 
00257 void VocabularyManagerFrame::paste() {
00258     QWidget* widget = qApp->focusWidget();
00259     if( widget ) {
00260         if( strcmp( widget->name(), "VocabTreeView" ) == 0 ) {
00261             TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00262             if( selectedItem ) {
00263                 QString dataType = controller->getClipboardDataType();
00264                 if( selectedItem->isFolder() ) {
00265                     if( dataType == QString( "vocabulary" ) )
00266                         pasteVocabulary();
00267                     else if( dataType == QString( "folder" ) )
00268                         pasteFolder();
00269                 }
00270                 else {
00271                     if( dataType == QString( "terms" ) )
00272                         pasteTerms();
00273                 }
00274             }
00275         }
00276         else if( strcmp( widget->name(), "TermList" ) == 0 ) {
00277             QString dataType = controller->getClipboardDataType();
00278             if( dataType == QString( "terms" ) )
00279                 pasteTerms();
00280         }
00281     }
00282 }
00283 
00284 void VocabularyManagerFrame::importData() {
00285     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00286     if( selectedItem && selectedItem->isFolder() ) {
00287         FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00288         Folder* folder = folderItem->getFolder(); 
00289         QDir dir( QPEApplication::documentDir() );
00290         ZFileDialog dialog( tr( "Import..." ), dir.path(), ZFileDialog::ExistingFile, this );
00291         dialog.setFilters( QStringList::split( QString( "," ), QString( ".zip" ) ) );
00292 
00293         int result = dialog.exec();
00294         if( result && !dialog.selectedFile().isEmpty() ) {
00295             QString fileExtension = dialog.selectedFile().right( 4 );
00296             if( fileExtension == QString( ".zip" ) ) {
00297                 QCopEnvelope busyEnvLanguages( "QPE/System", "busy()" ); 
00298                 QStringList translationLanguages = controller->getTranslationLanguagesFromFile( dialog.selectedFile() );
00299                 QCopEnvelope freeEnvLanguages( "QPE/System", "notBusy()" ); 
00300 
00301                 QStringList languagesToImport( translationLanguages );
00302                 if( translationLanguages.count() > 2 ) {
00303                     TranslationSelectionDialog msgBox( tr( "Import..." ), tr( "MultipleTranslationsDetectedForImport" ), 
00304                         translationLanguages, TranslationSelectionDialog::selectionModeStudyLanguages, controller, this );
00305                     msgBox.setMaximumHeight( size().height() - 40 );
00306                     msgBox.setMaximumWidth( size().width() - 40 );
00307                     int response = msgBox.exec();
00308                     if( response )
00309                         languagesToImport = msgBox.getSelectedLanguages();
00310                     else  {
00311                         return; // Cancel import.
00312                     }
00313                 }
00314 
00315                 for( QStringList::ConstIterator it = languagesToImport.begin(); it != languagesToImport.end(); it++ ) {
00316                     const QString& lang = *it;
00317                     if( !controller->getPreferences().isStudyLanguage( lang ) )
00318                         controller->getPreferences().addStudyLanguage( lang );
00319                 }
00320 
00321                 QCopEnvelope busyEnvImport( "QPE/System", "busy()" ); 
00322                 Base* newItem = controller->importData( folder, dialog.selectedFile(), languagesToImport );
00323                 if( newItem ) {
00324                     TreeItem* newTreeItem = NULL;
00325                     if( strcmp( newItem->className(), "Folder" ) == 0 ) {
00326                         Folder* newFolder = (Folder*)newItem;
00327                         newFolder->setModificationDate( QDateTime::currentDateTime() );
00328                         newFolder->setDirty( true );
00329                         folder->add( newFolder );
00330                         newTreeItem = buildTreeRec( vocabTreeView, folderItem, newFolder, true ); 
00331                     }
00332                     else if( strcmp( newItem->className(), "Vocabulary" ) == 0 ) {
00333                         Vocabulary* newVocab = (Vocabulary*)newItem;
00334                         newVocab->setModificationDate( QDateTime::currentDateTime() );
00335                         newVocab->setDirty( true );
00336                         folder->add( newVocab );
00337                         newTreeItem = buildTreeRec( folderItem, newVocab ); 
00338                     }
00339                     if( newTreeItem ) {
00340                         vocabTreeView->ensureItemVisible( newTreeItem );
00341                         vocabTreeView->setSelected( newTreeItem, true );
00342                         newTreeItem->setOpen( true );
00343                     }
00344                     else {
00345                         // This happens when the imported data is from a different language pair
00346                         // than the current one.  We reselect the selectedItem in this case.
00347                         vocabTreeView->setSelected( selectedItem, true );
00348                     }
00349                     QString msg = tr( "ImportSuccessful" );
00350                     if( !newTreeItem )
00351                         msg += tr( "InvisibleImport" );
00352                     QMessageBox::information( this, QObject::tr( "OperationSuccessful" ), msg );
00353                 }
00354                 else
00355                     QMessageBox::warning( this, QObject::tr( "OperationFailed" ), tr( "ItemImportFailed" ) );
00356                 QCopEnvelope freeEnvImport( "QPE/System", "notBusy()" ); 
00357             }
00358             else
00359                 QMessageBox::warning( this, QObject::tr( "OperationFailed" ), tr( "ItemImportFailedZipFileExpected" ) );
00360         }
00361     }
00362 }
00363 
00364 void VocabularyManagerFrame::exportData() {
00365     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00366     if( selectedItem ) {
00367         if( selectedItem->isFolder() ) {
00368             FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00369             exportFolder( folderItem->getFolder() );
00370         }
00371         else {
00372             VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00373             exportVocabulary( vocabItem->getVocabulary() );
00374         }
00375     }
00376 }
00377 
00378 void VocabularyManagerFrame::exportVocabulary( Vocabulary* vocab ) {
00379     QStringList translationLanguages = vocab->getTranslationLanguages();
00380     QStringList languagesToExport = translationLanguages;
00381     if( translationLanguages.count() > 2 ) {
00382         TranslationSelectionDialog msgBox( tr( "Export..." ), tr( "MultipleTranslationsDetectedForExport" ), 
00383             translationLanguages, TranslationSelectionDialog::selectionModeAllLanguages, controller, this );
00384         msgBox.setMaximumHeight( size().height() - 40 );
00385         msgBox.setMaximumWidth( size().width() - 40 );
00386         int response = msgBox.exec();
00387         if( response )
00388             languagesToExport = msgBox.getSelectedLanguages();
00389         else 
00390             return; // Cancel export.
00391     }
00392 
00393     QDir dir( QPEApplication::documentDir() );
00394     ZFileDialog dialog( tr( "Export..." ), dir.path(), ZFileDialog::AnyFile, this );
00395     dialog.setSelection( vocab->getTitle() + QString( ".zip" ) ); 
00396     int result = dialog.exec();
00397     if( result ) {
00398         QCopEnvelope busyEnv( "QPE/System", "busy()" ); 
00399         bool isOk = controller->exportData( vocab, dialog.selectedFile(), &languagesToExport );
00400         QCopEnvelope freeEnv( "QPE/System", "notBusy()" ); 
00401         if( isOk )
00402             QMessageBox::information( this, QObject::tr( "OperationSuccessful" ), tr( "GlossaryExportSuccessful" ) );
00403         else
00404             QMessageBox::warning( this, QObject::tr( "OperationFailed" ), tr( "GlossaryExportFailed" ) );
00405     }
00406 }
00407 
00408 void VocabularyManagerFrame::exportFolder( Folder* folder ) {
00409     QStringList translationLanguages = folder->getTranslationLanguages();
00410     QStringList languagesToExport = translationLanguages;
00411     if( translationLanguages.count() > 2 ) {
00412         TranslationSelectionDialog msgBox( tr( "Export..." ), tr( "MultipleTranslationsDetectedForFolderExport" ), 
00413             translationLanguages, TranslationSelectionDialog::selectionModeAllLanguages, controller, this );
00414         msgBox.setMaximumHeight( size().height() - 40 );
00415         msgBox.setMaximumWidth( size().width() - 40 );
00416         int response = msgBox.exec();
00417         if( response )
00418             languagesToExport = msgBox.getSelectedLanguages();
00419         else 
00420             return; // Cancel export.
00421     }
00422 
00423     QDir dir( QPEApplication::documentDir() );
00424     ZFileDialog dialog( tr( "Export..." ), dir.path(), ZFileDialog::AnyFile, this );
00425     dialog.setSelection( folder->getTitle() + QString( ".zip" ) ); 
00426     int result = dialog.exec();
00427     if( result ) {
00428         QCopEnvelope busyEnv( "QPE/System", "busy()" ); 
00429         bool isOk = controller->exportData( folder, dialog.selectedFile(), &languagesToExport );
00430         QCopEnvelope freeEnv( "QPE/System", "notBusy()" ); 
00431         if( isOk )
00432             QMessageBox::information( this, QObject::tr( "OperationSuccessful" ), tr( "FolderExportSuccessful" ) );
00433         else
00434             QMessageBox::warning( this, QObject::tr( "OperationFailed" ), tr( "FolderExportFailed" ) );
00435     }
00436 }
00437 
00438 void VocabularyManagerFrame::updateFonts() {
00439     QFont mediumFont( controller->getPreferences().getMediumFont() );
00440     QFont labelsFont( controller->getPreferences().getLabelsFont() );
00441 
00442     vocabTreeView->setFont( mediumFont );
00443     vocabTreeView->header()->setFont( labelsFont );
00444     folderDetailsTitle->setFont( labelsFont ); 
00445     folderDetailsFolderTitleLabel->setFont( labelsFont );
00446     folderDetailsFolderTitleLineEdit->setFont( mediumFont );
00447     folderDetailsPropsPanel->updateFonts();
00448     folderDetailsFolderTitleLineEdit->setFont( mediumFont );
00449     vocabDetailsTitle->setFont( labelsFont );
00450     vocabDetailsVocabTitleLabel->setFont( labelsFont );
00451     vocabDetailsVocabTitleLineEdit->setFont( mediumFont );
00452     vocabDetailsPropsPanel->updateFonts();
00453     termList->setFont( mediumFont );
00454     termList->header()->setFont( labelsFont );
00455     for( TermListItem* item = (TermListItem*)termList->firstChild(); item; item = (TermListItem*)item->nextSibling() ) {
00456         item->setFont( 0, controller->getPreferences().getMediumFont( controller->getPreferences().getFirstLanguage() ) );
00457         item->setFont( 1, controller->getPreferences().getMediumFont( controller->getPreferences().getTestLanguage() ) );
00458     }
00459 }
00460 
00461 bool VocabularyManagerFrame::isDigraphEnabled() const {
00462     return( folderDetailsFolderTitleLineEdit->isDigraphEnabled() );
00463 }
00464 
00465 void VocabularyManagerFrame::keepSelection() {
00466     currentFolderId = -1; 
00467     currentVocabId = -1; 
00468     currentTermId = -1;
00469     selectedTermIdList.clear();
00470 
00471     TreeItem* currentItem = (TreeItem*)vocabTreeView->currentItem();
00472     if( currentItem ) {
00473         if( currentItem->isFolder() ) {
00474             FolderTreeItem* folderItem = (FolderTreeItem*)currentItem;
00475             currentFolderId = folderItem->getFolder()->getId();
00476         }
00477         else {
00478             VocabTreeItem* vocabItem = (VocabTreeItem*)currentItem;
00479             currentVocabId = vocabItem->getVocabulary()->getId();
00480             for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00481                 if( termItem->isSelected() ) {
00482                     if( currentTermId == -1 )
00483                         currentTermId = termItem->getTerm()->getId();
00484                     selectedTermIdList.append( termItem->getTerm()->getId() );
00485                 }
00486             }
00487         }
00488     }
00489 }
00490 
00491 void VocabularyManagerFrame::restoreTreeSelection() {
00492     bool isTreeItemFound = false;
00493     for( TreeItem* item = (TreeItem*)vocabTreeView->firstChild(); item; item = (TreeItem*)item->itemBelow() ) {
00494         if( item->isFolder() ) {
00495             FolderTreeItem* folderItem = (FolderTreeItem*)item;
00496             if( currentFolderId == folderItem->getFolder()->getId() ) {
00497                 isTreeItemFound = true;
00498                 vocabTreeView->ensureItemVisible( item );
00499                 vocabTreeView->setSelected( item, true );
00500                 break;
00501             }
00502         }
00503         else {
00504             VocabTreeItem* vocabItem = (VocabTreeItem*)item;
00505             if( currentVocabId == vocabItem->getVocabulary()->getId() ) {
00506                 isTreeItemFound = true;
00507                 vocabTreeView->ensureItemVisible( item );
00508                 vocabTreeView->setSelected( item, true );
00509                 break;
00510             }
00511         }
00512     }
00513     if( !isTreeItemFound ) {
00514         vocabTreeView->setSelected( vocabTreeRoot, true );
00515         vocabTreeView->ensureItemVisible( vocabTreeRoot );
00516     }
00517 }
00518 
00519 void VocabularyManagerFrame::restoreVocabSelection() {
00520     if( currentTermId != -1 ) {
00521         termList->clearSelection();
00522         for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00523             int termItemId = termItem->getTerm()->getId();
00524             if( selectedTermIdList.contains( termItemId ) )
00525                 termList->setSelected( termItem, true );
00526             if( currentTermId == termItemId ) {
00527                 termList->ensureItemVisible( termItem );
00528                 termList->setCurrentItem( termItem );
00529                 updateTermList();
00530                 break;
00531             }
00532         }
00533     }
00534 }
00535 
00536 void VocabularyManagerFrame::setDigraphEnabled( bool isEnabled ) {
00537     folderDetailsFolderTitleLineEdit->setDigraphEnabled( isEnabled );
00538     vocabDetailsVocabTitleLineEdit->setDigraphEnabled( isEnabled );
00539     folderDetailsPropsPanel->setDigraphEnabled( isEnabled );
00540     vocabDetailsPropsPanel->setDigraphEnabled( isEnabled );
00541     if( searchDialog )
00542         searchDialog->setDigraphEnabled( isEnabled );
00543 }
00544 
00545 void VocabularyManagerFrame::retranslateUi() {
00546     vocabTreeView->setColumnText( 0, tr( "Glossaries" ) );
00547     folderDetailsTitle->setText( tr( "Folder" ) );
00548     folderDetailsFolderTitleLabel->setText( tr( "Title" ) );
00549     vocabDetailsTitle->setText( tr( "Glossary" ) );
00550     vocabDetailsVocabTitleLabel->setText( tr( "Title" ) );
00551     termList->setColumnText( 0, QObject::tr( controller->getPreferences().getFirstLanguage() ) );
00552     termList->setColumnText( 1, QObject::tr( controller->getPreferences().getTestLanguage() ) );
00553     folderDetailsPropsPanel->retranslateUi();
00554     vocabDetailsPropsPanel->retranslateUi();
00555     vocabDetailsTabWidget->changeTab( vocabDetailsPropsPanel, tr( "Properties" ) );
00556     vocabDetailsTabWidget->changeTab( vocabDetailsTermsPanel, tr( "Words" ) );
00557     if( searchDialog )
00558         searchDialog->retranslateUi();
00559     updateUi();
00560 }
00561 
00562 bool VocabularyManagerFrame::areDetailsMaximized() const {
00563     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00564     if( selectedItem ) {
00565         return( selectedItem->isFolder() ? 
00566             folderDetailsFolderMaximizeDetailsButton->isOn() : 
00567                 vocabDetailsVocabMaximizeDetailsButton->isOn() );
00568     }
00569     return( false );
00570 }
00571 
00572 
00573 void VocabularyManagerFrame::toggleMaximizeDetails( bool isOn ) {
00574     if( isOn )
00575         maximizeDetailsPanel();
00576     else
00577         restoreDetailsPanel();
00578 }
00579 
00580 void VocabularyManagerFrame::updateGeometry() {
00581     QSize size( width(), height() );
00582     if( size.width() > size.height() ) {
00583         int treePanelWidth = ( treePanel->isVisible() ? (int)( size.width() / 2.5 ) : 0 );
00584         int detailsPanelWidth = size.width() - treePanelWidth;
00585 
00586         if( treePanel->isVisible() )
00587             treePanel->setGeometry( 0, 0, treePanelWidth, size.height() );
00588         detailsPanel->setGeometry( treePanelWidth, 0, detailsPanelWidth, size.height() );
00589     }
00590     else {
00591         int treePanelHeight = ( treePanel->isVisible() ? 170 : 0 );
00592         int detailsPanelHeight = size.height() - treePanelHeight;
00593         if( treePanel->isVisible() )
00594             treePanel->setGeometry( 0, 0, size.width(), treePanelHeight );
00595         detailsPanel->setGeometry( 0, treePanelHeight, size.width(), detailsPanelHeight );
00596     }
00597 }
00598 
00599 void VocabularyManagerFrame::resizeEvent( QResizeEvent* ) {
00600     updateGeometry();
00601     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00602     if( selectedItem ) {
00603         if( selectedItem->isFolder() ) {
00604             VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00605             vocabTreeView->ensureItemVisible( vocabItem );
00606 
00607             for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00608                 if( termItem->isSelected() ) {
00609                     termList->ensureItemVisible( termItem );
00610                     break;
00611                 }
00612             }
00613         }
00614     }
00615 }
00616 
00617 void VocabularyManagerFrame::showEvent( QShowEvent* showEvt ) {
00618     QWidget::showEvent( showEvt );
00619     // Both folder and vocab maximize buttons should have the same state so we use the folder's one.
00620     // We do this because the state may be inconsistent because of QuizFrame.
00621     action[ ACTION_MAXIMIZE ]->setOn( folderDetailsFolderMaximizeDetailsButton->isOn() );  
00622 }
00623 
00624 
00625 void VocabularyManagerFrame::updateUi() {
00626     removeListeners();
00627     TreeItem* selectedItem = (TreeItem*)vocabTreeView->currentItem();
00628     removeItemButton->setEnabled( selectedItem );
00629     if( selectedItem ) {
00630         if( selectedItem->isFolder() ) {
00631             FolderTreeItem* folderItem = (FolderTreeItem*)selectedItem;
00632             updateCurrentFolder( folderItem );
00633         }
00634         else {
00635             VocabTreeItem* vocabItem = (VocabTreeItem*)selectedItem;
00636             updateCurrentVocab( vocabItem );
00637         }
00638     }
00639     if( termList && termList->childCount() > 0 ) {
00640         checkAllTermsButton->setEnabled( true );
00641         inverseCheckedTermsButton->setEnabled( true );
00642     }
00643     else {
00644         checkAllTermsButton->setEnabled( false );
00645         inverseCheckedTermsButton->setEnabled( false );
00646     }
00647     emit( selectionChanged( selectedItem ) );
00648     addListeners();
00649 }
00650 
00651 void VocabularyManagerFrame::updateCurrentFolder( FolderTreeItem* folderItem ) {
00652     QString firstLang = controller->getPreferences().getFirstLanguage();
00653     QString testLang = controller->getPreferences().getTestLanguage();
00654     bool isBothLangSet = ( firstLang != QString::null && testLang != QString::null );
00655     Folder* folder = folderItem->getFolder();
00656     folderDetailsFolderTitleLineEdit->setText( folder->getTitle() );
00657     folderDetailsPropsPanel->setFolder( folder );
00658     addVocabButton->setEnabled( isBothLangSet );
00659     addFolderButton->setEnabled( isBothLangSet );
00660     removeItemButton->setEnabled( folderItem != vocabTreeRoot );
00661     detailsPanel->raiseWidget( panelFolderIndex );
00662 }
00663 
00664 void VocabularyManagerFrame::updateCurrentVocab( VocabTreeItem* vocabItem ) {
00665     const Preferences& prefs = controller->getPreferences();
00666     Vocabulary* vocab = vocabItem->getVocabulary();
00667     vocabDetailsVocabTitleLineEdit->setText( vocab->getTitle() );
00668     vocabDetailsPropsPanel->setVocabulary( vocab );
00669     termList->setColumnText( 0, QObject::tr( prefs.getFirstLanguage() ) );
00670     termList->setColumnText( 1, QObject::tr( prefs.getTestLanguage() ) );
00671     termList->clear();
00672     for( Vocabulary::TermMap::Iterator it = vocab->begin(); it != vocab->end(); it++ ) {
00673         Term& term = it.data(); 
00674         if( !prefs.isLanguageFilterEnabled() ||
00675                 ( term.isTranslationExists( prefs.getFirstLanguage() ) &&
00676                 term.isTranslationExists( prefs.getTestLanguage() ) ) ) {
00677             TermListItem* termItem = new TermListItem( termList, &term, prefs.getFirstLanguage(), prefs.getTestLanguage(), prefs.isAltInTermListShown() );
00678             termItem->setOn( term.isMarkedForStudy() );
00679             termItem->setFont( 0, prefs.getMediumFont( prefs.getFirstLanguage() ) );
00680             termItem->setFont( 1, prefs.getMediumFont( prefs.getTestLanguage() ) );
00681         }
00682     }
00683     termList->verticalScrollBar()->setValue( 0 );
00684     vocabItem->setOpen( true );
00685     addVocabButton->setEnabled( false );
00686     addFolderButton->setEnabled( false );
00687     detailsPanel->raiseWidget( panelVocabIndex );
00688     updateTermList();
00689 }
00690 
00691 void VocabularyManagerFrame::updateTermList() {
00692     termList->updateColumnsWidth();
00693     uint selectedTermCount = getSelectedTermCount();
00694     editTermButton->setEnabled( selectedTermCount == 1 );
00695     removeTermButton->setEnabled( selectedTermCount > 0 );
00696 }
00697 
00698 FolderTreeItem* VocabularyManagerFrame::addFolder() {
00699     return( addFolder( NULL ) );
00700 }
00701 
00702 FolderTreeItem* VocabularyManagerFrame::addFolder( Folder* folder, QMap<int,Vocabulary>* vocabularies = NULL ) {
00703     FolderTreeItem* newFolderItem = vocabTreeView->addFolder( folder, vocabularies );
00704     if( newFolderItem ) {
00705         newFolderItem->setPropertiesPanel( folderDetailsPropsPanel );
00706         folderDetailsPropsPanel->setFolder( newFolderItem->getFolder() );
00707         folderDetailsPropsPanel->updateCounters();
00708         vocabTreeView->ensureItemVisible( newFolderItem );
00709     }
00710     return( newFolderItem );
00711 }
00712 
00713 VocabTreeItem* VocabularyManagerFrame::addVocab() {
00714     return( addVocab( NULL ) );
00715 }
00716 
00717 VocabTreeItem* VocabularyManagerFrame::addVocab( Vocabulary* vocab ) {
00718     VocabTreeItem* newVocabItem = vocabTreeView->addVocab( vocab );
00719     if( newVocabItem ) {
00720         newVocabItem->setPropertiesPanel( vocabDetailsPropsPanel );
00721         vocabDetailsPropsPanel->setVocabulary( newVocabItem->getVocabulary() );
00722         vocabDetailsPropsPanel->updateCounters();
00723         vocabTreeView->ensureItemVisible( newVocabItem );
00724     }
00725     return( newVocabItem );
00726 }
00727 
00728 void VocabularyManagerFrame::removeItem() {
00729     doRemoveItem();
00730 }
00731 
00732 void VocabularyManagerFrame::doRemoveItem( bool confirmBeforeRemove = true ) {
00733     int response;
00734     if( confirmBeforeRemove ) {
00735         QMessageBox msgBox( QObject::tr( "Warning" ), tr( "ConfirmRemoveItem" ),
00736             QMessageBox::Warning,
00737             QMessageBox::Yes,
00738             QMessageBox::No | QMessageBox::Default | QMessageBox::Escape,
00739             QMessageBox::NoButton,
00740             this );
00741         msgBox.setButtonText( QMessageBox::Yes, tr( "Yes" ) );
00742         msgBox.setButtonText( QMessageBox::No, tr( "No" ) );
00743 
00744         response = msgBox.exec();
00745     }
00746     else
00747         response = QMessageBox::Yes;
00748 
00749     if( response == QMessageBox::Yes ) {
00750         TreeItem* currentItem = (TreeItem*)vocabTreeView->currentItem();
00751         if( currentItem->isFolder() ) {
00752             FolderTreeItem* folderItem = (FolderTreeItem*)currentItem;
00753             Folder* folder = folderItem->getFolder();
00754             folder->setMarkedForDeletion( true );
00755         }
00756         else {
00757             VocabTreeItem* vocabItem = (VocabTreeItem*)currentItem;
00758             Vocabulary* vocab = vocabItem->getVocabulary();
00759             vocab->setMarkedForDeletion( true );
00760         }
00761         vocabTreeView->removeItem();
00762     }
00763 }
00764 
00765 void VocabularyManagerFrame::checkAllTerms() {
00766     TermListItem* termItem = (TermListItem*)termList->firstChild();
00767     while( termItem ) {
00768         termItem->setOn( true );
00769         termItem = (TermListItem*)termItem->nextSibling();
00770     }
00771     vocabDetailsPropsPanel->updateCounters();
00772 }
00773 
00774 void VocabularyManagerFrame::inverseCheckedTerms() {
00775     TermListItem* termItem = (TermListItem*)termList->firstChild();
00776     while( termItem ) {
00777         termItem->setOn( !termItem->isOn() );
00778         termItem = (TermListItem*)termItem->nextSibling();
00779     }
00780     vocabDetailsPropsPanel->updateCounters();
00781 }
00782 
00783 void VocabularyManagerFrame::addTerm() {
00784     TreeItem* currItem = (TreeItem*)vocabTreeView->currentItem();
00785     if( currItem && !currItem->isFolder() ) {
00786         VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
00787         if( vocabItem ) {
00788             Vocabulary* vocab = vocabItem->getVocabulary();
00789             TermDialog dialog( *vocab, controller, this );
00790             dialog.showMaximized();
00791             int result = dialog.exec();
00792             if( result ) {
00793                 Term newTerm( dialog.getTerm() );
00794                 vocab->addTerm( newTerm );
00795                 Term& term = vocab->getTerm( newTerm.getId() );
00796                 const Preferences& prefs = controller->getPreferences();
00797                 TermListItem* newTermListItem = new TermListItem( termList, &term, 
00798                     prefs.getFirstLanguage(), prefs.getTestLanguage(), prefs.isAltInTermListShown() );
00799                 newTermListItem->setOn( true );
00800                 vocab->setModificationDate( QDateTime::currentDateTime() );
00801                 vocab->setDirty( true );
00802                 vocabDetailsPropsPanel->updateCounters();
00803                 updateUi(); 
00804                 for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00805                     Term* termToSelect = termItem->getTerm();
00806                     if( termToSelect->getId() == newTerm.getId() ) {
00807                         termList->setSelected( termItem, true );
00808                         termList->ensureItemVisible( termItem );
00809                         break;
00810                     }
00811                 }
00812             }
00813         }
00814     }
00815 }
00816 
00817 void VocabularyManagerFrame::editTerm() {
00818     VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
00819     if( vocabItem ) {
00820         Vocabulary* vocab = vocabItem->getVocabulary();
00821 
00822         for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00823             if( termItem->isSelected() ) {
00824                 TermDialog dialog( *vocab, controller, this, *termItem->getTerm() );
00825                 dialog.showMaximized();
00826                 int result = dialog.exec();
00827                 if( result ) { 
00828                     Term newTerm = dialog.getTerm();
00829                     termItem->getTerm()->addTranslation( newTerm.getTranslation( controller->getPreferences().getFirstLanguage() ) );
00830                     termItem->getTerm()->addTranslation( newTerm.getTranslation( controller->getPreferences().getTestLanguage() ) );
00831                     BilingualKey commentKey( controller->getPreferences().getFirstLanguage(), controller->getPreferences().getTestLanguage() );
00832                     termItem->getTerm()->addComment( commentKey, newTerm.getComment( commentKey ) );
00833                     termItem->getTerm()->setImagePath( newTerm.getImagePath() );
00834                     termItem->updateUi();
00835                     vocab->setModificationDate( QDateTime::currentDateTime() );
00836                     vocab->setDirty( true );
00837                 }
00838                 break;
00839             }
00840         }
00841     }
00842 }
00843 
00844 void VocabularyManagerFrame::removeTerms() {
00845     doRemoveTerms();
00846 }
00847 
00848 void VocabularyManagerFrame::doRemoveTerms( bool allowSelectTrans = true, bool confirmBeforeRemove = true ) {
00849     int selectedItemCount = 0;
00850     // Find all the translation languages of the selected terms.
00851     QStringList translationLanguages;
00852 
00853     for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
00854         if( termList->isSelected( termItem ) ) {
00855             selectedItemCount++;
00856             Term* term = termItem->getTerm();
00857             for( Term::TranslationMap::ConstIterator it = term->translationsBegin(); it != term->translationsEnd(); it++ ) {
00858                 const Translation& trans = it.data();
00859                 if( !translationLanguages.contains( trans.getLanguage() ) )
00860                     translationLanguages.append( trans.getLanguage() );
00861             }
00862         }
00863     }
00864 
00865     if( selectedItemCount == 0 )
00866         return;
00867 
00868     if( translationLanguages.count() <= 2 ) {
00869         int response;
00870 
00871         if( confirmBeforeRemove ) {
00872             QMessageBox msgBox( QObject::tr( "Warning" ), tr( "ConfirmRemoveSelectedTerms" ),
00873                 QMessageBox::Warning,
00874                 QMessageBox::Yes,
00875                 QMessageBox::No | QMessageBox::Default | QMessageBox::Escape,
00876                 QMessageBox::NoButton,
00877                 this );
00878             msgBox.setButtonText( QMessageBox::Yes, tr( "Yes" ) );
00879             msgBox.setButtonText( QMessageBox::No, tr( "No" ) );
00880 
00881             response = msgBox.exec();
00882         }
00883         else 
00884             response = QMessageBox::Yes;
00885 
00886         if( response == QMessageBox::Yes ) {
00887             VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
00888             Vocabulary* vocab = vocabItem->getVocabulary();
00889 
00890             for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; ) {
00891                 TermListItem* nextTermItem = (TermListItem*)termItem->nextSibling();
00892                 if( termList->isSelected( termItem ) ) {
00893                     Term* term = termItem->getTerm();
00894                     if( !term->getImagePath().isNull() && term->getImagePath().left( 1 ) != "/" ) {
00895                         const QString& imagePath = controller->getApplicationDirName() + "/" + vocab->getParent()->getPath() +
00896                             "/v-" + QString::number( vocab->getId() ) + "/" + term->getImagePath();
00897                         QFile imageFile( imagePath );
00898                         if( imageFile.exists() ) {
00899                             if( !imageFile.remove() )
00900                                 cerr << "Could not remove image " << imagePath << endl;
00901                         }
00902                     }
00903                     vocab->removeTerm( term->getId() );
00904                     delete( termItem );
00905                 }
00906                 termItem = nextTermItem;
00907             }
00908 
00909             vocab->setModificationDate( QDateTime::currentDateTime() );
00910             vocab->setDirty( true );
00911             termList->clearSelection();
00912             vocabDetailsPropsPanel->updateCounters();
00913             updateUi();
00914         }
00915     }
00916     else {
00917         int response;
00918         QStringList selectedLanguages;
00919         if( allowSelectTrans ) {
00920             TranslationSelectionDialog msgBox( tr( "MultipleTranslationsDetectedForRemoveTermsCaption" ), tr( "MultipleTranslationsDetectedForRemoveTerms" ), 
00921                 translationLanguages, TranslationSelectionDialog::selectionModeTargetLanguage, controller, this );
00922             msgBox.setMaximumHeight( size().height() - 40 );
00923             msgBox.setMaximumWidth( size().width() - 40 );
00924             response = msgBox.exec();
00925             if( response )
00926                 selectedLanguages = msgBox.getSelectedLanguages();
00927         }
00928         else {
00929             selectedLanguages = QStringList();
00930             selectedLanguages.append( controller->getPreferences().getFirstLanguage() );
00931             selectedLanguages.append( controller->getPreferences().getTestLanguage() );
00932         }
00933         if( selectedLanguages.count() == 0 )
00934             return;
00935 
00936         VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
00937         Vocabulary* vocab = vocabItem->getVocabulary();
00938 
00939         for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; ) {
00940             TermListItem* nextTermItem = (TermListItem*)termItem->nextSibling();
00941 
00942             if( termList->isSelected( termItem ) ) {
00943                 Term* term = termItem->getTerm();
00944 
00945                 for( QStringList::ConstIterator it = selectedLanguages.begin(); it != selectedLanguages.end(); it++ ) {
00946                     QString lang = *it;
00947                     term->removeTranslation( lang );
00948                 }
00949                 
00950                 if( term->getTranslationCount() == 0 ) {
00951                     if( !term->getImagePath().isNull() && term->getImagePath().left( 1 ) != "/" ) {
00952                         const QString& imagePath = controller->getApplicationDirName() + "/" + vocab->getParent()->getPath() +
00953                             "/v-" + QString::number( vocab->getId() ) + "/" + term->getImagePath();
00954                         QFile imageFile( imagePath );
00955                         if( imageFile.exists() ) {
00956                             if( !imageFile.remove() )
00957                                 cerr << "Could not remove image " << imagePath << endl;
00958                         }
00959                     }
00960                     vocab->removeTerm( term->getId() );
00961                     delete( termItem );
00962                 }
00963             }
00964 
00965             termItem = nextTermItem;
00966         }
00967 
00968         vocab->setModificationDate( QDateTime::currentDateTime() );
00969         vocab->setDirty( true );
00970         termList->clearSelection();
00971         vocabDetailsPropsPanel->updateCounters();
00972         updateUi();
00973     }
00974 }
00975 
00976 void VocabularyManagerFrame::updateCurrentFolderTitle( const QString& title ) {
00977     FolderTreeItem* folderItem = (FolderTreeItem*)vocabTreeView->currentItem();
00978     folderItem->setText( 0, title );
00979     Folder* folder = folderItem->getFolder();
00980     folder->setTitle( title );
00981     folder->setModificationDate( QDateTime::currentDateTime() );
00982     folder->setDirty( true );
00983 }
00984 
00985 void VocabularyManagerFrame::updateCurrentVocabTitle( const QString& title ) {
00986     VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
00987     vocabItem->setText( 0, title );
00988     Vocabulary* vocab = vocabItem->getVocabulary();
00989     vocab->setTitle( title );
00990     vocab->setModificationDate( QDateTime::currentDateTime() );
00991     vocab->setDirty( true );
00992 }
00993 
00994 FolderTreeItem* VocabularyManagerFrame::buildTreeRec( VocabTreeView* vocabTreeView, FolderTreeItem* parentItem, Folder* folder, bool closeFolder = false ) {
00995     FolderTreeItem* folderItem = NULL;
00996     if( !folder->isMarkedForDeletion() ) {
00997         if( parentItem )
00998             folderItem = new FolderTreeItem( parentItem, folder, controller->getPreferences() ); 
00999         else {
01000             // Root folder.
01001             folderItem = new FolderTreeItem( vocabTreeView, folder, controller->getPreferences() );
01002             folderItem->setEnabled( false );
01003         }
01004         if( folderItem ) {
01005             if( closeFolder )
01006                 folderItem->setOpen( false );
01007             else
01008                 folderItem->setOpen( controller->getPreferences().isFolderOpen( folder->getId() ) );
01009             folderItem->setOn( folder->isMarkedForStudy() );
01010             folderItem->setPropertiesPanel( folderDetailsPropsPanel );
01011             if( !folder->isEmpty() ) {
01012                 QString firstLang = controller->getPreferences().getFirstLanguage();
01013                 QString testLang = controller->getPreferences().getTestLanguage();
01014                 bool isBothLangSet = ( firstLang != QString::null && testLang != QString::null );
01015                 if( isBothLangSet ) {
01016                     for( Base* folderChild = folder->first(); folderChild; folderChild = folder->next() ) {
01017                         if( strcmp( folderChild->className(), "Folder" ) == 0 ) {
01018                             Folder* childFolder = (Folder*)folderChild;
01019                             buildTreeRec( vocabTreeView, folderItem, childFolder, closeFolder );
01020                         }
01021                         else if( strcmp( folderChild->className(), "Vocabulary" ) == 0 ) {
01022                             Vocabulary* vocab = (Vocabulary*)folderChild;
01023                             buildTreeRec( folderItem, vocab );
01024                         }
01025                     }
01026                     if( folderItem->childCount() == 0 && folderItem->getFolder()->getParent() ) {
01027                         delete folderItem;
01028                         folderItem = NULL;
01029                     }
01030                 }
01031             }
01032         }
01033     }
01034     return( folderItem );
01035 }
01036 
01037 VocabTreeItem* VocabularyManagerFrame::buildTreeRec( FolderTreeItem* parentItem, Vocabulary* vocab ) {
01038     QString firstLang = controller->getPreferences().getFirstLanguage();
01039     QString testLang = controller->getPreferences().getTestLanguage();
01040     bool isVocabVisible = !vocab->isMarkedForDeletion() && 
01041         ( !controller->getPreferences().isLanguageFilterEnabled() || vocab->containsTermWithTranslations( firstLang, testLang ) );
01042     if( isVocabVisible ) {
01043         VocabTreeItem* vocabItem = new VocabTreeItem( parentItem, vocab );    
01044         vocabItem->setOpen( false );
01045         vocabItem->setOn( vocab->isMarkedForStudy() );
01046         vocabItem->setPropertiesPanel( vocabDetailsPropsPanel );
01047         return( vocabItem );
01048     }
01049     else
01050         return( NULL );
01051 }
01052 
01053 void VocabularyManagerFrame::copyTerms() const {
01054     QString firstLang( controller->getPreferences().getFirstLanguage() );
01055     QString testLang( controller->getPreferences().getTestLanguage() );
01056     QValueList<Term> termsToCopy;
01057 
01058     TermListItem* termItem = (TermListItem*)termList->firstChild();
01059     while( termItem ) {
01060         if( termList->isSelected( termItem ) ) {
01061             Term* term = termItem->getTerm();
01062             Term* termCopy = new Term( 0, 0 ); // Don't need to copy ids.
01063 
01064             // We copy only translations for the currenlty selected languages.
01065             QStringList languages;
01066             languages << firstLang << testLang;
01067 
01068             for( QStringList::ConstIterator it = languages.begin(); it != languages.end(); it++ ) {
01069                 const QString& lang = *it;
01070                 if( term->isTranslationExists( lang ) ) {
01071                     Translation transCopy( term->getTranslation( lang ) );
01072                     termCopy->addTranslation( transCopy );
01073                 }
01074             }
01075             BilingualKey commentKey( firstLang, testLang );
01076             if( term->isCommentExists( commentKey ) )
01077                 termCopy->addComment( commentKey, term->getComment( commentKey ) );
01078 
01079             QString absoluteImagePath = term->getImagePath();
01080             if( !absoluteImagePath.isNull() && absoluteImagePath.left( 1 ) != "/" ) {
01081                 TreeItem* currItem = (TreeItem*)vocabTreeView->currentItem();
01082                 if( currItem && !currItem->isFolder() ) {
01083                     VocabTreeItem* vocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
01084                     Vocabulary* vocab = vocabItem->getVocabulary();
01085                     absoluteImagePath = controller->getApplicationDirName() + "/" + vocab->getParent()->getPath() +
01086                         "/v-" + QString::number( vocab->getId() ) + "/" + absoluteImagePath;
01087                 }
01088             }
01089             termCopy->setImagePath( absoluteImagePath );
01090 
01091             termsToCopy.append( *termCopy );
01092         }
01093         termItem = (TermListItem*)termItem->nextSibling();
01094     }
01095 
01096     if( !termsToCopy.isEmpty() ) {
01097         QByteArray data;
01098         QDataStream out( data, IO_WriteOnly );
01099         out << termsToCopy;
01100         controller->setClipboardData( QString( "terms" ), Util::qCompress( data ) );
01101     }
01102 }
01103 
01104 void VocabularyManagerFrame::pasteTerms() {
01105     QByteArray data( Util::qUncompress( controller->getClipboardData() ) );
01106     QDataStream in( data, IO_ReadOnly );
01107 
01108     QValueList<Term> termsToPaste;
01109     in >> termsToPaste;
01110 
01111     VocabTreeItem* currVocabItem = (VocabTreeItem*)vocabTreeView->currentItem();
01112     Vocabulary* currVocab = currVocabItem->getVocabulary();
01113     for( QValueList<Term>::ConstIterator it = termsToPaste.begin(); it != termsToPaste.end(); it++ ) {
01114         const Term& term = *it;
01115         Term newTerm( currVocab->getMaxTermId() + 1, currVocab->getId() );
01116         for( Term::TranslationMap::ConstIterator it2 = term.translationsBegin(); it2 != term.translationsEnd(); it2++ ) {
01117             const Translation& trans = it2.data();
01118             newTerm.addTranslation( trans );
01119         }
01120         for( Term::CommentMap::ConstIterator it3 = term.commentsBegin(); it3 != term.commentsEnd(); it3++ ) {
01121             const BilingualKey& key = it3.key();
01122             const QString& comment = it3.data();
01123             newTerm.addComment( key, comment );
01124         }
01125         if( !term.getImagePath().isNull() ) {
01126             // If the path refers to a file outside toMOTko's directory, we just copy the path.
01127             // Otherwise, we copy the image as well as the container vocabulary may be moved or deleted ulteriorly.
01128             if( term.getImagePath().left( controller->getApplicationDirName().length() ) == controller->getApplicationDirName() ) {
01129                 const QString& vocabLocation = controller->getApplicationDirName() + "/" + currVocab->getParent()->getPath() +
01130                     "/v-" + QString::number( currVocab->getId() ) + "/";
01131                 QFileInfo imageToCopyInfo( term.getImagePath() );
01132                 QString imageFilename = imageToCopyInfo.fileName();
01133                 if( Util::copy( term.getImagePath(), vocabLocation + imageFilename ) )
01134                     newTerm.setImagePath( imageFilename ); 
01135                 else
01136                     cerr << "Could not copy " << term.getImagePath() << " to " << ( vocabLocation + imageFilename ) << endl;
01137             }
01138             else 
01139                 newTerm.setImagePath( term.getImagePath() ); 
01140         }
01141 
01142         currVocab->addTerm( newTerm );
01143         currVocab->setModificationDate( QDateTime::currentDateTime() );
01144         currVocab->setDirty( true );
01145     }
01146     vocabDetailsPropsPanel->updateCounters();
01147     updateUi();
01148 }
01149 
01150 void VocabularyManagerFrame::pasteVocabulary() {
01151     QByteArray data( Util::qUncompress( controller->getClipboardData() ) );
01152     QDataStream in( data, IO_ReadOnly );
01153 
01154     Vocabulary vocabToPaste;
01155     in >> vocabToPaste;
01156 
01157     VocabTreeItem* newVocabItem = addVocab( &vocabToPaste );
01158     vocabTreeView->setSelected( newVocabItem, true ); 
01159 }
01160 
01161 void VocabularyManagerFrame::pasteFolder() {
01162     QByteArray data( Util::qUncompress( controller->getClipboardData() ) );
01163     QDataStream in( data, IO_ReadOnly );
01164 
01165     Folder folderToPaste;
01166     QMap<int,Vocabulary> vocabularies;
01167     in >> folderToPaste;
01168     in >> vocabularies;
01169 
01170     FolderTreeItem* newFolderItem = addFolder( &folderToPaste, &vocabularies );
01171     // As the tree updates are disabled when adding new folders recursively,
01172     // we close the parent node.  When we select the new node, the parent node
01173     // will open when we call ensureItemVisible().  This way, the tree is updated
01174     // properly.
01175     newFolderItem->parent()->setOpen( false );
01176     vocabTreeView->setSelected( newFolderItem, true );
01177     vocabTreeView->ensureItemVisible( newFolderItem );
01178 }
01179 
01180 void VocabularyManagerFrame::addListeners() {
01181     connect( folderDetailsFolderTitleLineEdit, SIGNAL( textChanged( const QString& ) ),
01182         this, SLOT( updateCurrentFolderTitle( const QString& ) ) );
01183     connect( vocabDetailsVocabTitleLineEdit, SIGNAL( textChanged( const QString& ) ),
01184         this, SLOT( updateCurrentVocabTitle( const QString& ) ) );
01185 }
01186 
01187 void VocabularyManagerFrame::removeListeners() {
01188     disconnect( folderDetailsFolderTitleLineEdit, SIGNAL( textChanged( const QString& ) ),
01189         this, SLOT( updateCurrentFolderTitle( const QString& ) ) );
01190     disconnect( vocabDetailsVocabTitleLineEdit, SIGNAL( textChanged( const QString& ) ),
01191         this, SLOT( updateCurrentVocabTitle( const QString& ) ) );
01192 }
01193 
01194 void VocabularyManagerFrame::maximizeDetailsPanel() {
01195     action[ ACTION_MAXIMIZE ]->setOn( true );
01196     // Set both folder and vocab maximize buttons to the same state because easier to manage.
01197     folderDetailsFolderMaximizeDetailsButton->setOn( true );
01198     vocabDetailsVocabMaximizeDetailsButton->setOn( true );
01199     treePanel->hide();
01200     updateGeometry();
01201     update();
01202 }
01203 
01204 void VocabularyManagerFrame::restoreDetailsPanel() {
01205     action[ ACTION_MAXIMIZE ]->setOn( false );
01206     // Set both folder and vocab maximize buttons to the same state because easier to manage.
01207     folderDetailsFolderMaximizeDetailsButton->setOn( false );
01208     vocabDetailsVocabMaximizeDetailsButton->setOn( false );
01209     treePanel->show();
01210     updateGeometry();
01211     update();
01212 }
01213 
01214 uint VocabularyManagerFrame::getSelectedTermCount() const {
01215     uint count = 0;
01216     TermListItem* termItem = (TermListItem*)termList->firstChild();
01217     while( termItem ) {
01218         if( termList->isSelected( termItem ) )
01219             count++;
01220         termItem = (TermListItem*)termItem->nextSibling();
01221     }
01222     return( count );
01223 }
01224 
01225 void VocabularyManagerFrame::search() {
01226     if( !searchDialog ) {
01227         searchDialog = new SearchDialog( this, controller );
01228         searchDialog->setDigraphEnabled( controller->getPreferences().isDigraphEnabled() );
01229         connect( searchDialog, SIGNAL( showTermRequested( const TermKey& ) ), this, SLOT( showTerm( const TermKey& ) ) ); 
01230         connect( searchDialog, SIGNAL( termsRemoved() ), this, SLOT( updateUi() ) );
01231     }
01232     searchDialog->updateFonts();
01233     searchDialog->showMaximized();
01234     searchDialog->exec();
01235 }
01236 
01237 void VocabularyManagerFrame::showTerm( const TermKey& termKey ) {
01238     VocabTreeItem* vocabTreeItem = vocabTreeView->getVocabTreeItem( termKey.getVocabId() );
01239     if( vocabTreeItem ) {
01240         vocabTreeView->ensureItemVisible( vocabTreeItem );
01241         vocabTreeView->setSelected( vocabTreeItem, true );
01242         detailsPanel->raiseWidget( panelVocabIndex );
01243         vocabDetailsTabWidget->showPage( vocabDetailsTermsPanel );
01244         for( TermListItem* termItem = (TermListItem*)termList->firstChild(); termItem; termItem = (TermListItem*)termItem->nextSibling() ) {
01245             int termItemId = termItem->getTerm()->getId();
01246             if( termItemId == termKey.getTermId() ) {
01247                 termList->clearSelection();
01248                 termList->ensureItemVisible( termItem );
01249                 termList->setSelected( termItem, true );
01250                 break;
01251             }
01252         }
01253     }
01254 }

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