/********************************************************************** ** 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 MsgEdit This is the right panel of the main window. */ #include "msgedit.h" #include "trwindow.h" #include "phraselv.h" #include "simtexth.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static const int MaxCandidates = 5; class MED : public TQTextEdit { public: MED( TQWidget *parent, const char *name = 0 ) : TQTextEdit( parent, name ) {} int cursorX() const { return textCursor()->x(); } int cursorY() const { return textCursor()->paragraph()->rect().y() + textCursor()->y(); } }; TQString richMeta( const TQString& text ) { return TQString( "(" ) + text + TQString( ")" ); } TQString richText( const TQString& text ) { const char backTab[] = "\a\b\f\n\r\t"; const char * const friendlyBackTab[] = { QT_TRANSLATE_NOOP( "MessageEditor", "bell" ), QT_TRANSLATE_NOOP( "MessageEditor", "backspace" ), QT_TRANSLATE_NOOP( "MessageEditor", "new page" ), QT_TRANSLATE_NOOP( "MessageEditor", "new line" ), QT_TRANSLATE_NOOP( "MessageEditor", "carriage return" ), QT_TRANSLATE_NOOP( "MessageEditor", "tab" ) }; TQString rich; for ( int i = 0; i < (int) text.length(); i++ ) { int ch = text[i].unicode(); if ( ch < 0x20 ) { const char *p = strchr( backTab, ch ); if ( p == 0 ) rich += richMeta( TQString::number(ch, 16) ); else rich += richMeta( MessageEditor::tr(friendlyBackTab[p - backTab]) ); } else if ( ch == '<' ) { rich += TQString( "<" ); } else if ( ch == '>' ) { rich += TQString( ">" ); } else if ( ch == '&' ) { rich += TQString( "&" ); } else if ( ch == ' ' ) { if ( i == 0 || i == (text.length()-1) || text[i - 1] == ' ' || text[i + 1] == ' ' ) { rich += richMeta( MessageEditor::tr("sp") ); } else { rich += ' '; } } else { rich += TQChar( ch ); } if ( ch == '\n' ) rich += TQString( "
" ); } return rich; } /* ShadowWidget class impl. Used to create a shadow like effect for a widget */ ShadowWidget::ShadowWidget( TQWidget * parent, const char * name ) : TQWidget( parent, name ), sWidth( 10 ), wMargin( 3 ), childWgt( 0 ) { } ShadowWidget::ShadowWidget( TQWidget * child, TQWidget * parent, const char * name ) : TQWidget( parent, name ), sWidth( 10 ), wMargin( 3 ), childWgt( 0 ) { setWidget( child ); } void ShadowWidget::setWidget( TQWidget * child ) { childWgt = child; if ( childWgt && childWgt->parent() != this ) { childWgt->reparent( this, TQPoint( 0, 0 ), TRUE ); } } void ShadowWidget::resizeEvent( TQResizeEvent * ) { if( childWgt ) { childWgt->move( wMargin, wMargin ); childWgt->resize( width() - sWidth - wMargin, height() - sWidth - wMargin ); } } void ShadowWidget::paintEvent( TQPaintEvent * e ) { TQPainter p; int w = width() - sWidth; int h = height() - sWidth; if ( !((w > 0) && (h > 0)) ) return; if ( p.begin( this ) ) { p.setPen( colorGroup().shadow() ); p.drawPoint( w + 5, 6 ); p.drawLine( w + 3, 6, w + 5, 8 ); p.drawLine( w + 1, 6, w + 5, 10 ); int i; for( i=7; i < h; i += 2 ) p.drawLine( w, i, w + 5, i + 5 ); for( i = w - i + h; i > 6; i -= 2 ) p.drawLine( i, h, i + 5, h + 5 ); for( ; i > 0 ; i -= 2 ) p.drawLine( 6, h + 6 - i, i + 5, h + 5 ); // p.eraseRect( w, 0, sWidth, 45 ); // Cheap hack for the page curl.. p.end(); } TQWidget::paintEvent( e ); } /* EditorPage class impl. A frame that contains the source text, translated text and any source code comments and hints. */ EditorPage::EditorPage( TQWidget * parent, const char * name ) : TQFrame( parent, name ) { setLineWidth( 1 ); setFrameStyle( TQFrame::Box | TQFrame::Plain ); // Use white explicitly as the background color for the editor page. TQPalette p = palette(); p.setColor( TQPalette::Active, TQColorGroup::Base, TQColor( white ) ); p.setColor( TQPalette::Inactive, TQColorGroup::Base, TQColor( white ) ); p.setColor( TQPalette::Disabled, TQColorGroup::Base, TQColor( white ) ); p.setColor( TQPalette::Active, TQColorGroup::Background, p.active().color( TQColorGroup::Base ) ); p.setColor( TQPalette::Inactive, TQColorGroup::Background, p.inactive().color( TQColorGroup::Base ) ); p.setColor( TQPalette::Disabled, TQColorGroup::Background, p.disabled().color( TQColorGroup::Base ) ); setPalette( p ); srcTextLbl = new TQLabel( tr("Source text"), this, "source text label" ); transLbl = new TQLabel( tr("Translation"), this, "translation label" ); TQFont fnt = font(); fnt.setBold( TRUE ); srcTextLbl->setFont( fnt ); transLbl->setFont( fnt ); srcText = new TQTextView( this, "source text view" ); srcText->setFrameStyle( TQFrame::NoFrame ); srcText->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Minimum ) ); srcText->setResizePolicy( TQScrollView::AutoOne ); srcText->setHScrollBarMode( TQScrollView::AlwaysOff ); srcText->setVScrollBarMode( TQScrollView::AlwaysOff ); p = srcText->palette(); p.setColor( TQPalette::Disabled, TQColorGroup::Base, p.active().base() ); srcText->setPalette( p ); connect( srcText, SIGNAL(textChanged()), SLOT(handleSourceChanges()) ); cmtText = new TQTextView( this, "comment/context view" ); cmtText->setFrameStyle( TQFrame::NoFrame ); cmtText->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Minimum ) ); cmtText->setResizePolicy( TQScrollView::AutoOne ); cmtText->setHScrollBarMode( TQScrollView::AlwaysOff ); cmtText->setVScrollBarMode( TQScrollView::AlwaysOff ); p = cmtText->palette(); p.setColor( TQPalette::Active, TQColorGroup::Base, TQColor( 236,245,255 ) ); p.setColor( TQPalette::Inactive, TQColorGroup::Base, TQColor( 236,245,255 ) ); cmtText->setPalette( p ); connect( cmtText, SIGNAL(textChanged()), SLOT(handleCommentChanges()) ); translationMed = new MED( this, "translation editor" ); translationMed->setFrameStyle( TQFrame::NoFrame ); translationMed->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) ); translationMed->setHScrollBarMode( TQScrollView::AlwaysOff ); translationMed->setVScrollBarMode( TQScrollView::AlwaysOff ); translationMed->setResizePolicy( TQScrollView::AutoOne ); translationMed->setWrapPolicy( TQTextView::AtWhiteSpace ); translationMed->setWordWrap( TQTextView::WidgetWidth ); translationMed->setTextFormat( TQTextView::PlainText ); p = translationMed->palette(); p.setColor( TQPalette::Disabled, TQColorGroup::Base, p.active().base() ); translationMed->setPalette( p ); connect( translationMed, SIGNAL(textChanged()), SLOT(handleTranslationChanges()) ); pageCurl = new PageCurl( this, "page curl" ); // Focus setFocusPolicy( StrongFocus ); transLbl->setFocusProxy( translationMed ); srcTextLbl->setFocusProxy( translationMed ); cmtText->setFocusProxy( translationMed ); srcText->setFocusProxy( translationMed ); setFocusProxy( translationMed ); updateCommentField(); } /* Don't show the comment field if there are no comments. */ void EditorPage::updateCommentField() { if( cmtText->text().isEmpty() ) cmtText->hide(); else cmtText->show(); layoutWidgets(); } /* Handle the widget layout manually */ void EditorPage::layoutWidgets() { int margin = 6; int space = 2; int w = width(); pageCurl->move( width() - pageCurl->width(), 0 ); TQFontMetrics fm( srcTextLbl->font() ); srcTextLbl->move( margin, margin ); srcTextLbl->resize( fm.width( srcTextLbl->text() ), srcTextLbl->height() ); srcText->move( margin, srcTextLbl->y() + srcTextLbl->height() + space ); srcText->resize( w - margin*2, srcText->height() ); cmtText->move( margin, srcText->y() + srcText->height() + space ); cmtText->resize( w - margin*2, cmtText->height() ); if( cmtText->isHidden() ) transLbl->move( margin, srcText->y() + srcText->height() + space ); else transLbl->move( margin, cmtText->y() + cmtText->height() + space ); transLbl->resize( w - margin*2, transLbl->height() ); translationMed->move( margin, transLbl->y() + transLbl->height() + space ); translationMed->resize( w - margin*2, translationMed->height() ); // Calculate the total height for the editor page - emit a signal // if the actual page size is larger/smaller int totHeight = margin + srcTextLbl->height() + srcText->height() + space + transLbl->height() + space + translationMed->height() + space + frameWidth()*lineWidth()*2 + space * 3; if( !cmtText->isHidden() ) totHeight += cmtText->height() + space; if( height() != totHeight ) emit pageHeightUpdated( totHeight ); } void EditorPage::resizeEvent( TQResizeEvent * ) { handleTranslationChanges(); handleSourceChanges(); handleCommentChanges(); layoutWidgets(); } void EditorPage::handleTranslationChanges() { calculateFieldHeight( (TQTextView *) translationMed ); } void EditorPage::handleSourceChanges() { calculateFieldHeight( srcText ); } void EditorPage::handleCommentChanges() { calculateFieldHeight( cmtText ); } /* Check if the translation text field is big enough to show all text that has been entered. If it isn't, resize it. */ void EditorPage::calculateFieldHeight( TQTextView * field ) { field->sync(); // make sure the text formatting is done! int contentsHeight = field->contentsHeight(); if( contentsHeight != field->height() ) { int oldHeight = field->height(); if( contentsHeight < 30 ) contentsHeight = 30; field->resize( field->width(), contentsHeight ); emit pageHeightUpdated( height() + (field->height() - oldHeight) ); } } void EditorPage::fontChange( const TQFont & ) { TQFont fnt = font(); fnt.setBold( TRUE ); TQFontMetrics fm( fnt ); srcTextLbl->setFont( fnt ); srcTextLbl->resize( fm.width( srcTextLbl->text() ), srcTextLbl->height() ); transLbl->setFont( fnt ); transLbl->resize( fm.width( transLbl->text() ), transLbl->height() ); update(); } /* MessageEditor class impl. Handle layout of dock windows and the editor page. */ MessageEditor::MessageEditor( MetaTranslator * t, TQWidget * parent, const char * name ) : TQWidget( parent, name ), tor( t ) { doGuesses = TRUE; v = new TQVBoxLayout( this ); topDock = new TQDockArea( TQt::Horizontal, TQDockArea::Normal, this, "top dock area" ); topDock->setMinimumHeight( 10 ); topDock->setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum) ); topDockWnd = new TQDockWindow( TQDockWindow::InDock, topDock, "top dock window" ); TQMainWindow *mw = (TQMainWindow*)topLevelWidget(); if ( mw ) { mw->setDockEnabled( topDockWnd, TQt::DockTop, TRUE ); mw->setDockEnabled( topDockWnd, TQt::DockLeft, TRUE ); mw->setDockEnabled( topDockWnd, TQt::DockRight, TRUE ); mw->setDockEnabled( topDockWnd, TQt::DockBottom, TRUE ); } topDockWnd->setCaption( tr("Source text") ); topDockWnd->setCloseMode( TQDockWindow::Always ); topDockWnd->setResizeEnabled( TRUE ); topDockWnd->setFixedExtentHeight( 110 ); srcTextList = new TQListView( topDockWnd, "source text list view" ); srcTextList->setShowSortIndicator( TRUE ); srcTextList->setAllColumnsShowFocus( TRUE ); srcTextList->setSorting( 0 ); TQFontMetrics fm( font() ); srcTextList->addColumn( tr("Done"), fm.width( tr("Done") ) + 10 ); srcTextList->addColumn( tr("Source text") ); srcTextList->addColumn( tr("Translation"), 300 ); srcTextList->setColumnAlignment( 0, TQt::AlignCenter ); srcTextList->setColumnWidthMode( 1, TQListView::Manual ); srcTextList->header()->setStretchEnabled( TRUE, 1 ); srcTextList->setMinimumSize( TQSize( 50, 50 ) ); srcTextList->setHScrollBarMode( TQScrollView::AlwaysOff ); srcTextList->installEventFilter( this ); topDockWnd->setWidget( srcTextList ); sv = new TQScrollView( this, "scroll view" ); sv->setHScrollBarMode( TQScrollView::AlwaysOff ); sv->viewport()->setBackgroundMode( PaletteBackground ); editorPage = new EditorPage( sv, "editor page" ); connect( editorPage, SIGNAL(pageHeightUpdated(int)), SLOT(updatePageHeight(int)) ); editorPage->translationMed->installEventFilter( this ); sw = new ShadowWidget( editorPage, sv, "editor page shadow" ); sw->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding) ); sw->setMinimumSize( TQSize( 100, 150 ) ); sv->addChild( sw ); bottomDock = new TQDockArea( TQt::Horizontal, TQDockArea::Reverse, this, "bottom dock area" ); bottomDock->setMinimumHeight( 10 ); bottomDock->setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum) ); bottomDockWnd = new TQDockWindow( TQDockWindow::InDock, bottomDock, "bottom dock window" ); if ( mw ) { mw->setDockEnabled( bottomDockWnd, TQt::DockTop, TRUE ); mw->setDockEnabled( bottomDockWnd, TQt::DockLeft, TRUE ); mw->setDockEnabled( bottomDockWnd, TQt::DockRight, TRUE ); mw->setDockEnabled( bottomDockWnd, TQt::DockBottom, TRUE ); } bottomDockWnd->setCaption( tr("Phrases") ); bottomDockWnd->setCloseMode( TQDockWindow::Always ); bottomDockWnd->setResizeEnabled( TRUE ); TQWidget * w = new TQWidget( bottomDockWnd ); w->setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Minimum ) ); TQHBoxLayout *hl = new TQHBoxLayout( w, 6 ); TQVBoxLayout *vl = new TQVBoxLayout( 6 ); phraseLbl = new TQLabel( tr("Phrases and guesses:"), w ); phraseLv = new PhraseLV( w, "phrase list view" ); phraseLv->setSorting( PhraseLVI::DefinitionText ); phraseLv->installEventFilter( this ); hl->addLayout( vl ); vl->addWidget( phraseLbl ); vl->addWidget( phraseLv ); accel = new TQAccel( this, "accel" ); connect( accel, SIGNAL(activated(int)), this, SLOT(guessActivated(int)) ); for ( int i = 0; i < 9; i++ ) accel->insertItem( CTRL + (Key_1 + i), i + 1 ); bottomDockWnd->setWidget( w ); v->addWidget( topDock ); v->addWidget( sv ); v->addWidget( bottomDock ); // Signals connect( editorPage->pageCurl, SIGNAL(nextPage()), SIGNAL(nextUnfinished()) ); connect( editorPage->pageCurl, SIGNAL(prevPage()), SIGNAL(prevUnfinished()) ); connect( editorPage->translationMed, SIGNAL(textChanged()), this, SLOT(emitTranslationChanged()) ); connect( editorPage->translationMed, SIGNAL(textChanged()), this, SLOT(updateButtons()) ); connect( editorPage->translationMed, SIGNAL(undoAvailable(bool)), this, SIGNAL(undoAvailable(bool)) ); connect( editorPage->translationMed, SIGNAL(redoAvailable(bool)), this, SIGNAL(redoAvailable(bool)) ); connect( editorPage->translationMed, SIGNAL(copyAvailable(bool)), this, SIGNAL(cutAvailable(bool)) ); connect( editorPage->translationMed, SIGNAL(copyAvailable(bool)), this, SIGNAL(copyAvailable(bool)) ); connect( tqApp->clipboard(), SIGNAL(dataChanged()), this, SLOT(updateCanPaste()) ); connect( phraseLv, SIGNAL(doubleClicked(TQListViewItem *)), this, SLOT(insertPhraseInTranslation(TQListViewItem *)) ); connect( phraseLv, SIGNAL(returnPressed(TQListViewItem *)), this, SLOT(insertPhraseInTranslationAndLeave(TQListViewItem *)) ); // What's this TQWhatsThis::add( this, tr("This whole panel allows you to view and edit " "the translation of some source text.") ); TQWhatsThis::add( editorPage->srcText, tr("This area shows the source text.") ); TQWhatsThis::add( editorPage->cmtText, tr("This area shows a comment that" " may guide you, and the context in which the text" " occurs.") ); TQWhatsThis::add( editorPage->translationMed, tr("This is where you can enter or modify" " the translation of some source text.") ); } void MessageEditor::toggleFinished() { if ( itemFinished ) itemFinished = FALSE; else itemFinished = TRUE; emit finished( itemFinished ); } bool MessageEditor::eventFilter( TQObject *o, TQEvent *e ) { // Handle keypresses in the message editor - scroll the view if the current // line is hidden. if ( e->type() == TQEvent::KeyPress || e->type() == TQEvent::KeyRelease ) { TQKeyEvent * ke = (TQKeyEvent*)e; const int k = ke->key(); if ( ::qt_cast(o) ) { if ( e->type() == TQEvent::KeyPress ) { // Hardcode the Tab key to do focus changes when pressed // inside the editor if ( k == Key_BackTab ) { emit focusSourceList(); return TRUE; } } else if ( e->type() == TQEvent::KeyRelease ) { MED * ed = (MED *) o; switch( k ) { case Key_Up: if (ed->cursorY() < 10) sv->verticalScrollBar()->subtractLine(); break; case Key_Down: if (ed->cursorY() >= ed->height() - 20) sv->verticalScrollBar()->addLine(); break; case Key_PageUp: if (ed->cursorY() < 10) sv->verticalScrollBar()->subtractPage(); break; case Key_PageDown: if (ed->cursorY() >= ed->height() - 50) sv->verticalScrollBar()->addPage(); break; default: sv->ensureVisible( sw->margin() + ed->x() + ed->cursorX(), sw->margin() + ed->y() + ed->cursorY() ); break; } } } else if ( ::qt_cast(o) ) { // handle the ESC key in the list views if ( e->type() == TQEvent::KeyRelease && k == Key_Escape ) editorPage->translationMed->setFocus(); } } return TQWidget::eventFilter( o, e ); } void MessageEditor::updatePageHeight( int height ) { sw->resize( sw->width(), height + sw->margin() + sw->shadowWidth() ); } void MessageEditor::resizeEvent( TQResizeEvent * ) { sw->resize( sv->viewport()->width(), sw->height() ); } TQListView * MessageEditor::sourceTextList() const { return srcTextList; } TQListView * MessageEditor::phraseList() const { return phraseLv; } void MessageEditor::showNothing() { editorPage->srcText->setText( "" ); showContext( TQString(""), FALSE ); } void MessageEditor::showContext( const TQString& context, bool finished ) { setEditionEnabled( FALSE ); sourceText = TQString::null; guesses.clear(); if( context.isEmpty() ) editorPage->cmtText->setText(""); else editorPage->cmtText->setText( richText(context.simplifyWhiteSpace()) ); setTranslation( TQString(""), FALSE ); setFinished( finished ); phraseLv->clear(); editorPage->handleSourceChanges(); editorPage->handleCommentChanges(); editorPage->handleTranslationChanges(); editorPage->updateCommentField(); } void MessageEditor::showMessage( const TQString& text, const TQString& comment, const TQString& fullContext, const TQString& translation, MetaTranslatorMessage::Type type, const TQValueList& phrases ) { bool obsolete = ( type == MetaTranslatorMessage::Obsolete ); setEditionEnabled( !obsolete ); sourceText = text; guesses.clear(); editorPage->srcText->setText( TQString("

