kmail Library API Documentation

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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 
00043 #include <qpushbutton.h>
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 QPushButton( QString::null, this );
00125     mUpButton->setPixmap( BarIcon( "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 QPushButton( QString::null, this );
00138     mDownButton->setPixmap( BarIcon( "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 }
00213 
00214 void SimpleStringListEditor::slotRemove() {
00215   delete findSelectedItem( mListBox ); // delete 0 is well-behaved...
00216 }
00217 
00218 void SimpleStringListEditor::slotModify() {
00219   QListBoxItem * item = findSelectedItem( mListBox );
00220   if ( !item ) return;
00221 
00222   bool ok = false;
00223   QString newText = KInputDialog::getText( i18n("Change Value"),
00224                                            mAddDialogLabel, item->text(),
00225                        &ok, this );
00226   emit aboutToAdd( newText );
00227   if ( !ok || newText.isEmpty() || newText == item->text() ) return;
00228 
00229   int index = mListBox->index( item );
00230   delete item;
00231   mListBox->insertItem( newText, index );
00232   mListBox->setCurrentItem( index );
00233 }
00234 
00235 void SimpleStringListEditor::slotUp() {
00236   QListBoxItem * item = findSelectedItem( mListBox );
00237   if ( !item || !item->prev() ) return;
00238 
00239   // find the item that we want to insert after:
00240   QListBoxItem * pprev = item->prev()->prev();
00241   // take the item from it's current position...
00242   mListBox->takeItem( item );
00243   // ...and insert it after the above mentioned item:
00244   mListBox->insertItem( item, pprev );
00245   // make sure the old item is still the current one:
00246   mListBox->setCurrentItem( item );
00247   // enable and disable controls:
00248   if ( mRemoveButton )
00249     mRemoveButton->setEnabled( true );
00250   if ( mModifyButton )
00251     mModifyButton->setEnabled( true );
00252   if ( mUpButton )
00253     mUpButton->setEnabled( item->prev() );
00254   if ( mDownButton )
00255     mDownButton->setEnabled( true );
00256 }
00257 
00258 void SimpleStringListEditor::slotDown() {
00259   QListBoxItem * item  = findSelectedItem( mListBox );
00260   if ( !item || !item->next() ) return;
00261 
00262   // find the item that we want to insert after:
00263   QListBoxItem * next = item->next();
00264   // take the item from it's current position...
00265   mListBox->takeItem( item );
00266   // ...and insert it after the above mentioned item:
00267   if ( next )
00268     mListBox->insertItem( item, next );
00269   else
00270     mListBox->insertItem( item );
00271   // make sure the old item is still the current one:
00272   mListBox->setCurrentItem( item );
00273   // enable and disable controls:
00274   if ( mRemoveButton )
00275     mRemoveButton->setEnabled( true );
00276   if ( mModifyButton )
00277     mModifyButton->setEnabled( true );
00278   if ( mUpButton )
00279     mUpButton->setEnabled( true );
00280   if ( mDownButton )
00281     mDownButton->setEnabled( item->next() );
00282 }
00283 
00284 void SimpleStringListEditor::slotSelectionChanged() {
00285   // try to find a selected item:
00286   QListBoxItem * item = findSelectedItem( mListBox );
00287 
00288   // if there is one, item will be non-null (ie. true), else 0
00289   // (ie. false):
00290   if ( mRemoveButton )
00291     mRemoveButton->setEnabled( item );
00292   if ( mModifyButton )
00293     mModifyButton->setEnabled( item );
00294   if ( mUpButton )
00295     mUpButton->setEnabled( item && item->prev() );
00296   if ( mDownButton )
00297     mDownButton->setEnabled( item && item->next() );
00298 }
00299 
00300 
00301 
00302 #include "simplestringlisteditor.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:35 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003