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() ) );
00091 int colTestLanguage = termList->addColumn( QObject::tr( controller->getPreferences().getTestLanguage() ) );
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
00145
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
00169
00170
00171
00172
00173 if( vocabTreeView )
00174 vocabTreeView->setUpdatesEnabled( true );
00175 }
00176
00177 void VocabularyManagerFrame::loadData() {
00178 QCopEnvelope busyEnv( "QPE/System", "busy()" );
00179 controller->loadData();
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;
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
00346
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;
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;
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
00620
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
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
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 );
01063
01064
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
01127
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
01172
01173
01174
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
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
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 }