diff options
Diffstat (limited to 'tqtinterface/qt4/tools/linguist/linguist/trwindow.cpp')
-rw-r--r-- | tqtinterface/qt4/tools/linguist/linguist/trwindow.cpp | 2072 |
1 files changed, 2072 insertions, 0 deletions
diff --git a/tqtinterface/qt4/tools/linguist/linguist/trwindow.cpp b/tqtinterface/qt4/tools/linguist/linguist/trwindow.cpp new file mode 100644 index 0000000..8ebc932 --- /dev/null +++ b/tqtinterface/qt4/tools/linguist/linguist/trwindow.cpp @@ -0,0 +1,2072 @@ +/********************************************************************** +** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. +** +** This file is part of TQt Linguist. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** Licensees holding valid TQt Commercial licenses may use this file in +** accordance with the TQt Commercial License Agreement provided with +** the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +/* TRANSLATOR TrWindow + + This is the application's main window. +*/ + +#include "trwindow.h" +#include "listviews.h" +#include "finddialog.h" +#include "msgedit.h" +#include "phrasebookbox.h" +#include "printout.h" +#include "about.h" +#include "phraselv.h" +#include "statistics.h" + +#include <tqaccel.h> +#include <tqaction.h> +#include <tqapplication.h> +#include <tqbitmap.h> +#include <tqdict.h> +#include <tqdockarea.h> +#include <tqdockwindow.h> +#include <tqfile.h> +#include <tqfiledialog.h> +#include <tqfileinfo.h> +#include <tqheader.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqmenubar.h> +#include <tqmessagebox.h> +#include <tqpopupmenu.h> +#include <tqregexp.h> +#include <tqsettings.h> +#include <tqstatusbar.h> +#include <tqtoolbar.h> +#include <tqwhatsthis.h> +#include <tqprocess.h> +#include <tqobject.h> +#include <tqassistantclient.h> + +#include <stdlib.h> + +#define pagecurl_mask_width 53 +#define pagecurl_mask_height 51 +static const uchar pagecurl_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 }; + +typedef TQValueList<MetaTranslatorMessage> TML; + +static const int ErrorMS = 600000; // for error messages +static const int MessageMS = 2500; + +TQPixmap * TrWindow::pxOn = 0; +TQPixmap * TrWindow::pxOff = 0; +TQPixmap * TrWindow::pxObsolete = 0; +TQPixmap * TrWindow::pxDanger = 0; + +enum Ending { End_None, End_FullStop, End_Interrobang, End_Colon, + End_Ellipsis }; + +static Ending ending( TQString str ) +{ + str = str.simplifyWhiteSpace(); + int ch = 0; + if ( !str.isEmpty() ) + ch = str.right( 1 )[0].tqunicode(); + + switch ( ch ) { + case 0x002e: // full stop + if ( str.endsWith(TQString("...")) ) + return End_Ellipsis; + else + return End_FullStop; + case 0x0589: // armenian full stop + case 0x06d4: // arabic full stop + case 0x3002: // ideographic full stop + return End_FullStop; + case 0x0021: // exclamation mark + case 0x003f: // question mark + case 0x00a1: // inverted exclamation mark + case 0x00bf: // inverted question mark + case 0x01c3: // latin letter retroflex click + case 0x037e: // greek question mark + case 0x061f: // arabic question mark + case 0x203c: // double exclamation mark + case 0x203d: // interrobang + case 0x2048: // question exclamation mark + case 0x2049: // exclamation question mark + case 0x2762: // heavy exclamation mark ornament + return End_Interrobang; + case 0x003a: // colon + return End_Colon; + case 0x2026: // horizontal ellipsis + return End_Ellipsis; + default: + return End_None; + } +} + +class Action : public TQAction +{ +public: + Action( TQPopupMenu *pop, const TQString& menuText, TQObject *receiver, + const char *member, const TQString &imageName = TQString(), + int accel = 0, bool toggle = FALSE ); + Action( TQPopupMenu *pop, const TQString& menuText, int accel = 0, + bool toggle = FALSE ); + + virtual void setWhatsThis( const TQString& whatsThis ); + + bool addToToolbar( TQToolBar *tb, const TQString& text ); +}; + +Action::Action( TQPopupMenu *pop, const TQString& menuText, TQObject *receiver, + const char *member, const TQString &imageName, int accel, + bool toggle ) + : TQAction( pop->tqparent(), (const char *) 0, toggle ) +{ + setMenuText( menuText ); + setAccel( accel ); + + if ( !imageName.isEmpty() ) { + TQPixmap enabledPix = TQPixmap::fromMimeSource( imageName ); + TQIconSet s( enabledPix ); + if ( imageName != "whatsthis.xpm" ) { + TQPixmap disabledPix = TQPixmap::fromMimeSource( "d_" + imageName ); + s.setPixmap( disabledPix, TQIconSet::Small, TQIconSet::Disabled ); + } + setIconSet( s ); + } + TQAction::addTo( pop ); + connect( this, TQT_SIGNAL(activated()), receiver, member ); +} + +Action::Action( TQPopupMenu *pop, const TQString& menuText, int accel, + bool toggle ) + : TQAction( pop->tqparent(), (const char *) 0, toggle ) +{ + TQAction::addTo( pop ); + setMenuText( menuText ); + setAccel( accel ); +} + +void Action::setWhatsThis( const TQString& whatsThis ) +{ + TQAction::setWhatsThis( whatsThis ); + setStatusTip( whatsThis ); +} + +bool Action::addToToolbar( TQToolBar *tb, const TQString& text ) +{ + setText( text ); + return TQAction::addTo( tb ); +} + +const TQPixmap TrWindow::pageCurl() +{ + TQPixmap pixmap; + pixmap = TQPixmap::fromMimeSource( "pagecurl.png" ); + if ( !pixmap.isNull() ) { + TQBitmap pageCurlMask( pagecurl_mask_width, pagecurl_mask_height, + pagecurl_mask_bits, TRUE ); + pixmap.setMask( pageCurlMask ); + } + + return pixmap; +} + +TrWindow::TrWindow() + : TQMainWindow( 0, "translation window", (WFlags)(TQt::WType_TopLevel | TQt::WDestructiveClose) ) +{ + +#ifndef TQ_WS_MACX + setIcon( TQPixmap::fromMimeSource( "appicon.png" ) ); +#endif + + // Create the application global listview symbols + pxOn = new TQPixmap( TQPixmap::fromMimeSource( "s_check_on.png" ) ); + pxOff = new TQPixmap( TQPixmap::fromMimeSource( "s_check_off.png" ) ); + pxObsolete = new TQPixmap( TQPixmap::fromMimeSource( "d_s_check_obs.png" ) ); + pxDanger = new TQPixmap( TQPixmap::fromMimeSource( "s_check_danger.png" ) ); + + // Set up the Scope dock window + TQDockWindow * dwScope = new TQDockWindow( TQDockWindow::InDock, this, + "context"); + dwScope->setResizeEnabled( TRUE ); + dwScope->setCloseMode( TQDockWindow::Always ); + addDockWindow( dwScope, tqtr("Context"), TQt::DockLeft ); + dwScope->setCaption( tqtr("Context") ); + dwScope->setFixedExtentWidth( 200 ); + lv = new TQListView( dwScope, "context list view" ); + lv->setShowSortIndicator( TRUE ); + lv->setAllColumnsShowFocus( TRUE ); + lv->header()->setStretchEnabled( TRUE, 1 ); + TQFontMetrics fm( font() ); + lv->addColumn( tqtr("Done"), fm.width( tqtr("Done") ) + 10 ); + lv->addColumn( tqtr("Context") ); + lv->addColumn( tqtr("Items"), 55 ); + lv->setColumnAlignment( 0, TQt::AlignCenter ); + lv->setColumnAlignment( 2, TQt::AlignRight ); + lv->setSorting( 0 ); + lv->setHScrollBarMode( TQScrollView::AlwaysOff ); + dwScope->setWidget( lv ); + + messageIsShown = FALSE; + me = new MessageEditor( &tor, this, "message editor" ); + setCentralWidget( me ); + slv = me->sourceTextList(); + plv = me->phraseList(); + + setupMenuBar(); + setupToolBars(); + + progress = new TQLabel( statusBar(), "progress" ); + statusBar()->addWidget( progress, 0, TRUE ); + modified = new TQLabel( TQString(" %1 ").arg(tqtr("MOD")), statusBar(), + "modified?" ); + statusBar()->addWidget( modified, 0, TRUE ); + + dirtyItem = -1; + numFinished = 0; + numNonobsolete = 0; + numMessages = 0; + updateProgress(); + + dirty = FALSE; + updateCaption(); + + phraseBooks.setAutoDelete( TRUE ); + + f = new FindDialog( FALSE, this, "tqfind", FALSE ); + f->setCaption( tqtr("TQt Linguist") ); + h = new FindDialog( TRUE, this, "tqreplace", FALSE ); + h->setCaption( tqtr("TQt Linguist") ); + tqfindMatchCase = FALSE; + tqfindWhere = 0; + foundItem = 0; + foundScope = 0; + foundWhere = 0; + foundOffset = 0; + + connect( lv, TQT_SIGNAL(selectionChanged(TQListViewItem *)), + this, TQT_SLOT(showNewScope(TQListViewItem *)) ); + + connect( slv, TQT_SIGNAL(currentChanged(TQListViewItem *)), + this, TQT_SLOT(showNewCurrent(TQListViewItem *)) ); + + connect( slv, TQT_SIGNAL(clicked(TQListViewItem *, const TQPoint&, int)), + this, TQT_SLOT(showNewCurrent(TQListViewItem *)) ); + + connect( slv, TQT_SIGNAL(clicked(TQListViewItem *, const TQPoint&, int)), + this, TQT_SLOT(toggleFinished(TQListViewItem *, const TQPoint&, int)) ); + + connect( me, TQT_SIGNAL(translationChanged(const TQString&)), + this, TQT_SLOT(updateTranslation(const TQString&)) ); + connect( me, TQT_SIGNAL(finished(bool)), this, TQT_SLOT(updateFinished(bool)) ); + connect( me, TQT_SIGNAL(prevUnfinished()), this, TQT_SLOT(prevUnfinished()) ); + connect( me, TQT_SIGNAL(nextUnfinished()), this, TQT_SLOT(nextUnfinished()) ); + connect( me, TQT_SIGNAL(focusSourceList()), this, TQT_SLOT(focusSourceList()) ); + connect( me, TQT_SIGNAL(focusPhraseList()), this, TQT_SLOT(focusPhraseList()) ); + connect( f, TQT_SIGNAL(tqfindNext(const TQString&, int, bool)), + this, TQT_SLOT(tqfindNext(const TQString&, int, bool)) ); + + TQWhatsThis::add( lv, tqtr("This panel lists the source contexts.") ); + + TQWhatsThis::add( slv, tqtr("This panel lists the source texts. " + "Items that violate validation rules " + "are marked with a warning.") ); + showNewCurrent( 0 ); + + TQSize as( tqApp->desktop()->size() ); + as -= TQSize( 30, 30 ); + resize( TQSize( 1000, 800 ).boundedTo( as ) ); + readConfig(); + stats = 0; + srcWords = 0; + srcChars = 0; + srcCharsSpc = 0; +} + +TrWindow::~TrWindow() +{ + writeConfig(); + delete stats; +} + +void TrWindow::openFile( const TQString& name ) +{ + if ( !name.isEmpty() ) { + statusBar()->message( tqtr("Loading...") ); + tqApp->processEvents(); + tor.clear(); + if ( tor.load(name) ) { + slv->clear(); + slv->tqrepaint(); + slv->viewport()->tqrepaint(); + slv->setUpdatesEnabled( FALSE ); + slv->viewport()->setUpdatesEnabled( FALSE ); + lv->clear(); + lv->tqrepaint(); + lv->viewport()->tqrepaint(); + lv->setUpdatesEnabled( FALSE ); + lv->viewport()->setUpdatesEnabled( FALSE ); + setEnabled( FALSE ); + numFinished = 0; + numNonobsolete = 0; + numMessages = 0; + foundScope = 0; + + TML all = tor.messages(); + TML::Iterator it; + TQDict<ContextLVI> contexts( 1009 ); + + srcWords = 0; + srcChars = 0; + srcCharsSpc = 0; + for ( it = all.begin(); it != all.end(); ++it ) { + tqApp->processEvents(); + ContextLVI *c = contexts.tqfind( TQString((*it).context()) ); + if ( c == 0 ) { + c = new ContextLVI( lv, tor.toUnicode((*it).context(), + (*it).utf8()) ); + contexts.insert( TQString((*it).context()), c ); + } + if ( TQCString((*it).sourceText()) == ContextComment ) { + c->appendToComment( tor.toUnicode((*it).comment(), + (*it).utf8()) ); + } else { + MessageLVI * tmp = new MessageLVI( slv, *it, + tor.toUnicode((*it).sourceText(), + (*it).utf8()), + tor.toUnicode((*it).comment(), + (*it).utf8()), c ); + tmp->setDanger( danger(tmp->sourceText(), + tmp->translation()) && + tmp->message().type() == + MetaTranslatorMessage::Finished ); + c->instantiateMessageItem( slv, tmp ); + if ( (*it).type() != MetaTranslatorMessage::Obsolete ) { + numNonobsolete++; + if ( (*it).type() == MetaTranslatorMessage::Finished ) + numFinished++; + doCharCounting( tmp->sourceText(), srcWords, srcChars, srcCharsSpc ); + } else { + c->incrementObsoleteCount(); + } + numMessages++; + } + c->updatetqStatus(); + } + slv->viewport()->setUpdatesEnabled( TRUE ); + slv->setUpdatesEnabled( TRUE ); + lv->viewport()->setUpdatesEnabled( TRUE ); + lv->setUpdatesEnabled( TRUE ); + setEnabled( TRUE ); + slv->tqrepaint(); + slv->viewport()->tqrepaint(); + lv->triggerUpdate(); + updateProgress(); + filename = name; + dirty = FALSE; + updateCaption(); + me->showNothing(); + doneAndNextAct->setEnabled( FALSE ); + doneAndNextAlt->setEnabled( FALSE ); + messageIsShown = FALSE; + statusBar()->message( + tqtr("%1 source phrase(s) loaded.").arg(numMessages), + MessageMS ); + + foundItem = 0; + foundWhere = 0; + foundOffset = 0; + if ( lv->childCount() > 0 ) { + tqfindAct->setEnabled( TRUE ); + tqfindAgainAct->setEnabled( FALSE ); +#ifdef notyet + tqreplaceAct->setEnabled( TRUE ); +#endif + lv->setCurrentItem( lv->firstChild() ); + } + addRecentlyOpenedFile( name, recentFiles ); + updateStatistics(); + } else { + statusBar()->clear(); + TQMessageBox::warning( this, tqtr("TQt Linguist"), + tqtr("Cannot open '%1'.").arg(name) ); + } + } +} + +void TrWindow::open() +{ + if ( maybeSave() ) { + TQString newFilename = TQFileDialog::getOpenFileName( filename, + tqtr("TQt translation source (*.ts)\n" + "All files (*)"), + this, "open" ); + openFile( newFilename ); + } +} + +void TrWindow::save() +{ + if ( filename.isEmpty() ) + return; + + if ( tor.save(filename) ) { + dirty = FALSE; + updateCaption(); + statusBar()->message( tqtr("File saved."), MessageMS ); + } else { + TQMessageBox::warning( this, tqtr("TQt Linguist"), tqtr("Cannot save '%1'.") + .arg(filename) ); + } +} + +void TrWindow::saveAs() +{ + TQString newFilename = TQFileDialog::getSaveFileName( filename, + tqtr( "TQt translation source (*.ts)\n" + "All files (*)"), + this, "save_as" ); + if ( !newFilename.isEmpty() ) { + filename = newFilename; + save(); + updateCaption(); + } +} + +void TrWindow::release() +{ + TQString newFilename = filename; + newFilename.tqreplace( TQRegExp(".ts$"), "" ); + newFilename += TQString( ".qm" ); + + newFilename = TQFileDialog::getSaveFileName( newFilename, + tqtr("TQt message files for released applications (*.qm)\n" + "All files (*)"), + this, "release", + tqtr("Release") ); + if ( !newFilename.isEmpty() ) { + if ( tor.release(newFilename) ) + statusBar()->message( tqtr("File created."), MessageMS ); + else + TQMessageBox::warning( this, tqtr("TQt Linguist"), + tqtr("Cannot save '%1'.").arg(newFilename) ); + } +} + +void TrWindow::print() +{ + int pageNum = 0; + + if ( printer.setup(this) ) { + TQApplication::setOverrideCursor( WaitCursor ); + printer.setDocName( filename ); + statusBar()->message( tqtr("Printing...") ); + PrintOut pout( &printer ); + ContextLVI *c = (ContextLVI *) lv->firstChild(); + while ( c != 0 ) { + setCurrentContextItem( c ); + pout.vskip(); + pout.setRule( PrintOut::ThickRule ); + pout.setGuide( c->context() ); + pout.addBox( 100, tqtr("Context: %1").arg(c->context()), + PrintOut::Strong ); + pout.flushLine(); + pout.addBox( 4 ); + pout.addBox( 92, c->comment(), PrintOut::Emphasis ); + pout.flushLine(); + pout.setRule( PrintOut::ThickRule ); + + MessageLVI *m = (MessageLVI *) slv->firstChild(); + while ( m != 0 ) { + pout.setRule( PrintOut::ThinRule ); + + TQString type; + switch ( m->message().type() ) { + case MetaTranslatorMessage::Finished: + type = tqtr( "finished" ); + break; + case MetaTranslatorMessage::Unfinished: + type = m->danger() ? tqtr( "unresolved" ) : TQString( "unfinished" ); + break; + case MetaTranslatorMessage::Obsolete: + type = tqtr( "obsolete" ); + break; + default: + type = TQString( "" ); + } + pout.addBox( 40, m->sourceText() ); + pout.addBox( 4 ); + pout.addBox( 40, m->translation() ); + pout.addBox( 4 ); + pout.addBox( 12, type, PrintOut::Normal, TQt::AlignRight ); + if ( !m->comment().isEmpty() ) { + pout.flushLine(); + pout.addBox( 4 ); + pout.addBox( 92, m->comment(), PrintOut::Emphasis ); + } + pout.flushLine( TRUE ); + + if ( pout.pageNum() != pageNum ) { + pageNum = pout.pageNum(); + statusBar()->message( tqtr("Printing... (page %1)") + .arg(pageNum) ); + } + m = (MessageLVI *) m->nextSibling(); + } + c = (ContextLVI *) c->nextSibling(); + } + pout.flushLine( TRUE ); + TQApplication::restoreOverrideCursor(); + statusBar()->message( tqtr("Printing completed"), MessageMS ); + } else { + statusBar()->message( tqtr("Printing aborted"), MessageMS ); + } +} + +void TrWindow::tqfind() +{ + h->hide(); + f->show(); + f->setActiveWindow(); + f->raise(); +} + +void TrWindow::tqfindAgain() +{ + int pass = 0; + int oldItemNo = itemToIndex( slv, slv->currentItem() ); + TQString delayedMsg; + TQListViewItem * j = foundScope; + TQListViewItem * k = indexToItem( slv, foundItem ); + TQListViewItem * oldScope = lv->currentItem(); + + if ( lv->childCount() == 0 ) + return; +#if 1 + /* + As long as we don't implement highlighting of the text in the TQTextView, + we may have only one match per message. + */ + foundOffset = (int) 0x7fffffff; +#else + foundOffset++; +#endif + slv->setUpdatesEnabled( FALSE ); + do { + // Iterate through every item in all contexts + if ( j == 0 ) { + j = lv->firstChild(); + setCurrentContextItem( j ); + if ( foundScope != 0 ) + delayedMsg = tqtr("Search wrapped."); + } + if ( k == 0 ) + k = slv->firstChild(); + + while ( k ) { + MessageLVI * m = (MessageLVI *) k; + switch ( foundWhere ) { + case 0: + foundWhere = FindDialog::SourceText; + foundOffset = 0; + // fall-through + case FindDialog::SourceText: + if ( searchItem( m->sourceText(), j, k ) ) { + f->hide(); + if ( !delayedMsg.isEmpty() ) + statusBar()->message( delayedMsg, MessageMS ); + return; + } + foundWhere = FindDialog::Translations; + foundOffset = 0; + // fall-through + case FindDialog::Translations: + if ( searchItem( m->translation(), j, k ) ) { + f->hide(); + if ( !delayedMsg.isEmpty() ) + statusBar()->message( delayedMsg, MessageMS ); + return; + } + foundWhere = FindDialog::Comments; + foundOffset = 0; + // fall-through + case FindDialog::Comments: + if ( searchItem( ((ContextLVI *) j)->fullContext(), j, k) ) { + f->hide(); + if ( !delayedMsg.isEmpty() ) + statusBar()->message( delayedMsg, MessageMS ); + return; + } + foundWhere = 0; + foundOffset = 0; + } + k = k->nextSibling(); + } + + j = j->nextSibling(); + if ( j ) { + setCurrentContextItem( j ); + k = slv->firstChild(); + } + } while ( pass++ != lv->childCount() ); + + // This is just to keep the current scope and source text item + // selected after a search failed. + if ( oldScope ) { + setCurrentContextItem( oldScope ); + TQListViewItem * tmp = indexToItem( slv, oldItemNo ); + if( tmp ) + setCurrentMessageItem( tmp ); + } else { + if( lv->firstChild() ) + setCurrentContextItem( lv->firstChild() ); + if( slv->firstChild() ) + setCurrentMessageItem( slv->firstChild() ); + } + + slv->setUpdatesEnabled( TRUE ); + slv->triggerUpdate(); + tqApp->beep(); + TQMessageBox::warning( this, tqtr("TQt Linguist"), + TQString( tqtr("Cannot tqfind the string '%1'.") ).arg(tqfindText) ); + foundItem = 0; + foundWhere = 0; + foundOffset = 0; +} + +void TrWindow::tqreplace() +{ + f->hide(); + h->show(); + h->setActiveWindow(); + h->raise(); +} + +int TrWindow::itemToIndex( TQListView * view, TQListViewItem * item ) +{ + int no = 0; + TQListViewItem * tmp; + + if( view && item ){ + if( (tmp = view->firstChild()) != 0 ) + do { + no++; + tmp = tmp->nextSibling(); + } while( tmp && (tmp != item) ); + } + return no; +} + +TQListViewItem * TrWindow::indexToItem( TQListView * view, int index ) +{ + TQListViewItem * item = 0; + + if ( view && index > 0 ) { + item = view->firstChild(); + while( item && index-- > 0 ) + item = item->nextSibling(); + } + return item; +} + +bool TrWindow::searchItem( const TQString & searchWhat, TQListViewItem * j, + TQListViewItem * k ) +{ + if ( (tqfindWhere & foundWhere) != 0 ) { + foundOffset = searchWhat.tqfind( tqfindText, foundOffset, tqfindMatchCase ); + if ( foundOffset >= 0 ) { + foundItem = itemToIndex( slv, k ); + foundScope = j; + setCurrentMessageItem( k ); + slv->setUpdatesEnabled( TRUE ); + slv->triggerUpdate(); + return TRUE; + } + } + foundOffset = 0; + return FALSE; +} + +void TrWindow::newPhraseBook() +{ + TQString name; + for (;;) { + name = TQFileDialog::getSaveFileName( TQString(), + tqtr("TQt phrase books (*.qph)\n" + "All files (*)"), + this, "new_phrasebook", + tqtr("Create New Phrase Book") ); + if ( !TQFile::exists(name) ) + break; + TQMessageBox::warning( this, tqtr("TQt Linguist"), + tqtr("A file called '%1' already exists." + " Please choose another name.").arg(name) ); + } + if ( !name.isEmpty() ) { + PhraseBook pb; + if ( savePhraseBook(name, pb) ) { + if ( openPhraseBook(name) ) + statusBar()->message( tqtr("Phrase book created."), MessageMS ); + } + } +} + +void TrWindow::openPhraseBook() +{ + TQString phrasebooks( qInstallPathData() ); + TQString name = TQFileDialog::getOpenFileName( phrasebooks + "/phrasebooks", + tqtr("TQt phrase books (*.qph)\n" + "All files (*)"), + this, "open_phrasebook", + tqtr("Open Phrase Book") ); + if ( !name.isEmpty() && !phraseBookNames.tqcontains(name) ) { + if ( openPhraseBook(name) ) { + int n = (int)(phraseBooks.at( phraseBooks.count() - 1 )->count()); + statusBar()->message( tqtr("%1 phrase(s) loaded.").arg(n), + MessageMS ); + } + } +} + +void TrWindow::closePhraseBook( int id ) +{ + int index = closePhraseBookp->indexOf( id ); + phraseBooks.remove( index ); + phraseBookNames.remove( phraseBookNames.at(index) ); + updatePhraseDict(); + + dirtyItem = index; // remove the item next time the menu is opened + editPhraseBookp->removeItem( editPhraseBookp->idAt(index) ); + printPhraseBookp->removeItem( printPhraseBookp->idAt(index) ); +} + +void TrWindow::editPhraseBook( int id ) +{ + int index = editPhraseBookp->indexOf( id ); + PhraseBookBox box( phraseBookNames[index], *phraseBooks.at(index), this, + "phrase book box", TRUE ); + box.setCaption( tqtr("%1 - %2").arg(tqtr("TQt Linguist")) + .arg(friendlyPhraseBookName(index)) ); + box.resize( 500, 300 ); + box.exec(); + *phraseBooks.at( index ) = box.phraseBook(); + updatePhraseDict(); +} + +void TrWindow::printPhraseBook( int id ) +{ + int index = printPhraseBookp->indexOf( id ); + int pageNum = 0; + + if ( printer.setup(this) ) { + printer.setDocName( phraseBookNames[index] ); + statusBar()->message( tqtr("Printing...") ); + PrintOut pout( &printer ); + PhraseBook *phraseBook = phraseBooks.at( index ); + PhraseBook::Iterator p; + pout.setRule( PrintOut::ThinRule ); + for ( p = phraseBook->begin(); p != phraseBook->end(); ++p ) { + pout.setGuide( (*p).source() ); + pout.addBox( 29, (*p).source() ); + pout.addBox( 4 ); + pout.addBox( 29, (*p).target() ); + pout.addBox( 4 ); + pout.addBox( 34, (*p).definition(), PrintOut::Emphasis ); + + if ( pout.pageNum() != pageNum ) { + pageNum = pout.pageNum(); + statusBar()->message( tqtr("Printing... (page %1)") + .arg(pageNum) ); + } + pout.setRule( PrintOut::NoRule ); + pout.flushLine( TRUE ); + } + pout.flushLine( TRUE ); + statusBar()->message( tqtr("Printing completed"), MessageMS ); + } else { + statusBar()->message( tqtr("Printing aborted"), MessageMS ); + } +} + +void TrWindow::revertSorting() +{ + lv->setSorting( 0 ); + slv->setSorting( 0 ); +} + +void TrWindow::manual() +{ + TQAssistantClient *ac = new TQAssistantClient( qInstallPathBins(), TQT_TQOBJECT(this) ); + ac->showPage( TQString( qInstallPathDocs() ) + "/html/linguist-manual.html" ); +} + +void TrWindow::about() +{ + AboutDialog about( this, 0, TRUE ); + about.versionLabel->setText( tqtr("Version %1").arg(TQT_VERSION_STR) ); + about.exec(); +} + +void TrWindow::aboutTQt() +{ + TQMessageBox::aboutTQt( this, tqtr("TQt Linguist") ); +} + +void TrWindow::setupPhrase() +{ + bool enabled = !phraseBooks.isEmpty(); + phrasep->setItemEnabled( closePhraseBookId, enabled ); + phrasep->setItemEnabled( editPhraseBookId, enabled ); + phrasep->setItemEnabled( printPhraseBookId, enabled ); +} + +void TrWindow::closeEvent( TQCloseEvent *e ) +{ + if ( maybeSave() ) + e->accept(); + else + e->ignore(); +} + +bool TrWindow::maybeSave() +{ + if ( dirty ) { + switch ( TQMessageBox::information(this, tqtr("TQt Linguist"), + tqtr("Do you want to save '%1'?") + .arg(filename), + TQMessageBox::Yes | TQMessageBox::Default, + TQMessageBox::No, + TQMessageBox::Cancel | TQMessageBox::Escape ) ) + { + case TQMessageBox::Cancel: + return FALSE; + case TQMessageBox::Yes: + save(); + return !dirty; + case TQMessageBox::No: + break; + } + } + return TRUE; +} + +void TrWindow::updateCaption() +{ + TQString cap; + bool enable = !filename.isEmpty(); + saveAct->setEnabled( enable ); + saveAsAct->setEnabled( enable ); + releaseAct->setEnabled( enable ); + printAct->setEnabled( enable ); + acceleratorsAct->setEnabled( enable ); + endingPunctuationAct->setEnabled( enable ); + phraseMatchesAct->setEnabled( enable ); + revertSortingAct->setEnabled( enable ); + + if ( filename.isEmpty() ) + cap = tqtr( "TQt Linguist by Trolltech" ); + else + cap = tqtr( "%1 - %2" ).arg( tqtr("TQt Linguist by Trolltech") ) + .arg( filename ); + setCaption( cap ); + modified->setEnabled( dirty ); +} + +// +// New scope selected - build a new list of source text items +// for that scope. +// +void TrWindow::showNewScope( TQListViewItem *item ) +{ + static ContextLVI * oldContext = 0; + + if( item != 0 ) { + ContextLVI * c = (ContextLVI *) item; + bool upe = slv->isUpdatesEnabled(); + slv->setUpdatesEnabled( FALSE ); + slv->viewport()->setUpdatesEnabled( FALSE ); + if ( oldContext != 0 ) { + MessageLVI * tmp; + slv->blockSignals( TRUE ); + while ( (tmp = (MessageLVI *) slv->firstChild()) != 0 ) + oldContext->appendMessageItem( slv, tmp ); + slv->blockSignals( FALSE ); + } + MessageLVI * tmp; + while ( c->messageItemsInList() ) { + tmp = c->takeMessageItem( c->messageItemsInList() - 1); + slv->insertItem( tmp ); + tmp->updateTranslationText(); + } + + // Make sure that we update the source text and translation text. Use the first message in the new scope. + setCurrentMessageItem(slv->firstChild()); + // This must be explicitly called since the signal is not emitted if the context only tqcontains one item + showNewCurrent(slv->firstChild()); + slv->viewport()->setUpdatesEnabled( upe ); + slv->setUpdatesEnabled( upe ); + if( upe ) + slv->triggerUpdate(); + oldContext = (ContextLVI *) item; + statusBar()->clear(); + } +} + +void TrWindow::showNewCurrent( TQListViewItem *item ) +{ + messageIsShown = (item != 0); + MessageLVI *m = (MessageLVI *) item; + ContextLVI *c = (ContextLVI *) m ? m->contextLVI() : 0; + + if ( messageIsShown ) { + me->showMessage( m->sourceText(), m->comment(), c->fullContext(), + m->translation(), m->message().type(), + getPhrases(m->sourceText()) ); + if ( (m->message().type() != MetaTranslatorMessage::Finished) && + m->danger() ) + danger( m->sourceText(), m->translation(), TRUE ); + else + statusBar()->clear(); + + doneAndNextAct->setEnabled( m->message().type() != + MetaTranslatorMessage::Obsolete ); + } else { + if ( item == 0 ) + me->showNothing(); + else + me->showContext( c->fullContext(), c->finished() ); + doneAndNextAct->setEnabled( FALSE ); + } + doneAndNextAlt->setEnabled( doneAndNextAct->isEnabled() ); + + selectAllAct->setEnabled( messageIsShown ); +} + +void TrWindow::updateTranslation( const TQString& translation ) +{ + TQListViewItem *item = slv->currentItem(); + if ( item != 0 ) { + MessageLVI *m = (MessageLVI *) item; + if ( translation != m->translation() ) { + bool dngr; + m->setTranslation( translation ); + if ( m->finished() && + (dngr = danger( m->sourceText(), m->translation(), TRUE )) ) { + numFinished -= 1; + m->setDanger( dngr ); + m->setFinished( FALSE ); + m->contextLVI()->updatetqStatus(); + updateProgress(); + } + tor.insert( m->message() ); + if ( !dirty ) { + dirty = TRUE; + updateCaption(); + } + m->updateTranslationText(); + } + } +} + +void TrWindow::updateFinished( bool finished ) +{ + TQListViewItem *item = slv->currentItem(); + if ( item != 0 ) { + MessageLVI *m = (MessageLVI *) item; + if ( finished != m->finished() ) { + numFinished += finished ? +1 : -1; + updateProgress(); + m->setFinished( finished ); + bool oldDanger = m->danger(); + m->setDanger( /*m->finished() &&*/ + danger(m->sourceText(), m->translation(), + !oldDanger) ); + if ( !oldDanger && m->danger() ) + tqApp->beep(); + tor.insert( m->message() ); + if ( !dirty ) { + dirty = TRUE; + updateCaption(); + } + } + } +} + +void TrWindow::doneAndNext() +{ + MessageLVI * m = (MessageLVI *) slv->currentItem(); + bool dngr = FALSE; + + if ( !m ) return; + dngr = danger( m->sourceText(), m->translation(), TRUE ); + if ( !dngr ) { + me->finishAndNext(); + m->contextLVI()->updatetqStatus(); + } else { + if ( m->danger() != dngr ) + m->setDanger( dngr ); + tor.insert( m->message() ); + if ( !dirty ) { + dirty = TRUE; + updateCaption(); + } + tqApp->beep(); + } + updateStatistics(); +} + +void TrWindow::toggleFinished( TQListViewItem *item, const TQPoint& /* p */, + int column ) +{ + if ( item != 0 && column == 0 ) { + MessageLVI *m = (MessageLVI *) item; + bool dngr = FALSE; + + if ( m->message().type() == MetaTranslatorMessage::Unfinished ) { + dngr = danger( m->sourceText(), m->translation(), TRUE ); + } + if ( !dngr && m->message().type() != MetaTranslatorMessage::Obsolete) { + setCurrentMessageItem( m ); + me->setFinished( !m->finished() ); + m->contextLVI()->updatetqStatus(); + } else { + bool oldDanger = m->danger(); + m->setDanger( danger(m->sourceText(), m->translation(), + !oldDanger) ); + if ( !oldDanger && m->danger() ) + tqApp->beep(); + tor.insert( m->message() ); + if ( !dirty ) { + dirty = TRUE; + updateCaption(); + } + } + updateStatistics(); + } +} + +void TrWindow::nextUnfinished() +{ + if ( nextUnfinishedAct->isEnabled() ) { + // Select a message to translate, grab the first available if + // there are no current selection. + TQListViewItem * cItem = lv->currentItem(); // context item + TQListViewItem * mItem = slv->currentItem(); // message item + + // Make sure an item is selected from both the context and the + // message list. + if( (mItem == 0) && !(mItem = slv->firstChild()) ) { + if( (cItem == 0) && !(cItem = lv->firstChild()) ) { + statusBar()->message( tqtr("No phrase to translate."), + MessageMS ); + tqApp->beep(); + return; + } else { + showNewScope( cItem ); + while( cItem && !(mItem = slv->firstChild()) ) { + // no tqchildren in this node - try next one + cItem = cItem->nextSibling(); + showNewScope( cItem ); + } + setCurrentContextItem( cItem ); + if( mItem ) { + setCurrentMessageItem( mItem ); + } else { + statusBar()->message( tqtr("No phrase to translate."), + MessageMS ); + tqApp->beep(); + return; + } + } + } else { + setCurrentMessageItem( mItem ); + } + + MessageLVI * m = (MessageLVI *) mItem; + MessageLVI * n; + ContextLVI * p = (ContextLVI *) cItem; + ContextLVI * q; + + // Find the next Unfinished sibling within the same context. + m = (MessageLVI *) mItem->nextSibling(); + n = m; + do { + if ( n == 0 ) + break; + if ( n && !n->finished() && n != mItem ) { + setCurrentMessageItem( n ); + return; + } + n = (MessageLVI *) n->nextSibling(); + } while ( n != m ); + + // If all siblings are Finished or Obsolete, look in the first + // Unfinished context. + p = (ContextLVI *) p->nextSibling(); + q = p; + do { + if ( q == 0 ) + q = (ContextLVI *) lv->firstChild(); + if ( q && !q->finished() ) { + showNewScope( q ); + setCurrentContextItem( q ); + n = (MessageLVI *) slv->firstChild(); + while ( n && n->finished() ) + n = (MessageLVI *) n->nextSibling(); + if ( n && q ) { + setCurrentMessageItem( n ); + showNewCurrent( n ); + return; + } + } + q = (ContextLVI *) q->nextSibling(); + } while ( q != p ); + } + + // If no Unfinished message is left, the user has finished the job. We + // congratulate on a job well done with this ringing bell. + statusBar()->message( tqtr("No untranslated phrases left."), MessageMS ); + tqApp->beep(); +} + +static TQListViewItem * lastChild( TQListView * view ) +{ + if ( view ) { + TQListViewItem * ret, * tmp; + ret = view->firstChild(); + while ( ret ) { + tmp = ret->nextSibling(); + if ( tmp == 0 ) + return ret; + ret = tmp; + } + } + return 0; +} + +void TrWindow::prevUnfinished() +{ + if ( prevUnfinishedAct->isEnabled() ) { + // Select a message to translate, grab the first available if + // there are no current selection. + TQListViewItem * cItem = lv->currentItem(); // context item + TQListViewItem * mItem = slv->currentItem(); // message item + + // Make sure an item is selected from both the context and the + // message list. + if( (mItem == 0) && !(mItem = slv->firstChild()) ) { + if( (cItem == 0) && !(cItem = lv->firstChild()) ) { + statusBar()->message( tqtr("No phrase to translate."), + MessageMS ); + tqApp->beep(); + return; + } else { + showNewScope( cItem ); + while( cItem && !(mItem = slv->firstChild()) ) { + // no tqchildren in this node - try next one + cItem = cItem->nextSibling(); + showNewScope( cItem ); + } + setCurrentContextItem( cItem ); + if( mItem ) { + setCurrentMessageItem( cItem ); + } else { + statusBar()->message( tqtr("No phrase to translate."), + MessageMS ); + tqApp->beep(); + return; + } + } + } else { + setCurrentMessageItem( mItem ); + } + + MessageLVI * m = (MessageLVI *) mItem; + MessageLVI * n; + ContextLVI * p = (ContextLVI *) cItem; + ContextLVI * q; + + // Find the next Unfinished sibling within the same context. + n = m; + do { + n = (MessageLVI * ) n->itemAbove(); + if ( n == 0 ) + break; + if ( n && !n->finished() ) { + setCurrentMessageItem( n ); + return; + } + } while ( !((ContextLVI *) cItem)->finished() && n != 0 ); + + // If all siblings are Finished or Obsolete, look in the prev + // Unfinished context. + q = p; + do { + q = (ContextLVI *) q->itemAbove(); + if ( q == 0 ) + q = (ContextLVI *) lastChild( lv ); + if ( q && !q->finished() ) { + showNewScope( q ); + setCurrentContextItem( q ); + n = (MessageLVI *) lastChild( slv ); + while ( n && n->finished() ) + n = (MessageLVI *) n->itemAbove(); + if ( n && q ) { + setCurrentMessageItem( n ); + return; + } + } + } while ( q != 0 ); + } + statusBar()->message( tqtr("No untranslated phrases left."), MessageMS ); + tqApp->beep(); +} + +void TrWindow::prev() +{ + TQListViewItem * cItem = lv->currentItem(); // context item + TQListViewItem * mItem = slv->currentItem(); // message item + TQListViewItem * tmp; + + if ( !cItem ) { + cItem = lv->firstChild(); + if ( !cItem ) return; + setCurrentContextItem( cItem ); + } + + if ( !mItem ) { + mItem = lastChild( slv ); + if ( !mItem ) return; + setCurrentMessageItem( mItem ); + } else { + if ( (tmp = mItem->itemAbove()) != 0 ) { + setCurrentMessageItem( tmp ); + return; + } else { + if ( (tmp = cItem->itemAbove()) == 0 ) { + tmp = lastChild( lv ); + } + if ( !tmp ) return; + setCurrentContextItem( tmp ); + setCurrentMessageItem( lastChild( slv ) ); + } + } +} + +void TrWindow::next() +{ + TQListViewItem * cItem = lv->currentItem(); // context item + TQListViewItem * mItem = slv->currentItem(); // message item + TQListViewItem * tmp; + + if ( !cItem ) { + cItem = lv->firstChild(); + if ( !cItem ) return; + setCurrentContextItem( cItem ); + } + + if ( !mItem ) { + mItem = slv->firstChild(); + if ( !mItem ) return; + setCurrentMessageItem( mItem ); + } else { + if ( (tmp = mItem->nextSibling()) != 0 ) { + setCurrentMessageItem( tmp ); + return; + } else { + if ( (tmp = cItem->nextSibling()) == 0 ) { + tmp = lv->firstChild(); + } + if ( !tmp ) return; + setCurrentContextItem( tmp ); + setCurrentMessageItem( slv->firstChild() ); + } + } +} + + +void TrWindow::tqfindNext( const TQString& text, int where, bool matchCase ) +{ + tqfindText = text; + if ( tqfindText.isEmpty() ) + tqfindText = TQString( "magicwordthatyoushouldavoid" ); + tqfindWhere = where; + tqfindMatchCase = matchCase; + tqfindAgainAct->setEnabled( TRUE ); + tqfindAgain(); +} + +void TrWindow::revalidate() +{ + ContextLVI *c = (ContextLVI *) lv->firstChild(); + TQListViewItem * oldScope = lv->currentItem(); + int oldItemNo = itemToIndex( slv, slv->currentItem() ); + slv->setUpdatesEnabled( FALSE ); + + while ( c != 0 ) { + showNewScope( c ); + MessageLVI *m = (MessageLVI *) slv->firstChild(); + while ( m != 0 ) { + m->setDanger( danger(m->sourceText(), m->translation()) && + m->message().type() == MetaTranslatorMessage::Finished ); + m = (MessageLVI *) m->nextSibling(); + } + c = (ContextLVI *) c->nextSibling(); + } + + if ( oldScope ){ + showNewScope( oldScope ); + TQListViewItem * tmp = indexToItem( slv, oldItemNo ); + if( tmp ) + setCurrentMessageItem( tmp ); + } + slv->setUpdatesEnabled( TRUE ); + slv->triggerUpdate(); +} + +TQString TrWindow::friendlyString( const TQString& str ) +{ + TQString f = str.lower(); + f.tqreplace( TQRegExp(TQString("[.,:;!?()-]")), TQString(" ") ); + f.tqreplace( "&", TQString("") ); + f = f.simplifyWhiteSpace(); + f = f.lower(); + return f; +} + +void TrWindow::setupMenuBar() +{ + TQMenuBar * m = menuBar(); + TQPopupMenu * filep = new TQPopupMenu( this ); + TQPopupMenu * editp = new TQPopupMenu( this ); + TQPopupMenu * translationp = new TQPopupMenu( this ); + TQPopupMenu * validationp = new TQPopupMenu( this ); + validationp->setCheckable( TRUE ); + phrasep = new TQPopupMenu( this ); + closePhraseBookp = new TQPopupMenu( this ); + editPhraseBookp = new TQPopupMenu( this ); + printPhraseBookp = new TQPopupMenu( this ); + TQPopupMenu * viewp = new TQPopupMenu( this ); + viewp->setCheckable( TRUE ); + TQPopupMenu * helpp = new TQPopupMenu( this ); + + m->insertItem( tqtr("&File"), filep ); + m->insertItem( tqtr("&Edit"), editp ); + m->insertItem( tqtr("&Translation"), translationp ); + m->insertItem( tqtr("V&alidation"), validationp ); + m->insertItem( tqtr("&Phrases"), phrasep ); + m->insertItem( tqtr("&View"), viewp ); + m->insertSeparator(); + m->insertItem( tqtr("&Help"), helpp ); + + connect( closePhraseBookp, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(closePhraseBook(int)) ); + connect( closePhraseBookp, TQT_SIGNAL(aboutToShow()), + this, TQT_SLOT(updateClosePhraseBook()) ); + connect( editPhraseBookp, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(editPhraseBook(int)) ); + connect( printPhraseBookp, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(printPhraseBook(int)) ); + // File menu + openAct = new Action( filep, tqtr("&Open..."), TQT_TQOBJECT(this), TQT_SLOT(open()), + "fileopen.png", TQAccel::stringToKey(tqtr("Ctrl+O")) ); + + filep->insertSeparator(); + + saveAct = new Action( filep, tqtr("&Save"), TQT_TQOBJECT(this), TQT_SLOT(save()), + "filesave.png", TQAccel::stringToKey(tqtr("Ctrl+S")) ); + saveAsAct = new Action( filep, tqtr("Save &As..."), TQT_TQOBJECT(this), TQT_SLOT(saveAs()) ); + releaseAct = new Action( filep, tqtr("&Release..."), TQT_TQOBJECT(this), TQT_SLOT(release()) ); + filep->insertSeparator(); + printAct = new Action( filep, tqtr("&Print..."), TQT_TQOBJECT(this), TQT_SLOT(print()), + "print.png", TQAccel::stringToKey(tqtr("Ctrl+P")) ); + + filep->insertSeparator(); + + recentFilesMenu = new TQPopupMenu( this ); + filep->insertItem( tqtr("Re¢ly opened files"), recentFilesMenu ); + connect( recentFilesMenu, TQT_SIGNAL(aboutToShow()), this, + TQT_SLOT(setupRecentFilesMenu()) ); + connect( recentFilesMenu, TQT_SIGNAL(activated( int )), this, + TQT_SLOT(recentFileActivated( int )) ); + + filep->insertSeparator(); + + exitAct = new Action( filep, tqtr("E&xit"), TQT_TQOBJECT(this), TQT_SLOT(close()), + TQString(), TQAccel::stringToKey(tqtr("Ctrl+Q")) ); + // Edit menu + undoAct = new Action( editp, tqtr("&Undo"), TQT_TQOBJECT(me), TQT_SLOT(undo()), + "undo.png", TQAccel::stringToKey(tqtr("Ctrl+Z")) ); + undoAct->setEnabled( FALSE ); + connect( me, TQT_SIGNAL(undoAvailable(bool)), undoAct, TQT_SLOT(setEnabled(bool)) ); + redoAct = new Action( editp, tqtr("&Redo"), TQT_TQOBJECT(me), TQT_SLOT(redo()), + "redo.png", TQAccel::stringToKey(tqtr("Ctrl+Y")) ); + redoAct->setEnabled( FALSE ); + connect( me, TQT_SIGNAL(redoAvailable(bool)), redoAct, TQT_SLOT(setEnabled(bool)) ); + editp->insertSeparator(); + cutAct = new Action( editp, tqtr("Cu&t"), TQT_TQOBJECT(me), TQT_SLOT(cut()), + "editcut.png", TQAccel::stringToKey(tqtr("Ctrl+X")) ); + cutAct->setEnabled( FALSE ); + connect( me, TQT_SIGNAL(cutAvailable(bool)), cutAct, TQT_SLOT(setEnabled(bool)) ); + copyAct = new Action( editp, tqtr("&Copy"), TQT_TQOBJECT(me), TQT_SLOT(copy()), + "editcopy.png", TQAccel::stringToKey(tqtr("Ctrl+C")) ); + copyAct->setEnabled( FALSE ); + connect( me, TQT_SIGNAL(copyAvailable(bool)), copyAct, TQT_SLOT(setEnabled(bool)) ); + pasteAct = new Action( editp, tqtr("&Paste"), TQT_TQOBJECT(me), TQT_SLOT(paste()), + "editpaste.png", TQAccel::stringToKey(tqtr("Ctrl+V")) ); + pasteAct->setEnabled( FALSE ); + connect( me, TQT_SIGNAL(pasteAvailable(bool)), + pasteAct, TQT_SLOT(setEnabled(bool)) ); + selectAllAct = new Action( editp, tqtr("Select &All"), TQT_TQOBJECT(me), TQT_SLOT(selectAll()), + TQString(), TQAccel::stringToKey(tqtr("Ctrl+A")) ); + selectAllAct->setEnabled( FALSE ); + editp->insertSeparator(); + tqfindAct = new Action( editp, tqtr("&Find..."), TQT_TQOBJECT(this), TQT_SLOT(tqfind()), + "searchfind.png", TQAccel::stringToKey(tqtr("Ctrl+F")) ); + tqfindAct->setEnabled( FALSE ); + tqfindAgainAct = new Action( editp, tqtr("Find &Next"), + TQT_TQOBJECT(this), TQT_SLOT(tqfindAgain()), TQString(), Qt::Key_F3 ); + tqfindAgainAct->setEnabled( FALSE ); +#ifdef notyet + tqreplaceAct = new Action( editp, tqtr("&Replace..."), TQT_TQOBJECT(this), TQT_SLOT(tqreplace()), + TQAccel::stringToKey(tqtr("Ctrl+H")) ); + tqreplaceAct->setEnabled( FALSE ); +#endif + + // Translation menu + // when updating the accelerators, remember the status bar + prevUnfinishedAct = new Action( translationp, tqtr("&Prev Unfinished"), + TQT_TQOBJECT(this), TQT_SLOT(prevUnfinished()), + "prevunfinished.png", TQAccel::stringToKey(tqtr("Ctrl+K")) ); + nextUnfinishedAct = new Action( translationp, tqtr("&Next Unfinished"), + TQT_TQOBJECT(this), TQT_SLOT(nextUnfinished()), + "nextunfinished.png", TQAccel::stringToKey(tqtr("Ctrl+L")) ); + + prevAct = new Action( translationp, tqtr("P&rev"), + TQT_TQOBJECT(this), TQT_SLOT(prev()), "prev.png", + TQAccel::stringToKey(tqtr("Ctrl+Shift+K")) ); + nextAct = new Action( translationp, tqtr("Ne&xt"), + TQT_TQOBJECT(this), TQT_SLOT(next()), "next.png", + TQAccel::stringToKey(tqtr("Ctrl+Shift+L")) ); + doneAndNextAct = new Action( translationp, tqtr("Done and &Next"), + TQT_TQOBJECT(this), TQT_SLOT(doneAndNext()), "doneandnext.png", + TQAccel::stringToKey(tqtr("Ctrl+Enter")) ); + doneAndNextAlt = new TQAction( this ); + doneAndNextAlt->setAccel( TQAccel::stringToKey(tqtr("Ctrl+Return")) ); + connect( doneAndNextAlt, TQT_SIGNAL(activated()), this, TQT_SLOT(doneAndNext()) ); + beginFromSourceAct = new Action( translationp, tqtr("&Begin from Source"), + TQT_TQOBJECT(me), TQT_SLOT(beginFromSource()), + TQString(), TQAccel::stringToKey(tqtr("Ctrl+B")) ); + connect( me, TQT_SIGNAL(updateActions(bool)), beginFromSourceAct, + TQT_SLOT(setEnabled(bool)) ); + + // Phrasebook menu + newPhraseBookAct = new Action( phrasep, tqtr("&New Phrase Book..."), + TQT_TQOBJECT(this), TQT_SLOT(newPhraseBook()), + TQString(), TQAccel::stringToKey(tqtr("Ctrl+N")) ); + openPhraseBookAct = new Action( phrasep, tqtr("&Open Phrase Book..."), + TQT_TQOBJECT(this), TQT_SLOT(openPhraseBook()), + "book.png", TQAccel::stringToKey(tqtr("Ctrl+H")) ); + closePhraseBookId = phrasep->insertItem( tqtr("&Close Phrase Book"), + closePhraseBookp ); + phrasep->insertSeparator(); + editPhraseBookId = phrasep->insertItem( tqtr("&Edit Phrase Book..."), + editPhraseBookp ); + printPhraseBookId = phrasep->insertItem( tqtr("&Print Phrase Book..."), + printPhraseBookp ); + connect( phrasep, TQT_SIGNAL(aboutToShow()), this, TQT_SLOT(setupPhrase()) ); + + // Validation menu + acceleratorsAct = new Action( validationp, tqtr("&Accelerators"), + TQT_TQOBJECT(this), TQT_SLOT(revalidate()), "accelerator.png", 0, TRUE ); + acceleratorsAct->setOn( TRUE ); + endingPunctuationAct = new Action( validationp, tqtr("&Ending Punctuation"), + TQT_TQOBJECT(this), TQT_SLOT(revalidate()), "punctuation.png", 0, TRUE ); + endingPunctuationAct->setOn( TRUE ); + phraseMatchesAct = new Action( validationp, tqtr("&Phrase Matches"), + TQT_TQOBJECT(this), TQT_SLOT(revalidate()), "phrase.png", 0, TRUE ); + phraseMatchesAct->setOn( TRUE ); + + // View menu + revertSortingAct = new Action( viewp, tqtr("&Revert Sorting"), + TQT_TQOBJECT(this), TQT_SLOT(revertSorting()) ); + doGuessesAct = new Action( viewp, tqtr("&Display guesses"), + TQT_TQOBJECT(this), TQT_SLOT(toggleGuessing()) ); + doGuessesAct->setToggleAction( TRUE ); + doGuessesAct->setOn( TRUE ); + toggleStats = new Action( viewp, tqtr("&Statistics"), TQT_TQOBJECT(this), TQT_SLOT(toggleStatistics()) ); + toggleStats->setToggleAction( TRUE ); + viewp->insertSeparator(); + viewp->insertItem( tqtr("Vie&ws"), createDockWindowMenu( NoToolBars ) ); + viewp->insertItem( tqtr("&Toolbars"), createDockWindowMenu( OnlyToolBars ) ); + + // Help + manualAct = new Action( helpp, tqtr("&Manual"), TQT_TQOBJECT(this), TQT_SLOT(manual()), 0, + Qt::Key_F1 ); + helpp->insertSeparator(); + aboutAct = new Action( helpp, tqtr("&About"), TQT_TQOBJECT(this), TQT_SLOT(about()) ); + aboutTQtAct = new Action( helpp, tqtr("About &TQt"), TQT_TQOBJECT(this), TQT_SLOT(aboutTQt()) ); + helpp->insertSeparator(); + whatsThisAct = new Action( helpp, tqtr("&What's This?"), + TQT_TQOBJECT(this), TQT_SLOT(whatsThis()), "whatsthis.xpm", Qt::SHIFT + Qt::Key_F1 ); + + openAct->setWhatsThis( tqtr("Open a TQt translation source file (TS file) for" + " editing.") ); + saveAct->setWhatsThis( tqtr("Save changes made to this TQt translation " + "source file.") ); + saveAsAct->setWhatsThis( tqtr("Save changes made to this TQt translation" + "source file into a new file.") ); + releaseAct->setWhatsThis( tqtr("Create a TQt message file suitable for" + " released applications" + " from the current message file.") ); + printAct->setWhatsThis( tqtr("Print a list of all the phrases in the current" + " TQt translation source file.") ); + exitAct->setWhatsThis( tqtr("Close this window and exit.") ); + + undoAct->setWhatsThis( tqtr("Undo the last editing operation performed on the" + " translation.") ); + redoAct->setWhatsThis( tqtr("Redo an undone editing operation performed on" + " the translation.") ); + cutAct->setWhatsThis( tqtr("Copy the selected translation text to the" + " clipboard and deletes it.") ); + copyAct->setWhatsThis( tqtr("Copy the selected translation text to the" + " clipboard.") ); + pasteAct->setWhatsThis( tqtr("Paste the clipboard text into the" + " translation.") ); + selectAllAct->setWhatsThis( tqtr("Select the whole translation text.") ); + tqfindAct->setWhatsThis( tqtr("Search for some text in the translation " + "source file.") ); + tqfindAgainAct->setWhatsThis( tqtr("Continue the search where it was left.") ); +#ifdef notyet + tqreplaceAct->setWhatsThis( tqtr("Search for some text in the translation" + " source file and tqreplace it by another" + " text.") ); +#endif + + newPhraseBookAct->setWhatsThis( tqtr("Create a new phrase book.") ); + openPhraseBookAct->setWhatsThis( tqtr("Open a phrase book to assist" + " translation.") ); + acceleratorsAct->setWhatsThis( tqtr("Toggle validity checks of" + " accelerators.") ); + endingPunctuationAct->setWhatsThis( tqtr("Toggle validity checks" + " of ending punctuation.") ); + phraseMatchesAct->setWhatsThis( tqtr("Toggle checking that phrase" + " suggestions are used.") ); + + revertSortingAct->setWhatsThis( tqtr("Sort the items back in the same order" + " as in the message file.") ); + + doGuessesAct->setWhatsThis( tqtr("Set whether or not to display translation guesses.") ); + manualAct->setWhatsThis( tqtr("Display the manual for %1.") + .arg(tqtr("TQt Linguist")) ); + aboutAct->setWhatsThis( tqtr("Display information about %1.") + .arg(tqtr("TQt Linguist")) ); + aboutTQtAct->setWhatsThis( tqtr("Display information about the TQt toolkit by" + " Trolltech.") ); + whatsThisAct->setWhatsThis( tqtr("Enter What's This? mode.") ); + + beginFromSourceAct->setWhatsThis( tqtr("Copies the source text into" + " the translation field.") ); + nextAct->setWhatsThis( tqtr("Moves to the next item.") ); + prevAct->setWhatsThis( tqtr("Moves to the previous item.") ); + nextUnfinishedAct->setWhatsThis( tqtr("Moves to the next unfinished item.") ); + prevUnfinishedAct->setWhatsThis( tqtr("Moves to the previous unfinished item.") ); + doneAndNextAct->setWhatsThis( tqtr("Marks this item as done and moves to the" + " next unfinished item.") ); + doneAndNextAlt->setWhatsThis( doneAndNextAct->whatsThis() ); +} + +void TrWindow::setupToolBars() +{ + TQToolBar *filet = new TQToolBar( tqtr("File"), this ); + TQToolBar *editt = new TQToolBar( tqtr("Edit"), this ); + TQToolBar *translationst = new TQToolBar( tqtr("Translation"), this ); + TQToolBar *validationt = new TQToolBar( tqtr("Validation"), this ); + TQToolBar *helpt = new TQToolBar( tqtr("Help"), this ); + + openAct->addToToolbar( filet, tqtr("Open") ); + saveAct->addToToolbar( filet, tqtr("Save") ); + printAct->addToToolbar( filet, tqtr("Print") ); + filet->addSeparator(); + openPhraseBookAct->addToToolbar( filet, tqtr("Open Phrase Book") ); + + undoAct->addToToolbar( editt, tqtr("Undo") ); + redoAct->addToToolbar( editt, tqtr("Redo") ); + editt->addSeparator(); + cutAct->addToToolbar( editt, tqtr("Cut") ); + copyAct->addToToolbar( editt, tqtr("Copy") ); + pasteAct->addToToolbar( editt, tqtr("Paste") ); + editt->addSeparator(); + tqfindAct->addToToolbar( editt, tqtr("Find") ); +#ifdef notyet + tqreplaceAct->addToToolbar( editt, tqtr("Replace") ); +#endif + + // beginFromSourceAct->addToToolbar( translationst, + // tqtr("Begin from Source"), "searchtqfind" ); + prevAct->addToToolbar( translationst, tqtr("Prev") ); + nextAct->addToToolbar( translationst, tqtr("Next") ); + prevUnfinishedAct->addToToolbar( translationst, tqtr("Prev Unfinished") ); + nextUnfinishedAct->addToToolbar( translationst, tqtr("Next Unfinished") ); + doneAndNextAct->addToToolbar( translationst, tqtr("Done and Next") ); + + acceleratorsAct->addToToolbar( validationt, tqtr("Accelerators") ); + endingPunctuationAct->addToToolbar( validationt, tqtr("Punctuation") ); + phraseMatchesAct->addToToolbar( validationt, tqtr("Phrases") ); + + whatsThisAct->addToToolbar( helpt, tqtr("What's This?") ); +} + +void TrWindow::setCurrentContextItem( TQListViewItem *item ) +{ + lv->ensureItemVisible( item ); + lv->setSelected( item, TRUE ); +} + +void TrWindow::setCurrentMessageItem( TQListViewItem *item ) +{ + slv->ensureItemVisible( item ); + slv->setSelected( item, TRUE ); +} + +TQString TrWindow::friendlyPhraseBookName( int k ) +{ + return TQFileInfo( phraseBookNames[k] ).fileName(); +} + +bool TrWindow::openPhraseBook( const TQString& name ) +{ + PhraseBook *pb = new PhraseBook; + if ( !pb->load(name) ) { + TQMessageBox::warning( this, tqtr("TQt Linguist"), + tqtr("Cannot read from phrase book '%1'.") + .arg(name) ); + return FALSE; + } + + int index = (int) phraseBooks.count(); + phraseBooks.append( pb ); + phraseBookNames.append( name ); + int id = closePhraseBookp->insertItem( friendlyPhraseBookName(index) ); + closePhraseBookp->TQMenuData::setWhatsThis( id, tqtr("Close this phrase book.") ); + id = editPhraseBookp->insertItem( friendlyPhraseBookName(index) ); + editPhraseBookp->TQMenuData::setWhatsThis( id, tqtr("Allow you to add, modify, or delete" + " phrases of this phrase book.") ); + id = printPhraseBookp->insertItem( friendlyPhraseBookName(index) ); + printPhraseBookp->TQMenuData::setWhatsThis( id, tqtr("Print the entries of the phrase" + " book.") ); + updatePhraseDict(); + return TRUE; +} + +bool TrWindow::savePhraseBook( TQString& name, const PhraseBook& pb ) +{ + if ( !name.tqcontains( ".qph" ) && !name.tqcontains(".") ) + name += ".qph"; + + if ( !pb.save(name) ) { + TQMessageBox::warning( this, tqtr("TQt Linguist"), + tqtr("Cannot create phrase book '%1'.") + .arg(name) ); + return FALSE; + } + return TRUE; +} + +void TrWindow::updateProgress() +{ + if ( numNonobsolete == 0 ) + progress->setText( TQString(" " " ") ); + else + progress->setText( TQString(" %1/%2 ").arg(numFinished) + .arg(numNonobsolete) ); + prevUnfinishedAct->setEnabled( numFinished != numNonobsolete ); + nextUnfinishedAct->setEnabled( numFinished != numNonobsolete ); + prevAct->setEnabled( lv->firstChild() != 0 ); + nextAct->setEnabled( lv->firstChild() != 0 ); +} + +void TrWindow::updatePhraseDict() +{ + TQPtrListIterator<PhraseBook> pb = phraseBooks; + PhraseBook::Iterator p; + PhraseBook *ent; + phraseDict.clear(); + while ( pb.current() != 0 ) { + for ( p = (*pb)->begin(); p != (*pb)->end(); ++p ) { + TQString f = friendlyString( (*p).source() ); + if ( f.length() > 0 ) { + f = TQStringList::split( TQChar(' '), f ).first(); + ent = phraseDict.tqfind( f ); + if ( ent == 0 ) { + ent = new PhraseBook; + phraseDict.insert( f, ent ); + } + ent->append( *p ); + } + } + ++pb; + } + revalidate(); +} + +PhraseBook TrWindow::getPhrases( const TQString& source ) +{ + PhraseBook phrases; + TQString f = friendlyString( source ); + TQStringList lookupWords = TQStringList::split( TQChar(' '), f ); + TQStringList::Iterator w; + PhraseBook::Iterator p; + + for ( w = lookupWords.begin(); w != lookupWords.end(); ++w ) { + PhraseBook *ent = phraseDict.tqfind( *w ); + if ( ent != 0 ) { + for ( p = ent->begin(); p != ent->end(); ++p ) { + if ( f.tqfind(friendlyString((*p).source())) >= 0 ) + phrases.append( *p ); + } + } + } + return phrases; +} + +bool TrWindow::danger( const TQString& source, const TQString& translation, + bool verbose ) +{ + if ( acceleratorsAct->isOn() ) { + int sk = TQAccel::shortcutKey( source ); + int tk = TQAccel::shortcutKey( translation ); + if ( sk == 0 && tk != 0 ) { + if ( verbose ) + statusBar()->message( tqtr("Accelerator possibly superfluous in" + " translation."), ErrorMS ); + return TRUE; + } else if ( sk != 0 && tk == 0 ) { + if ( verbose ) + statusBar()->message( tqtr("Accelerator possibly missing in" + " translation."), ErrorMS ); + return TRUE; + } + } + if ( endingPunctuationAct->isOn() ) { + if ( ending(source) != ending(translation) ) { + if ( verbose ) + statusBar()->message( tqtr("Translation does not end with the" + " same punctuation as the source" + " text."), ErrorMS ); + return TRUE; + } + } + if ( phraseMatchesAct->isOn() ) { + TQString fsource = friendlyString( source ); + TQString ftranslation = friendlyString( translation ); + TQStringList lookupWords = TQStringList::split( TQChar(' '), fsource ); + TQStringList::Iterator w; + PhraseBook::Iterator p; + + for ( w = lookupWords.begin(); w != lookupWords.end(); ++w ) { + PhraseBook *ent = phraseDict.tqfind( *w ); + if ( ent != 0 ) { + for ( p = ent->begin(); p != ent->end(); ++p ) { + if ( fsource.tqfind(friendlyString((*p).source())) < 0 || + ftranslation.tqfind(friendlyString((*p).target())) >= 0 ) + break; + } + if ( p == ent->end() ) { + if ( verbose ) + statusBar()->message( tqtr("A phrase book suggestion for" + " '%1' was ignored.") + .arg(*w), ErrorMS ); + return TRUE; + } + } + } + } + if ( verbose ) + statusBar()->clear(); + + return FALSE; +} + +void TrWindow::readConfig() +{ + TQString keybase( "/TQt Linguist/" + + TQString::number( (TQT_VERSION >> 16) & 0xff ) + + "." + TQString::number( (TQT_VERSION >> 8) & 0xff ) + "/" ); + TQSettings config; + + config.insertSearchPath( TQSettings::Windows, "/Trolltech" ); + + TQRect r( pos(), size() ); + recentFiles = config.readListEntry( keybase + "RecentlyOpenedFiles" ); + if ( !config.readBoolEntry( keybase + "Geometry/MainwindowMaximized", FALSE ) ) { + r.setX( config.readNumEntry( keybase + "Geometry/MainwindowX", r.x() ) ); + r.setY( config.readNumEntry( keybase + "Geometry/MainwindowY", r.y() ) ); + r.setWidth( config.readNumEntry( keybase + "Geometry/MainwindowWidth", r.width() ) ); + r.setHeight( config.readNumEntry( keybase + "Geometry/MainwindowHeight", r.height() ) ); + + TQRect desk = TQApplication::desktop()->tqgeometry(); + TQRect inter = desk.intersect( r ); + resize( r.size() ); + if ( inter.width() * inter.height() > ( r.width() * r.height() / 20 ) ) { + move( r.topLeft() ); + } + } + + TQDockWindow * dw; + dw = (TQDockWindow *) lv->tqparent(); + int place; + place = config.readNumEntry( keybase + "Geometry/ContextwindowInTQt::Dock" ); + r.setX( config.readNumEntry( keybase + "Geometry/ContextwindowX" ) ); + r.setY( config.readNumEntry( keybase + "Geometry/ContextwindowY" ) ); + r.setWidth( config.readNumEntry( keybase + + "Geometry/ContextwindowWidth" ) ); + r.setHeight( config.readNumEntry( keybase + + "Geometry/ContextwindowHeight" ) ); + if ( place == TQDockWindow::OutsideDock ) { + dw->undock(); + dw->show(); + } + dw->setGeometry( r ); + + dw = (TQDockWindow *) slv->tqparent(); + place = config.readNumEntry( keybase + "Geometry/SourcewindowInTQt::Dock" ); + r.setX( config.readNumEntry( keybase + "Geometry/SourcewindowX" ) ); + r.setY( config.readNumEntry( keybase + "Geometry/SourcewindowY" ) ); + r.setWidth( config.readNumEntry( keybase + + "Geometry/SourcewindowWidth" ) ); + r.setHeight( config.readNumEntry( keybase + + "Geometry/SourcewindowHeight" ) ); + if ( place == TQDockWindow::OutsideDock ) { + dw->undock(); + dw->show(); + } + dw->setGeometry( r ); + + dw = (TQDockWindow *) plv->tqparent()->tqparent(); + place = config.readNumEntry( keybase + "Geometry/PhrasewindowInTQt::Dock" ); + r.setX( config.readNumEntry( keybase + "Geometry/PhrasewindowX" ) ); + r.setY( config.readNumEntry( keybase + "Geometry/PhrasewindowY" ) ); + r.setWidth( config.readNumEntry( keybase + + "Geometry/PhrasewindowWidth" ) ); + r.setHeight( config.readNumEntry( keybase + + "Geometry/PhrasewindowHeight" ) ); + if ( place == TQDockWindow::OutsideDock ) { + dw->undock(); + dw->show(); + } + dw->setGeometry( r ); + TQApplication::sendPostedEvents(); +} + +void TrWindow::writeConfig() +{ + TQString keybase( "/TQt Linguist/" + + TQString::number( (TQT_VERSION >> 16) & 0xff ) + + "." + TQString::number( (TQT_VERSION >> 8) & 0xff ) + "/" ); + TQSettings config; + + config.insertSearchPath( TQSettings::Windows, "/Trolltech" ); + config.writeEntry( keybase + "RecentlyOpenedFiles", recentFiles ); + config.writeEntry( keybase + "Geometry/MainwindowMaximized", isMaximized() ); + config.writeEntry( keybase + "Geometry/MainwindowX", x() ); + config.writeEntry( keybase + "Geometry/MainwindowY", y() ); + config.writeEntry( keybase + "Geometry/MainwindowWidth", width() ); + config.writeEntry( keybase + "Geometry/MainwindowHeight", height() ); + + TQDockWindow * dw =(TQDockWindow *) lv->tqparent(); + config.writeEntry( keybase + "Geometry/ContextwindowInTQt::Dock", dw->place() ); + config.writeEntry( keybase + "Geometry/ContextwindowX", dw->x() ); + config.writeEntry( keybase + "Geometry/ContextwindowY", dw->y() ); + config.writeEntry( keybase + "Geometry/ContextwindowWidth", dw->width() ); + config.writeEntry( keybase + "Geometry/ContextwindowHeight", dw->height() ); + + dw =(TQDockWindow *) slv->tqparent(); + config.writeEntry( keybase + "Geometry/SourcewindowInTQt::Dock", + dw->place() ); + config.writeEntry( keybase + "Geometry/SourcewindowX", dw->tqgeometry().x() ); + config.writeEntry( keybase + "Geometry/SourcewindowY", dw->tqgeometry().y() ); + config.writeEntry( keybase + "Geometry/SourcewindowWidth", dw->width() ); + config.writeEntry( keybase + "Geometry/SourcewindowHeight", dw->height() ); + + dw =(TQDockWindow *) plv->tqparent()->tqparent(); + config.writeEntry( keybase + "Geometry/PhrasewindowInTQt::Dock", + dw->place() ); + config.writeEntry( keybase + "Geometry/PhrasewindowX", dw->tqgeometry().x() ); + config.writeEntry( keybase + "Geometry/PhrasewindowY", dw->tqgeometry().y() ); + config.writeEntry( keybase + "Geometry/PhrasewindowWidth", dw->width() ); + config.writeEntry( keybase + "Geometry/PhrasewindowHeight", dw->height() ); +} + +void TrWindow::setupRecentFilesMenu() +{ + recentFilesMenu->clear(); + int id = 0; + TQStringList::Iterator it = recentFiles.begin(); + for ( ; it != recentFiles.end(); ++it ) + { + recentFilesMenu->insertItem( *it, id ); + id++; + } +} + +void TrWindow::recentFileActivated( int id ) +{ + if ( id != -1 ) { + if ( maybeSave() ) + openFile( *recentFiles.at( id ) ); + } +} + +void TrWindow::addRecentlyOpenedFile( const TQString &fn, TQStringList &lst ) +{ + if ( lst.tqfind( fn ) != lst.end() ) + return; + if ( lst.count() >= 10 ) + lst.remove( lst.begin() ); + lst << fn; +} + +void TrWindow::toggleGuessing() +{ + me->toggleGuessing(); +} + +void TrWindow::focusSourceList() +{ + slv->setFocus(); +} + +void TrWindow::focusPhraseList() +{ + plv->setFocus(); +} + +void TrWindow::updateClosePhraseBook() +{ + if ( dirtyItem != -1 ) { + closePhraseBookp->removeItem( closePhraseBookp->idAt(dirtyItem) ); + dirtyItem = -1; + } +} + +void TrWindow::toggleStatistics() +{ + if ( toggleStats->isOn() ) { + if ( !stats ) { + stats = new Statistics( this, "linguist_stats" ); + connect( this, TQT_SIGNAL(statsChanged(int,int,int,int,int,int)), stats, + TQT_SLOT(updateStats(int,int,int,int,int,int)) ); + connect( stats, TQT_SIGNAL(closed()), toggleStats, TQT_SLOT(toggle()) ); + } + updateStatistics(); + stats->show(); + } else if ( stats ) { + stats->close(); + } +} + +void TrWindow::updateStatistics() +{ + TQListViewItem * ci = lv->firstChild(); + int trW = 0; + int trC = 0; + int trCS = 0; + while ( ci ) { + countStats( ci, ((ContextLVI *)ci)->firstMessageItem(), trW, trC, trCS ); + ci = ci->nextSibling(); + } + // ..and the items in the source list + countStats( 0, slv->firstChild(), trW, trC, trCS ); + emit statsChanged( srcWords, srcChars, srcCharsSpc, trW, trC, trCS ); +} + + +void TrWindow::countStats( TQListViewItem* ci, TQListViewItem* mi, int& trW, int& trC, int& trCS ) +{ + MessageLVI * m; + while ( mi ) { + m = (MessageLVI *) mi; + if ( m->finished() && !(m->message().type() == MetaTranslatorMessage::Obsolete) ) + doCharCounting( m->translation(), trW, trC, trCS ); + if ( ci ) + mi = ((ContextLVI *)ci)->nextMessageItem(); + else + mi = mi->nextSibling(); + } +} + +void TrWindow::doCharCounting( const TQString& text, int& trW, int& trC, int& trCS ) +{ + trCS += text.length(); + bool inWord = FALSE; + for ( int i = 0; i < (int) text.length(); i++ ) { + if ( text[i].isLetterOrNumber() || text[i] == TQChar('_') ) { + if ( !inWord ) { + trW++; + inWord = TRUE; + } + } else { + inWord = FALSE; + } + if ( !text[i].isSpace() ) + trC++; + } +} |