") + richText( text ) + TQString("

") ); if ( !fullContext.isEmpty() && !comment.isEmpty() ) editorPage->cmtText->setText( richText(fullContext.simplifyWhiteSpace()) + "\n" + richText(comment.simplifyWhiteSpace()) ); else if ( !fullContext.isEmpty() && comment.isEmpty() ) editorPage->cmtText->setText(richText(fullContext.simplifyWhiteSpace() ) ); else if ( fullContext.isEmpty() && !comment.isEmpty() ) editorPage->cmtText->setText( richText(comment.simplifyWhiteSpace() ) ); else editorPage->cmtText->setText( "" ); setTranslation( translation, FALSE ); setFinished( type != MetaTranslatorMessage::Unfinished ); TQValueList::ConstIterator p; phraseLv->clear(); for ( p = phrases.begin(); p != phrases.end(); ++p ) (void) new PhraseLVI( phraseLv, *p ); if ( doGuesses && !sourceText.isEmpty() ) { CandidateList cl = similarTextHeuristicCandidates( tor, sourceText.latin1(), MaxCandidates ); int n = 0; TQValueList::Iterator it = cl.begin(); while ( it != cl.end() ) { TQString def; if ( n < 9 ) def = tr( "Guess (%1)" ).arg( TQString(TQKeySequence(CTRL | (Key_0 + (n + 1)))) ); else def = tr( "Guess" ); (void) new PhraseLVI( phraseLv, Phrase((*it).source, (*it).target, def), n + 1 ); n++; ++it; } } editorPage->handleSourceChanges(); editorPage->handleCommentChanges(); editorPage->handleTranslationChanges(); editorPage->updateCommentField(); } void MessageEditor::setTranslation( const TQString& translation, bool emitt ) { // Block signals so that 'textChanged()' is not emitted when // for example a new source text item is selected and *not* // the actual translation. editorPage->translationMed->blockSignals( !emitt ); editorPage->translationMed->setText( translation ); editorPage->translationMed->blockSignals( FALSE ); if ( !emitt ) updateButtons(); emit cutAvailable( FALSE ); emit copyAvailable( FALSE ); } void MessageEditor::setEditionEnabled( bool enabled ) { editorPage->transLbl->setEnabled( enabled ); editorPage->translationMed->setReadOnly( !enabled ); phraseLbl->setEnabled( enabled ); phraseLv->setEnabled( enabled ); updateCanPaste(); } void MessageEditor::undo() { editorPage->translationMed->undo(); } void MessageEditor::redo() { editorPage->translationMed->redo(); } void MessageEditor::cut() { editorPage->translationMed->cut(); } void MessageEditor::copy() { editorPage->translationMed->copy(); } void MessageEditor::paste() { editorPage->translationMed->paste(); } void MessageEditor::del() { editorPage->translationMed->del(); } void MessageEditor::selectAll() { editorPage->translationMed->selectAll(); } void MessageEditor::emitTranslationChanged() { emit translationChanged( editorPage->translationMed->text() ); } void MessageEditor::guessActivated( int accelKey ) { TQListViewItem *item = phraseLv->firstChild(); while ( item != 0 && ((PhraseLVI *) item)->accelKey() != accelKey ) item = item->nextSibling(); if ( item != 0 ) insertPhraseInTranslation( item ); } void MessageEditor::insertPhraseInTranslation( TQListViewItem *item ) { editorPage->translationMed->insert(((PhraseLVI *) item)->phrase().target()); emit translationChanged( editorPage->translationMed->text() ); } void MessageEditor::insertPhraseInTranslationAndLeave( TQListViewItem *item ) { editorPage->translationMed->insert(((PhraseLVI *) item)->phrase().target()); emit translationChanged( editorPage->translationMed->text() ); editorPage->translationMed->setFocus(); } void MessageEditor::updateButtons() { bool overwrite = ( !editorPage->translationMed->isReadOnly() && (editorPage->translationMed->text().stripWhiteSpace().isEmpty() || mayOverwriteTranslation) ); mayOverwriteTranslation = FALSE; emit updateActions( overwrite ); } void MessageEditor::beginFromSource() { mayOverwriteTranslation = TRUE; setTranslation( sourceText, TRUE ); if ( !editorPage->hasFocus() ) editorPage->setFocus(); } void MessageEditor::finishAndNext() { setFinished( TRUE ); emit nextUnfinished(); if ( !editorPage->hasFocus() ) editorPage->setFocus(); } void MessageEditor::updateCanPaste() { bool oldCanPaste = canPaste; canPaste = ( !editorPage->translationMed->isReadOnly() && !tqApp->clipboard()->text().isNull() ); if ( canPaste != oldCanPaste ) emit pasteAvailable( canPaste ); } void MessageEditor::setFinished( bool finished ) { if ( !finished != !itemFinished ) toggleFinished(); } void MessageEditor::toggleGuessing() { doGuesses = !doGuesses; if ( !doGuesses ) { phraseLv->clear(); } }