00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <klocale.h>
00021 #include <kdebug.h>
00022 #include <kurlrequester.h>
00023 #include <klineedit.h>
00024 #include <kdialogbase.h>
00025 #include <kdeversion.h>
00026
00027 #include <qapplication.h>
00028 #include <qtooltip.h>
00029 #include <qheader.h>
00030 #include <qstringlist.h>
00031 #include <qlayout.h>
00032 #include <qlabel.h>
00033 #include <qregexp.h>
00034 #include <qspinbox.h>
00035
00036
00037 #if KDE_VERSION <= 305
00038 #include "../compat/kdeveditlistbox.h"
00039 using namespace KDevCompat;
00040 #endif
00041
00042 #include "flagboxes.h"
00043
00044
00045 QString QRegExp_escape( const QString& str )
00046 {
00047 static const char meta[] = "$()*+.?[\\]^{|}";
00048 QString quoted = str;
00049 int i = 0;
00050
00051 while ( i < (int) quoted.length() ) {
00052 if ( strchr(meta, quoted[i].latin1()) != 0 )
00053 quoted.insert( i++, "\\" );
00054 i++;
00055 }
00056 return quoted;
00057 }
00058
00059
00060 class FlagListToolTip : public QToolTip
00061 {
00062 public:
00063 FlagListToolTip(QWidget *parent);
00064 protected:
00065 void maybeTip(const QPoint &p);
00066 };
00067
00068
00069 FlagListToolTip::FlagListToolTip(QWidget *parent)
00070 : QToolTip(parent)
00071 {}
00072
00073
00074 void FlagListToolTip::maybeTip(const QPoint &pos)
00075 {
00076 FlagListBox *listbox = static_cast<FlagListBox*>(parentWidget());
00077 QListViewItem *item = listbox->itemAt(pos);
00078 FlagListItem *flitem = static_cast<FlagListItem*>(item);
00079
00080 if (item)
00081 tip(listbox->itemRect(item), flitem->desc);
00082 }
00083
00084
00085 FlagListItem::FlagListItem(FlagListBox *parent, const QString &flagstr,
00086 const QString &description)
00087 : QCheckListItem(parent, flagstr, QCheckListItem::CheckBox),
00088 flag(flagstr), desc(description)
00089 {}
00090
00091
00092 FlagListItem::FlagListItem(FlagListBox *parent, const QString &flagstr,
00093 const QString &description, const QString &offstr)
00094 : QCheckListItem(parent, flagstr, QCheckListItem::CheckBox),
00095 flag(flagstr), off(offstr), desc(description)
00096 {}
00097
00098
00099 FlagListBox::FlagListBox(QWidget *parent, const char *name)
00100 : QListView(parent, name)
00101 {
00102 setResizeMode(LastColumn);
00103 header()->hide();
00104 addColumn(i18n("Flags"));
00105 (void) new FlagListToolTip(this);
00106 }
00107
00108
00109 void FlagListBox::readFlags(QStringList *list)
00110 {
00111 QListViewItem *item = firstChild();
00112 for (; item; item = item->nextSibling()) {
00113 FlagListItem *flitem = static_cast<FlagListItem*>(item);
00114 QStringList::Iterator sli = list->find(flitem->flag);
00115 if (sli != list->end()) {
00116 flitem->setOn(true);
00117 list->remove(sli);
00118 }
00119 sli = list->find(flitem->off);
00120 if (sli != list->end()) {
00121 flitem->setOn(false);
00122 list->remove(sli);
00123 }
00124 }
00125 }
00126
00127
00128 void FlagListBox::writeFlags(QStringList *list)
00129 {
00130 QListViewItem *item = firstChild();
00131 for (; item; item = item->nextSibling()) {
00132 FlagListItem *flitem = static_cast<FlagListItem*>(item);
00133 if (flitem->isOn())
00134 (*list) << flitem->flag;
00135 }
00136 }
00137
00138
00139 FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
00140 const QString &flagstr, const QString &description)
00141 : QCheckBox(description, parent), flag(flagstr), includeOff(false), useDef(false), defSet(false)
00142 {
00143 QToolTip::add(this, flagstr);
00144 controller->addCheckBox(this);
00145 }
00146
00147
00148 FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
00149 const QString &flagstr, const QString &description,
00150 const QString &offstr)
00151 : QCheckBox(description, parent), flag(flagstr), off(offstr), includeOff(false), useDef(false), defSet(false)
00152 {
00153 QToolTip::add(this, flagstr);
00154 controller->addCheckBox(this);
00155 }
00156
00157 FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
00158 const QString &flagstr, const QString &description,
00159 const QString &offstr, const QString &defstr)
00160 : QCheckBox(description, parent), flag(flagstr), off(offstr), def(defstr), includeOff(false), useDef(true), defSet(false)
00161 {
00162 QToolTip::add(this, flagstr);
00163 controller->addCheckBox(this);
00164 }
00165
00166 FlagCheckBoxController::FlagCheckBoxController(QStringList multiKeys)
00167 :m_multiKeys(multiKeys)
00168 {
00169 }
00170
00171
00172 void FlagCheckBoxController::addCheckBox(FlagCheckBox *item)
00173 {
00174 cblist.append(item);
00175 }
00176
00177
00178 void FlagCheckBoxController::readFlags(QStringList *list)
00179 {
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 QPtrListIterator<FlagCheckBox> it(cblist);
00212 for (; it.current(); ++it) {
00213 FlagCheckBox *fitem = it.current();
00214 QStringList::Iterator sli = list->find(fitem->flag);
00215 if (sli != list->end()) {
00216 fitem->setChecked(true);
00217 fitem->useDef = false;
00218 list->remove(sli);
00219 }
00220 sli = list->find(fitem->off);
00221 if (sli != list->end()) {
00222 fitem->setChecked(false);
00223 fitem->includeOff = true;
00224 fitem->useDef = false;
00225 list->remove(sli);
00226 }
00227 if (!fitem->def.isEmpty())
00228 if (fitem->useDef && (fitem->def == fitem->flag))
00229 {
00230 fitem->setChecked(true);
00231 fitem->defSet = true;
00232 }
00233 else
00234 fitem->useDef = false;
00235 }
00236 }
00237
00238
00239 void FlagCheckBoxController::writeFlags(QStringList *list)
00240 {
00241 QPtrListIterator<FlagCheckBox> it(cblist);
00242 for (; it.current(); ++it) {
00243 FlagCheckBox *fitem = it.current();
00244 if (fitem->isChecked() && (!fitem->useDef))
00245 {
00246 (*list) << fitem->flag;
00247 }
00248 else if ((!fitem->off.isEmpty()) && fitem->includeOff)
00249 (*list) << fitem->off;
00250 else if ((fitem->def == fitem->flag) && (!fitem->isChecked()))
00251 (*list) << fitem->off;
00252 else if ((fitem->def == fitem->off) && (fitem->isChecked()))
00253 (*list) << fitem->flag;
00254 }
00255 }
00256
00257 FlagPathEditController::FlagPathEditController( )
00258 {
00259 }
00260
00261 FlagPathEditController::~ FlagPathEditController( )
00262 {
00263 }
00264
00265 void FlagPathEditController::readFlags( QStringList * list )
00266 {
00267
00268 QPtrListIterator<FlagPathEdit> it(plist);
00269 for (; it.current(); ++it) {
00270 FlagPathEdit *peitem = it.current();
00271
00272 QStringList::Iterator sli = list->begin();
00273 while ( sli != list->end() )
00274 {
00275
00276 if ((*sli).startsWith(peitem->flag))
00277 {
00278
00279 peitem->setText((*sli).replace(QRegExp(QRegExp_escape(peitem->flag)),""));
00280 sli = list->remove(sli);
00281 continue;
00282 }
00283 ++sli;
00284 }
00285
00286
00287
00288
00289
00290 }
00291 }
00292
00293 void FlagPathEditController::writeFlags( QStringList * list )
00294 {
00295 QPtrListIterator<FlagPathEdit> it(plist);
00296 for (; it.current(); ++it) {
00297 FlagPathEdit *pitem = it.current();
00298 if (!pitem->isEmpty())
00299 (*list) << pitem->flag + pitem->text();
00300 }
00301 }
00302
00303 void FlagPathEditController::addPathEdit( FlagPathEdit * item )
00304 {
00305 plist.append(item);
00306 }
00307
00308 FlagPathEdit::FlagPathEdit( QWidget * parent, QString pathDelimiter,
00309 FlagPathEditController * controller, const QString & flagstr, const QString & description,
00310 KFile::Mode mode )
00311 : QWidget(parent), delimiter(pathDelimiter), flag(flagstr), m_description(description)
00312 {
00313 QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
00314 topLayout->addWidget(new QLabel(description, this));
00315 QBoxLayout *layout = new QHBoxLayout(topLayout, KDialog::spacingHint());
00316
00317 if (delimiter.isEmpty())
00318 {
00319 url = new KURLRequester(this);
00320 url->setMode(mode);
00321 layout->addWidget(url);
00322 }
00323 else
00324 {
00325 edit = new KLineEdit(this);
00326 layout->addWidget(edit);
00327 details = new QPushButton("...", this);
00328 details->setMaximumWidth(30);
00329 connect(details, SIGNAL(clicked()), this, SLOT(showPathDetails()));
00330 layout->addWidget(details);
00331 }
00332
00333 QApplication::sendPostedEvents(this, QEvent::ChildInserted);
00334
00335 QToolTip::add(this, flagstr);
00336 controller->addPathEdit(this);
00337 }
00338
00339 void FlagPathEdit::showPathDetails( )
00340 {
00341 KDialogBase *dia = new KDialogBase(0, "flag_path_edit_dia", true, m_description,
00342 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true);
00343
00344 QBoxLayout *diaLayout = new QVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
00345 diaLayout->setAutoAdd(true);
00346
00347 KURLRequester *req = new KURLRequester( dia );
00348 req->setMode(KFile::Directory);
00349 KEditListBox::CustomEditor pCustomEditor;
00350 #if KDE_VERSION > 305
00351 pCustomEditor = req->customEditor();
00352 #else
00353 QObjectList* pOL = req->queryList("KLineEdit");
00354 KLineEdit* pEdit = dynamic_cast<KLineEdit*>(pOL->first());
00355 assert(pEdit);
00356 KEditListBox::CustomEditor editor(req, pEdit);
00357 pCustomEditor = editor;
00358 #endif
00359 KEditListBox *elb = new KEditListBox( "", pCustomEditor, dia );
00360 dia->setMainWidget(elb);
00361
00362 elb->insertStringList(QStringList::split(delimiter, text()));
00363
00364 if (dia->exec() == QDialog::Accepted)
00365 {
00366 setText(elb->items().join(delimiter));
00367 }
00368
00369 delete dia;
00370 }
00371
00372 void FlagPathEdit::setText( const QString text )
00373 {
00374 if (delimiter.isEmpty())
00375 url->setURL(text);
00376 else
00377 edit->setText(text);
00378 }
00379
00380 QString FlagPathEdit::text( )
00381 {
00382 if (delimiter.isEmpty())
00383 return url->url();
00384 else
00385 return edit->text();
00386 }
00387
00388 bool FlagPathEdit::isEmpty( )
00389 {
00390 if (delimiter.isEmpty())
00391 return url->url().isEmpty();
00392 else
00393 return edit->text().isEmpty();
00394 }
00395
00396 FlagRadioButton::FlagRadioButton( QWidget * parent, FlagRadioButtonController * controller, const QString & flagstr, const QString & description )
00397 : QRadioButton(description, parent), flag(flagstr)
00398 {
00399 QToolTip::add(this, flagstr);
00400 controller->addRadioButton(this);
00401 }
00402
00403 FlagRadioButtonController::FlagRadioButtonController(QStringList multiKeys)
00404 :m_multiKeys(multiKeys)
00405 {
00406 }
00407
00408 void FlagRadioButtonController::addRadioButton(FlagRadioButton *item)
00409 {
00410 cblist.append(item);
00411 }
00412
00413
00414 void FlagRadioButtonController::readFlags(QStringList *list)
00415 {
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 QPtrListIterator<FlagRadioButton> it(cblist);
00448 for (; it.current(); ++it) {
00449 FlagRadioButton *fitem = it.current();
00450 QStringList::Iterator sli = list->find(fitem->flag);
00451 if (sli != list->end()) {
00452 fitem->setChecked(true);
00453 list->remove(sli);
00454 }
00455 }
00456 }
00457
00458
00459 void FlagRadioButtonController::writeFlags(QStringList *list)
00460 {
00461 QPtrListIterator<FlagRadioButton> it(cblist);
00462 for (; it.current(); ++it) {
00463 FlagRadioButton *fitem = it.current();
00464 if (fitem->isChecked())
00465 (*list) << fitem->flag;
00466 }
00467 }
00468
00469 FlagEditController::FlagEditController( )
00470 {
00471 }
00472
00473 FlagEditController::~ FlagEditController( )
00474 {
00475 }
00476
00477 void FlagEditController::readFlags( QStringList * list )
00478 {
00479 QPtrListIterator<FlagListEdit> it(plist);
00480 for (; it.current(); ++it) {
00481 FlagListEdit *peitem = it.current();
00482
00483 QStringList::Iterator sli = list->begin();
00484 while (sli != list->end())
00485 {
00486 if ((*sli).startsWith(peitem->flag))
00487 {
00488 peitem->appendText((*sli).replace(QRegExp(QRegExp_escape(peitem->flag)),""));
00489 sli = list->remove(sli);
00490 continue;
00491 }
00492 ++sli;
00493 }
00494 }
00495
00496
00497 QPtrListIterator<FlagSpinEdit> it2(slist);
00498 for (; it2.current(); ++it2) {
00499 FlagSpinEdit *sitem = it2.current();
00500
00501 QStringList::Iterator sli = list->begin();
00502 while ( sli != list->end() )
00503 {
00504 if ((*sli).startsWith(sitem->flag))
00505 {
00506 sitem->setText((*sli).replace(QRegExp(QRegExp_escape(sitem->flag)),""));
00507 sli = list->remove(sli);
00508 continue;
00509 }
00510 ++sli;
00511 }
00512 }
00513 }
00514
00515 void FlagEditController::writeFlags( QStringList * list )
00516 {
00517 QPtrListIterator<FlagListEdit> it(plist);
00518 for (; it.current(); ++it) {
00519 FlagListEdit *pitem = it.current();
00520 if (!pitem->isEmpty())
00521 (*list) += pitem->flags();
00522 }
00523
00524 QPtrListIterator<FlagSpinEdit> it2(slist);
00525 for (; it2.current(); ++it2) {
00526 FlagSpinEdit *sitem = it2.current();
00527 if (!sitem->isDefault())
00528 (*list) << sitem->flags();
00529 }
00530 }
00531
00532 void FlagEditController::addListEdit( FlagListEdit * item )
00533 {
00534 plist.append(item);
00535 }
00536
00537 void FlagEditController::addSpinBox(FlagSpinEdit *item)
00538 {
00539 slist.append(item);
00540 }
00541
00542
00543 FlagListEdit::FlagListEdit( QWidget * parent, QString listDelimiter, FlagEditController * controller,
00544 const QString & flagstr, const QString & description)
00545 : QWidget(parent), delimiter(listDelimiter), flag(flagstr), m_description(description)
00546 {
00547 QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
00548 topLayout->addWidget(new QLabel(description, this));
00549 QBoxLayout *layout = new QHBoxLayout(topLayout, KDialog::spacingHint());
00550
00551 edit = new KLineEdit(this);
00552 layout->addWidget(edit);
00553 if (! listDelimiter.isEmpty())
00554 {
00555 details = new QPushButton("...", this);
00556 details->setMaximumWidth(30);
00557 connect(details, SIGNAL(clicked()), this, SLOT(showListDetails()));
00558 layout->addWidget(details);
00559 }
00560
00561 QApplication::sendPostedEvents(this, QEvent::ChildInserted);
00562
00563 QToolTip::add(this, flagstr);
00564 controller->addListEdit(this);
00565 }
00566
00567 void FlagListEdit::setText( const QString text )
00568 {
00569 edit->setText(text);
00570 }
00571
00572 bool FlagListEdit::isEmpty( )
00573 {
00574 return edit->text().isEmpty();
00575 }
00576
00577 QString FlagListEdit::text( )
00578 {
00579 return edit->text();
00580 }
00581
00582 void FlagListEdit::showListDetails( )
00583 {
00584 KDialogBase *dia = new KDialogBase(0, "flag_list_edit_dia", true, m_description,
00585 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true);
00586
00587 QBoxLayout *diaLayout = new QVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
00588 diaLayout->setAutoAdd(true);
00589
00590 KEditListBox *elb = new KEditListBox( "", dia );
00591 dia->setMainWidget(elb);
00592
00593 elb->insertStringList(QStringList::split(delimiter, text()));
00594
00595 if (dia->exec() == QDialog::Accepted)
00596 {
00597 setText(elb->items().join(delimiter));
00598 }
00599
00600 delete dia;
00601 }
00602
00603 void FlagListEdit::appendText( const QString text )
00604 {
00605 edit->setText(edit->text() + (edit->text().isEmpty()?QString(""):delimiter) + text);
00606 }
00607
00608 QStringList FlagListEdit::flags( )
00609 {
00610 QStringList fl = QStringList::split(delimiter, text());
00611 for (QStringList::iterator it = fl.begin(); it != fl.end(); ++it)
00612 {
00613 (*it).prepend(flag);
00614 }
00615 return fl;
00616 }
00617
00618 FlagSpinEdit::FlagSpinEdit( QWidget * parent, int minVal, int maxVal, int incr, int defaultVal, FlagEditController * controller, const QString & flagstr, const QString & description )
00619 :QWidget(parent), m_defaultVal(defaultVal), flag(flagstr)
00620 {
00621 QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
00622 topLayout->addWidget(new QLabel(description, this));
00623
00624 spb = new QSpinBox(minVal, maxVal, incr, this);
00625 spb->setValue(defaultVal);
00626 topLayout->addWidget(spb);
00627
00628 QApplication::sendPostedEvents(this, QEvent::ChildInserted);
00629
00630 QToolTip::add(this, flagstr);
00631 controller->addSpinBox(this);
00632 }
00633
00634 void FlagSpinEdit::setText( const QString text )
00635 {
00636 spb->setValue(text.toInt());
00637 }
00638
00639 QString FlagSpinEdit::text( )
00640 {
00641 return QString("%1").arg(spb->value());
00642 }
00643
00644 QString FlagSpinEdit::flags( )
00645 {
00646 return flag + text();
00647 }
00648
00649 bool FlagSpinEdit::isDefault( )
00650 {
00651 if (spb->value() == m_defaultVal)
00652 return true;
00653 return false;
00654 }
00655
00656
00657 #include "flagboxes.moc"