22#include <kurlrequester.h>
24#include <kdialogbase.h>
26#include <tqapplication.h>
29#include <tqstringlist.h>
38TQString TQRegExp_escape(
const TQString& str )
40 static const char meta[] =
"$()*+.?[\\]^{|}";
41 TQString quoted = str;
44 while ( i < (
int) quoted.length() ) {
45 if ( strchr(meta, quoted[i].latin1()) != 0 )
46 quoted.insert( i++,
"\\" );
53class FlagListToolTip :
public TQToolTip
56 FlagListToolTip(TQWidget *parent);
58 void maybeTip(
const TQPoint &p);
62FlagListToolTip::FlagListToolTip(TQWidget *parent)
67void FlagListToolTip::maybeTip(
const TQPoint &pos)
69 FlagListBox *listbox =
static_cast<FlagListBox*
>(parentWidget());
70 TQListViewItem *item = listbox->itemAt(pos);
71 FlagListItem *flitem =
static_cast<FlagListItem*
>(item);
74 tip(listbox->itemRect(item), flitem->desc);
78FlagListItem::FlagListItem(
FlagListBox *parent,
const TQString &flagstr,
79 const TQString &description)
80 : TQCheckListItem(parent, flagstr, TQCheckListItem::CheckBox),
81 flag(flagstr), desc(description)
85FlagListItem::FlagListItem(
FlagListBox *parent,
const TQString &flagstr,
86 const TQString &description,
const TQString &offstr)
87 : TQCheckListItem(parent, flagstr, TQCheckListItem::CheckBox),
88 flag(flagstr), off(offstr), desc(description)
92FlagListBox::FlagListBox(TQWidget *parent,
const char *name)
93 : TQListView(parent, name)
95 setResizeMode(LastColumn);
97 addColumn(i18n(
"Flags"));
98 (void)
new FlagListToolTip(
this);
102void FlagListBox::readFlags(TQStringList *list)
104 TQListViewItem *item = firstChild();
105 for (; item; item = item->nextSibling()) {
106 FlagListItem *flitem =
static_cast<FlagListItem*
>(item);
107 TQStringList::Iterator sli = list->find(flitem->flag);
108 if (sli != list->end()) {
112 sli = list->find(flitem->off);
113 if (sli != list->end()) {
114 flitem->setOn(
false);
121void FlagListBox::writeFlags(TQStringList *list)
123 TQListViewItem *item = firstChild();
124 for (; item; item = item->nextSibling()) {
125 FlagListItem *flitem =
static_cast<FlagListItem*
>(item);
127 (*list) << flitem->flag;
133 const TQString &flagstr,
const TQString &description)
134 : TQCheckBox(description, parent), flag(flagstr), includeOff(false), useDef(false), defSet(false)
136 TQToolTip::add(
this, flagstr);
137 controller->addCheckBox(
this);
142 const TQString &flagstr,
const TQString &description,
143 const TQString &offstr)
144 : TQCheckBox(description, parent), flag(flagstr), off(offstr), includeOff(false), useDef(false), defSet(false)
146 TQToolTip::add(
this, flagstr);
147 controller->addCheckBox(
this);
151 const TQString &flagstr,
const TQString &description,
152 const TQString &offstr,
const TQString &defstr)
153 : TQCheckBox(description, parent), flag(flagstr), off(offstr), def(defstr), includeOff(false), useDef(true), defSet(false)
155 TQToolTip::add(
this, flagstr);
156 controller->addCheckBox(
this);
160 :m_multiKeys(multiKeys)
165void FlagCheckBoxController::addCheckBox(
FlagCheckBox *item)
171void FlagCheckBoxController::readFlags(TQStringList *list)
204 TQPtrListIterator<FlagCheckBox> it(cblist);
205 for (; it.current(); ++it) {
206 FlagCheckBox *fitem = it.current();
207 TQStringList::Iterator sli = list->find(fitem->flag);
208 if (sli != list->end()) {
209 fitem->setChecked(
true);
210 fitem->useDef =
false;
213 sli = list->find(fitem->off);
214 if (sli != list->end()) {
215 fitem->setChecked(
false);
216 fitem->includeOff =
true;
217 fitem->useDef =
false;
220 if (!fitem->def.isEmpty())
221 if (fitem->useDef && (fitem->def == fitem->flag))
223 fitem->setChecked(
true);
224 fitem->defSet =
true;
227 fitem->useDef =
false;
232void FlagCheckBoxController::writeFlags(TQStringList *list)
234 TQPtrListIterator<FlagCheckBox> it(cblist);
235 for (; it.current(); ++it) {
236 FlagCheckBox *fitem = it.current();
237 if (fitem->isChecked() && (!fitem->useDef))
239 (*list) << fitem->flag;
241 else if ((!fitem->off.isEmpty()) && fitem->includeOff)
242 (*list) << fitem->off;
243 else if ((fitem->def == fitem->flag) && (!fitem->isChecked()))
244 (*list) << fitem->off;
245 else if ((fitem->def == fitem->off) && (fitem->isChecked()))
246 (*list) << fitem->flag;
250 FlagPathEditController::FlagPathEditController( )
254 FlagPathEditController::~ FlagPathEditController( )
258void FlagPathEditController::readFlags( TQStringList * list )
261 TQPtrListIterator<FlagPathEdit> it(plist);
262 for (; it.current(); ++it) {
263 FlagPathEdit *peitem = it.current();
265 TQStringList::Iterator sli = list->begin();
266 while ( sli != list->end() )
269 if ((*sli).startsWith(peitem->flag))
272 peitem->setText((*sli).replace(TQRegExp(TQRegExp_escape(peitem->flag)),
""));
273 sli = list->remove(sli);
286void FlagPathEditController::writeFlags( TQStringList * list )
288 TQPtrListIterator<FlagPathEdit> it(plist);
289 for (; it.current(); ++it) {
290 FlagPathEdit *pitem = it.current();
291 if (!pitem->isEmpty())
292 (*list) << pitem->flag + pitem->text();
296void FlagPathEditController::addPathEdit(
FlagPathEdit * item )
302 FlagPathEditController * controller,
const TQString & flagstr,
const TQString & description,
304 : TQWidget(parent), delimiter(pathDelimiter), flag(flagstr), m_description(description)
306 TQBoxLayout *topLayout =
new TQVBoxLayout(
this, 0, 1);
307 topLayout->addWidget(
new TQLabel(description,
this));
308 TQBoxLayout *layout =
new TQHBoxLayout(topLayout, KDialog::spacingHint());
310 if (delimiter.isEmpty())
312 url =
new KURLRequester(
this);
314 layout->addWidget(url);
318 edit =
new KLineEdit(
this);
319 layout->addWidget(edit);
320 details =
new TQPushButton(
"...",
this);
321 details->setMaximumWidth(30);
322 connect(details, TQ_SIGNAL(clicked()),
this, TQ_SLOT(showPathDetails()));
323 layout->addWidget(details);
326 TQApplication::sendPostedEvents(
this, TQEvent::ChildInserted);
328 TQToolTip::add(
this, flagstr);
329 controller->addPathEdit(
this);
332void FlagPathEdit::showPathDetails( )
334 KDialogBase *dia =
new KDialogBase(0,
"flag_path_edit_dia",
true, m_description,
335 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok,
true);
337 TQBoxLayout *diaLayout =
new TQVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
338 diaLayout->setAutoAdd(
true);
340 KURLRequester *req =
new KURLRequester( dia );
341 req->setMode(KFile::Directory);
342 KEditListBox::CustomEditor pCustomEditor;
343 pCustomEditor = req->customEditor();
344 KEditListBox *elb =
new KEditListBox(
"", pCustomEditor, dia );
345 dia->setMainWidget(elb);
347 elb->insertStringList(TQStringList::split(delimiter, text()));
349 if (dia->exec() == TQDialog::Accepted)
351 setText(elb->items().join(delimiter));
357void FlagPathEdit::setText(
const TQString text )
359 if (delimiter.isEmpty())
365TQString FlagPathEdit::text( )
367 if (delimiter.isEmpty())
373bool FlagPathEdit::isEmpty( )
375 if (delimiter.isEmpty())
376 return url->url().isEmpty();
378 return edit->text().isEmpty();
381FlagRadioButton::FlagRadioButton( TQWidget * parent,
FlagRadioButtonController * controller,
const TQString & flagstr,
const TQString & description )
382 : TQRadioButton(description, parent), flag(flagstr)
384 TQToolTip::add(
this, flagstr);
385 controller->addRadioButton(
this);
389 :m_multiKeys(multiKeys)
399void FlagRadioButtonController::readFlags(TQStringList *list)
432 TQPtrListIterator<FlagRadioButton> it(cblist);
433 for (; it.current(); ++it) {
434 FlagRadioButton *fitem = it.current();
435 TQStringList::Iterator sli = list->find(fitem->flag);
436 if (sli != list->end()) {
437 fitem->setChecked(
true);
444void FlagRadioButtonController::writeFlags(TQStringList *list)
446 TQPtrListIterator<FlagRadioButton> it(cblist);
447 for (; it.current(); ++it) {
448 FlagRadioButton *fitem = it.current();
449 if (fitem->isChecked())
450 (*list) << fitem->flag;
454 FlagEditController::FlagEditController( )
458 FlagEditController::~ FlagEditController( )
462void FlagEditController::readFlags( TQStringList * list )
464 TQPtrListIterator<FlagListEdit> it(plist);
465 for (; it.current(); ++it) {
466 FlagListEdit *peitem = it.current();
468 TQStringList::Iterator sli = list->begin();
469 while (sli != list->end())
471 if ((*sli).startsWith(peitem->flag))
473 peitem->appendText((*sli).replace(TQRegExp(TQRegExp_escape(peitem->flag)),
""));
474 sli = list->remove(sli);
482 TQPtrListIterator<FlagSpinEdit> it2(slist);
483 for (; it2.current(); ++it2) {
484 FlagSpinEdit *sitem = it2.current();
486 TQStringList::Iterator sli = list->begin();
487 while ( sli != list->end() )
489 if ((*sli).startsWith(sitem->flag))
491 sitem->setText((*sli).replace(TQRegExp(TQRegExp_escape(sitem->flag)),
""));
492 sli = list->remove(sli);
500void FlagEditController::writeFlags( TQStringList * list )
502 TQPtrListIterator<FlagListEdit> it(plist);
503 for (; it.current(); ++it) {
504 FlagListEdit *pitem = it.current();
505 if (!pitem->isEmpty())
506 (*list) += pitem->flags();
509 TQPtrListIterator<FlagSpinEdit> it2(slist);
510 for (; it2.current(); ++it2) {
511 FlagSpinEdit *sitem = it2.current();
512 if (!sitem->isDefault())
513 (*list) << sitem->flags();
517void FlagEditController::addListEdit(
FlagListEdit * item )
529 const TQString & flagstr,
const TQString & description)
530 : TQWidget(parent), delimiter(listDelimiter), flag(flagstr), m_description(description)
532 TQBoxLayout *topLayout =
new TQVBoxLayout(
this, 0, 1);
533 topLayout->addWidget(
new TQLabel(description,
this));
534 TQBoxLayout *layout =
new TQHBoxLayout(topLayout, KDialog::spacingHint());
536 edit =
new KLineEdit(
this);
537 layout->addWidget(edit);
538 if (! listDelimiter.isEmpty())
540 details =
new TQPushButton(
"...",
this);
541 details->setMaximumWidth(30);
542 connect(details, TQ_SIGNAL(clicked()),
this, TQ_SLOT(showListDetails()));
543 layout->addWidget(details);
546 TQApplication::sendPostedEvents(
this, TQEvent::ChildInserted);
548 TQToolTip::add(
this, flagstr);
549 controller->addListEdit(
this);
552void FlagListEdit::setText(
const TQString text )
557bool FlagListEdit::isEmpty( )
559 return edit->text().isEmpty();
562TQString FlagListEdit::text( )
567void FlagListEdit::showListDetails( )
569 KDialogBase *dia =
new KDialogBase(0,
"flag_list_edit_dia",
true, m_description,
570 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok,
true);
572 TQBoxLayout *diaLayout =
new TQVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
573 diaLayout->setAutoAdd(
true);
575 KEditListBox *elb =
new KEditListBox(
"", dia );
576 dia->setMainWidget(elb);
578 elb->insertStringList(TQStringList::split(delimiter, text()));
580 if (dia->exec() == TQDialog::Accepted)
582 setText(elb->items().join(delimiter));
588void FlagListEdit::appendText(
const TQString text )
590 edit->setText(edit->text() + (edit->text().isEmpty()?TQString(
""):delimiter) + text);
593TQStringList FlagListEdit::flags( )
595 TQStringList fl = TQStringList::split(delimiter, text());
596 for (TQStringList::iterator it = fl.begin(); it != fl.end(); ++it)
603FlagSpinEdit::FlagSpinEdit( TQWidget * parent,
int minVal,
int maxVal,
int incr,
int defaultVal,
FlagEditController * controller,
const TQString & flagstr,
const TQString & description )
604 :TQWidget(parent), m_defaultVal(defaultVal), flag(flagstr)
606 TQBoxLayout *topLayout =
new TQVBoxLayout(
this, 0, 1);
607 topLayout->addWidget(
new TQLabel(description,
this));
609 spb =
new TQSpinBox(minVal, maxVal, incr,
this);
610 spb->setValue(defaultVal);
611 topLayout->addWidget(spb);
613 TQApplication::sendPostedEvents(
this, TQEvent::ChildInserted);
615 TQToolTip::add(
this, flagstr);
616 controller->addSpinBox(
this);
619void FlagSpinEdit::setText(
const TQString text )
621 spb->setValue(text.toInt());
624TQString FlagSpinEdit::text( )
626 return TQString(
"%1").arg(spb->value());
629TQString FlagSpinEdit::flags( )
631 return flag + text();
634bool FlagSpinEdit::isDefault( )
636 if (spb->value() == m_defaultVal)
642#include "flagboxes.moc"
Controller for check box editors.
FlagCheckBoxController(TQStringList multiKeys=TQStringList())
"multi key" is a list of options like -vxyz (-vx -vy -vz) multiKeys must contain a list of option nam...
Check box item holding a compiler flag.
Controller for flag editors.
List box item holding a compiler flag.
List editor if list is a compiler flag.
FlagListEdit(TQWidget *parent, TQString listDelimiter, FlagEditController *controller, const TQString &flagstr, const TQString &description)
If the listDelimiter is not empty then list edit can contain a list of entries.
Path editor if path is a compiler flag.
FlagPathEdit(TQWidget *parent, TQString pathDelimiter, FlagPathEditController *controller, const TQString &flagstr, const TQString &description, KFile::Mode mode=KFile::Directory)
If the pathDelimiter is not empty then path edit can contain a list of paths.
Spin editor of a compiler flag.
Support classes for compiler plugins.