kmail

simplestringlisteditor.cpp

00001 /*  -*- mode: C++; c-file-style: "gnu" -*-
00002     simplestringlisteditor.cpp
00003 
00004     This file is part of KMail, the KDE mail client.
00005     Copyright (c) 2001 Marc Mutz <mutz@kde.org>
00006 
00007     KMail is free software; you can redistribute it and/or modify it
00008     under the terms of the GNU General Public License, version 2, as
00009     published by the Free Software Foundation.
00010 
00011     KMail is distributed in the hope that it will be useful, but
00012     WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00019 
00020     In addition, as a special exception, the copyright holders give
00021     permission to link the code of this program with any edition of
00022     the Qt library by Trolltech AS, Norway (or with modified versions
00023     of Qt that use the same license as Qt), and distribute linked
00024     combinations including the two.  You must obey the GNU General
00025     Public License in all respects for all of the code used other than
00026     Qt.  If you modify this file, you may extend this exception to
00027     your version of the file, but you are not obligated to do so.  If
00028     you do not wish to do so, delete this exception statement from
00029     your version.
00030 */
00031 
00032 #ifdef HAVE_CONFIG_H
00033 #include <config.h>
00034 #endif
00035 
00036 #include "simplestringlisteditor.h"
00037 
00038 #include <kinputdialog.h>
00039 #include <kiconloader.h>
00040 #include <klocale.h>
00041 #include <kdebug.h>
00042 #include <kpushbutton.h>
00043 
00044 #include <tqlayout.h>
00045 
00046 
00047 //********************************************************
00048 // SimpleStringListEditor
00049 //********************************************************
00050 
00051 // small helper function:
00052 static inline TQListBoxItem * findSelectedItem( TQListBox * lb ) {
00053   TQListBoxItem * item = 0;
00054   for ( item = lb->firstItem() ; item && !item->isSelected() ;
00055     item = item->next() ) ;
00056   return item;
00057 }
00058 
00059 SimpleStringListEditor::SimpleStringListEditor( TQWidget * parent,
00060                         const char * name,
00061                         ButtonCode buttons,
00062                         const TQString & addLabel,
00063                         const TQString & removeLabel,
00064                         const TQString & modifyLabel,
00065                         const TQString & addDialogLabel )
00066   : TQWidget( parent, name ),
00067     mAddButton(0), mRemoveButton(0), mModifyButton(0),
00068     mUpButton(0), mDownButton(0),
00069     mAddDialogLabel( addDialogLabel.isEmpty() ?
00070              i18n("New entry:") : addDialogLabel )
00071 {
00072   TQHBoxLayout * hlay = new TQHBoxLayout( this, 0, KDialog::spacingHint() );
00073 
00074   mListBox = new TQListBox( this );
00075   hlay->addWidget( mListBox, 1 );
00076 
00077   if ( buttons == None )
00078     kdDebug(5006) << "SimpleStringListBox called with no buttons. "
00079       "Consider using a plain TQListBox instead!" << endl;
00080 
00081   TQVBoxLayout * vlay = new TQVBoxLayout( hlay ); // inherits spacing
00082 
00083   if ( buttons & Add ) {
00084     if ( addLabel.isEmpty() )
00085       mAddButton = new TQPushButton( i18n("&Add..."), this );
00086     else
00087       mAddButton = new TQPushButton( addLabel, this );
00088     mAddButton->setAutoDefault( false );
00089     vlay->addWidget( mAddButton );
00090     connect( mAddButton, TQT_SIGNAL(clicked()),
00091          this, TQT_SLOT(slotAdd()) );
00092   }
00093 
00094   if ( buttons & Remove ) {
00095     if ( removeLabel.isEmpty() )
00096       mRemoveButton = new TQPushButton( i18n("&Remove"), this );
00097     else
00098       mRemoveButton = new TQPushButton( removeLabel, this );
00099     mRemoveButton->setAutoDefault( false );
00100     mRemoveButton->setEnabled( false ); // no selection yet
00101     vlay->addWidget( mRemoveButton );
00102     connect( mRemoveButton, TQT_SIGNAL(clicked()),
00103          this, TQT_SLOT(slotRemove()) );
00104   }
00105 
00106   if ( buttons & Modify ) {
00107     if ( modifyLabel.isEmpty() )
00108       mModifyButton = new TQPushButton( i18n("&Modify..."), this );
00109     else
00110       mModifyButton = new TQPushButton( modifyLabel, this );
00111     mModifyButton->setAutoDefault( false );
00112     mModifyButton->setEnabled( false ); // no selection yet
00113     vlay->addWidget( mModifyButton );
00114     connect( mModifyButton, TQT_SIGNAL(clicked()),
00115          this, TQT_SLOT(slotModify()) );
00116     connect( mListBox, TQT_SIGNAL( doubleClicked( TQListBoxItem* ) ),
00117              this, TQT_SLOT( slotModify() ) );
00118   }
00119 
00120   if ( buttons & Up ) {
00121     if ( !(buttons & Down) )
00122       kdDebug(5006) << "Are you sure you want to use an Up button "
00123     "without a Down button??" << endl;
00124     mUpButton = new KPushButton( TQString::null, this );
00125     mUpButton->setIconSet( BarIconSet( "up", KIcon::SizeSmall ) );
00126     mUpButton->setAutoDefault( false );
00127     mUpButton->setEnabled( false ); // no selection yet
00128     vlay->addWidget( mUpButton );
00129     connect( mUpButton, TQT_SIGNAL(clicked()),
00130          this, TQT_SLOT(slotUp()) );
00131   }
00132 
00133   if ( buttons & Down ) {
00134     if ( !(buttons & Up) )
00135       kdDebug(5006) << "Are you sure you want to use a Down button "
00136     "without an Up button??" << endl;
00137     mDownButton = new KPushButton( TQString::null, this );
00138     mDownButton->setIconSet( BarIconSet( "down", KIcon::SizeSmall ) );
00139     mDownButton->setAutoDefault( false );
00140     mDownButton->setEnabled( false ); // no selection yet
00141     vlay->addWidget( mDownButton );
00142     connect( mDownButton, TQT_SIGNAL(clicked()),
00143          this, TQT_SLOT(slotDown()) );
00144   }
00145 
00146   vlay->addStretch( 1 ); // spacer
00147 
00148   connect( mListBox, TQT_SIGNAL(selectionChanged()),
00149        this, TQT_SLOT(slotSelectionChanged()) );
00150 }
00151 
00152 void SimpleStringListEditor::setStringList( const TQStringList & strings ) {
00153   mListBox->clear();
00154   mListBox->insertStringList( strings );
00155 }
00156 
00157 void SimpleStringListEditor::appendStringList( const TQStringList & strings ) {
00158   mListBox->insertStringList( strings );
00159 }
00160 
00161 TQStringList SimpleStringListEditor::stringList() const {
00162   TQStringList result;
00163   for ( TQListBoxItem * item = mListBox->firstItem() ;
00164     item ; item = item->next() )
00165     result << item->text();
00166   return result;
00167 }
00168 
00169 bool SimpleStringListEditor::containsString( const TQString & str ) {
00170   for ( TQListBoxItem * item = mListBox->firstItem() ;
00171     item ; item = item->next() ) {
00172     if ( item->text() == str )
00173       return true;
00174   }
00175   return false;
00176 }
00177 
00178 void SimpleStringListEditor::setButtonText( ButtonCode button,
00179                         const TQString & text ) {
00180   switch ( button ) {
00181   case Add:
00182     if ( !mAddButton ) break;
00183     mAddButton->setText( text );
00184     return;
00185   case Remove:
00186     if ( !mRemoveButton ) break;
00187     mRemoveButton->setText( text );
00188     return;
00189   case Modify:
00190     if ( !mModifyButton ) break;
00191     mModifyButton->setText( text );
00192     return;
00193   case Up:
00194   case Down:
00195     kdDebug(5006) << "SimpleStringListEditor: Cannot change text of "
00196       "Up and Down buttons: they don't contains text!" << endl;
00197     return;
00198   default:
00199     if ( button & All )
00200       kdDebug(5006) << "SimpleStringListEditor::setButtonText: No such button!"
00201             << endl;
00202     else
00203       kdDebug(5006) << "SimpleStringListEditor::setButtonText: Can only set "
00204     "text for one button at a time!" << endl;
00205     return;
00206   }
00207 
00208   kdDebug(5006) << "SimpleStringListEditor::setButtonText: the requested "
00209     "button has not been created!" << endl;
00210 }
00211 
00212 void SimpleStringListEditor::slotAdd() {
00213   bool ok = false;
00214   TQString newEntry = KInputDialog::getText( i18n("New Value"),
00215                                             mAddDialogLabel, TQString::null,
00216                         &ok, this );
00217   // let the user verify the string before adding
00218   emit aboutToAdd( newEntry );
00219   if ( ok && !newEntry.isEmpty() && !containsString( newEntry )) {
00220       mListBox->insertItem( newEntry );
00221       emit changed();
00222   }
00223 }
00224 
00225 void SimpleStringListEditor::slotRemove() {
00226   delete findSelectedItem( mListBox ); // delete 0 is well-behaved...
00227   emit changed();
00228 }
00229 
00230 void SimpleStringListEditor::slotModify() {
00231   TQListBoxItem * item = findSelectedItem( mListBox );
00232   if ( !item ) return;
00233 
00234   bool ok = false;
00235   TQString newText = KInputDialog::getText( i18n("Change Value"),
00236                                            mAddDialogLabel, item->text(),
00237                        &ok, this );
00238   emit aboutToAdd( newText );
00239   if ( !ok || newText.isEmpty() || newText == item->text() ) return;
00240 
00241   int index = mListBox->index( item );
00242   delete item;
00243   mListBox->insertItem( newText, index );
00244   mListBox->setCurrentItem( index );
00245   emit changed();
00246 }
00247 
00248 void SimpleStringListEditor::slotUp() {
00249   TQListBoxItem * item = findSelectedItem( mListBox );
00250   if ( !item || !item->prev() ) return;
00251 
00252   // find the item that we want to insert after:
00253   TQListBoxItem * pprev = item->prev()->prev();
00254   // take the item from it's current position...
00255   mListBox->takeItem( item );
00256   // ...and insert it after the above mentioned item:
00257   mListBox->insertItem( item, pprev );
00258   // make sure the old item is still the current one:
00259   mListBox->setCurrentItem( item );
00260   // enable and disable controls:
00261   if ( mRemoveButton )
00262     mRemoveButton->setEnabled( true );
00263   if ( mModifyButton )
00264     mModifyButton->setEnabled( true );
00265   if ( mUpButton )
00266     mUpButton->setEnabled( item->prev() );
00267   if ( mDownButton )
00268     mDownButton->setEnabled( true );
00269   emit changed();
00270 }
00271 
00272 void SimpleStringListEditor::slotDown() {
00273   TQListBoxItem * item  = findSelectedItem( mListBox );
00274   if ( !item || !item->next() ) return;
00275 
00276   // find the item that we want to insert after:
00277   TQListBoxItem * next = item->next();
00278   // take the item from it's current position...
00279   mListBox->takeItem( item );
00280   // ...and insert it after the above mentioned item:
00281   if ( next )
00282     mListBox->insertItem( item, next );
00283   else
00284     mListBox->insertItem( item );
00285   // make sure the old item is still the current one:
00286   mListBox->setCurrentItem( item );
00287   // enable and disable controls:
00288   if ( mRemoveButton )
00289     mRemoveButton->setEnabled( true );
00290   if ( mModifyButton )
00291     mModifyButton->setEnabled( true );
00292   if ( mUpButton )
00293     mUpButton->setEnabled( true );
00294   if ( mDownButton )
00295     mDownButton->setEnabled( item->next() );
00296   emit changed();
00297 }
00298 
00299 void SimpleStringListEditor::slotSelectionChanged() {
00300   // try to find a selected item:
00301   TQListBoxItem * item = findSelectedItem( mListBox );
00302 
00303   // if there is one, item will be non-null (ie. true), else 0
00304   // (ie. false):
00305   if ( mRemoveButton )
00306     mRemoveButton->setEnabled( item );
00307   if ( mModifyButton )
00308     mModifyButton->setEnabled( item );
00309   if ( mUpButton )
00310     mUpButton->setEnabled( item && item->prev() );
00311   if ( mDownButton )
00312     mDownButton->setEnabled( item && item->next() );
00313 }
00314 
00315 
00316 
00317 #include "simplestringlisteditor.moc"