diff options
Diffstat (limited to 'kbabel/kbabeldict/kbabeldictbox.cpp')
-rw-r--r-- | kbabel/kbabeldict/kbabeldictbox.cpp | 1767 |
1 files changed, 1767 insertions, 0 deletions
diff --git a/kbabel/kbabeldict/kbabeldictbox.cpp b/kbabel/kbabeldict/kbabeldictbox.cpp new file mode 100644 index 00000000..2beed684 --- /dev/null +++ b/kbabel/kbabeldict/kbabeldictbox.cpp @@ -0,0 +1,1767 @@ +/* **************************************************************************** + This file is part of KBabel + + Copyright (C) 2000 by Matthias Kiefer + <matthias.kiefer@gmx.de> + 2003-2005 by Stanislav Visnovsky + <visnovsky@kde.org> + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. + +**************************************************************************** */ + + +#include <dcopclient.h> +#include <kaboutapplication.h> + +#include "aboutmoduledlg.h" +#include "kbabeldictbox.h" +#include <version.h> +#include <resources.h> + +#include <kaboutdata.h> +#include <kaboutdialog.h> +#include <kapplication.h> +#include <kconfig.h> +#include <kcmenumngr.h> +#include <kdialogbase.h> +#include <klibloader.h> +#include <klistview.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kstandarddirs.h> +#include <kglobal.h> +#include <kdebug.h> +#include <ktrader.h> +#include <kwin.h> + +#include <qclipboard.h> +#include <qdir.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpopupmenu.h> +#include <qpushbutton.h> +#include <qtextview.h> +#include <qstylesheet.h> +#include <qtoolbutton.h> +#include <qwhatsthis.h> +#include <qtimer.h> + +#define KBABELDICT 5321 + +using namespace KBabel; + +class ResultListItem : public QListViewItem +{ +public: + ResultListItem(QListView *parent, const SearchResult& result,bool richText); + + virtual QString key(int column, bool ascending) const; + const SearchResult* result() const; + bool richText() const { return _richText; } + +private: + SearchResult _result; + bool _richText; +}; + +ResultListItem::ResultListItem(QListView *parent, const SearchResult& result + , bool richText) + : QListViewItem(parent) + , _result(result) + , _richText(richText) +{ + int score=_result.score; + if(score<0) + score=0; + else if(score>100) + score=100; + setText(0,QString::number(score)); + + QString tmp; + if(richText) + tmp=_result.plainFound; + else + // FIXME: what about plural forms? + tmp=result.found.first(); + + bool cutted=false; + int index=tmp.find('\n'); + if(index > 0) + { + tmp=tmp.left(index); + cutted=true; + } + if(tmp.length() > 30) + { + tmp=tmp.left(30); + cutted=true; + } + tmp=tmp.stripWhiteSpace(); + if(cutted) + tmp+="..."; + + setText(1,tmp); + + if(richText) + tmp=_result.plainTranslation; + else + tmp=result.translation; + + cutted=false; + index=tmp.find('\n'); + if(index > 0) + { + tmp=tmp.left(index); + cutted=true; + } + if(tmp.length() > 30) + { + tmp=tmp.left(30); + cutted=true; + } + tmp=tmp.stripWhiteSpace(); + if(cutted) + tmp+="..."; + setText(2,tmp); + + + if(!_result.descriptions.isEmpty()) + { + TranslationInfo *ti = _result.descriptions.first(); + if(ti) + { + setText(3,ti->location); + } + } + +} + +QString ResultListItem::key(int column, bool ascending) const +{ + if(column==0) + { + QString result=QString::number(_result.score); + result=result.rightJustify(10,'0'); + + return result; + } + + return QListViewItem::key(column,ascending); +} + +const SearchResult *ResultListItem::result() const +{ + return &_result; +} + +/* + * Constructs a KBabelDictBox which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + */ +KBabelDictBox::KBabelDictBox( QWidget* parent, const char* name, WFlags fl ) + : DCOPObject("KBabelDict"), QWidget( parent, name, fl ) +{ + active=-1; + currentResult=0; + currentInfo=0; + moduleList.setAutoDelete(false); + + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setMargin(KDialog::marginHint()); + mainLayout->setSpacing(KDialog::spacingHint()); + + QGridLayout *grid = new QGridLayout(mainLayout); + + QHBoxLayout *hbox = new QHBoxLayout; + QLabel *label = new QLabel(i18n("Total:"),this); + hbox->addWidget(label); + totalResultsLabel = new QLabel("0",this); + hbox->addWidget(totalResultsLabel); + grid->addLayout(hbox,0,0); + + hbox = new QHBoxLayout; + label = new QLabel(i18n("Current:"), this); + hbox->addWidget(label); + currentLabel = new QLabel("0",this); + hbox->addWidget(currentLabel); + grid->addLayout(hbox,1,0); + + + hbox = new QHBoxLayout; + label = new QLabel(i18n("Found in:"), this); + hbox->addWidget(label); + locationLabel = new QLabel(this); + hbox->addWidget(locationLabel); + hbox->setStretchFactor(locationLabel,2); + grid->addLayout(hbox,0,1); + + hbox = new QHBoxLayout; + label = new QLabel(i18n("Translator:"), this); + hbox->addWidget(label); + translatorLabel = new QLabel(this); + translatorLabel->setMinimumSize(50,0); + hbox->addWidget(translatorLabel); + hbox->setStretchFactor(translatorLabel,2); + grid->addLayout(hbox,1,1); + + grid->setColStretch(1,2); + + + hbox = new QHBoxLayout; + label = new QLabel(i18n("Date:"),this); + hbox->addWidget(label); + dateLabel = new QLabel(this); + dateLabel->setMinimumSize(50,0); + hbox->addWidget(dateLabel); + hbox->setStretchFactor(dateLabel,2); + + moreButton = new QPushButton(this,"moreButton"); + moreButton->setText(i18n("&More")); + moreButton->setEnabled(false); + moreButton->setAutoRepeat(true); + hbox->addWidget(moreButton); + + mainLayout->addLayout(hbox); + + + hbox = new QHBoxLayout; + hbox->addStretch(1); + listButton = new QToolButton(Qt::UpArrow,this); + listButton->setFixedSize(20,15); + listButton->setAutoRepeat(false); + connect(listButton,SIGNAL(clicked()),this,SLOT(showListOnly())); + hbox->addWidget(listButton); + detailButton = new QToolButton(Qt::DownArrow,this); + detailButton->setFixedSize(20,15); + detailButton->setAutoRepeat(false); + connect(detailButton,SIGNAL(clicked()),this,SLOT(showDetailsOnly())); + hbox->addWidget(detailButton); + + mainLayout->addLayout(hbox); + + + resultSplitter = new QSplitter(Qt::Vertical,this + ,"resultsplitter"); + mainLayout->addWidget(resultSplitter); + + viewContainer = new QSplitter(Qt::Vertical,resultSplitter, "singleEntrySplitter"); + QVBoxLayout *vbox = new QVBoxLayout(viewContainer); + vbox->setResizeMode(QLayout::FreeResize); + origView = new QTextView(viewContainer,"origView"); + origView->setWordWrap( QTextEdit::WidgetWidth ); + origView->setMinimumSize(1,1); + vbox->addWidget(origView); + translationView = new QTextView(viewContainer,"translationView"); + origView->setWordWrap( QTextEdit::WidgetWidth ); + translationView->setMinimumSize(1,1); + vbox->addWidget(translationView); + viewContainer->setMinimumSize(1,1); + + resultListView = new KListView( resultSplitter, "resultListView" ); + resultListView->setMinimumSize(1,1); + resultListView->addColumn( i18n( "Score" ) ); + resultListView->addColumn( i18n( "Original" ) ); + resultListView->addColumn( i18n( "Translation" ) ); + resultListView->addColumn( i18n( "Location" ) ); + + resultListView->installEventFilter(this); + connect(resultListView + , SIGNAL(doubleClicked(QListViewItem *,const QPoint&,int)) + , this, SLOT(editFile())); + connect(resultListView, SIGNAL(returnPressed(QListViewItem *)) + , this, SLOT(editFile())); + connect(resultListView + , SIGNAL(contextMenu(KListView *,QListViewItem *,const QPoint&)) + , this + , SLOT(showContextMenu(KListView *,QListViewItem *,const QPoint&))); + + resultSplitter->setResizeMode(viewContainer,QSplitter::KeepSize); + QValueList<int> sizes; + sizes.append(50); + sizes.append(50); + resultSplitter->setSizes(sizes); + + + hbox = new QHBoxLayout; + hbox->addStretch(1); + + prevButton = new QPushButton(i18n("< &Previous"),this); + prevButton->setEnabled(false); + prevButton->setAutoRepeat(true); + hbox->addWidget(prevButton); + + nextButton = new QPushButton(i18n("&Next >"),this); + nextButton->setEnabled(false); + nextButton->setAutoRepeat(true); + hbox->addWidget(nextButton); + + hbox->addStretch(1); + mainLayout->addLayout(hbox); + + totalResultsLabel->setNum(100000); + totalResultsLabel->setFixedSize(totalResultsLabel->sizeHint()); + totalResultsLabel->setNum(0); + currentLabel->setNum(100000); + currentLabel->setFixedSize(currentLabel->sizeHint()); + currentLabel->setNum(0); + + setRMBMenu(new QPopupMenu(this)); + QStringList fileList; +#if 0 + // try to find installed modules by looking into directories + // kbabeldict/modules and getting all files *.rc + QStringList dirList = KGlobal::dirs()->findDirs("data" + ,"kbabeldict/modules"); + + for ( QStringList::Iterator it = dirList.begin(); it != dirList.end() + ; ++it ) + { + QDir dir((*it),"*.rc"); + QStringList list = dir.entryList(QDir::Files|QDir::Readable); + + for ( QStringList::Iterator fit = list.begin(); fit != list.end() + ; ++fit ) + { + if(!fileList.contains((*fit))) + { + fileList.append((*fit)); + } + } + } +#endif + + // use locate to locate the actual file, because rcfiles in the users + // directory is prefered for systemwide rc files + QStringList rcList; + for( QStringList::Iterator fit = fileList.begin(); fit != fileList.end(); + ++fit) + { + rcList.append(locate("data","kbabeldict/modules/"+(*fit))); + } + + for( QStringList::Iterator rit = rcList.begin(); rit != rcList.end(); + ++rit) + { + KConfig rcConfig((*rit),true,false); + + rcConfig.setGroup("SearchEngine"); + + QStringList appList = rcConfig.readListEntry("Applications"); + KInstance *inst = KGlobal::instance(); + if(inst && !appList.isEmpty() && !appList.contains(inst->instanceName())) + { + continue; + } + + QString libName = rcConfig.readEntry("Lib"); + + if(!libName.isNull()) + { + kdDebug(KBABELDICT) << "loading library " << libName << endl; + + KLibFactory *factory=KLibLoader::self()->factory(libName.latin1()); + + if(factory) + { + SearchEngine *e = (SearchEngine *)factory->create(this + , "searchengine", "SearchEngine"); + if(!e) + { + kdError() << "searchengine not initialized" << endl; + } + else + { + registerModule(e); + } + } + else + { + kdError() << "wasn't able to load library" << endl; + } + + } + } + + kdDebug(KBABEL_SEARCH) << "Now using trader for " << KGlobal::instance()->instanceName() << endl; + + // try to find installed modules by KTrader + KTrader::OfferList offers = KTrader::self()->query("KBabelDictModule", + "('"+KGlobal::instance()->instanceName()+"' in [Applications])"); + + for(KTrader::OfferList::ConstIterator it = offers.begin(); it != offers.end(); ++it ) + { + KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().local8Bit() ); + + if(factory) + { + SearchEngine *e = (SearchEngine *)factory->create(this + , "searchengine", "SearchEngine"); + if(!e) + { + kdError() << "searchengine not initialized" << endl; + } + else + { + registerModule(e); + } + } + else + { + kdError() << "wasn't able to load library" << endl; + } + } + + kdDebug(KBABEL_SEARCH) << "Now for any application" << endl; + + offers = KTrader::self()->query("KBabelDictModule", + "not ( exist Applications)"); + + for(KTrader::OfferList::ConstIterator it = offers.begin(); it != offers.end(); ++it ) + { + KLibFactory *factory = KLibLoader::self()->factory( (*it)->library().local8Bit() ); + + if(factory) + { + SearchEngine *e = (SearchEngine *)factory->create(this + , "searchengine", "SearchEngine"); + if(!e) + { + kdError() << "searchengine not initialized" << endl; + } + else + { + registerModule(e); + } + } + else + { + kdError() << "wasn't able to load library" << endl; + } + } + + connect(nextButton,SIGNAL(clicked()),this,SLOT(slotNextResult())); + connect(prevButton,SIGNAL(clicked()),this,SLOT(slotPrevResult())); + connect(moreButton,SIGNAL(clicked()),this,SLOT(nextInfo())); + + + origView->installEventFilter(this); + translationView->installEventFilter(this); + + resultListView->setSorting(0,false); + resultListView->setAllColumnsShowFocus(true); + + connect(resultListView,SIGNAL(selectionChanged(QListViewItem*)) + , this, SLOT(showResult(QListViewItem*))); +} + +/* + * Destroys the object and frees any allocated resources + */ +KBabelDictBox::~KBabelDictBox() +{ +} + +void KBabelDictBox::registerModule( SearchEngine* e ) +{ + active = 0; + moduleList.append(e); + connect(e, SIGNAL(started()),this,SIGNAL(searchStarted())); + connect(e, SIGNAL(finished()),this,SIGNAL(searchStopped())); + connect(e, SIGNAL(finished()),this + ,SLOT(clearModuleResults())); + connect(e, SIGNAL(progress(int)),this,SIGNAL(progressed(int))); + connect(e, SIGNAL(progressStarts(const QString&)),this + , SIGNAL(progressStarts(const QString&))); + connect(e, SIGNAL(progressEnds()),this,SIGNAL(progressEnds())); + connect(e, SIGNAL(resultFound(const SearchResult*)), this + , SLOT(addResult(const SearchResult*))); + connect(e, SIGNAL(hasError(const QString&)), this + , SIGNAL(errorInModule(const QString&))); +} + +void KBabelDictBox::saveSettings(KConfigBase *config) +{ + KConfigGroupSaver cs(config,"KBabelDict"); + + config->writeEntry("ResultSplitter",resultSplitter->sizes()); + + SearchEngine *e; + + e = moduleList.at(active); + if(e) + { + config->writeEntry("ActiveModule",e->id()); + } + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + config->setGroup(e->id()); + e->saveSettings(config); + } + + +} + +void KBabelDictBox::saveSettings(const QString& moduleId, KConfigBase *config) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == moduleId) + { + e->saveSettings(config); + break; + } + } +} + +void KBabelDictBox::readSettings(KConfigBase *config) +{ + SearchEngine *e; + KConfigGroupSaver cs(config,"KBabelDict"); + QValueList<int> sizes=config->readIntListEntry("ResultSplitter"); + if(!sizes.isEmpty()) + resultSplitter->setSizes(sizes); + + QString m = config->readEntry("ActiveModule"); + if(!m.isEmpty()) + { + setActiveModule(m); + } + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + config->setGroup(e->id()); + e->readSettings(config); + } +} + +void KBabelDictBox::readSettings(const QString& moduleId, KConfigBase *config) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == moduleId) + { + e->readSettings(config); + break; + } + } +} + +void KBabelDictBox::setAutoUpdateOptions(bool on) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + e->setAutoUpdateOptions(on); + } +} + + +int KBabelDictBox::activeModule() +{ + return active; +} + +/* + * public slot + */ +void KBabelDictBox::setActiveModule(int a) +{ + if( a == active) + return; + + if( a < (int)moduleList.count()) + { + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else if(engine->isSearching()) + { + engine->stopSearch(); + engine->clearResults(); + } + + engine = moduleList.at(a); + if(engine) + { + active = a; + emit activeModuleChanged(active); + emit activeModuleChanged(engine->isEditable()); + } + + + } +} + +void KBabelDictBox::setActiveModule(QString id) +{ + SearchEngine *e; + + int i=0; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == id) + { + setActiveModule(i); + break; + } + + i++; + } +} + +/* + * public slot + */ +void KBabelDictBox::startSearch(const QString text) +{ + clear(); + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + if(engine->isSearching()) + { + engine->stopSearch(); + connect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedSearch())); + + searchText=text; + } + else engine->startSearch(text); + } +} + +/* + * public slot + */ +void KBabelDictBox::startTranslationSearch(const QString text) +{ + clear(); + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + if(engine->isSearching()) + { + engine->stopSearch(); + connect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedTranslationSearch())); + + searchText=text; + } + else engine->startSearchInTranslation(text); + } +} + +void KBabelDictBox::startDelayedSearch(const QString text) +{ + clear(); + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + searchText=text; + + if(engine->isSearching()) + { + engine->stopSearch(); + + connect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedSearch())); + + } + else + { + QTimer::singleShot(5,this,SLOT(startDelayedSearch())); + } + } +} + +void KBabelDictBox::startDelayedTranslationSearch(const QString text) +{ + clear(); + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + searchText=text; + + if(engine->isSearching()) + { + engine->stopSearch(); + + connect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedTranslationSearch())); + + } + else + { + QTimer::singleShot(5,this,SLOT(startDelayedTranslationSearch())); + } + } +} + +QString KBabelDictBox::translate(const QString text) +{ + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + return QString::null; + } + else + { + if(engine->isSearching()) + { + engine->stopSearch(); + } + + return engine->translate(text); + } +} + +QString KBabelDictBox::fuzzyTranslation(const QString text, int &score) +{ + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + return QString::null; + } + else + { + if(engine->isSearching()) + { + engine->stopSearch(); + } + + return engine->fuzzyTranslation(text, score); + } +} + +QString KBabelDictBox::searchTranslation(const QString text, int &score) +{ + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + return QString::null; + } + else + { + if(engine->isSearching()) + { + engine->stopSearch(); + } + + return engine->searchTranslation(text, score); + } +} + +void KBabelDictBox::startDelayedSearch() +{ + clear(); + + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + disconnect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedSearch())); + + + engine->startSearch(searchText); + } +} + +void KBabelDictBox::startDelayedTranslationSearch() +{ + clear(); + + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + disconnect(this, SIGNAL(searchStopped()), this + , SLOT(startDelayedTranslationSearch())); + + + engine->startSearchInTranslation(searchText); + } +} + +/* + * public slot + */ +void KBabelDictBox::stopSearch() +{ + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + } + else + { + engine->stopSearch(); + } + +} + +bool KBabelDictBox::isSearching() +{ + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + kdDebug(KBABELDICT) << "no module available" << endl; + return false; + } + + return engine->isSearching(); +} + + +QStringList KBabelDictBox::moduleNames() +{ + QStringList list; + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + list.append(e->name()); + } + + return list; +} + +QStringList KBabelDictBox::modules() +{ + QStringList list; + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + list.append(e->id()); + } + + return list; +} + +QPtrList<ModuleInfo> KBabelDictBox::moduleInfos() +{ + QPtrList<ModuleInfo> list; + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + ModuleInfo *info = new ModuleInfo; + info->id=e->id(); + info->name=e->name(); + info->editable=e->isEditable(); + + list.append(info); + } + + return list; +} + + +QPtrList<PrefWidget> KBabelDictBox::modPrefWidgets(QWidget *parent) +{ + QPtrList<PrefWidget> list; + list.setAutoDelete(false); + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + list.append(e->preferencesWidget(parent)); + } + + return list; + +} + + +void KBabelDictBox::showResult(QListViewItem *item) +{ + ResultListItem *resultItem = static_cast<ResultListItem*>(item); + + if(!item) + { + kdError(KBABELDICT) << "no item" << endl; + if(rmbPopup) + { + rmbPopup->changeItem(editFileIndex, i18n("Edit File")); + rmbPopup->setItemEnabled(editFileIndex,false); + } + } + else + { + const SearchResult *result= resultItem->result(); + if(!result) + return; + + resultListView->ensureItemVisible(item); + + currentResult = resultListView->itemIndex(item); + currentInfo = 0; + + bool richText=resultItem->richText(); + if(richText) + { + // FIXME: what about plural forms? + origView->setText(result->found.first()); + translationView->setText(result->translation); + } + else + { + // FIXME: what about plural forms? + origView->setText(QStyleSheet::convertFromPlainText(result->found.first())); + translationView->setText( + QStyleSheet::convertFromPlainText(result->translation)); + } + + if(result->descriptions.count() > 0) + { + QPtrListIterator<TranslationInfo> it(result->descriptions); + TranslationInfo *info=it.current(); + if(info) + { + if(info->lastChange.isValid()) + { + dateLabel->setText(KGlobal::locale()->formatDate( + info->lastChange.date(),true)); + } + else + { + dateLabel->setText(""); + } + locationLabel->setText(info->location); + translatorLabel->setText(info->translator); + + if(rmbPopup) + { + if(!info->filePath.isEmpty()) + { + rmbPopup->changeItem(editFileIndex + ,i18n("Edit File %1").arg(info->location)); + rmbPopup->setItemEnabled(editFileIndex,true); + } + else + { + rmbPopup->changeItem(editFileIndex, i18n("Edit File")); + rmbPopup->setItemEnabled(editFileIndex,false); + } + } + } + } + else + { + dateLabel->setText(""); + locationLabel->setText(""); + translatorLabel->setText(""); + + rmbPopup->changeItem(editFileIndex, i18n("Edit File")); + rmbPopup->setItemEnabled(editFileIndex,false); + } + + moreButton->setEnabled((result->descriptions.count() > 1)); + + currentLabel->setText(QString::number(currentResult+1)); + + prevButton->setEnabled(currentResult > 0); + nextButton->setEnabled(currentResult+1 < total); + } + +} + +void KBabelDictBox::nextResult() +{ + QListViewItem *item=resultListView->selectedItem(); + if(item) + { + item=item->itemBelow(); + if(item) + { + resultListView->setSelected(item,true); + } + } +} + + +void KBabelDictBox::prevResult() +{ + QListViewItem *item=resultListView->selectedItem(); + if(item) + { + item=item->itemAbove(); + if(item) + { + resultListView->setSelected(item,true); + } + } + +} + +void KBabelDictBox::addResult(const SearchResult* result) +{ + SearchEngine *e; + + e = moduleList.at(active); + if(!e) + { + kdError(KBABELDICT) << "no module available" << endl; + return; + } + + QListViewItem *item=resultListView->selectedItem(); + int index=0; + if(item) + { + index=resultListView->itemIndex(item); + } + + new ResultListItem(resultListView, *result,e->usesRichTextResults()); + total++; + totalResultsLabel->setText(QString::number(total)); + + if(total==1) + { + resultListView->setSelected(resultListView->firstChild(),true); + } + else + { + nextButton->setEnabled((currentResult+1) < total); + item=resultListView->itemAtIndex(index); + if(item) + { + resultListView->setSelected(item,true); + } + } +} + +void KBabelDictBox::clear() +{ + dateLabel->setText(""); + locationLabel->setText(""); + translatorLabel->setText(""); + currentLabel->setText(QString::number(0)); + totalResultsLabel->setText(QString::number(0)); + origView->setText(""); + translationView->setText(""); + currentResult=0; + currentInfo=0; + total=0; + + resultListView->clear(); + clearModuleResults(); + + moreButton->setEnabled(false); + prevButton->setEnabled(false); + nextButton->setEnabled(false); + + if(rmbPopup) + { + rmbPopup->changeItem(editFileIndex,i18n("Edit File")); + rmbPopup->setItemEnabled(editFileIndex,false); + } +} + +void KBabelDictBox::nextInfo() +{ + ResultListItem *item = static_cast<ResultListItem*>(resultListView->selectedItem()); + + if(!item) + { + kdDebug(KBABELDICT) << "no item available" << endl; + } + else + { + const SearchResult *result = item->result(); + if(!result) + return; + + if(result->descriptions.count() > 0) + { + currentInfo++; + TranslationInfo *info; + if(currentInfo == (int)result->descriptions.count()) + { + QPtrListIterator<TranslationInfo> it(result->descriptions); + info = it.current(); + currentInfo = 0; + } + else + { + QPtrListIterator<TranslationInfo> it(result->descriptions); + for(int i=0; i < currentInfo; i++) + { + ++it; + } + info=*it; + } + + if(info->lastChange.isValid()) + { + dateLabel->setText(KGlobal::locale()->formatDate( + info->lastChange.date(),true)); + } + else + { + dateLabel->setText(""); + } + + locationLabel->setText(info->location); + translatorLabel->setText(info->translator); + + if(rmbPopup) + { + if(!info->filePath.isEmpty()) + { + rmbPopup->changeItem(editFileIndex + ,i18n("Edit File %1").arg(info->location)); + rmbPopup->setItemEnabled(editFileIndex,true); + } + else + { + rmbPopup->changeItem(editFileIndex, i18n("Edit File")); + rmbPopup->setItemEnabled(editFileIndex,false); + } + } + } + } + +} + +void KBabelDictBox::showListOnly() +{ + int h=resultSplitter->height(); + QValueList<int> sizes; + sizes.append(1); + sizes.append(h-1); + resultSplitter->setSizes(sizes); +} + +void KBabelDictBox::showDetailsOnly() +{ + int h=resultSplitter->height(); + QValueList<int> sizes; + sizes.append(h-1); + sizes.append(h); + resultSplitter->setSizes(sizes); +} + +void KBabelDictBox::clearModuleResults() +{ + SearchEngine *engine = moduleList.at(active); + if(engine) + engine->clearResults(); +} + +void KBabelDictBox::about() +{ + KAboutApplication *aboutDlg = new KAboutApplication(this); + + SearchEngine *e; + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + KAboutContainer *page = aboutDlg->addScrolledContainerPage(e->name()); + + const KAboutData *aboutData = e->about(); + if(aboutData) + { + + QString text = aboutData->programName() + " " + + aboutData->version() + "\n"; + + text += "\n"+aboutData->shortDescription()+"\n"; + + if(!aboutData->homepage().isEmpty()) + { + text += "\n" + aboutData->homepage() + "\n"; + } + if(!aboutData->otherText().isEmpty()) + { + text += "\n" + aboutData->otherText() + "\n"; + } + if(!aboutData->copyrightStatement().isEmpty()) + { + text += "\n" + aboutData->copyrightStatement() + "\n"; + } + + if(aboutData->bugAddress() != "submit@bugs.kde.org") + { + text += "\n" + i18n("Send bugs to %1") + .arg(aboutData->bugAddress()) +"\n"; + } + + QLabel *label = new QLabel(text,0); + page->addWidget(label); + + int authorCount = aboutData->authors().count(); + if(authorCount) + { + if(authorCount==1) + text=i18n("Author:"); + else + text=i18n("Authors:"); + + label = new QLabel(text,0); + page->addWidget(label); + + QValueList<KAboutPerson>::ConstIterator it; + for(it = aboutData->authors().begin(); + it != aboutData->authors().end(); ++it) + { + page->addPerson( (*it).name(), (*it).emailAddress(), + (*it).webAddress(), (*it).task() ); + } + } + int creditsCount = aboutData->credits().count(); + if(creditsCount) + { + text = i18n("Thanks to:"); + label = new QLabel(text,0); + page->addWidget(label); + + QValueList<KAboutPerson>::ConstIterator it; + for(it = aboutData->credits().begin(); + it != aboutData->credits().end(); ++it) + { + page->addPerson( (*it).name(), (*it).emailAddress(), + (*it).webAddress(), (*it).task() ); + } + + } + } + else + { + QString text = i18n("No information available."); + QLabel *label = new QLabel(text,0); + page->addWidget(label); + } + + } + + aboutDlg->setInitialSize(QSize(400,1)); + aboutDlg->exec(); + + delete aboutDlg; +} + +void KBabelDictBox::aboutActiveModule() +{ + SearchEngine *engine = moduleList.at(active); + if(!engine) + return; + + aboutModule(engine->id()); +} + +void KBabelDictBox::aboutModule(const QString& id) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == id) + { + break; + } + } + + if(!e) + return; + + AboutModuleDlg *aboutDlg = new AboutModuleDlg(e->about(),this); + aboutDlg->exec(); + + delete aboutDlg; + +} + + +void KBabelDictBox::slotNextResult() +{ + nextResult(); +} + +void KBabelDictBox::slotPrevResult() +{ + prevResult(); +} + + +void KBabelDictBox::slotStopSearch() +{ + stopSearch(); +} + +void KBabelDictBox::slotStartSearch(const QString& text) +{ + startSearch(text); +} + +void KBabelDictBox::setEditedPackage(const QString& name) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + e->setEditedPackage(name); + } +} + + +void KBabelDictBox::setEditedFile(const QString& path) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + e->setEditedFile(path); + } +} + +void KBabelDictBox::setLanguage(const QString& languageCode, + const QString& languageName) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + e->setLanguage(languageCode,languageName); + e->setLanguageCode(languageCode); + } +} + +void KBabelDictBox::copy() +{ + if(origView->hasSelectedText()) + { + origView->copy(); + } + else if(translationView->hasSelectedText()) + { + translationView->copy(); + } + else + { + QClipboard *cb = KApplication::clipboard(); + cb->setText(translation()); + } +} + +QString KBabelDictBox::translation() +{ + QString trans; + + QListViewItem *item=resultListView->selectedItem(); + if(item) + { + ResultListItem *r=static_cast<ResultListItem*>(item); + if(r) + { + const SearchResult *sr=r->result(); + if(sr) + { + if(r->richText()) + trans=sr->plainTranslation; + else + trans=sr->translation; + } + } + } + + return trans; +} + +void KBabelDictBox::setRMBMenu(QPopupMenu *popup) +{ + if(popup) + { + if(popup->count() > 0) + popup->insertSeparator(); + + editFileIndex = popup->insertItem(i18n("Edit File") + , this, SLOT(editFile())); + popup->setItemEnabled(editFileIndex,false); + + KContextMenuManager::insert(origView,popup); + KContextMenuManager::insert(origView->viewport(),popup); + KContextMenuManager::insert(translationView,popup); + KContextMenuManager::insert(translationView->viewport(),popup); + KContextMenuManager::insert(this,popup); + //KContextMenuManager::insert(resultListView->viewport(),popup); + + rmbPopup = popup; + } +} + +bool KBabelDictBox::hasSelectedText() const +{ + bool have=false; + if(origView->hasSelectedText()) + have=true; + else if(translationView->hasSelectedText()) + have=true; + else if(resultListView->selectedItem() ) + have=true; + + return have; +} + +QString KBabelDictBox::selectedText() const +{ + QString text; + if(origView->hasSelectedText()) + text=origView->selectedText(); + else if(translationView->hasSelectedText()) + translationView->selectedText(); + + return text; +} + + + +void KBabelDictBox::configure(const QString& id, bool modal) +{ + + QWidget* w = prefDialogs[id]; + if(w) + { + KWin::setActiveWindow(w->winId()); + return; + } + + SearchEngine *e; + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == id) + { + QString caption = i18n("Configure Dictionary %1").arg(e->name()); + KDialogBase *dialog = new KDialogBase(this,"prefDialog" + , modal, caption + , KDialogBase::Ok|KDialogBase::Apply|KDialogBase::Cancel| + KDialogBase::Default); + + QWhatsThis::add(dialog,""); + + PrefWidget *prefWidget = e->preferencesWidget(dialog); + dialog->setMainWidget(prefWidget); + + connect(dialog, SIGNAL(okClicked()),prefWidget,SLOT(apply())); + connect(dialog, SIGNAL(applyClicked()),prefWidget,SLOT(apply())); + connect(dialog, SIGNAL(defaultClicked()),prefWidget,SLOT(standard())); + connect(dialog, SIGNAL(cancelClicked()),prefWidget,SLOT(cancel())); + + connect(dialog, SIGNAL(finished()),this,SLOT(destroyConfigDialog())); + + prefDialogs.insert(id,dialog); + + if( modal ) dialog->exec(); + else dialog->show(); + + break; + } + } + +} + + +void KBabelDictBox::destroyConfigDialog() +{ + const QObject *obj = sender(); + if(obj && obj->inherits("KDialogBase")) + { + KDialogBase *dialog = (KDialogBase*)obj; + if(dialog) + { + dialog->delayedDestruct(); + + QDictIterator<QWidget> it(prefDialogs); + while(it.current() != dialog) + { + ++it; + } + + prefDialogs.remove(it.currentKey()); + } + } +} + +void KBabelDictBox::edit(const QString& id) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + if(e->id() == id) + { + if(e->isEditable()) + e->edit(); + + break; + } + } +} + +void KBabelDictBox::edit() +{ + SearchEngine *engine = moduleList.at(active); + if(!engine) + return; + + if(engine->isEditable()) + engine->edit(); +} + +void KBabelDictBox::setTextChanged(const QStringList& orig, + const QString& translation, uint pluralForm, const QString& description) +{ + SearchEngine *e; + + for(e = moduleList.first(); e != 0; e = moduleList.next()) + { + e->stringChanged(orig,translation,pluralForm,description); + } +} + + +void KBabelDictBox::wheelEvent(QWheelEvent *we) +{ + if(we->delta() > 0) + { + prevResult(); + } + else + { + nextResult(); + } + + we->accept(); +} + +bool KBabelDictBox::eventFilter(QObject *o, QEvent *e) +{ + if(e->type() == QEvent::Wheel) + { + QWheelEvent *we = static_cast<QWheelEvent*>(e); + if(we) + { + wheelEvent(we); + return true; + } + } + else if(e->type() == QEvent::Resize && o == resultListView) + { + if(resultListView->height() < 2) + { + detailButton->setEnabled(false); + listButton->setEnabled(true); + } + else if(resultListView->height() > resultSplitter->height()-10) + { + detailButton->setEnabled(true); + listButton->setEnabled(false); + } + else + { + detailButton->setEnabled(true); + listButton->setEnabled(true); + } + } + + return false; +} + +void KBabelDictBox::editFile() +{ + ResultListItem *item = static_cast<ResultListItem*>(resultListView->currentItem()); + + if(!item) + { + kdDebug(KBABELDICT) << "no item available" << endl; + } + else + { + const SearchResult *result = item->result(); + if(!result) + return; + + if(!result->descriptions.isEmpty()) + { + TranslationInfo *info; + QPtrListIterator<TranslationInfo> it(result->descriptions); + for(int i=0; i < currentInfo; i++) + { + ++it; + } + info=*it; + + if(!info->filePath.isEmpty()) + { + QString url = info->filePath; + QString msgid; + + if( item->richText() ) + { + msgid = result->plainFound; + } + else + { + msgid = result->found.first(); + } + + DCOPClient *dcop = kapp->dcopClient(); + + QCStringList list = dcop->registeredApplications(); + int index = list.findIndex("kbabel"); + if(index < 0) +// if(!dcop->isApplicationRegistered("kbabel")); + { + kdDebug(KBABELDICT) << "kbabel is not registered" << endl; + + QString error; + QStringList argList; + argList.append("--nosplash"); + argList.append("--gotomsgid"); + argList.append(msgid.local8Bit()); + argList.append(url.local8Bit()); + kapp->kdeinitExec("kbabel",argList,&error); + if(!error.isNull()) + { + KMessageBox::sorry(this + ,i18n("There was an error starting KBabel:\n%1") + .arg(error)); + return; + } + } + else + { + QByteArray data; + QDataStream arg(data, IO_WriteOnly); + arg << url.utf8() << msgid.utf8(); + if (!dcop->send("kbabel", "KBabelIFace" + , "gotoFileEntry(QCString,QCString)",data)) + { + KMessageBox::sorry(this + ,i18n("There was an error using DCOP.")); + } + } + } + } + } +} + +void KBabelDictBox::showContextMenu(KListView *,QListViewItem *,const QPoint& p) +{ + if(rmbPopup) + { + rmbPopup->exec(p); + } +} + + +bool KBabelDictBox::messagesForPackage(const QString& package + , QValueList<DiffEntry>& resultList, QString& error) +{ + setActiveModule("dbsearchengine"); + SearchEngine *engine = moduleList.at(active); + + if(!engine) + { + KMessageBox::sorry(this + ,i18n("The \"Translation Database\" module\n" + "appears not to be installed on your system.")); + return false; + } + + QValueList<SearchResult> rList; + + SearchFilter* filter = new SearchFilter(); + filter->setLocation(package); + + bool success = engine->messagesForFilter(filter,rList,error); + + if(success) + { + QValueList<SearchResult>::Iterator it; + for(it=rList.begin(); it != rList.end(); ++it) + { + // FIXME: what about plural forms? + DiffEntry e; + e.msgid = (*it).found.first(); + e.msgstr = (*it).translation; + resultList.append(e); + } + } + + return success; +} + +#include "kbabeldictbox.moc" + |