kmail

simplestringlisteditor.cpp

Go to the documentation of this file.
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 <qlayout.h>
00045 
00046 
00047 //********************************************************
00048 // SimpleStringListEditor
00049 //********************************************************
00050 
00051 // small helper function:
00052 static inline QListBoxItem * findSelectedItem( QListBox * lb ) {
00053   QListBoxItem * item = 0;
00054   for ( item = lb->firstItem() ; item && !item->isSelected() ;
00055     item = item->next() ) ;
00056   return item;
00057 }
00058 
00059 SimpleStringListEditor::SimpleStringListEditor( QWidget * parent,
00060                         const char * name,
00061                         ButtonCode buttons,
00062                         const QString & addLabel,
00063                         const QString & removeLabel,
00064                         const QString & modifyLabel,
00065                         const QString & addDialogLabel )
00066   : QWidget( 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   QHBoxLayout * hlay = new QHBoxLayout( this, 0, KDialog::spacingHint() );
00073 
00074   mListBox = new QListBox( this );
00075   hlay->addWidget( mListBox, 1 );
00076 
00077   if ( buttons == None )
00078     kdDebug(5006) << "SimpleStringListBox called with no buttons. "
00079       "Consider using a plain QListBox instead!" << endl;
00080 
00081   QVBoxLayout * vlay = new QVBoxLayout( hlay ); // inherits spacing
00082 
00083   if ( buttons & Add ) {
00084     if ( addLabel.isEmpty() )
00085       mAddButton = new QPushButton( i18n("&Add..."), this );
00086     else
00087       mAddButton = new QPushButton( addLabel, this );
00088     mAddButton->setAutoDefault( false );
00089     vlay->addWidget( mAddButton );
00090     connect( mAddButton, SIGNAL(clicked()),
00091          this, SLOT(slotAdd()) );
00092   }
00093 
00094   if ( buttons & Remove ) {
00095     if ( removeLabel.isEmpty() )
00096       mRemoveButton = new QPushButton( i18n("&Remove"), this );
00097     else
00098       mRemoveButton = new QPushButton( removeLabel, this );
00099     mRemoveButton->setAutoDefault( false );
00100     mRemoveButton->setEnabled( false ); // no selection yet
00101     vlay->addWidget( mRemoveButton );
00102     connect( mRemoveButton, SIGNAL(clicked()),
00103          this, SLOT(slotRemove()) );
00104   }
00105 
00106   if ( buttons & Modify ) {
00107     if ( modifyLabel.isEmpty() )
00108       mModifyButton = new QPushButton( i18n("&Modify..."), this );
00109     else
00110       mModifyButton = new QPushButton( modifyLabel, this );
00111     mModifyButton->setAutoDefault( false );
00112     mModifyButton->setEnabled( false ); // no selection yet
00113     vlay->addWidget( mModifyButton );
00114     connect( mModifyButton, SIGNAL(clicked()),
00115          this, SLOT(slotModify()) );
00116     connect( mListBox, SIGNAL( doubleClicked( QListBoxItem* ) ),
00117              this, 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( QString::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, SIGNAL(clicked()),
00130          this, 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( QString::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, SIGNAL(clicked()),
00143          this, SLOT(slotDown()) );
00144   }
00145 
00146   vlay->addStretch( 1 ); // spacer
00147 
00148   connect( mListBox, SIGNAL(selectionChanged()),
00149        this, SLOT(slotSelectionChanged()) );
00150 }
00151 
00152 void SimpleStringListEditor::setStringList( const QStringList & strings ) {
00153   mListBox->clear();
00154   mListBox->insertStringList( strings );
00155 }
00156 
00157 void SimpleStringListEditor::appendStringList( const QStringList & strings ) {
00158   mListBox->insertStringList( strings );
00159 }
00160 
00161 QStringList SimpleStringListEditor::stringList() const {
00162   QStringList result;
00163   for ( QListBoxItem * item = mListBox->firstItem() ;
00164     item ; item = item->next() )
00165     result << item->text();
00166   return result;
00167 }
00168 
00169 void SimpleStringListEditor::setButtonText( ButtonCode button,
00170                         const QString & text ) {
00171   switch ( button ) {
00172   case Add:
00173     if ( !mAddButton ) break;
00174     mAddButton->setText( text );
00175     return;
00176   case Remove:
00177     if ( !mRemoveButton ) break;
00178     mRemoveButton->setText( text );
00179     return;
00180   case Modify:
00181     if ( !mModifyButton ) break;
00182     mModifyButton->setText( text );
00183     return;
00184   case Up:
00185   case Down:
00186     kdDebug(5006) << "SimpleStringListEditor: Cannot change text of "
00187       "Up and Down buttons: they don't contains text!" << endl;
00188     return;
00189   default:
00190     if ( button & All )
00191       kdDebug(5006) << "SimpleStringListEditor::setButtonText: No such button!"
00192             << endl;
00193     else
00194       kdDebug(5006) << "SimpleStringListEditor::setButtonText: Can only set "
00195     "text for one button at a time!" << endl;
00196     return;
00197   }
00198 
00199   kdDebug(5006) << "SimpleStringListEditor::setButtonText: the requested "
00200     "button has not been created!" << endl;
00201 }
00202 
00203 void SimpleStringListEditor::slotAdd() {
00204   bool ok = false;
00205   QString newEntry = KInputDialog::getText( i18n("New Value"),
00206                                             mAddDialogLabel, QString::null,
00207                         &ok, this );
00208   // let the user verify the string before adding
00209   emit aboutToAdd( newEntry );
00210   if ( ok && !newEntry.isEmpty() )
00211     mListBox->insertItem( newEntry );
00212   emit changed();
00213 }
00214 
00215 void SimpleStringListEditor::slotRemove() {
00216   delete findSelectedItem( mListBox ); // delete 0 is well-behaved...
00217   emit changed();
00218 }
00219 
00220 void SimpleStringListEditor::slotModify() {
00221   QListBoxItem * item = findSelectedItem( mListBox );
00222   if ( !item ) return;
00223 
00224   bool ok = false;
00225   QString newText = KInputDialog::getText( i18n("Change Value"),
00226                                            mAddDialogLabel, item->text(),
00227                        &ok, this );
00228   emit aboutToAdd( newText );
00229   if ( !ok || newText.isEmpty() || newText == item->text() ) return;
00230 
00231   int index = mListBox->index( item );
00232   delete item;
00233   mListBox->insertItem( newText, index );
00234   mListBox->setCurrentItem( index );
00235   emit changed();
00236 }
00237 
00238 void SimpleStringListEditor::slotUp() {
00239   QListBoxItem * item = findSelectedItem( mListBox );
00240   if ( !item || !item->prev() ) return;
00241 
00242   // find the item that we want to insert after:
00243   QListBoxItem * pprev = item->prev()->prev();
00244   // take the item from it's current position...
00245   mListBox->takeItem( item );
00246   // ...and insert it after the above mentioned item:
00247   mListBox->insertItem( item, pprev );
00248   // make sure the old item is still the current one:
00249   mListBox->setCurrentItem( item );
00250   // enable and disable controls:
00251   if ( mRemoveButton )
00252     mRemoveButton->setEnabled( true );
00253   if ( mModifyButton )
00254     mModifyButton->setEnabled( true );
00255   if ( mUpButton )
00256     mUpButton->setEnabled( item->prev() );
00257   if ( mDownButton )
00258     mDownButton->setEnabled( true );
00259   emit changed();
00260 }
00261 
00262 void SimpleStringListEditor::slotDown() {
00263   QListBoxItem * item  = findSelectedItem( mListBox );
00264   if ( !item || !item->next() ) return;
00265 
00266   // find the item that we want to insert after:
00267   QListBoxItem * next = item->next();
00268   // take the item from it's current position...
00269   mListBox->takeItem( item );
00270   // ...and insert it after the above mentioned item:
00271   if ( next )
00272     mListBox->insertItem( item, next );
00273   else
00274     mListBox->insertItem( item );
00275   // make sure the old item is still the current one:
00276   mListBox->setCurrentItem( item );
00277   // enable and disable controls:
00278   if ( mRemoveButton )
00279     mRemoveButton->setEnabled( true );
00280   if ( mModifyButton )
00281     mModifyButton->setEnabled( true );
00282   if ( mUpButton )
00283     mUpButton->setEnabled( true );
00284   if ( mDownButton )
00285     mDownButton->setEnabled( item->next() );
00286   emit changed();
00287 }
00288 
00289 void SimpleStringListEditor::slotSelectionChanged() {
00290   // try to find a selected item:
00291   QListBoxItem * item = findSelectedItem( mListBox );
00292 
00293   // if there is one, item will be non-null (ie. true), else 0
00294   // (ie. false):
00295   if ( mRemoveButton )
00296     mRemoveButton->setEnabled( item );
00297   if ( mModifyButton )
00298     mModifyButton->setEnabled( item );
00299   if ( mUpButton )
00300     mUpButton->setEnabled( item && item->prev() );
00301   if ( mDownButton )
00302     mDownButton->setEnabled( item && item->next() );
00303 }
00304 
00305 
00306 
00307 #include "simplestringlisteditor.moc"