summaryrefslogtreecommitdiffstats
path: root/src/idsuggestionswidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/idsuggestionswidget.cpp')
-rw-r--r--src/idsuggestionswidget.cpp567
1 files changed, 567 insertions, 0 deletions
diff --git a/src/idsuggestionswidget.cpp b/src/idsuggestionswidget.cpp
new file mode 100644
index 0000000..d2d371f
--- /dev/null
+++ b/src/idsuggestionswidget.cpp
@@ -0,0 +1,567 @@
+/***************************************************************************
+ * Copyright (C) 2004-2009 by Thomas Fischer *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qobjectlist.h>
+#include <qscrollview.h>
+
+#include <kglobalsettings.h>
+#include <klineedit.h>
+#include <kpopupmenu.h>
+#include <kcombobox.h>
+#include <kpushbutton.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <idsuggestions.h>
+#include <fileimporter.h>
+#include <fileimporterbibtex.h>
+#include "idsuggestionswidget.h"
+
+#define min(a,b) ((a)>(b)?(b):(a))
+#define max(a,b) ((a)<(b)?(b):(a))
+
+namespace KBibTeX
+{
+ QString IdSuggestionsWidget::exampleBibTeXEntry = "@Article{ dijkstra1983terminationdetect,\nauthor = {Edsger W. Dijkstra and W. H. J. Feijen and A. J. M. {van Gasteren}},\ntitle = {{Derivation of a Termination Detection Algorithm for Distributed Computations}},\njournal = {Information Processing Letters},\nvolume = 16,\nnumber = 5,\npages = {217--219},\nmonth = jun,\nyear = 1983\n}";
+
+ IdSuggestionComponent::IdSuggestionComponent( const QString& title, QWidget *parent ): QFrame( parent ), m_toBeDeleted( false ), m_title( title ), m_parent( parent )
+ {
+ setFrameShape( QFrame::Panel );
+ setFrameShadow( QFrame::Sunken );
+ setLineWidth( 1 );
+ }
+
+ QWidget *IdSuggestionComponent::moveWidgets( QWidget *parent )
+ {
+ QWidget *container = new QWidget( parent );
+ QVBoxLayout *layout = new QVBoxLayout( container, 0, KDialog::spacingHint() );
+ m_pushButtonUp = new KPushButton( QIconSet( SmallIcon( "up" ) ), i18n( "Up" ), container );
+ m_pushButtonDown = new KPushButton( QIconSet( SmallIcon( "down" ) ), i18n( "Down" ), container );
+ m_pushButtonDel = new KPushButton( QIconSet( SmallIcon( "remove" ) ), i18n( "Delete" ), container );
+ layout->addWidget( m_pushButtonUp );
+ layout->addWidget( m_pushButtonDown );
+ layout->addWidget( m_pushButtonDel );
+ layout->addStretch( 10 );
+ connect( m_pushButtonUp, SIGNAL( clicked() ), this, SLOT( slotUp() ) );
+ connect( m_pushButtonDown, SIGNAL( clicked() ), this, SLOT( slotDown() ) );
+ connect( m_pushButtonDel, SIGNAL( clicked() ), this, SLOT( slotDelete() ) );
+ return container;
+ }
+
+ void IdSuggestionComponent::setEnableUpDown( bool enableUp, bool enableDown )
+ {
+ m_pushButtonUp->setEnabled( enableUp );
+ m_pushButtonDown->setEnabled( enableDown );
+ }
+
+ void IdSuggestionComponent::slotUp()
+ {
+ QVBoxLayout *layout = dynamic_cast<QVBoxLayout*>( m_parent->layout() );
+ if ( layout == NULL ) return;
+ int oldPos = layout->findWidget( this );
+ if ( oldPos > 0 )
+ {
+ layout->remove( this );
+ layout->insertWidget( oldPos - 1, this );
+ emit moved();
+ }
+ }
+
+ void IdSuggestionComponent::slotDown()
+ {
+ QVBoxLayout *layout = dynamic_cast<QVBoxLayout*>( m_parent->layout() );
+ if ( layout == NULL ) return;
+ int oldPos = layout->findWidget( this );
+ int componentCount = dynamic_cast<IdSuggestionsWidget*>( m_parent->parent()->parent()->parent() )->numComponents();
+ if ( oldPos < componentCount - 1 )
+ {
+ layout->remove( this );
+ layout->insertWidget( oldPos + 1, this );
+ emit moved();
+ }
+ }
+
+ void IdSuggestionComponent::slotDelete()
+ {
+ m_toBeDeleted = true;
+ emit deleted();
+ delete this;
+ }
+
+ IdSuggestionComponentAuthor::IdSuggestionComponentAuthor( const QString &text, QWidget *parent ): IdSuggestionComponent( i18n( "Author" ), parent )
+ {
+ QGridLayout *layout = new QGridLayout( this, 6, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( m_title, this );
+ QFont labelFont( label->font() );
+ labelFont.setBold( TRUE );
+ label->setFont( labelFont );
+ label->setBackgroundColor( KGlobalSettings::highlightColor() );
+ label->setPaletteForegroundColor( KGlobalSettings::highlightedTextColor() );
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ layout->addMultiCellWidget( label, 0, 0, 0, 2 );
+
+ m_comboBoxWhichAuthors = new KComboBox( false, this );
+ layout->addMultiCellWidget( m_comboBoxWhichAuthors, 1, 1, 0, 1 );
+ m_comboBoxWhichAuthors->insertItem( i18n( "All authors" ) );
+ m_comboBoxWhichAuthors->insertItem( i18n( "First author only" ) );
+ m_comboBoxWhichAuthors->insertItem( i18n( "All but first author" ) );
+ switch ( text[0] )
+ {
+ case 'a': m_comboBoxWhichAuthors->setCurrentItem( 1 ); break;
+ case 'z': m_comboBoxWhichAuthors->setCurrentItem( 2 ); break;
+ default: m_comboBoxWhichAuthors->setCurrentItem( 0 );
+ }
+ connect( m_comboBoxWhichAuthors, SIGNAL( activated( const QString& ) ), SIGNAL( modified() ) );
+
+ struct IdSuggestionTokenInfo info = IdSuggestions::evalToken( text.mid( 1 ) );
+
+ label = new QLabel( i18n( "Casing:" ), this );
+ layout->addWidget( label, 2, 0 );
+ m_comboBoxCasing = new KComboBox( FALSE, this );
+ label->setBuddy( m_comboBoxCasing );
+ layout->addWidget( m_comboBoxCasing, 2, 1 );
+ m_comboBoxCasing->insertItem( i18n( "No change" ) );
+ m_comboBoxCasing->insertItem( i18n( "Lower case" ) );
+ m_comboBoxCasing->insertItem( i18n( "Upper case" ) );
+ if ( info.toLower )
+ m_comboBoxCasing->setCurrentItem( 1 );
+ else if ( info.toUpper )
+ m_comboBoxCasing->setCurrentItem( 2 );
+ else
+ m_comboBoxCasing->setCurrentItem( 0 );
+ connect( m_comboBoxCasing, SIGNAL( activated( const QString& ) ), SIGNAL( modified() ) );
+
+ label = new QLabel( i18n( "Only first letters:" ), this );
+ layout->addWidget( label, 3, 0 );
+ m_spinBoxLen = new QSpinBox( this );
+ label->setBuddy( m_spinBoxLen );
+ layout->addWidget( m_spinBoxLen, 3, 1 );
+ m_spinBoxLen->setMinValue( 0 );
+ m_spinBoxLen->setMaxValue( 9 );
+ m_spinBoxLen->setSpecialValueText( i18n( "Complete name" ) );
+ m_spinBoxLen->setValue( info.len > 9 ? 0 : info.len );
+ m_spinBoxLen->setMinimumWidth( m_spinBoxLen->fontMetrics().width( i18n( "Complete name" ) ) + 32 );
+ connect( m_spinBoxLen, SIGNAL( valueChanged( int ) ), SIGNAL( modified() ) );
+
+ label = new QLabel( i18n( "Text between authors:" ), this );
+ layout->addWidget( label, 4, 0 );
+ m_lineEditInBetween = new KLineEdit( this );
+ label->setBuddy( m_lineEditInBetween );
+ layout->addWidget( m_lineEditInBetween, 4, 1 );
+ m_lineEditInBetween->setText( info.inBetween );
+ connect( m_lineEditInBetween, SIGNAL( textChanged( const QString& ) ), SIGNAL( modified() ) );
+
+ layout->setRowStretch( 5, 1 );
+ layout->setColStretch( 1, 1 );
+ layout->setColSpacing( 2, KDialog::spacingHint() * 3 );
+ layout->addMultiCellWidget( moveWidgets( this ), 0, 5, 3, 3 );
+ }
+
+ QString IdSuggestionComponentAuthor::text() const
+ {
+ if ( m_toBeDeleted ) return QString::null;
+
+ QString result;
+ switch ( m_comboBoxWhichAuthors->currentItem() )
+ {
+ case 1: result = "a"; break;
+ case 2: result = "z"; break;
+ default: result = "A";
+ }
+ if ( m_spinBoxLen->value() > 0 && m_spinBoxLen->value() <= 9 ) result.append( QString::number( m_spinBoxLen->value() ) );
+ if ( m_comboBoxCasing->currentItem() == 1 ) result.append( "l" );
+ else if ( m_comboBoxCasing->currentItem() == 2 ) result.append( "u" );
+ if ( !m_lineEditInBetween->text().isEmpty() ) result.append( '"' ).append( m_lineEditInBetween->text() );
+
+ return result;
+ }
+
+ IdSuggestionComponentTitle::IdSuggestionComponentTitle( const QString &text, QWidget *parent ): IdSuggestionComponent( i18n( "Title" ), parent )
+ {
+ QGridLayout *layout = new QGridLayout( this, 6, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( m_title, this );
+ QFont labelFont( label->font() );
+ labelFont.setBold( TRUE );
+ label->setFont( labelFont );
+ label->setBackgroundColor( KGlobalSettings::highlightColor() );
+ label->setPaletteForegroundColor( KGlobalSettings::highlightedTextColor() );
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ layout->addMultiCellWidget( label, 0, 0, 0, 2 );
+
+ m_checkBoxRemoveSmallWords = new QCheckBox( i18n( "Remove small words" ), this );
+ layout->addMultiCellWidget( m_checkBoxRemoveSmallWords, 1, 1, 0, 1 );
+ m_checkBoxRemoveSmallWords->setChecked( text[0] == 'T' );
+ connect( m_checkBoxRemoveSmallWords, SIGNAL( toggled( bool ) ), SIGNAL( modified() ) );
+
+ struct IdSuggestionTokenInfo info = IdSuggestions::evalToken( text.mid( 1 ) );
+
+ label = new QLabel( i18n( "Casing:" ), this );
+ layout->addWidget( label, 2, 0 );
+ m_comboBoxCasing = new KComboBox( FALSE, this );
+ label->setBuddy( m_comboBoxCasing );
+ layout->addWidget( m_comboBoxCasing, 2, 1 );
+ m_comboBoxCasing->insertItem( i18n( "No change" ) );
+ m_comboBoxCasing->insertItem( i18n( "Lower case" ) );
+ m_comboBoxCasing->insertItem( i18n( "Upper case" ) );
+ if ( info.toLower )
+ m_comboBoxCasing->setCurrentItem( 1 );
+ else if ( info.toUpper )
+ m_comboBoxCasing->setCurrentItem( 2 );
+ else
+ m_comboBoxCasing->setCurrentItem( 0 );
+ connect( m_comboBoxCasing, SIGNAL( textChanged( const QString& ) ), SIGNAL( modified() ) );
+
+ label = new QLabel( i18n( "Only first letters:" ), this );
+ layout->addWidget( label, 3, 0 );
+ m_spinBoxLen = new QSpinBox( this );
+ label->setBuddy( m_spinBoxLen );
+ layout->addWidget( m_spinBoxLen, 3, 1 );
+ m_spinBoxLen->setMinValue( 0 );
+ m_spinBoxLen->setMaxValue( 9 );
+ m_spinBoxLen->setSpecialValueText( i18n( "Complete title" ) );
+ m_spinBoxLen->setValue( info.len > 9 ? 0 : info.len );
+ m_spinBoxLen->setMinimumWidth( m_spinBoxLen->fontMetrics().width( i18n( "Complete title" ) ) + 32 );
+ connect( m_spinBoxLen, SIGNAL( valueChanged( int ) ), SIGNAL( modified() ) );
+
+ label = new QLabel( i18n( "Text between words:" ), this );
+ layout->addWidget( label, 4, 0 );
+ m_lineEditInBetween = new KLineEdit( this );
+ label->setBuddy( m_lineEditInBetween );
+ layout->addWidget( m_lineEditInBetween, 4, 1 );
+ m_lineEditInBetween->setText( info.inBetween );
+ connect( m_lineEditInBetween, SIGNAL( textChanged( const QString& ) ), SIGNAL( modified() ) );
+
+ layout->setRowStretch( 5, 1 );
+ layout->setColStretch( 1, 1 );
+ layout->setColSpacing( 2, KDialog::spacingHint() *2 );
+ layout->addMultiCellWidget( moveWidgets( this ), 0, 5, 3, 3 );
+ }
+
+ QString IdSuggestionComponentTitle::text() const
+ {
+ if ( m_toBeDeleted ) return QString::null;
+
+ QString result = m_checkBoxRemoveSmallWords->isChecked() ? "T" : "t";
+ if ( m_spinBoxLen->value() > 0 && m_spinBoxLen->value() <= 9 ) result.append( QString::number( m_spinBoxLen->value() ) );
+ if ( m_comboBoxCasing->currentItem() == 1 ) result.append( "l" );
+ else if ( m_comboBoxCasing->currentItem() == 2 ) result.append( "u" );
+ if ( !m_lineEditInBetween->text().isEmpty() ) result.append( '"' ).append( m_lineEditInBetween->text() );
+
+ return result;
+ }
+
+ IdSuggestionComponentYear::IdSuggestionComponentYear( const QString &text, QWidget *parent ): IdSuggestionComponent( i18n( "Year" ), parent )
+ {
+ QGridLayout *layout = new QGridLayout( this, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( m_title, this );
+ QFont labelFont( label->font() );
+ labelFont.setBold( TRUE );
+ label->setFont( labelFont );
+ label->setBackgroundColor( KGlobalSettings::highlightColor() );
+ label->setPaletteForegroundColor( KGlobalSettings::highlightedTextColor() );
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ layout->addMultiCellWidget( label, 0, 0, 0, 2 );
+
+ label = new QLabel( i18n( "Year:" ), this );
+ layout->addWidget( label, 1, 0 );
+ m_comboBoxDigits = new KComboBox( this );
+ label->setBuddy( m_comboBoxDigits );
+ layout->addWidget( m_comboBoxDigits, 1, 1 );
+ m_comboBoxDigits->insertItem( i18n( "2 digits" ) );
+ m_comboBoxDigits->insertItem( i18n( "4 digits" ) );
+ m_comboBoxDigits->setCurrentItem( text[0] == 'y' ? 0 : 1 );
+ connect( m_comboBoxDigits, SIGNAL( activated( int ) ), SIGNAL( modified() ) );
+
+ layout->setColStretch( 1, 1 );
+ layout->setRowStretch( 2, 1 );
+ layout->setColSpacing( 2, KDialog::spacingHint() *2 );
+ layout->addMultiCellWidget( moveWidgets( this ), 0, 2, 3, 3 );
+ }
+
+ QString IdSuggestionComponentYear::text() const
+ {
+ if ( m_toBeDeleted ) return QString::null;
+ return m_comboBoxDigits->currentItem() == 0 ? "y" : "Y";
+ }
+
+ IdSuggestionComponentText::IdSuggestionComponentText( const QString &text, QWidget *parent ): IdSuggestionComponent( i18n( "Text" ), parent )
+ {
+ QGridLayout *layout = new QGridLayout( this, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( m_title, this );
+ QFont labelFont( label->font() );
+ labelFont.setBold( TRUE );
+ label->setFont( labelFont );
+ label->setBackgroundColor( KGlobalSettings::highlightColor() );
+ label->setPaletteForegroundColor( KGlobalSettings::highlightedTextColor() );
+ label->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
+ layout->addMultiCellWidget( label, 0, 0, 0, 2 );
+
+ label = new QLabel( i18n( "Text in between:" ), this );
+ layout->addWidget( label, 1, 0 );
+ m_lineEditInBetween = new KLineEdit( this );
+ label->setBuddy( m_lineEditInBetween );
+ layout->addWidget( m_lineEditInBetween, 1, 1 );
+ m_lineEditInBetween->setText( text.mid( 1 ) );
+ connect( m_lineEditInBetween, SIGNAL( textChanged( const QString& ) ), SIGNAL( modified() ) );
+
+ layout->setColStretch( 1, 1 );
+ layout->setRowStretch( 2, 1 );
+ layout->setColSpacing( 2, KDialog::spacingHint() * 2 );
+ layout->addMultiCellWidget( moveWidgets( this ), 0, 2, 3, 3 );
+ }
+
+ QString IdSuggestionComponentText::text() const
+ {
+ if ( m_toBeDeleted ) return QString::null;
+ return m_lineEditInBetween->text().isEmpty() ? QString::null : QString( "\"" ).append( m_lineEditInBetween->text() );
+ }
+
+ IdSuggestionsScrollView::IdSuggestionsScrollView( QWidget *parent, const char*name ): QScrollView( parent, name ), m_widget( NULL )
+ {
+ setMinimumHeight( 256 );
+ setHScrollBarMode( QScrollView::AlwaysOff );
+ setVScrollBarMode( QScrollView::AlwaysOn );
+ setLineWidth( 0 );
+ }
+
+ IdSuggestionsScrollView::~IdSuggestionsScrollView()
+ {
+ // nothing
+ }
+
+ void IdSuggestionsScrollView::viewportResizeEvent( QResizeEvent * )
+ {
+ if ( m_widget != NULL )
+ m_widget->setFixedWidth( viewport()->width() );
+ }
+
+ IdSuggestionsWidget::IdSuggestionsWidget( const QString &formatStr, KDialogBase *parent, const char *name )
+ : QWidget( parent, name ), m_originalFormatStr( formatStr ), m_parent( parent )
+ {
+ BibTeX::FileImporter *importer = new BibTeX::FileImporterBibTeX( false );
+ BibTeX::File *file = importer->load( exampleBibTeXEntry );
+ m_example = new BibTeX::Entry( dynamic_cast<BibTeX::Entry*>( *( file->begin() ) ) );
+ delete file;
+ delete importer;
+
+ setupGUI();
+ reset( formatStr );
+ }
+
+ IdSuggestionsWidget::~IdSuggestionsWidget()
+ {
+ // nothing
+ }
+
+ int IdSuggestionsWidget::numComponents()
+ {
+ return m_componentCount;
+ }
+
+ QDialog::DialogCode IdSuggestionsWidget::execute( QString &formatStr, QWidget *parent, const char *name )
+ {
+ KDialogBase * dlg = new KDialogBase( parent, name, true, i18n( "Edit Id Suggestions" ), KDialogBase::Ok | KDialogBase::Cancel );
+ IdSuggestionsWidget* ui = new IdSuggestionsWidget( formatStr, dlg, "IdSuggestionsWidget" );
+ dlg->setMainWidget( ui );
+
+ QDialog::DialogCode result = ( QDialog::DialogCode ) dlg->exec();
+ if ( result == QDialog::Accepted )
+ ui->apply( formatStr );
+
+ delete( ui );
+ delete( dlg );
+
+ return result;
+ }
+
+ void IdSuggestionsWidget::reset( const QString& formatStr )
+ {
+ QLayoutIterator it = m_listOfComponents->layout()->iterator();
+ QLayoutItem *child;
+ while (( child = it.current() ) != 0 )
+ {
+ IdSuggestionComponent *component = dynamic_cast<IdSuggestionComponent*>( child->widget() );
+ ++it;
+ if ( component != NULL )
+ delete component;
+ }
+
+ m_componentCount = 0;
+ QStringList lines = QStringList::split( '|', formatStr );
+ for ( QStringList::Iterator it = lines.begin(); it != lines.end();++it )
+ {
+ IdSuggestionComponent *component = NULL;
+ if (( *it )[0] == 'a' || ( *it )[0] == 'A' )
+ component = new IdSuggestionComponentAuthor( *it, m_listOfComponents );
+ else if (( *it )[0] == 't' || ( *it )[0] == 'T' )
+ component = new IdSuggestionComponentTitle( *it, m_listOfComponents );
+ else if (( *it )[0] == 'y' || ( *it )[0] == 'Y' )
+ component = new IdSuggestionComponentYear( *it, m_listOfComponents );
+ else if (( *it )[0] == '"' )
+ component = new IdSuggestionComponentText( *it, m_listOfComponents );
+
+ if ( component != NULL )
+ {
+ ++m_componentCount;
+ connect( component, SIGNAL( moved() ), this, SLOT( updateGUI() ) );
+ connect( component, SIGNAL( deleted() ), this, SLOT( componentDeleted() ) );
+ connect( component, SIGNAL( modified() ), this, SLOT( updateExample() ) );
+ }
+ }
+
+ m_listOfComponents->adjustSize();
+ m_scrollViewComponents->verticalScrollBar()->adjustSize();
+ updateGUI();
+ m_scrollViewComponents->resize( m_scrollViewComponents->width(), min( 384, m_listOfComponents->height() + 2 ) );
+ }
+
+ void IdSuggestionsWidget::apply( QString& formatStr )
+ {
+ bool first = TRUE;
+ formatStr = "";
+ QLayoutIterator it = m_listOfComponents->layout()->iterator();
+ QLayoutItem *child;
+ while (( child = it.current() ) != 0 )
+ {
+ IdSuggestionComponent *component = dynamic_cast<IdSuggestionComponent*>( child->widget() );
+ QString text = QString::null;
+ if ( component != NULL && ( text = component->text() ) != QString::null )
+ {
+ if ( first ) first = FALSE; else formatStr.append( "|" );
+ formatStr.append( text );
+ }
+ ++it;
+ }
+ }
+
+ void IdSuggestionsWidget::setupGUI()
+ {
+ QGridLayout *gridLayout = new QGridLayout( this, 3, 2, 0, KDialog::spacingHint() );
+ gridLayout->setRowStretch( 2, 1 );
+ gridLayout->setColStretch( 0, 1 );
+
+ m_labelExample = new QLabel( this );
+ gridLayout->addMultiCellWidget( m_labelExample, 0, 1, 0, 0 );
+
+ m_pushButtonAdd = new KPushButton( i18n( "Add" ), this );
+ gridLayout->addWidget( m_pushButtonAdd, 1, 1 );
+
+ m_scrollViewComponents = new IdSuggestionsScrollView( this );
+ m_listOfComponents = new QWidget( m_scrollViewComponents->viewport() );
+ m_scrollViewComponents->setMainWidget( m_listOfComponents );
+ m_scrollViewComponents->addChild( m_listOfComponents );
+ gridLayout->addMultiCellWidget( m_scrollViewComponents, 2, 2, 0, 1 );
+ QVBoxLayout *listLayout = new QVBoxLayout( m_listOfComponents, 0, KDialog::spacingHint() );
+ listLayout->setAutoAdd( TRUE );
+
+ KPopupMenu *addMenu = new KPopupMenu( m_pushButtonAdd );
+ addMenu->insertItem( i18n( "Author" ), 1 );
+ addMenu->insertItem( i18n( "Year" ), 2 );
+ addMenu->insertItem( i18n( "Title" ), 3 );
+ addMenu->insertItem( i18n( "Text" ), 4 );
+ connect( addMenu, SIGNAL( activated( int ) ), this, SLOT( addMenuActivated( int ) ) );
+ m_pushButtonAdd->setPopup( addMenu );
+ }
+
+ void IdSuggestionsWidget::addMenuActivated( int id )
+ {
+ IdSuggestionComponent *comp = NULL;
+ if ( id == 1 )
+ comp = new IdSuggestionComponentAuthor( "a", m_listOfComponents );
+ else if ( id == 2 )
+ comp = new IdSuggestionComponentYear( "y", m_listOfComponents );
+ else if ( id == 3 )
+ comp = new IdSuggestionComponentTitle( "t", m_listOfComponents );
+ else if ( id == 4 )
+ comp = new IdSuggestionComponentText( "", m_listOfComponents );
+
+ if ( comp != NULL )
+ {
+ ++m_componentCount;
+
+ comp->show();
+
+ connect( comp, SIGNAL( moved() ), this, SLOT( updateGUI() ) );
+ connect( comp, SIGNAL( deleted() ), this, SLOT( componentDeleted() ) );
+ connect( comp, SIGNAL( modified() ), this, SLOT( updateExample() ) );
+ m_listOfComponents->adjustSize();
+ m_scrollViewComponents->ensureVisible( 10, m_listOfComponents->height() - 2 );
+ updateGUI();
+ }
+ }
+
+ void IdSuggestionsWidget::updateGUI()
+ {
+ QLayoutIterator it = m_listOfComponents->layout()->iterator();
+ QLayoutItem *child = NULL;
+ IdSuggestionComponent *lastComponent = NULL;
+ bool first = TRUE;
+ int i = 0;
+ while (( child = it.current() ) != 0 )
+ {
+ IdSuggestionComponent *component = dynamic_cast<IdSuggestionComponent*>( child->widget() );
+ ++it;
+ if ( component != NULL )
+ {
+ if ( first )
+ {
+ first = FALSE;
+ component->setEnableUpDown( FALSE, m_componentCount > 1 );
+ }
+ else
+ component->setEnableUpDown( TRUE, i < m_componentCount - 1 );
+
+ ++i;
+ lastComponent = component;
+ }
+ }
+
+ if ( lastComponent != NULL )
+ lastComponent->setEnableUpDown( m_componentCount > 1, FALSE );
+
+ m_scrollViewComponents->updateGeometry();
+ m_parent->enableButtonOK( m_componentCount > 0 );
+ updateExample();
+ }
+
+ void IdSuggestionsWidget::componentDeleted()
+ {
+ --m_componentCount;
+ updateGUI();
+ }
+
+ void IdSuggestionsWidget::updateExample()
+ {
+ QString formatStr;
+ apply( formatStr );
+ QString formatted = IdSuggestions::formatId( m_example, formatStr );
+ m_labelExample->setText( QString( i18n( "<qt>Example:<br/><b>%1</b></qt>" ) ).arg( formatted ) );
+ }
+
+}
+#include "idsuggestionswidget.moc"