/*************************************************************************** phrasebookdialog.cpp - description ------------------- begin : Don Sep 19 2002 copyright : (C) 2002 by Gunnar Schmi Dt email : kmouth@schmi-dt.de ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ // include files for QT #include #include #include #include #include #include #include #include #include #include #include #include // include files for KDE #include #include #include #include #include #include #include #include #include #include #include #include "phrasebookdialog.h" #include "buttonboxui.h" #include "phrasetree.h" namespace PhraseBookPrivate { enum columns { name = 1, filename = 2 }; } CheckBookItem::CheckBookItem (TQListViewItem *parent, TQListViewItem *last, const TQString &text, const TQString &name, const TQString &filename) : TQCheckListItem (parent, text, TQCheckListItem::CheckBox) { moveItem (last); setText(PhraseBookPrivate::name, name); setText(PhraseBookPrivate::filename, filename); setSelectable(false); if (filename.isNull() || filename.isEmpty()) numberOfBooks = 0; else numberOfBooks = 1; selectedBooks = 0; ((CheckBookItem*)parent)->childChange (numberOfBooks, selectedBooks); } CheckBookItem::CheckBookItem (TQListView *parent, TQListViewItem *last, const TQString &text, const TQString &name, const TQString &filename) : TQCheckListItem (parent, text, TQCheckListItem::CheckBox) { moveItem (last); setText(PhraseBookPrivate::name, name); setText(PhraseBookPrivate::filename, filename); setSelectable(false); if (filename.isNull() || filename.isEmpty()) numberOfBooks = 0; else numberOfBooks = 1; selectedBooks = 0; } CheckBookItem::~CheckBookItem () { } void CheckBookItem::activate() { TQListView *lv = listView(); if ((lv != 0) && (!lv->isEnabled()) || (!isEnabled())) return; setOn (!isOn()); ignoreDoubleClick(); } void CheckBookItem::stateChange (bool on) { TQListViewItem *item = firstChild(); if (item == 0) { TQListViewItem *parent = this->parent(); if (parent != 0) { if (on) ((CheckBookItem*)parent)->childChange (0, 1); else ((CheckBookItem*)parent)->childChange (0, -1); } } else propagateStateChange(); } void CheckBookItem::propagateStateChange () { TQListViewItem *item = firstChild(); while (item != 0) { if (isOn() != ((TQCheckListItem*)item)->isOn()) ((TQCheckListItem*)item)->setOn (isOn()); else ((CheckBookItem*)item)->propagateStateChange (); item = item->nextSibling(); } } void CheckBookItem::childChange (int numberDiff, int selDiff) { numberOfBooks += numberDiff; selectedBooks += selDiff; TQListViewItem *parent = this->parent(); if (parent != 0) ((CheckBookItem*)parent)->childChange (numberDiff, selDiff); TQString text = i18n(" (%1 of %2 books selected)"); text = text.arg(selectedBooks).arg(numberOfBooks); setText(0, this->text(PhraseBookPrivate::name)+text); } /***************************************************************************/ InitialPhraseBookWidget::InitialPhraseBookWidget (TQWidget *parent, const char *name) : TQWidget(parent, name) { TQVBoxLayout *mainLayout = new TQVBoxLayout (this, 0, KDialog::spacingHint()); TQLabel *label = new TQLabel (i18n("Please decide which phrase books you need:"), this, "booksTitle"); mainLayout->add (label); books = new KListView (this, "books"); books->setSorting (-1); books->setItemsMovable (false); books->setDragEnabled (false); books->setAcceptDrops (false); books->addColumn (i18n("Book")); books->setRootIsDecorated (true); books->setAllColumnsShowFocus (true); books->setSelectionMode (TQListView::Multi); mainLayout->add (books); initStandardPhraseBooks(); } InitialPhraseBookWidget::~InitialPhraseBookWidget () { } void InitialPhraseBookWidget::initStandardPhraseBooks() { StandardBookList bookPaths = PhraseBookDialog::standardPhraseBooks(); TQListViewItem *parent = 0; TQListViewItem *last = 0; TQStringList currentNamePath = ""; TQPtrStack stack; StandardBookList::iterator it; for (it = bookPaths.begin(); it != bookPaths.end(); ++it) { TQString namePath = (*it).path; TQStringList dirs = TQStringList::split("/", namePath); TQStringList::iterator it1=currentNamePath.begin(); TQStringList::iterator it2=dirs.begin(); for (; (it1 != currentNamePath.end()) && (it1 != dirs.end()) && (*it1 == *it2); ++it1, ++it2); for (; it1 != currentNamePath.end(); ++it1) { last = parent; parent = stack.pop(); } for (; it2 != dirs.end(); ++it2) { stack.push (parent); TQListViewItem *newParent; if (parent == 0) newParent = new CheckBookItem (books, last, *it2, *it2, TQString()); else newParent = new CheckBookItem (parent, last, *it2, *it2, TQString()); parent = newParent; last = 0; } currentNamePath = dirs; TQListViewItem *book; if (parent == 0) book = new CheckBookItem (books, last, (*it).name, (*it).name, (*it).filename); else book = new CheckBookItem (parent, last, (*it).name, (*it).name, (*it).filename); last = book; } } void InitialPhraseBookWidget::createBook () { PhraseBook book; TQListViewItem *item = books->firstChild(); while (item != 0) { if (item->firstChild() != 0) { item = item->firstChild(); } else { if (((TQCheckListItem*)item)->isOn()) { PhraseBook localBook; localBook.open(KURL( item->text(PhraseBookPrivate::filename ))); book += localBook; } while ((item != 0) && (item->nextSibling() == 0)) { item = item->parent(); } if (item != 0) item = item->nextSibling(); } } TQString bookLocation = TDEApplication::kApplication()->dirs()->saveLocation ("appdata", "/"); if (!bookLocation.isNull() && !bookLocation.isEmpty()) { book.save (KURL( bookLocation + "standard.phrasebook" )); } } /***************************************************************************/ ButtonBoxWidget::ButtonBoxWidget (TQWidget *parent, const char *name) : ButtonBoxUI (parent, name) { keyButtonPlaceLayout = new TQGridLayout (keyButtonPlace, 1, 1, 0, 0, "keyButtonPlaceLayout"); keyButton = new KKeyButton (keyButtonPlace, "key"); keyButtonPlaceLayout->addWidget (keyButton, 1,1); TQWhatsThis::add (keyButton, i18n("By clicking on this button you can select the keyboard shortcut associated with the selected phrase.")); group = new TQButtonGroup (phrasebox); group->hide(); group->setExclusive (true); group->insert (noKey); group->insert (customKey); } ButtonBoxWidget::~ButtonBoxWidget () { } /***************************************************************************/ namespace PhraseBookPrivate { PhraseBookDialog *instance = 0; } PhraseBookDialog::PhraseBookDialog () : KMainWindow (0, "phraseEditDialog") { setCaption (i18n("Phrase Book")); initGUI(); initActions(); initStandardPhraseBooks(); TQString standardBook = TDEApplication::kApplication()->dirs()->findResource("appdata", "standard.phrasebook"); if (!standardBook.isNull() && !standardBook.isEmpty()) { PhraseBook book; book.open(KURL( standardBook )); treeView->clear(); treeView->addBook(0, 0, &book); treeView->setCurrentItem(treeView->firstChild()); selectionChanged(); phrasebookChanged = false; } // i18n("Edit Phrase Book") } PhraseBookDialog *PhraseBookDialog::get() { if (PhraseBookPrivate::instance == 0) PhraseBookPrivate::instance = new PhraseBookDialog(); return PhraseBookPrivate::instance; } PhraseBookDialog::~PhraseBookDialog() { PhraseBookPrivate::instance = 0; } void PhraseBookDialog::initGUI () { TQWidget *page = new TQWidget( this ); setCentralWidget(page); TQVBoxLayout *mainLayout = new TQVBoxLayout (page, 0); treeView = new PhraseTree (page, "phrasetree"); treeView->setSorting (-1); treeView->setItemsMovable (true); treeView->setDragEnabled (true); treeView->setAcceptDrops (true); treeView->addColumn (i18n("Phrase")); treeView->addColumn (i18n("Shortcut")); treeView->setRootIsDecorated (true); treeView->setAllColumnsShowFocus (true); treeView->setSelectionMode (TQListView::Extended); TQWhatsThis::add (treeView, i18n("This list contains the current phrase book in a tree structure. You can select and modify individual phrases and sub phrase books")); connect (treeView, TQT_SIGNAL(selectionChanged()), TQT_TQOBJECT(this), TQT_SLOT(selectionChanged())); connect (treeView, TQT_SIGNAL(contextMenuRequested (TQListViewItem *, const TQPoint &, int)), TQT_TQOBJECT(this), TQT_SLOT(contextMenuRequested (TQListViewItem *, const TQPoint &, int))); connect (treeView, TQT_SIGNAL(dropped (TQDropEvent *, TQListViewItem *, TQListViewItem *)), TQT_TQOBJECT(this), TQT_SLOT(slotDropped (TQDropEvent *, TQListViewItem *, TQListViewItem *))); connect (treeView, TQT_SIGNAL(moved (TQListViewItem *, TQListViewItem *, TQListViewItem *)), TQT_TQOBJECT(this), TQT_SLOT(slotMoved (TQListViewItem *, TQListViewItem *, TQListViewItem *))); mainLayout->addWidget (treeView); buttonBox = new ButtonBoxWidget (page, "buttonbox"); connect (buttonBox->lineEdit, TQT_SIGNAL(textChanged(const TQString &)), TQT_SLOT(slotTextChanged(const TQString &))); connect (buttonBox->noKey, TQT_SIGNAL(clicked()), TQT_SLOT(slotNoKey())); connect (buttonBox->customKey, TQT_SIGNAL(clicked()), TQT_SLOT(slotCustomKey())); connect (buttonBox->keyButton, TQT_SIGNAL(capturedShortcut(const KShortcut&)), TQT_SLOT(capturedShortcut(const KShortcut&))); mainLayout->addWidget (buttonBox); treeView->setFocus(); selectionChanged(); } void PhraseBookDialog::initActions() { // The file menu fileNewPhrase = new KAction (i18n("&New Phrase"), "phrase_new", 0, TQT_TQOBJECT(this), TQT_SLOT(slotAddPhrase()), actionCollection(),"file_new_phrase"); fileNewPhrase->setStatusText(i18n("Adds a new phrase")); fileNewPhrase->setWhatsThis (i18n("Adds a new phrase")); fileNewBook = new KAction (i18n("New Phrase &Book"), "phrasebook_new", 0, TQT_TQOBJECT(this), TQT_SLOT(slotAddPhrasebook()), actionCollection(),"file_new_book"); fileNewBook->setStatusText(i18n("Adds a new phrase book into which other books and phrases can be placed")); fileNewBook->setWhatsThis (i18n("Adds a new phrase book into which other books and phrases can be placed")); fileSave = KStdAction::save(TQT_TQOBJECT(this), TQT_SLOT(slotSave()), actionCollection()); fileSave->setStatusText(i18n("Saves the phrase book onto the hard disk")); fileSave->setWhatsThis (i18n("Saves the phrase book onto the hard disk")); fileImport = new KAction (i18n("&Import..."), "phrasebook_open", 0, TQT_TQOBJECT(this), TQT_SLOT(slotImportPhrasebook()), actionCollection(),"file_import"); fileImport->setStatusText(i18n("Imports a file and adds its contents to the phrase book")); fileImport->setWhatsThis (i18n("Imports a file and adds its contents to the phrase book")); toolbarImport = new KToolBarPopupAction (i18n("&Import..."), "phrasebook_open", 0, TQT_TQOBJECT(this), TQT_SLOT(slotImportPhrasebook()), actionCollection(),"toolbar_import"); toolbarImport->setStatusText(i18n("Imports a file and adds its contents to the phrase book")); toolbarImport->setWhatsThis (i18n("Imports a file and adds its contents to the phrase book")); fileImportStandardBook = new KActionMenu (i18n("I&mport Standard Phrase Book"), "phrasebook_open", actionCollection(),"file_import_standard_book"); fileImportStandardBook->setStatusText(i18n("Imports a standard phrase book and adds its contents to the phrase book")); fileImportStandardBook->setWhatsThis (i18n("Imports a standard phrase book and adds its contents to the phrase book")); fileExport = new KAction (i18n("&Export..."), "phrasebook_save", 0, TQT_TQOBJECT(this), TQT_SLOT(slotExportPhrasebook()), actionCollection(),"file_export"); fileExport->setStatusText(i18n("Exports the currently selected phrase(s) or phrase book(s) into a file")); fileExport->setWhatsThis (i18n("Exports the currently selected phrase(s) or phrase book(s) into a file")); filePrint = KStdAction::print(TQT_TQOBJECT(this), TQT_SLOT(slotPrint()), actionCollection()); filePrint->setStatusText(i18n("Prints the currently selected phrase(s) or phrase book(s)")); filePrint->setWhatsThis (i18n("Prints the currently selected phrase(s) or phrase book(s)")); fileClose = KStdAction::close(TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection()); fileClose->setStatusText(i18n("Closes the window")); fileClose->setWhatsThis (i18n("Closes the window")); // The edit menu editCut = KStdAction::cut(TQT_TQOBJECT(this), TQT_SLOT(slotCut()), actionCollection()); editCut->setStatusText(i18n("Cuts the currently selected entries from the phrase book and puts it to the clipboard")); editCut->setWhatsThis (i18n("Cuts the currently selected entries from the phrase book and puts it to the clipboard")); editCopy = KStdAction::copy(TQT_TQOBJECT(this), TQT_SLOT(slotCopy()), actionCollection()); editCopy->setStatusText(i18n("Copies the currently selected entry from the phrase book to the clipboard")); editCopy->setWhatsThis (i18n("Copies the currently selected entry from the phrase book to the clipboard")); editPaste = KStdAction::paste(TQT_TQOBJECT(this), TQT_SLOT(slotPaste()), actionCollection()); editPaste->setStatusText(i18n("Pastes the clipboard contents to actual position")); editPaste->setWhatsThis (i18n("Pastes the clipboard contents to actual position")); editDelete = new KAction (i18n("&Delete"), "editdelete", 0, TQT_TQOBJECT(this), TQT_SLOT(slotRemove()), actionCollection(),"edit_delete"); editDelete->setStatusText(i18n("Deletes the selected entries from the phrase book")); editDelete->setWhatsThis (i18n("Deletes the selected entries from the phrase book")); // use the absolute path to your kmouthui.rc file for testing purpose in createGUI(); createGUI("phrasebookdialogui.rc"); } TQString PhraseBookDialog::displayPath (TQString filename) { TQFileInfo file(filename); TQString path = file.dirPath(); TQString dispPath = ""; uint position = path.find("/kmouth/books/")+TQString("/kmouth/books/").length(); while (path.length() > position) { file.setFile(path); KDesktopFile *dirDesc = new KDesktopFile(path+"/.directory", true, "data"); TQString name = dirDesc->readName(); delete dirDesc; if (name.isNull() || name.isEmpty()) dispPath += "/" + file.fileName (); else dispPath += "/" + name; path = file.dirPath(); } return dispPath; } StandardBookList PhraseBookDialog::standardPhraseBooks() { TQStringList bookPaths = KGlobal::instance()->dirs()->findAllResources ( "data", "kmouth/books/*.phrasebook", true, true); TQStringList bookNames; TQMap bookMap; TQStringList::iterator it; for (it = bookPaths.begin(); it != bookPaths.end(); ++it) { PhraseBook pbook; if (pbook.open (KURL( *it ))) { StandardBook book; book.name = (*pbook.begin()).getPhrase().getPhrase(); book.path = displayPath(*it); book.filename = *it; bookNames += book.path + "/" + book.name; bookMap [book.path + "/" + book.name] = book; } } bookNames.sort(); StandardBookList result; for (it = bookNames.begin(); it != bookNames.end(); ++it) result += bookMap [*it]; return result; } void PhraseBookDialog::initStandardPhraseBooks () { StandardBookList bookPaths = standardPhraseBooks(); KActionMenu *parent = fileImportStandardBook; TQStringList currentNamePath = "x"; TQPtrStack stack; StandardBookList::iterator it; for (it = bookPaths.begin(); it != bookPaths.end(); ++it) { KURL url; url.setPath((*it).filename); TQString namePath = "x/"+(*it).path; TQStringList dirs = TQStringList::split("/", namePath); TQStringList::iterator it1=currentNamePath.begin(); TQStringList::iterator it2=dirs.begin(); for (; (it1 != currentNamePath.end()) && (it1 != dirs.end()) && (*it1 == *it2); ++it1, ++it2); for (; it1 != currentNamePath.end(); ++it1) parent = stack.pop(); for (; it2 != dirs.end(); ++it2) { stack.push (parent); KActionMenu *newParent = new KActionMenu (*it2); parent->insert(newParent); if (parent == fileImportStandardBook) newParent->plug(toolbarImport->popupMenu()); parent = newParent; } currentNamePath = dirs; KAction *book = new StandardPhraseBookInsertAction ( url, (*it).name, TQT_TQOBJECT(this), TQT_SLOT(slotImportPhrasebook (const KURL &)), actionCollection()); parent->insert(book); if (parent == fileImportStandardBook) book->plug(toolbarImport->popupMenu()); } } PhraseTreeItem *selectedItem (TQListView *treeView) { PhraseTreeItem *currentItem = (PhraseTreeItem *)treeView->currentItem(); if ((currentItem == 0) || (!currentItem->isSelected())) return 0; TQListViewItemIterator it(treeView); while (it.current()) { TQListViewItem *item = it.current(); if (item->isSelected() && (item != currentItem)) return 0; ++it; } return currentItem; } void PhraseBookDialog::selectionChanged () { bool modified = phrasebookChanged; PhraseTreeItem *currentItem = selectedItem (treeView); if (currentItem == 0) { buttonBox->textLabel->setText (i18n("Text of the &phrase:")); buttonBox->textLabel->setEnabled(false); buttonBox->group->setEnabled(false); buttonBox->lineEdit->setText(""); buttonBox->lineEdit->setEnabled(false); buttonBox->shortcutLabel->setEnabled(false); buttonBox->keyButton->setShortcut("", false); buttonBox->keyButton->setEnabled(false); buttonBox->noKey->setChecked (false); buttonBox->noKey->setEnabled (false); buttonBox->customKey->setChecked (false); buttonBox->customKey->setEnabled (false); } else if (currentItem->isPhrase()) { buttonBox->textLabel->setText (i18n("Text of the &phrase:")); buttonBox->textLabel->setEnabled(true); buttonBox->group->setEnabled(true); buttonBox->lineEdit->setText(currentItem->text(0)); buttonBox->lineEdit->setEnabled(true); buttonBox->shortcutLabel->setEnabled(true); TQString shortcut = currentItem->text(1); buttonBox->keyButton->setShortcut(currentItem->cut(), false); if (shortcut.isEmpty() || shortcut.isNull()) { buttonBox->noKey->setChecked (true); buttonBox->customKey->setChecked (false); } else { buttonBox->noKey->setChecked (false); buttonBox->customKey->setChecked (true); } buttonBox->keyButton->setEnabled(true); buttonBox->noKey->setEnabled(true); buttonBox->customKey->setEnabled(true); } else { buttonBox->textLabel->setText (i18n("Name of the &phrase book:")); buttonBox->textLabel->setEnabled(true); buttonBox->group->setEnabled(true); buttonBox->lineEdit->setText(currentItem->text(0)); buttonBox->lineEdit->setEnabled(true); buttonBox->shortcutLabel->setEnabled(false); buttonBox->keyButton->setShortcut("", false); buttonBox->keyButton->setEnabled(false); buttonBox->noKey->setChecked (false); buttonBox->noKey->setEnabled (false); buttonBox->customKey->setChecked (false); buttonBox->customKey->setEnabled (false); } phrasebookChanged = modified; } bool PhraseBookDialog::queryClose() { if (phrasebookChanged) { int answer = KMessageBox::questionYesNoCancel (this, i18n("There are unsaved changes.
Do you want to apply the changes before closing the \"phrase book\" window or discard the changes?
"), i18n("Closing \"Phrase Book\" Window"), KStdGuiItem::apply(), KStdGuiItem::discard(), "AutomaticSave"); if (answer == KMessageBox::Yes) { slotSave(); return true; } return (answer == KMessageBox::No); } return true; } void PhraseBookDialog::slotTextChanged (const TQString &s) { PhraseTreeItem *currentItem = selectedItem (treeView); if (currentItem != 0) currentItem->setText(0, s); phrasebookChanged = true; } void PhraseBookDialog::slotNoKey() { buttonBox->noKey->setChecked (true); buttonBox->customKey->setChecked (false); PhraseTreeItem *currentItem = selectedItem (treeView); if (currentItem != 0) { currentItem->setCut (KShortcut(TQString())); buttonBox->keyButton->setShortcut(currentItem->cut(), false); } phrasebookChanged = true; } void PhraseBookDialog::slotCustomKey() { buttonBox->keyButton->captureShortcut(); } void PhraseBookDialog::capturedShortcut (const KShortcut& cut) { if (cut.isNull()) { slotNoKey(); } else setShortcut (cut); phrasebookChanged = true; } void PhraseBookDialog::setShortcut( const KShortcut& cut ) { // Check whether the shortcut is valid for (uint i = 0; i < cut.count(); i++) { const KKeySequence& seq = cut.seq(i); const KKey& key = seq.key(0); if (key.modFlags() == 0 && key.sym() < 0x3000 && TQChar(key.sym()).isLetterOrNumber()) { TQString s = i18n("In order to use the '%1' key as a shortcut, " "it must be combined with the " "Win, Alt, Ctrl, and/or Shift keys.").arg(TQChar(key.sym())); KMessageBox::sorry( this, s, i18n("Invalid Shortcut Key") ); return; } } PhraseTreeItem *currentItem = selectedItem (treeView); // If key isn't already in use, if (!treeView->isKeyPresent (cut, currentItem, true)) { // Set new key code currentItem->setCut (cut); // Update display buttonBox->noKey->setChecked (false); buttonBox->customKey->setChecked (true); buttonBox->keyButton->setShortcut(currentItem->cut(), false); } } TQListViewItem *PhraseBookDialog::addBook (TQListViewItem *parent, TQListViewItem *after, PhraseBook *book) { TQListViewItem *newItem = treeView->addBook(parent, after, book); if (newItem != 0) { treeView->clearSelection(); treeView->ensureItemVisible(newItem); treeView->setCurrentItem (newItem); treeView->setSelected (newItem, true); phrasebookChanged = true; } return newItem; } TQListViewItem *PhraseBookDialog::addBook (TQListViewItem *item, PhraseBook *book) { if (item == 0) return addBook(0, 0, book); else if (((PhraseTreeItem *)item)->isPhrase() || !item->isOpen()) if (item->parent() != 0) return addBook(item->parent(), item, book); else return addBook(0, item, book); else return addBook(item, 0, book); } void PhraseBookDialog::contextMenuRequested(TQListViewItem *, const TQPoint &pos, int) { TQString name; if (treeView->hasSelectedItems()) name = "phrasebook_popup_sel"; else name = "phrasebook_popup_nosel"; TQPopupMenu *popup = (TQPopupMenu *)factory()->container(name,this); if (popup != 0) { popup->popup(pos, 0); } } void PhraseBookDialog::slotRemove () { if (treeView->hasSelectedItems() != 0) treeView->deleteSelectedItems(); selectionChanged(); phrasebookChanged = true; } void PhraseBookDialog::slotCut () { slotCopy(); slotRemove(); } void PhraseBookDialog::slotCopy () { PhraseBook book; treeView->fillBook (&book, true); TQApplication::clipboard()->setData(new PhraseBookDrag(&book)); } void PhraseBookDialog::slotPaste () { PhraseBook book; if (PhraseBookDrag::decode(TQApplication::clipboard()->data(), &book)) { addBook (treeView->currentItem(), &book); } } void PhraseBookDialog::slotDropped (TQDropEvent *e, TQListViewItem *parent, TQListViewItem *after) { PhraseBook book; if (PhraseBookDrag::decode(e, &book)) { addBook(parent, after, &book); } } void PhraseBookDialog::slotMoved (TQListViewItem *item, TQListViewItem *, TQListViewItem *) { treeView->ensureItemVisible(item); treeView->setSelected (item, true); phrasebookChanged = true; } void PhraseBookDialog::slotAddPhrasebook () { PhraseBook book; Phrase phrase(i18n("(New Phrase Book)"), ""); book += PhraseBookEntry(phrase, 0, false); TQListViewItem *item = addBook (treeView->currentItem(), &book); item->setOpen (true); buttonBox->lineEdit->selectAll(); buttonBox->lineEdit->setFocus(); } void PhraseBookDialog::slotAddPhrase () { PhraseBook book; Phrase phrase(i18n("(New Phrase)"), ""); book += PhraseBookEntry(phrase, 0, true); addBook (treeView->currentItem(), &book); buttonBox->lineEdit->selectAll(); buttonBox->lineEdit->setFocus(); } void PhraseBookDialog::slotSave () { book.clear(); treeView->fillBook (&book, false); emit phrasebookConfirmed (book); phrasebookChanged = false; } void PhraseBookDialog::slotImportPhrasebook () { KURL url=KFileDialog::getOpenURL(TQString(), i18n("*.phrasebook|Phrase Books (*.phrasebook)\n*.txt|Plain Text Files (*.txt)\n*|All Files"), this, i18n("Import Phrasebook")); slotImportPhrasebook (url); } void PhraseBookDialog::slotImportPhrasebook (const KURL &url) { if(!url.isEmpty()) { PhraseBook book; if (book.open (url)) addBook(treeView->currentItem(), &book); else KMessageBox::sorry(this,i18n("There was an error loading file\n%1").arg( url.url() )); } } void PhraseBookDialog::slotExportPhrasebook () { PhraseBook book; treeView->fillBook (&book, treeView->hasSelectedItems()); KURL url; if (book.save (this, i18n("Export Phrase Book"), url) == -1) KMessageBox::sorry(this,i18n("There was an error saving file\n%1").arg( url.url() )); } void PhraseBookDialog::slotPrint() { KPrinter printer; if (printer.setup(this)) { PhraseBook book; treeView->fillBook (&book, treeView->hasSelectedItems()); book.print(&printer); } } #include "phrasebookdialog.moc"