diff options
Diffstat (limited to 'kbabel/kbabel/kbabelview2.cpp')
-rw-r--r-- | kbabel/kbabel/kbabelview2.cpp | 1025 |
1 files changed, 1025 insertions, 0 deletions
diff --git a/kbabel/kbabel/kbabelview2.cpp b/kbabel/kbabel/kbabelview2.cpp new file mode 100644 index 00000000..c07990d0 --- /dev/null +++ b/kbabel/kbabel/kbabelview2.cpp @@ -0,0 +1,1025 @@ +/* **************************************************************************** + This file is part of KBabel + + Copyright (C) 1999-2000 by Matthias Kiefer + <matthias.kiefer@gmx.de> + 2002-2004 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 <kdatatool.h> +#include <kdebug.h> +#include <kfiledialog.h> +#include <kinputdialog.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <knotifyclient.h> +#include <kurl.h> +#include <kio/netaccess.h> + +#include <qcheckbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qmessagebox.h> +#include <qpopupmenu.h> +#include <qvbox.h> + +#include "catalogsettings.h" +#include "editcmd.h" +#include "tagextractor.h" +#include "kbabelview.h" +#include "kbabeldictbox.h" +#include "mymultilineedit.h" +#include "hidingmsgedit.h" +#include "roughtransdlg.h" +#include "kbabelsettings.h" +#include "kbprojectsettings.h" + +#include "resources.h" + +using namespace KBabel; + +QPtrList<ModuleInfo> KBabelView::dictionaries() +{ + QPtrList<ModuleInfo> list = dictBox->moduleInfos(); + + return list; +} + +void KBabelView::configureDictionary(const QString id) +{ + dictBox->configure(id); +} + +void KBabelView::editDictionary(const QString id) +{ + dictBox->edit(id); +} + + +void KBabelView::aboutDictionary(const QString id) +{ + dictBox->aboutModule(id); +} + +void KBabelView::informDictionary() +{ + if( isSearching () ) + stopSearch (); + + if( msgstrEdit->isModified() ) + dictBox->setTextChanged(_catalog->msgid(_currentIndex,true) + ,*(_catalog->msgstr(_currentIndex).at(msgstrEdit->currentForm())) + ,msgstrEdit->currentForm() + ,_catalog->comment(_currentIndex)); +} + +void KBabelView::setNewLanguage() +{ + IdentitySettings s = _catalog->identitySettings(); + + dictBox->setLanguage(s.languageCode, s.languageName); + + // setup new plural form number + int form = msgstrEdit->currentForm(); + if( form >= s.numberOfPluralForms ) + form = s.numberOfPluralForms-1; + + msgstrEdit->setNumberOfPlurals (s.numberOfPluralForms); + updateSettings(); + + if (! _catalog->currentURL().isEmpty()) + { + updateEditor( form ); + } +} + + +void KBabelView::wheelEvent(QWheelEvent *e) +{ + if( _catalog->numberOfEntries() == 0 ) return; + + if( (e->state() & ControlButton) && (e->state() & AltButton)) + { + if(e->delta() > 0) + { + gotoPrevFuzzyOrUntrans(); + } + else + { + gotoNextFuzzyOrUntrans(); + } + } + else if(e->state() & ControlButton) + { + if(e->delta() > 0) + { + gotoPrevFuzzy(); + } + else + { + gotoNextFuzzy(); + } + } + else if(e->state() & AltButton) + { + if(e->delta() > 0) + { + gotoPrevUntranslated(); + } + else + { + gotoNextUntranslated(); + } + } + else + { + if(e->delta() > 0) + { + gotoPrev(); + } + else + { + gotoNext(); + } + } + + e->accept(); +} + + + +void KBabelView::roughTranslation() +{ + RoughTransDlg *dlg = new RoughTransDlg(dictBox, _catalog, this + , "roughtransDlg"); + + dlg->exec(); + + delete dlg; +} + + +void KBabelView::updateTags() +{ + bool hadTags = _tags.count() > 0; + + _tags = _catalog->tagList(_currentIndex); + + if(_tagsMenu) + { + _tagsMenu->clear(); + + QStringList tList; + QStringList::Iterator it; + int counter=0; + for(it=_tags.begin(); it!=_tags.end(); ++it) + { + QString s = *it; + if( s.startsWith("&") ) s = "&"+s; + if(!tList.contains(s)) + { + _tagsMenu->insertItem(s,counter); + tList.append(s); + } + counter++; + } + } + + bool haveTags = (_tags.count() > 0); + + if(isReadOnly()) + haveTags=false; + + if(haveTags != hadTags) + { + emit signalNextTagAvailable(haveTags); + emit signalTagsAvailable(haveTags); + } + + _currentTag = 0; + + if(haveTags) + { + _tagExtractor->setString(_catalog->msgid(_currentIndex).first()); + } + // if there is no tag, it will set invalid tag + selectTag(); +} + +void KBabelView::skipToNextTag() +{ + if( (uint)_currentTag >= _tags.count()-1 ) return; + ++_currentTag; + selectTag(); +} + +void KBabelView::skipToPreviousTag() +{ + if( _currentTag == 0 ) return; + --_currentTag; + selectTag(); +} + +void KBabelView::selectTag() +{ + if( _tagExtractor->countMatches() == 0 ) { + // no tags, select none + kdDebug() << "No tags" << endl; + msgidLabel->selectTag(0,0); + return; + } + + // count number of eofs in tag + uint diff=0; + // FIXME: what about plural forms + QString msgid = _catalog->msgid(_currentIndex).first(); + + for( uint i = _tagExtractor->matchIndex(_currentTag); i < _tagExtractor->matchIndex(_currentTag)+_tags[_currentTag].length()+1; i++ ) + { + if( msgid[i] == '\n' ) diff++; + } + msgidLabel->selectTag(_tagExtractor->matchIndex(_currentTag),_tags[_currentTag].length()+diff); + emit signalNextTag (_currentTag); +} + +void KBabelView::setTagsMenu(QPopupMenu *menu) +{ + _tagsMenu=menu; + + connect(_tagsMenu,SIGNAL(activated(int)),this,SLOT(insertTag(int))); +} + +void KBabelView::modifyMsgstrText(const uint offset, const QString& text, bool clearFirst) +{ + _catalog->applyBeginCommand( _currentIndex, Msgstr ,this); + + if( clearFirst ) msgstrEdit->clear(); + + InsTextCmd* insCmd = new InsTextCmd(offset,text,msgstrEdit->currentForm()); + insCmd->setPart(Msgstr); + insCmd->setIndex(_currentIndex); + + msgstrEdit->processCommand(insCmd,false); + forwardMsgstrEditCmd(insCmd); + + _catalog->applyEndCommand(_currentIndex, Msgstr,this); + + autoCheck( true ); // check it NOW - it should not be needed, but it is, I don't know why :-( +} + +void KBabelView::insertTag(int n) +{ + QString tag = _tagsMenu->text(n); + if( tag.startsWith( "&&" ) ) tag = tag.remove(0,1); // replace && -> &. && is used for correct menu display + + modifyMsgstrText( msgstrEdit->currentIndex(), tag ); +} + +void KBabelView::insertNextTag() +{ + if(_currentTag >= (int)_tags.count()) + { + KNotifyClient::beep(); + return; + } + + int offset = msgstrEdit->currentIndex(); + + _currentTag++; + selectTag(); + + modifyMsgstrText( offset, _tags[_currentTag-1] ); +} + +void KBabelView::insertNextTagMsgid() +{ + TagExtractor extractor; + + int offset = msgstrEdit->beginOfLastMarkedText(); //msgstrEdit->currentIndex(); + + QString s = (*_catalog->msgstr(_currentIndex).at(msgstrEdit->currentForm())).left(offset); + + QString t; + + if( _catalog->pluralForm( _currentIndex ) == KDESpecific ) + { + int pos = msgstrEdit->currentIndex(); + int currentFormBegin=s.findRev("\\n",pos); + if( currentFormBegin == -1 ) currentFormBegin=0; + else currentFormBegin+=3; // skip the newline + int currentFormEnd=s.find("\\n",pos); + if( currentFormEnd == -1 ) currentFormEnd=s.length(); + + s=s.mid(currentFormBegin,currentFormEnd-currentFormBegin); + } + + extractor.setString(s); + uint num= extractor.countMatches(); + if(num >= _tags.count()) + { + KNotifyClient::beep(); + return; + } + + t=_tags[num]; + + modifyMsgstrText( offset, t ); +} + +void KBabelView::showTagsMenu() +{ + if(_tagsMenu && _tags.count() > 0) + { + int y=msgstrEdit->height()/2; + int x=msgstrEdit->width()/2; + _tagsMenu->exec(msgstrEdit->mapToGlobal( QPoint(x,y) ) ); + + return; + } +} + + +void KBabelView::updateArgs() +{ + bool hadArgs = _args.count() > 0; + + _args = _catalog->argList(_currentIndex); + + if(_argsMenu) + { + _argsMenu->clear(); + + QStringList tList; + QStringList::Iterator it; + int counter=0; + for(it=_args.begin(); it!=_args.end(); ++it) + { + QString s = *it; + if(!tList.contains(s)) + { + _argsMenu->insertItem(s,counter); + tList.append(s); + } + counter++; + } + } + + bool haveArgs = (_args.count() > 0); + + if(isReadOnly()) + haveArgs=false; + + if(haveArgs != hadArgs) + { + emit signalNextArgAvailable(haveArgs); + emit signalArgsAvailable(haveArgs); + } +} + +void KBabelView::setArgsMenu(QPopupMenu *menu) +{ + _argsMenu=menu; + + connect(_argsMenu,SIGNAL(activated(int)),this,SLOT(insertArg(int))); +} + + +void KBabelView::insertArg(int n) +{ + QString arg = _argsMenu->text(n); + + modifyMsgstrText( msgstrEdit->currentIndex(), arg ); +} + +void KBabelView::insertNextArg() +{ + int offset = msgstrEdit->currentIndex(); + + QString s = (*_catalog->msgstr(_currentIndex).at(msgstrEdit->currentForm())).left(offset); + + if( _catalog->pluralForm( _currentIndex ) == KDESpecific ) + { + int pos = msgstrEdit->currentIndex(); + int currentFormBegin=s.findRev("\\n",pos); + if( currentFormBegin == -1 ) currentFormBegin=0; + else currentFormBegin+=3; // skip the newline + int currentFormEnd=s.find("\\n",pos); + if( currentFormEnd == -1 ) currentFormEnd=s.length(); + + s=s.mid(currentFormBegin,currentFormEnd-currentFormBegin); + } + + _argExtractor->setString(s); + uint num=_argExtractor->countMatches(); + if(num >= _args.count()) + { + KNotifyClient::beep(); + return; + } + + QString t=_args[num]; + + modifyMsgstrText( offset,t ); +} + +void KBabelView::showArgsMenu() +{ + if(_argsMenu && _args.count() > 0) + { + int y=msgstrEdit->height()/2; + int x=msgstrEdit->width()/2; + _argsMenu->exec(msgstrEdit->mapToGlobal( QPoint(x,y) ) ); + + return; + } +} + + +void KBabelView::diff() +{ + diffInternal(false); + msgstrEdit->setFocus(); +} + +void KBabelView::diffShowOrig() +{ + msgidLabel->setText(_catalog->msgid(_currentIndex)); + msgidLabel->forceUpdate(); + msgstrEdit->setFocus(); +} + +void KBabelView::toggleAutoDiff(bool on) +{ + if(on != _diffEnabled) + { + _diffEnabled = on; + + if(on) + { + diff(); + } + else + { + diffShowOrig(); + } + } +} + +void KBabelView::autoDiff() +{ + diffInternal(true); +} + +void KBabelView::diffInternal(bool autoDf) +{ + if(_diffing || _loadingDiffFile) + { + return; + } + + _diffing = true; + uint diffIndex = _currentIndex; + + QString diffString; + + Catalog::DiffResult r = _catalog->diff(_currentIndex, &diffString); + + if(r == Catalog::DiffNeedList) + { + switch( _project->settings()->useDBForDiff() ) + { + case 1: + { + _loadingDiffFile=true; + bool wasEnabled=_diffEnabled; + _diffEnabled=false; + + QValueList<DiffEntry> diffList; + QString error; + QString package = _catalog->packageName()+".po"; + kdDebug(KBABEL) << "getting list for " << package << endl; + + if(dictBox->messagesForPackage(package,diffList,error)) + { + kdDebug(KBABEL) << "got " << diffList.count() + << " messages" << endl; + _catalog->setDiffList(diffList); + } + else + { + KMessageBox::sorry(this + ,i18n("An error occurred while trying to get the list " + "of messages for this file from the database:\n" + "%1").arg(error)); + + _diffing=false; + _diffEnabled=false; + _loadingDiffFile=false; + emit signalDiffEnabled(false); + + return; + } + + _diffEnabled=wasEnabled; + _loadingDiffFile=false; + break; + } + case 0: + { + _diffing=false; + if(!openDiffFile(true)) + { + _diffEnabled=false; + emit signalDiffEnabled(false); + + _diffing=false; + return; + } + + _diffing = true; + break; + } + case 2: + { + // get the list of all entries + QValueList<DiffEntry> diffList = _catalog->asDiffList(); + + QValueList<DiffEntry> resultList; + + // swap msgstr and msgid + QValueList<DiffEntry>::iterator it; + DiffEntry entry; + + for ( it = diffList.begin(); it != diffList.end(); ++it ) + { + entry.msgstr = (*it).msgid; + // if there is no translation, do not show difference + if( !(*it).msgstr.isEmpty() ) + { + entry.msgid = (*it).msgstr; + } + else + { + entry.msgid = (*it).msgid; + } + resultList.append(entry); + } + + // set as a source for diff + _catalog->setDiffList(resultList); + + _diffing=false; + _diffEnabled=true; + _loadingDiffFile=false; + emit signalDiffEnabled(true); + } + } + + diffIndex = _currentIndex; + r = _catalog->diff(_currentIndex, &diffString); + } + + // if the index changed in the meanwhile + while(diffIndex != _currentIndex) + { + diffIndex=_currentIndex; + r = _catalog->diff(_currentIndex,&diffString); + } + + if(r == Catalog::DiffOk) + { + msgidLabel->setText(diffString); + msgidLabel->forceUpdate(); + + // FIXME: should care about plural forms + if(diffString == _catalog->msgid(_currentIndex).first() ) + { + emit signalChangeStatusbar(i18n("No difference found")); + } + else + { + emit signalChangeStatusbar(i18n("Difference found")); + } + } + else + { + if(!autoDf) + { + KMessageBox::information(this + ,i18n("No corresponding message found.")); + } + else + { + emit signalChangeStatusbar( + i18n("No corresponding message found")); + } + } + + _diffing = false; +} + +bool KBabelView::openDiffFile() +{ + return openDiffFile(false); +} + +bool KBabelView::openDiffFile(bool autoDiff) +{ + if(_diffing || _loadingDiffFile) + return false; + + KURL url; + + if( autoDiff && ! _project->settings()->diffBaseDir().isEmpty() ) + { + KURL fileURL = _catalog->currentURL(); + + KURL poBaseURL( _project->catManSettings().poBaseDir ); + + QString poBase = poBaseURL.path(); + int len = poBase.length(); + if(fileURL.path().left(len) == poBase) + { + QString fileRelPath = fileURL.path().mid(len); + if(fileRelPath[0] == '/') + fileRelPath=fileRelPath.mid(1); + + if(_project->settings()->diffBaseDir().right(1) != "/") + _project->settings()->diffBaseDir() += '/'; + + QString diffFilePath = _project->settings()->diffBaseDir() + fileRelPath; + + + KURL diffFileURL(diffFilePath); + + if(diffFileURL.isValid() && KIO::NetAccess::exists(diffFileURL,true,NULL)) + { + url = diffFileURL; + + kdDebug(KBABEL) << "using file " << diffFileURL.prettyURL() + << " as diff file" << endl; + } + } + } + + + if(url.isEmpty()) + { + url = KFileDialog::getOpenURL(_project->settings()->diffBaseDir(), +"application/x-gettext", this, i18n("Select File to Diff With")); + } + + if(url.isEmpty()) + return false; + + _loadingDiffFile=true; + bool wasEnabled=_diffEnabled; + _diffEnabled=false; + + + Catalog cat; + + connect(&cat,SIGNAL(signalProgress(int)),this,SIGNAL(signalProgress(int))); + emit signalResetProgressBar(i18n("loading file for diff"),100); + + ConversionStatus stat = cat.openURL(url); + + emit signalClearProgressBar(); + + + if(stat != OK && stat != RECOVERED_PARSE_ERROR) + { + switch(stat) + { + case PARSE_ERROR: + { + KMessageBox::sorry(this + ,i18n("Error while trying to read file:\n %1\n" + "Maybe it is not a valid PO file.").arg(url.prettyURL())); + break; + } + case NO_PERMISSIONS: + { + KMessageBox::sorry(this,i18n( + "You do not have permissions to read file:\n %1") + .arg(url.prettyURL())); + break; + } + case NO_FILE: + { + KMessageBox::sorry(this,i18n( + "You have not specified a valid file:\n %1") + .arg(url.prettyURL())); + break; + } + case NO_PLUGIN: + { + KMessageBox::error(this,i18n( + "KBabel cannot find a corresponding plugin for the MIME type of the file:\n %1").arg(url.prettyURL())); + break; + } + case UNSUPPORTED_TYPE: + { + KMessageBox::error(this,i18n( + "The import plugin cannot handle this type of the file:\n %1").arg(url.prettyURL())); + break; + } + default: + { + KMessageBox::sorry(this,i18n( + "Error while trying to open file:\n %1") + .arg(url.prettyURL())); + break; + } + + } + + _diffEnabled=wasEnabled; + _loadingDiffFile=false; + + return false; + } + + _catalog->setDiffList( cat.asDiffList() ); + + _diffEnabled=wasEnabled; + _loadingDiffFile=false; + + return true; +} + +void KBabelView::showTryLaterMessageBox() +{ + if( !_showTryLaterBox ) return; + + KDialogBase *dialog= new KDialogBase( + i18n("Information"), + KDialogBase::Yes, + KDialogBase::Yes, KDialogBase::Yes, + this, "information", true, true, + KStdGuiItem::ok() ); + + QVBox *topcontents = new QVBox (dialog); + topcontents->setSpacing(KDialog::spacingHint()*2); + topcontents->setMargin(KDialog::marginHint()*2); + + QWidget *contents = new QWidget(topcontents); + QHBoxLayout * lay = new QHBoxLayout(contents); + lay->setSpacing(KDialog::spacingHint()*2); + + lay->addStretch(1); + QLabel *label1 = new QLabel( contents); + label1->setPixmap(QMessageBox::standardIcon(QMessageBox::Information)); + lay->add( label1 ); + QLabel *label2 = new QLabel( i18n("The search string has not been found yet.\n" + "However, the string might be found " + "in the files being searched at the moment.\n" + "Please try later."), contents); + label2->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::ExpandTabs | Qt::WordBreak ); + label2->setMinimumSize(label2->sizeHint()); + lay->add( label2 ); + lay->addStretch(1); + + QCheckBox *checkbox = new QCheckBox(i18n("Do not show in this find/replace session again"), topcontents); + + dialog->setMainWidget(topcontents); + dialog->enableButtonSeparator(false); + dialog->incInitialSize( QSize(50,0) ); + + dialog->exec(); + + _showTryLaterBox = !checkbox->isChecked(); + delete dialog; +} + +void KBabelView::setFilePackage() +{ + bool result=false; + QString p = KInputDialog::getText(QString::null, i18n("Enter new package for the current file:"),_catalog->package(),&result,this); + if( result ) + { + _catalog->setPackage(p); + emit signalChangeCaption(p); + } +} + +void KBabelView::insertTagFromTool( const QString& tag ) +{ + modifyMsgstrText(msgstrEdit->currentIndex(),tag); + + msgstrEdit->setFocus(); +} + +void KBabelView::skipToTagFromTool( int index ) +{ + _currentTag = index; + selectTag(); +} + +void KBabelView::plural2msgstr() +{ + int currentFormBegin, currentFormEnd, pos; + uint i; + + QStringList msgs = _catalog->msgstr(_currentIndex); + QString text= *msgs.at(msgstrEdit->currentForm()); + uint numForms = _catalog->numberOfPluralForms(_currentIndex); + + if( text.isEmpty() || _catalog->pluralForm(_currentIndex) == NoPluralForm) return; + + + QString result; + + switch( _catalog->pluralForm(_currentIndex) ) + { + case Gettext: + + _catalog->applyBeginCommand( _currentIndex, Msgstr ,this); + + i=0; + for( QStringList::Iterator it=msgs.begin() ; it!=msgs.end() ; ++it ) + { + if( i!= msgstrEdit->currentForm() ) + { + // clear first + DelTextCmd* insCmd = new DelTextCmd(0,(*it),i); + insCmd->setPart(Msgstr); + insCmd->setIndex(_currentIndex); + msgstrEdit->processCommand(insCmd,false); + forwardMsgstrEditCmd(insCmd); + + // insert text + insCmd = new InsTextCmd(0,text,i); + insCmd->setPart(Msgstr); + insCmd->setIndex(_currentIndex); + msgstrEdit->processCommand(insCmd,false); + forwardMsgstrEditCmd(insCmd); + } + i++; + } + + // fill the non-initialized ones + while (i != numForms) + { + // insert text + DelTextCmd* insCmd = new InsTextCmd(0,text,i); + insCmd->setPart(Msgstr); + insCmd->setIndex(_currentIndex); + msgstrEdit->processCommand(insCmd,false); + forwardMsgstrEditCmd(insCmd); + i++; + } + + _catalog->applyEndCommand( _currentIndex, Msgstr ,this); + + break; + + case KDESpecific: + { + pos = msgstrEdit->currentIndex(); + currentFormBegin=text.findRev("\\n",pos); + if( currentFormBegin == -1 ) currentFormBegin=0; + else currentFormBegin+=3; // skip the newline + currentFormEnd=text.find("\\n",pos); + if( currentFormEnd == -1 ) currentFormEnd=text.length(); + + text=text.mid(currentFormBegin,currentFormEnd-currentFormBegin); + + QString result=text; + for( i=1; i<numForms ; i++ ) + result+="\\n\n"+text; + + modifyMsgstrText( 0, result, true ); + } + break; + + case NoPluralForm: break; + } + +} + +bool KBabelView::validateUsingTool( const KDataToolInfo & info, const QString &command ) +{ + if(currentURL().isEmpty()) + return false; + + KDataTool* tool = info.createTool(); + if( !tool ) + { + kdWarning() << "Cannot create tool" << endl; + return false; + } + + bool result=_catalog->checkUsingTool(tool); + emitEntryState(); + + QString checkName = *(info.userCommands().at( info.commands().findIndex(command) )); + + if(result) + { + KMessageBox::information(this + ,i18n("No mismatch has been found.") + ,checkName); + } + else + { + int index=0; + DocPosition pos; + + if(!_catalog->hasError(0,pos)) + index = _catalog->nextError(0,pos); + if(index>=0) + { + kdDebug(KBABEL) << "Going to " << pos.item << ", " << pos.form << endl; + gotoEntry(pos); + } + + KMessageBox::error(this + ,i18n("Some mismatches have been found.\n" + "Please check the questionable entries by using " + "Go->Next error") + ,checkName); + } + delete tool; + + return result; +} + +void KBabelView::modifyUsingTool( const KDataToolInfo & info, const QString &command ) +{ + KDataTool* tool = info.createTool(); + if( !tool ) + { + kdWarning() << "Cannot create tool" << endl; + return; + } + + // do some stuff on all entries + _catalog->modifyUsingTool(tool, command); + + delete tool; +} + +void KBabelView::modifyCatalogUsingTool( const KDataToolInfo & info, const QString &command ) +{ + KDataTool* tool = info.createTool(); + if( !tool ) + { + kdWarning() << "Cannot create tool" << endl; + return; + } + + // do some stuff on the catalog + tool->run(command, _catalog, "Catalog", "application/x-kbabel-catalog"); + + delete tool; +} + +void KBabelView::insertChar( QChar ch ) +{ + if( isReadOnly() || _catalog->package().isEmpty() ) + return; + + modifyMsgstrText(msgstrEdit->currentIndex(),ch); + msgstrEdit->setFocus(); +} + +void KBabelView::wordCount() +{ + uint total, untranslated, fuzzy; + + _catalog->wordCount( total, fuzzy, untranslated ); + + KMessageBox::information( this + , i18n("Total words: %1\n\n" +"Words in untranslated messages: %2\n\n" +"Words in fuzzy messages: %3").arg(total).arg(untranslated).arg(fuzzy) + , i18n("Word Count") ); +} |