00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
#ifdef HAVE_CONFIG_H
00034
#include <config.h>
00035
#endif
00036
00037
#include "dnattributeorderconfigwidget.h"
00038
00039
#include "kleo/dn.h"
00040
00041
#include <klocale.h>
00042
#include <kdebug.h>
00043
#include <kdialog.h>
00044
#include <kiconloader.h>
00045
#include <kconfig.h>
00046
#include <kapplication.h>
00047
00048
#include <qtoolbutton.h>
00049
#include <qlayout.h>
00050
#include <qheader.h>
00051
#include <qlabel.h>
00052
#include <qlistview.h>
00053
#include <qtooltip.h>
00054
00055
#include <assert.h>
00056
00057
struct Kleo::DNAttributeOrderConfigWidget::Private {
00058
enum { UUp=0, Up=1, Left=2, Right=3, Down=4, DDown=5 };
00059
00060
QListView * availableLV;
00061
QListView * currentLV;
00062
QToolButton * navTB[6];
00063
00064
QListViewItem * placeHolderItem;
00065
00066
Kleo::DNAttributeMapper * mapper;
00067 };
00068
00069
static void prepare(
QListView * lv ) {
00070 lv->setAllColumnsShowFocus(
true );
00071 lv->setResizeMode( QListView::LastColumn );
00072 lv->header()->setClickEnabled(
false );
00073 lv->addColumn( QString::null );
00074 lv->addColumn( i18n(
"Description") );
00075 }
00076
00077 Kleo::DNAttributeOrderConfigWidget::DNAttributeOrderConfigWidget( DNAttributeMapper * mapper,
QWidget * parent,
const char * name, WFlags f )
00078 :
QWidget( parent, name, f ), d( 0 )
00079 {
00080 assert( mapper );
00081 d =
new Private();
00082 d->mapper = mapper;
00083
00084
QGridLayout * glay =
new QGridLayout(
this, 2, 3, 0, KDialog::spacingHint() );
00085 glay->setColStretch( 0, 1 );
00086 glay->setColStretch( 2, 1 );
00087
00088
int row = -1;
00089
00090 ++row;
00091 glay->addWidget(
new QLabel( i18n(
"Available attributes:"),
this ), row, 0 );
00092 glay->addWidget(
new QLabel( i18n(
"Current attribute order:"),
this ), row, 2 );
00093
00094
00095 ++row;
00096 glay->setRowStretch( row, 1 );
00097
00098 d->availableLV =
new QListView(
this );
00099 prepare( d->availableLV );
00100 d->availableLV->setSorting( 0 );
00101 glay->addWidget( d->availableLV, row, 0 );
00102
00103 d->currentLV =
new QListView(
this );
00104 prepare( d->currentLV );
00105 d->currentLV->setSorting( -1 );
00106 glay->addWidget( d->currentLV, row, 2 );
00107
00108 connect( d->availableLV, SIGNAL(selectionChanged(
QListViewItem*)),
00109 SLOT(slotAvailableSelectionChanged(
QListViewItem*)) );
00110 connect( d->currentLV, SIGNAL(selectionChanged(
QListViewItem*)),
00111 SLOT(slotCurrentOrderSelectionChanged(
QListViewItem*)) );
00112
00113 d->placeHolderItem =
new QListViewItem( d->availableLV,
"_X_", i18n(
"All others") );
00114
00115
00116
00117
QGridLayout * xlay =
new QGridLayout( 5, 3, 0,
"xlay" );
00118 xlay->setAlignment( AlignCenter );
00119
00120
static const struct {
00121
const char * icon;
00122
int row, col;
00123
const char * tooltip;
00124
const char * slot;
00125 } navButtons[] = {
00126 {
"2uparrow", 0, 1, I18N_NOOP(
"Move to top" ), SLOT(slotDoubleUpButtonClicked()) },
00127 {
"1uparrow", 1, 1, I18N_NOOP(
"Move one up" ), SLOT(slotUpButtonClicked()) },
00128 {
"1leftarrow", 2, 0, I18N_NOOP(
"Remove from current attribute order" ), SLOT(slotLeftButtonClicked()) },
00129 {
"1rightarrow", 2, 2, I18N_NOOP(
"Add to current attribute order" ), SLOT(slotRightButtonClicked()) },
00130 {
"1downarrow", 3, 1, I18N_NOOP(
"Move one down" ), SLOT(slotDownButtonClicked()) },
00131 {
"2downarrow", 4, 1, I18N_NOOP(
"Move to bottom" ), SLOT(slotDoubleDownButtonClicked()) }
00132 };
00133
00134
for (
unsigned int i = 0 ; i <
sizeof navButtons /
sizeof *navButtons ; ++i ) {
00135
QToolButton * tb = d->navTB[i] =
new QToolButton(
this );
00136 tb->setIconSet( SmallIconSet( navButtons[i].icon ) );
00137 tb->setEnabled(
false );
00138 QToolTip::add( tb, i18n( navButtons[i].tooltip ) );
00139 xlay->addWidget( tb, navButtons[i].row, navButtons[i].col );
00140 connect( tb, SIGNAL(clicked()), navButtons[i].slot );
00141 }
00142
00143 glay->addLayout( xlay, row, 1 );
00144 }
00145
00146 Kleo::DNAttributeOrderConfigWidget::~DNAttributeOrderConfigWidget() {
00147
delete d; d = 0;
00148 }
00149
00150
void Kleo::DNAttributeOrderConfigWidget::load() {
00151
00152 takePlaceHolderItem();
00153
00154 d->availableLV->clear();
00155 d->currentLV->clear();
00156
00157
const QStringList order = d->mapper->attributeOrder();
00158
00159
00160
QListViewItem * last = 0;
00161
for ( QStringList::const_iterator it = order.begin() ; it != order.end() ; ++it ) {
00162
const QString attr = (*it).upper();
00163
if ( attr ==
"_X_" ) {
00164 takePlaceHolderItem();
00165 d->currentLV->insertItem( d->placeHolderItem );
00166 d->placeHolderItem->moveItem( last );
00167 last = d->placeHolderItem;
00168 }
else
00169 last =
new QListViewItem( d->currentLV, last, attr, d->mapper->name2label( attr ) );
00170 }
00171
00172
00173
00174
const QStringList all = Kleo::DNAttributeMapper::instance()->names();
00175
for ( QStringList::const_iterator it = all.begin() ; it != all.end() ; ++it )
00176
if ( order.find( *it ) == order.end() )
00177 (
void)
new QListViewItem( d->availableLV, *it, d->mapper->name2label( *it ) );
00178
00179
if ( !d->placeHolderItem->listView() )
00180 d->availableLV->insertItem( d->placeHolderItem );
00181 }
00182
00183
void Kleo::DNAttributeOrderConfigWidget::takePlaceHolderItem() {
00184
if (
QListView * lv = d->placeHolderItem->listView() )
00185 lv->takeItem( d->placeHolderItem );
00186 }
00187
00188
void Kleo::DNAttributeOrderConfigWidget::save()
const {
00189
QStringList order;
00190
for (
QListViewItemIterator it( d->currentLV ) ; it.current() ; ++it )
00191 order.push_back( it.current()->text( 0 ) );
00192
00193 d->mapper->setAttributeOrder( order );
00194 }
00195
00196
void Kleo::DNAttributeOrderConfigWidget::defaults() {
00197 qDebug(
"Sorry, not implemented: Kleo::DNAttributeOrderConfigWidget::defaults()" );
00198 }
00199
00200
00201
00202
void Kleo::DNAttributeOrderConfigWidget::slotAvailableSelectionChanged(
QListViewItem * item ) {
00203 d->navTB[Private::Right]->setEnabled( item );
00204 }
00205
00206
void Kleo::DNAttributeOrderConfigWidget::slotCurrentOrderSelectionChanged(
QListViewItem * item ) {
00207 enableDisableButtons( item );
00208 }
00209
00210
void Kleo::DNAttributeOrderConfigWidget::enableDisableButtons(
QListViewItem * item ) {
00211 d->navTB[Private::UUp ]->setEnabled( item && item->itemAbove() );
00212 d->navTB[Private::Up ]->setEnabled( item && item->itemAbove() );
00213 d->navTB[Private::Left ]->setEnabled( item );
00214 d->navTB[Private::Down ]->setEnabled( item && item->itemBelow() );
00215 d->navTB[Private::DDown]->setEnabled( item && item->itemBelow() );
00216 }
00217
00218
void Kleo::DNAttributeOrderConfigWidget::slotUpButtonClicked() {
00219
QListViewItem * item = d->currentLV->selectedItem();
00220
if ( !item )
00221
return;
00222
QListViewItem * above = item->itemAbove();
00223
if ( !above )
00224
return;
00225 above->moveItem( item );
00226 enableDisableButtons( item );
00227 emit changed();
00228 }
00229
00230
void Kleo::DNAttributeOrderConfigWidget::slotDoubleUpButtonClicked() {
00231
QListViewItem * item = d->currentLV->selectedItem();
00232
if ( !item )
00233
return;
00234
if ( item == d->currentLV->firstChild() )
00235
return;
00236 d->currentLV->takeItem( item );
00237 d->currentLV->insertItem( item );
00238 d->currentLV->setSelected( item,
true );
00239 enableDisableButtons( item );
00240 emit changed();
00241 }
00242
00243
void Kleo::DNAttributeOrderConfigWidget::slotDownButtonClicked() {
00244
QListViewItem * item = d->currentLV->selectedItem();
00245
if ( !item )
00246
return;
00247
QListViewItem * below = item->itemBelow();
00248
if ( !below )
00249
return;
00250 item->moveItem( below );
00251 enableDisableButtons( item );
00252 emit changed();
00253 }
00254
00255
void Kleo::DNAttributeOrderConfigWidget::slotDoubleDownButtonClicked() {
00256
QListViewItem * item = d->currentLV->selectedItem();
00257
if ( !item )
00258
return;
00259
QListViewItem * last = d->currentLV->lastItem();
00260 assert( last );
00261
if ( item == last )
00262
return;
00263 item->moveItem( last );
00264 enableDisableButtons( item );
00265 emit changed();
00266 }
00267
00268
void Kleo::DNAttributeOrderConfigWidget::slotLeftButtonClicked() {
00269
QListViewItem * right = d->currentLV->selectedItem();
00270
if ( !right )
00271
return;
00272
QListViewItem * next = right->itemBelow();
00273
if ( !next )
00274 next = right->itemAbove();
00275 d->currentLV->takeItem( right );
00276 d->availableLV->insertItem( right );
00277
if ( next )
00278 d->currentLV->setSelected( next,
true );
00279 enableDisableButtons( next );
00280 emit changed();
00281 }
00282
00283
void Kleo::DNAttributeOrderConfigWidget::slotRightButtonClicked() {
00284
QListViewItem * left = d->availableLV->selectedItem();
00285
if ( !left )
00286
return;
00287
QListViewItem * next = left->itemBelow();
00288
if ( !next )
00289 next = left->itemAbove();
00290 d->availableLV->takeItem( left );
00291 d->currentLV->insertItem( left );
00292
if (
QListViewItem * right = d->currentLV->selectedItem() ) {
00293
if (
QListViewItem * above = right->itemAbove() )
00294 left->moveItem( above );
00295 d->currentLV->setSelected( right,
false );
00296 }
00297 d->currentLV->setSelected( left,
true );
00298 enableDisableButtons( left );
00299 d->navTB[Private::Right]->setEnabled( next );
00300
if ( next )
00301 d->availableLV->setSelected( next,
true );
00302 emit changed();
00303 }
00304
00305
00306
00307
void Kleo::DNAttributeOrderConfigWidget::virtual_hook(
int,
void* ) {}
00308
00309
#include "dnattributeorderconfigwidget.moc"