00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kactionselector.h"
00021
00022
#include <klocale.h>
00023
#include <kiconloader.h>
00024
#include <kdialog.h>
00025
#include <kdebug.h>
00026
#include <qapplication.h>
00027
#include <qlistbox.h>
00028
#include <qtoolbutton.h>
00029
#include <qlabel.h>
00030
#include <qlayout.h>
00031
#include <qevent.h>
00032
#include <qwhatsthis.h>
00033
00034
class KActionSelectorPrivate {
00035
public:
00036
QListBox *availableListBox, *selectedListBox;
00037
QToolButton *btnAdd, *btnRemove, *btnUp, *btnDown;
00038
QLabel *lAvailable, *lSelected;
00039
bool moveOnDoubleClick, keyboardEnabled;
00040
KActionSelector::ButtonIconSize iconSize;
00041
QString addIcon, removeIcon, upIcon, downIcon;
00042
KActionSelector::InsertionPolicy availableInsertionPolicy, selectedInsertionPolicy;
00043
bool showUpDownButtons;
00044 };
00045
00046
00047
00048 KActionSelector::KActionSelector(
QWidget *parent,
const char *name )
00049 :
QWidget( parent,
name )
00050 {
00051 d =
new KActionSelectorPrivate();
00052 d->moveOnDoubleClick =
true;
00053 d->keyboardEnabled =
true;
00054 d->iconSize = SmallIcon;
00055 d->addIcon = QApplication::reverseLayout()?
"back" :
"forward";
00056 d->removeIcon = QApplication::reverseLayout()?
"forward" :
"back";
00057 d->upIcon =
"up";
00058 d->downIcon =
"down";
00059 d->availableInsertionPolicy = Sorted;
00060 d->selectedInsertionPolicy = BelowCurrent;
00061 d->showUpDownButtons =
true;
00062
00063
00064
00065
QHBoxLayout *lo =
new QHBoxLayout(
this );
00066 lo->setSpacing( KDialog::spacingHint() );
00067
00068
QVBoxLayout *loAv =
new QVBoxLayout( lo );
00069 d->lAvailable =
new QLabel( i18n(
"&Available:"),
this );
00070 loAv->addWidget( d->lAvailable );
00071 d->availableListBox =
new QListBox(
this );
00072 loAv->addWidget( d->availableListBox );
00073 d->lAvailable->setBuddy( d->availableListBox );
00074
00075
QVBoxLayout *loHBtns =
new QVBoxLayout( lo );
00076 loHBtns->addStretch( 1 );
00077 d->btnAdd =
new QToolButton(
this );
00078 loHBtns->addWidget( d->btnAdd );
00079 d->btnRemove =
new QToolButton(
this );
00080 loHBtns->addWidget( d->btnRemove );
00081 loHBtns->addStretch( 1 );
00082
00083
QVBoxLayout *loS =
new QVBoxLayout( lo );
00084 d->lSelected =
new QLabel( i18n(
"&Selected:"),
this );
00085 loS->addWidget( d->lSelected );
00086 d->selectedListBox =
new QListBox(
this );
00087 loS->addWidget( d->selectedListBox );
00088 d->lSelected->setBuddy( d->selectedListBox );
00089
00090
QVBoxLayout *loVBtns =
new QVBoxLayout( lo );
00091 loVBtns->addStretch( 1 );
00092 d->btnUp =
new QToolButton(
this );
00093 d->btnUp->setAutoRepeat(
true );
00094 loVBtns->addWidget( d->btnUp );
00095 d->btnDown =
new QToolButton(
this );
00096 d->btnDown->setAutoRepeat(
true );
00097 loVBtns->addWidget( d->btnDown );
00098 loVBtns->addStretch( 1 );
00099
00100 loadIcons();
00101
00102 connect( d->btnAdd, SIGNAL(clicked()),
this, SLOT(buttonAddClicked()) );
00103 connect( d->btnRemove, SIGNAL(clicked()),
this, SLOT(buttonRemoveClicked()) );
00104 connect( d->btnUp, SIGNAL(clicked()),
this, SLOT(buttonUpClicked()) );
00105 connect( d->btnDown, SIGNAL(clicked()),
this, SLOT(buttonDownClicked()) );
00106 connect( d->availableListBox, SIGNAL(doubleClicked(
QListBoxItem*)),
00107
this, SLOT(itemDoubleClicked(
QListBoxItem*)) );
00108 connect( d->selectedListBox, SIGNAL(doubleClicked(
QListBoxItem*)),
00109
this, SLOT(itemDoubleClicked(
QListBoxItem*)) );
00110 connect( d->availableListBox, SIGNAL(currentChanged(
QListBoxItem*)),
00111
this, SLOT(slotCurrentChanged(
QListBoxItem *)) );
00112 connect( d->selectedListBox, SIGNAL(currentChanged(
QListBoxItem*)),
00113
this, SLOT(slotCurrentChanged(
QListBoxItem *)) );
00114
00115 d->availableListBox->installEventFilter(
this );
00116 d->selectedListBox->installEventFilter(
this );
00117 }
00118
00119 KActionSelector::~KActionSelector()
00120 {
00121 }
00122
00123
00124
00125
00126
00127 QListBox *
KActionSelector::availableListBox()
const
00128
{
00129
return d->availableListBox;
00130 }
00131
00132 QListBox *
KActionSelector::selectedListBox()
const
00133
{
00134
return d->selectedListBox;
00135 }
00136
00137 void KActionSelector::setButtonIcon(
const QString &icon, MoveButton button )
00138 {
00139
switch ( button )
00140 {
00141
case ButtonAdd:
00142 d->addIcon = icon;
00143 d->btnAdd->setIconSet( SmallIconSet( icon, d->iconSize ) );
00144
break;
00145
case ButtonRemove:
00146 d->removeIcon = icon;
00147 d->btnRemove->setIconSet( SmallIconSet( icon, d->iconSize ) );
00148
break;
00149
case ButtonUp:
00150 d->upIcon = icon;
00151 d->btnUp->setIconSet( SmallIconSet( icon, d->iconSize ) );
00152
break;
00153
case ButtonDown:
00154 d->downIcon = icon;
00155 d->btnDown->setIconSet( SmallIconSet( icon, d->iconSize ) );
00156
break;
00157
default:
00158
kdDebug(13001)<<
"KActionSelector::setButtonIcon: DAINBREAD!"<<
endl;
00159 }
00160 }
00161
00162 void KActionSelector::setButtonIconSet(
const QIconSet &iconset, MoveButton button )
00163 {
00164
switch ( button )
00165 {
00166
case ButtonAdd:
00167 d->btnAdd->setIconSet( iconset );
00168
break;
00169
case ButtonRemove:
00170 d->btnRemove->setIconSet( iconset );
00171
break;
00172
case ButtonUp:
00173 d->btnUp->setIconSet( iconset );
00174
break;
00175
case ButtonDown:
00176 d->btnDown->setIconSet( iconset );
00177
break;
00178
default:
00179
kdDebug(13001)<<
"KActionSelector::setButtonIconSet: DAINBREAD!"<<
endl;
00180 }
00181 }
00182
00183 void KActionSelector::setButtonTooltip(
const QString &tip, MoveButton button )
00184 {
00185
switch ( button )
00186 {
00187
case ButtonAdd:
00188 d->btnAdd->setTextLabel( tip );
00189
break;
00190
case ButtonRemove:
00191 d->btnRemove->setTextLabel( tip );
00192
break;
00193
case ButtonUp:
00194 d->btnUp->setTextLabel( tip );
00195
break;
00196
case ButtonDown:
00197 d->btnDown->setTextLabel( tip );
00198
break;
00199
default:
00200
kdDebug(13001)<<
"KActionSelector::setButtonToolTip: DAINBREAD!"<<
endl;
00201 }
00202 }
00203
00204 void KActionSelector::setButtonWhatsThis(
const QString &text, MoveButton button )
00205 {
00206
switch ( button )
00207 {
00208
case ButtonAdd:
00209 QWhatsThis::add( d->btnAdd, text );
00210
break;
00211
case ButtonRemove:
00212 QWhatsThis::add( d->btnRemove, text );
00213
break;
00214
case ButtonUp:
00215 QWhatsThis::add( d->btnUp, text );
00216
break;
00217
case ButtonDown:
00218 QWhatsThis::add( d->btnDown, text );
00219
break;
00220
default:
00221
kdDebug(13001)<<
"KActionSelector::setButtonWhatsThis: DAINBREAD!"<<
endl;
00222 }
00223 }
00224
00225 void KActionSelector::setButtonsEnabled()
00226 {
00227 d->btnAdd->setEnabled( d->availableListBox->currentItem() > -1 );
00228 d->btnRemove->setEnabled( d->selectedListBox->currentItem() > -1 );
00229 d->btnUp->setEnabled( d->selectedListBox->currentItem() > 0 );
00230 d->btnDown->setEnabled( d->selectedListBox->currentItem() > -1 &&
00231 d->selectedListBox->currentItem() < (
int)d->selectedListBox->count() - 1 );
00232 }
00233
00234
00235
00236
00237
00238
bool KActionSelector::moveOnDoubleClick()
const
00239
{
00240
return d->moveOnDoubleClick;
00241 }
00242
00243 void KActionSelector::setMoveOnDoubleClick(
bool b )
00244 {
00245 d->moveOnDoubleClick = b;
00246 }
00247
00248
bool KActionSelector::keyboardEnabled()
const
00249
{
00250
return d->keyboardEnabled;
00251 }
00252
00253 void KActionSelector::setKeyboardEnabled(
bool b )
00254 {
00255 d->keyboardEnabled = b;
00256 }
00257
00258
QString KActionSelector::availableLabel()
const
00259
{
00260
return d->lAvailable->text();
00261 }
00262
00263 void KActionSelector::setAvailableLabel(
const QString &text )
00264 {
00265 d->lAvailable->setText( text );
00266 }
00267
00268
QString KActionSelector::selectedLabel()
const
00269
{
00270
return d->lSelected->text();
00271 }
00272
00273 void KActionSelector::setSelectedLabel(
const QString &text )
00274 {
00275 d->lSelected->setText( text );
00276 }
00277
00278 KActionSelector::ButtonIconSize
KActionSelector::buttonIconSize()
const
00279
{
00280
return d->iconSize;
00281 }
00282
00283 void KActionSelector::setButtonIconSize( ButtonIconSize size )
00284 {
00285 d->iconSize = size;
00286
00287 loadIcons();
00288 }
00289
00290 KActionSelector::InsertionPolicy
KActionSelector::availableInsertionPolicy()
const
00291
{
00292
return d->availableInsertionPolicy;
00293 }
00294
00295 void KActionSelector::setAvailableInsertionPolicy( InsertionPolicy p )
00296 {
00297 d->availableInsertionPolicy = p;
00298 }
00299
00300 KActionSelector::InsertionPolicy
KActionSelector::selectedInsertionPolicy()
const
00301
{
00302
return d->selectedInsertionPolicy;
00303 }
00304
00305 void KActionSelector::setSelectedInsertionPolicy( InsertionPolicy p )
00306 {
00307 d->selectedInsertionPolicy = p;
00308 }
00309
00310
bool KActionSelector::showUpDownButtons()
const
00311
{
00312
return d->showUpDownButtons;
00313 }
00314
00315 void KActionSelector::setShowUpDownButtons(
bool show )
00316 {
00317 d->showUpDownButtons = show;
00318
if ( show )
00319 {
00320 d->btnUp->show();
00321 d->btnDown->show();
00322 }
00323
else
00324 {
00325 d->btnUp->hide();
00326 d->btnDown->hide();
00327 }
00328 }
00329
00330
00331
00332
00333
00334 void KActionSelector::polish()
00335 {
00336
setButtonsEnabled();
00337 }
00338
00339
00340
00341
00342 void KActionSelector::keyPressEvent(
QKeyEvent *e )
00343 {
00344
if ( ! d->keyboardEnabled )
return;
00345
if ( (e->state() & Qt::ControlButton) )
00346 {
00347
switch ( e->key() )
00348 {
00349
case Key_Right:
00350 buttonAddClicked();
00351
break;
00352
case Key_Left:
00353 buttonRemoveClicked();
00354
break;
00355
case Key_Up:
00356 buttonUpClicked();
00357
break;
00358
case Key_Down:
00359 buttonDownClicked();
00360
break;
00361
default:
00362 e->ignore();
00363
return;
00364 }
00365 }
00366 }
00367
00368 bool KActionSelector::eventFilter(
QObject *o,
QEvent *e )
00369 {
00370
if ( d->keyboardEnabled && e->type() == QEvent::KeyPress )
00371 {
00372
if ( (((
QKeyEvent*)e)->state() & Qt::ControlButton) )
00373 {
00374
switch ( ((
QKeyEvent*)e)->key() )
00375 {
00376
case Key_Right:
00377 buttonAddClicked();
00378
break;
00379
case Key_Left:
00380 buttonRemoveClicked();
00381
break;
00382
case Key_Up:
00383 buttonUpClicked();
00384
break;
00385
case Key_Down:
00386 buttonDownClicked();
00387
break;
00388
default:
00389
return QWidget::eventFilter( o, e );
00390
break;
00391 }
00392
return true;
00393 }
00394
else if ( o->inherits(
"QListBox" ) )
00395 {
00396
switch ( ((
QKeyEvent*)e)->key() )
00397 {
00398
case Key_Return:
00399
case Key_Enter:
00400
QListBox *lb = (
QListBox*)o;
00401
int index = lb->currentItem();
00402
if ( index < 0 )
break;
00403 moveItem( lb->item( index ) );
00404
return true;
00405 }
00406 }
00407 }
00408
return QWidget::eventFilter( o, e );
00409 }
00410
00411
00412
00413
00414
00415
void KActionSelector::buttonAddClicked()
00416 {
00417
00418
QListBoxItem *item = d->availableListBox->firstItem();
00419
while ( item ) {
00420
if ( item->isSelected() ) {
00421 d->availableListBox->takeItem( item );
00422 d->selectedListBox->insertItem( item, insertionIndex( d->selectedListBox, d->selectedInsertionPolicy ) );
00423 d->selectedListBox->setCurrentItem( item );
00424 emit
added( item );
00425 }
00426 item = item->next();
00427 }
00428
if ( d->selectedInsertionPolicy == Sorted )
00429 d->selectedListBox->sort();
00430 d->selectedListBox->setFocus();
00431 }
00432
00433
void KActionSelector::buttonRemoveClicked()
00434 {
00435
00436
QListBoxItem *item = d->selectedListBox->firstItem();
00437
while ( item ) {
00438
if ( item->isSelected() ) {
00439 d->selectedListBox->takeItem( item );
00440 d->availableListBox->insertItem( item, insertionIndex( d->availableListBox, d->availableInsertionPolicy ) );
00441 d->availableListBox->setCurrentItem( item );
00442 emit
removed( item );
00443 }
00444 item = item->next();
00445 }
00446
if ( d->availableInsertionPolicy == Sorted )
00447 d->availableListBox->sort();
00448 d->availableListBox->setFocus();
00449 }
00450
00451
void KActionSelector::buttonUpClicked()
00452 {
00453
int c = d->selectedListBox->currentItem();
00454
if ( c < 1 )
return;
00455
QListBoxItem *item = d->selectedListBox->item( c );
00456 d->selectedListBox->takeItem( item );
00457 d->selectedListBox->insertItem( item, c-1 );
00458 d->selectedListBox->setCurrentItem( item );
00459 emit
movedUp( item );
00460 }
00461
00462
void KActionSelector::buttonDownClicked()
00463 {
00464
int c = d->selectedListBox->currentItem();
00465
if ( c < 0 || c == int( d->selectedListBox->count() ) - 1 )
return;
00466
QListBoxItem *item = d->selectedListBox->item( c );
00467 d->selectedListBox->takeItem( item );
00468 d->selectedListBox->insertItem( item, c+1 );
00469 d->selectedListBox->setCurrentItem( item );
00470 emit
movedDown( item );
00471 }
00472
00473
void KActionSelector::itemDoubleClicked(
QListBoxItem *item )
00474 {
00475
if ( d->moveOnDoubleClick )
00476 moveItem( item );
00477 }
00478
00479
00480
00481
00482
00483
void KActionSelector::loadIcons()
00484 {
00485 d->btnAdd->setIconSet( SmallIconSet( d->addIcon, d->iconSize ) );
00486 d->btnRemove->setIconSet( SmallIconSet( d->removeIcon, d->iconSize ) );
00487 d->btnUp->setIconSet( SmallIconSet( d->upIcon, d->iconSize ) );
00488 d->btnDown->setIconSet( SmallIconSet( d->downIcon, d->iconSize ) );
00489 }
00490
00491
void KActionSelector::moveItem(
QListBoxItem *item )
00492 {
00493
QListBox *lbFrom = item->listBox();
00494
QListBox *lbTo;
00495
if ( lbFrom == d->availableListBox )
00496 lbTo = d->selectedListBox;
00497
else if ( lbFrom == d->selectedListBox )
00498 lbTo = d->availableListBox;
00499
else
00500
return;
00501
00502
InsertionPolicy p = ( lbTo == d->availableListBox ) ?
00503 d->availableInsertionPolicy : d->selectedInsertionPolicy;
00504
00505 lbFrom->takeItem( item );
00506 lbTo->insertItem( item, insertionIndex( lbTo, p ) );
00507 lbTo->setFocus();
00508 lbTo->setCurrentItem( item );
00509
00510
if ( p == Sorted )
00511 lbTo->sort();
00512
if ( lbTo == d->selectedListBox )
00513 emit
added( item );
00514
else
00515 emit
removed( item );
00516 }
00517
00518
int KActionSelector::insertionIndex(
QListBox *lb, InsertionPolicy policy )
00519 {
00520
int index;
00521
switch ( policy )
00522 {
00523
case BelowCurrent:
00524 index = lb->currentItem();
00525
if ( index > -1 ) index += 1;
00526
break;
00527
case AtTop:
00528 index = 0;
00529
break;
00530
default:
00531 index = -1;
00532 }
00533
return index;
00534 }
00535
00536
00537
#include "kactionselector.moc"