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 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"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:25 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003