summaryrefslogtreecommitdiffstats
path: root/lib/widgets/flagboxes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/widgets/flagboxes.cpp')
-rw-r--r--lib/widgets/flagboxes.cpp643
1 files changed, 643 insertions, 0 deletions
diff --git a/lib/widgets/flagboxes.cpp b/lib/widgets/flagboxes.cpp
new file mode 100644
index 00000000..dbbae793
--- /dev/null
+++ b/lib/widgets/flagboxes.cpp
@@ -0,0 +1,643 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000-2001 Bernd Gehrmann <bernd@kdevelop.org>
+ Copyright (C) 2003 Alexander Dymo <cloudtemple@mksat.net>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+#include <klocale.h>
+#include <kdebug.h>
+#include <kurlrequester.h>
+#include <klineedit.h>
+#include <kdialogbase.h>
+#include <kdeversion.h>
+
+#include <qapplication.h>
+#include <qtooltip.h>
+#include <qheader.h>
+#include <qstringlist.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qregexp.h>
+#include <qspinbox.h>
+
+#include "flagboxes.h"
+
+// partial copy of Qt-3.1 for back-compatibility to KDE-3.0
+QString QRegExp_escape( const QString& str )
+{
+ static const char meta[] = "$()*+.?[\\]^{|}";
+ QString quoted = str;
+ int i = 0;
+
+ while ( i < (int) quoted.length() ) {
+ if ( strchr(meta, quoted[i].latin1()) != 0 )
+ quoted.insert( i++, "\\" );
+ i++;
+ }
+ return quoted;
+}
+
+
+class FlagListToolTip : public QToolTip
+{
+public:
+ FlagListToolTip(QWidget *parent);
+protected:
+ void maybeTip(const QPoint &p);
+};
+
+
+FlagListToolTip::FlagListToolTip(QWidget *parent)
+ : QToolTip(parent)
+{}
+
+
+void FlagListToolTip::maybeTip(const QPoint &pos)
+{
+ FlagListBox *listbox = static_cast<FlagListBox*>(parentWidget());
+ QListViewItem *item = listbox->itemAt(pos);
+ FlagListItem *flitem = static_cast<FlagListItem*>(item);
+
+ if (item)
+ tip(listbox->itemRect(item), flitem->desc);
+}
+
+
+FlagListItem::FlagListItem(FlagListBox *parent, const QString &flagstr,
+ const QString &description)
+ : QCheckListItem(parent, flagstr, QCheckListItem::CheckBox),
+ flag(flagstr), desc(description)
+{}
+
+
+FlagListItem::FlagListItem(FlagListBox *parent, const QString &flagstr,
+ const QString &description, const QString &offstr)
+ : QCheckListItem(parent, flagstr, QCheckListItem::CheckBox),
+ flag(flagstr), off(offstr), desc(description)
+{}
+
+
+FlagListBox::FlagListBox(QWidget *parent, const char *name)
+ : QListView(parent, name)
+{
+ setResizeMode(LastColumn);
+ header()->hide();
+ addColumn(i18n("Flags"));
+ (void) new FlagListToolTip(this);
+}
+
+
+void FlagListBox::readFlags(QStringList *list)
+{
+ QListViewItem *item = firstChild();
+ for (; item; item = item->nextSibling()) {
+ FlagListItem *flitem = static_cast<FlagListItem*>(item);
+ QStringList::Iterator sli = list->find(flitem->flag);
+ if (sli != list->end()) {
+ flitem->setOn(true);
+ list->remove(sli);
+ }
+ sli = list->find(flitem->off);
+ if (sli != list->end()) {
+ flitem->setOn(false);
+ list->remove(sli);
+ }
+ }
+}
+
+
+void FlagListBox::writeFlags(QStringList *list)
+{
+ QListViewItem *item = firstChild();
+ for (; item; item = item->nextSibling()) {
+ FlagListItem *flitem = static_cast<FlagListItem*>(item);
+ if (flitem->isOn())
+ (*list) << flitem->flag;
+ }
+}
+
+
+FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
+ const QString &flagstr, const QString &description)
+ : QCheckBox(description, parent), flag(flagstr), includeOff(false), useDef(false), defSet(false)
+{
+ QToolTip::add(this, flagstr);
+ controller->addCheckBox(this);
+}
+
+
+FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
+ const QString &flagstr, const QString &description,
+ const QString &offstr)
+ : QCheckBox(description, parent), flag(flagstr), off(offstr), includeOff(false), useDef(false), defSet(false)
+{
+ QToolTip::add(this, flagstr);
+ controller->addCheckBox(this);
+}
+
+FlagCheckBox::FlagCheckBox(QWidget *parent, FlagCheckBoxController *controller,
+ const QString &flagstr, const QString &description,
+ const QString &offstr, const QString &defstr)
+ : QCheckBox(description, parent), flag(flagstr), off(offstr), def(defstr), includeOff(false), useDef(true), defSet(false)
+{
+ QToolTip::add(this, flagstr);
+ controller->addCheckBox(this);
+}
+
+FlagCheckBoxController::FlagCheckBoxController(QStringList multiKeys)
+ :m_multiKeys(multiKeys)
+{
+}
+
+
+void FlagCheckBoxController::addCheckBox(FlagCheckBox *item)
+{
+ cblist.append(item);
+}
+
+
+void FlagCheckBoxController::readFlags(QStringList *list)
+{
+ //handle keys like -vxyz -> transform they into -vx -vy -vz
+ //very "effective" algo :(
+/* QStringList addons;
+ for (QStringList::Iterator mk = m_multiKeys.begin(); mk != m_multiKeys.end(); ++ mk)
+ {
+ kdDebug() << "multikey " << *mk << endl;
+ for (QStringList::Iterator sli = list->begin(); sli != list->end(); ++sli)
+ {
+ QString key = *sli;
+ kdDebug() << "current key: " << key << endl;
+ if ( (key.length() > 3) && (key.startsWith(*mk)) )
+ {
+ list->remove(sli);
+ key = key.remove(*mk);
+ kdDebug() << "refined key " << key << endl;
+ for (int i = 0; i < key.length(); ++i)
+ {
+ kdDebug() << "adding key " << *mk + key[i] << endl;
+ addons << *mk + key[i];
+ }
+ }
+ }
+ }
+ kdDebug() << "good" << endl;
+ *list += addons;
+
+ for (QStringList::Iterator sli = list->begin(); sli != list->end(); ++sli)
+ {
+ kdDebug() << "KEYS: " << *sli << endl;
+ }
+*/
+ QPtrListIterator<FlagCheckBox> it(cblist);
+ for (; it.current(); ++it) {
+ FlagCheckBox *fitem = it.current();
+ QStringList::Iterator sli = list->find(fitem->flag);
+ if (sli != list->end()) {
+ fitem->setChecked(true);
+ fitem->useDef = false;
+ list->remove(sli);
+ }
+ sli = list->find(fitem->off);
+ if (sli != list->end()) {
+ fitem->setChecked(false);
+ fitem->includeOff = true;
+ fitem->useDef = false;
+ list->remove(sli);
+ }
+ if (!fitem->def.isEmpty())
+ if (fitem->useDef && (fitem->def == fitem->flag))
+ {
+ fitem->setChecked(true);
+ fitem->defSet = true;
+ }
+ else
+ fitem->useDef = false;
+ }
+}
+
+
+void FlagCheckBoxController::writeFlags(QStringList *list)
+{
+ QPtrListIterator<FlagCheckBox> it(cblist);
+ for (; it.current(); ++it) {
+ FlagCheckBox *fitem = it.current();
+ if (fitem->isChecked() && (!fitem->useDef))
+ {
+ (*list) << fitem->flag;
+ }
+ else if ((!fitem->off.isEmpty()) && fitem->includeOff)
+ (*list) << fitem->off;
+ else if ((fitem->def == fitem->flag) && (!fitem->isChecked()))
+ (*list) << fitem->off;
+ else if ((fitem->def == fitem->off) && (fitem->isChecked()))
+ (*list) << fitem->flag;
+ }
+}
+
+ FlagPathEditController::FlagPathEditController( )
+{
+}
+
+ FlagPathEditController::~ FlagPathEditController( )
+{
+}
+
+void FlagPathEditController::readFlags( QStringList * list )
+{
+// kdDebug() << "read path flags" << endl;
+ QPtrListIterator<FlagPathEdit> it(plist);
+ for (; it.current(); ++it) {
+ FlagPathEdit *peitem = it.current();
+
+ QStringList::Iterator sli = list->begin();
+ while ( sli != list->end() )
+ {
+ // kdDebug() << "option: " << (*sli) << " flag is: " << peitem->flag << endl;
+ if ((*sli).startsWith(peitem->flag))
+ {
+// kdDebug() << "Processing.." << endl;
+ peitem->setText((*sli).replace(QRegExp(QRegExp_escape(peitem->flag)),""));
+ sli = list->remove(sli);
+ continue;
+ }
+ ++sli;
+ }
+/* QStringList::Iterator sli = list->find(peitem->flag);
+ if (sli != list->end()) {
+ peitem->setText((*sli).remove(peitem->flag));
+ list->remove(sli);
+ }*/
+ }
+}
+
+void FlagPathEditController::writeFlags( QStringList * list )
+{
+ QPtrListIterator<FlagPathEdit> it(plist);
+ for (; it.current(); ++it) {
+ FlagPathEdit *pitem = it.current();
+ if (!pitem->isEmpty())
+ (*list) << pitem->flag + pitem->text();
+ }
+}
+
+void FlagPathEditController::addPathEdit( FlagPathEdit * item )
+{
+ plist.append(item);
+}
+
+FlagPathEdit::FlagPathEdit( QWidget * parent, QString pathDelimiter,
+ FlagPathEditController * controller, const QString & flagstr, const QString & description,
+ KFile::Mode mode )
+ : QWidget(parent), delimiter(pathDelimiter), flag(flagstr), m_description(description)
+{
+ QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
+ topLayout->addWidget(new QLabel(description, this));
+ QBoxLayout *layout = new QHBoxLayout(topLayout, KDialog::spacingHint());
+
+ if (delimiter.isEmpty())
+ {
+ url = new KURLRequester(this);
+ url->setMode(mode);
+ layout->addWidget(url);
+ }
+ else
+ {
+ edit = new KLineEdit(this);
+ layout->addWidget(edit);
+ details = new QPushButton("...", this);
+ details->setMaximumWidth(30);
+ connect(details, SIGNAL(clicked()), this, SLOT(showPathDetails()));
+ layout->addWidget(details);
+ }
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QToolTip::add(this, flagstr);
+ controller->addPathEdit(this);
+}
+
+void FlagPathEdit::showPathDetails( )
+{
+ KDialogBase *dia = new KDialogBase(0, "flag_path_edit_dia", true, m_description,
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true);
+
+ QBoxLayout *diaLayout = new QVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
+ diaLayout->setAutoAdd(true);
+
+ KURLRequester *req = new KURLRequester( dia );
+ req->setMode(KFile::Directory);
+ KEditListBox::CustomEditor pCustomEditor;
+ pCustomEditor = req->customEditor();
+ KEditListBox *elb = new KEditListBox( "", pCustomEditor, dia );
+ dia->setMainWidget(elb);
+
+ elb->insertStringList(QStringList::split(delimiter, text()));
+
+ if (dia->exec() == QDialog::Accepted)
+ {
+ setText(elb->items().join(delimiter));
+ }
+
+ delete dia;
+}
+
+void FlagPathEdit::setText( const QString text )
+{
+ if (delimiter.isEmpty())
+ url->setURL(text);
+ else
+ edit->setText(text);
+}
+
+QString FlagPathEdit::text( )
+{
+ if (delimiter.isEmpty())
+ return url->url();
+ else
+ return edit->text();
+}
+
+bool FlagPathEdit::isEmpty( )
+{
+ if (delimiter.isEmpty())
+ return url->url().isEmpty();
+ else
+ return edit->text().isEmpty();
+}
+
+FlagRadioButton::FlagRadioButton( QWidget * parent, FlagRadioButtonController * controller, const QString & flagstr, const QString & description )
+ : QRadioButton(description, parent), flag(flagstr)
+{
+ QToolTip::add(this, flagstr);
+ controller->addRadioButton(this);
+}
+
+FlagRadioButtonController::FlagRadioButtonController(QStringList multiKeys)
+ :m_multiKeys(multiKeys)
+{
+}
+
+void FlagRadioButtonController::addRadioButton(FlagRadioButton *item)
+{
+ cblist.append(item);
+}
+
+
+void FlagRadioButtonController::readFlags(QStringList *list)
+{
+ //handle keys like -vxyz -> transform they into -vx -vy -vz
+ //very "effective" algo :(
+/* QStringList addons;
+ for (QStringList::Iterator mk = m_multiKeys.begin(); mk != m_multiKeys.end(); ++ mk)
+ {
+ kdDebug() << "multikey " << *mk << endl;
+ for (QStringList::Iterator sli = list->begin(); sli != list->end(); ++sli)
+ {
+ QString key = *sli;
+ kdDebug() << "current key: " << key << endl;
+ if ( (key.length() > 3) && (key.startsWith(*mk)) )
+ {
+ list->remove(sli);
+ key = key.remove(*mk);
+ kdDebug() << "refined key " << key << endl;
+ for (int i = 0; i < key.length(); ++i)
+ {
+ kdDebug() << "adding key " << *mk + key[i] << endl;
+ addons << *mk + key[i];
+ }
+ }
+ }
+ }
+ kdDebug() << "good" << endl;
+ *list += addons;
+
+ for (QStringList::Iterator sli = list->begin(); sli != list->end(); ++sli)
+ {
+ kdDebug() << "KEYS: " << *sli << endl;
+ }
+*/
+ QPtrListIterator<FlagRadioButton> it(cblist);
+ for (; it.current(); ++it) {
+ FlagRadioButton *fitem = it.current();
+ QStringList::Iterator sli = list->find(fitem->flag);
+ if (sli != list->end()) {
+ fitem->setChecked(true);
+ list->remove(sli);
+ }
+ }
+}
+
+
+void FlagRadioButtonController::writeFlags(QStringList *list)
+{
+ QPtrListIterator<FlagRadioButton> it(cblist);
+ for (; it.current(); ++it) {
+ FlagRadioButton *fitem = it.current();
+ if (fitem->isChecked())
+ (*list) << fitem->flag;
+ }
+}
+
+ FlagEditController::FlagEditController( )
+{
+}
+
+ FlagEditController::~ FlagEditController( )
+{
+}
+
+void FlagEditController::readFlags( QStringList * list )
+{
+ QPtrListIterator<FlagListEdit> it(plist);
+ for (; it.current(); ++it) {
+ FlagListEdit *peitem = it.current();
+
+ QStringList::Iterator sli = list->begin();
+ while (sli != list->end())
+ {
+ if ((*sli).startsWith(peitem->flag))
+ {
+ peitem->appendText((*sli).replace(QRegExp(QRegExp_escape(peitem->flag)),""));
+ sli = list->remove(sli);
+ continue;
+ }
+ ++sli;
+ }
+ }
+
+
+ QPtrListIterator<FlagSpinEdit> it2(slist);
+ for (; it2.current(); ++it2) {
+ FlagSpinEdit *sitem = it2.current();
+
+ QStringList::Iterator sli = list->begin();
+ while ( sli != list->end() )
+ {
+ if ((*sli).startsWith(sitem->flag))
+ {
+ sitem->setText((*sli).replace(QRegExp(QRegExp_escape(sitem->flag)),""));
+ sli = list->remove(sli);
+ continue;
+ }
+ ++sli;
+ }
+ }
+}
+
+void FlagEditController::writeFlags( QStringList * list )
+{
+ QPtrListIterator<FlagListEdit> it(plist);
+ for (; it.current(); ++it) {
+ FlagListEdit *pitem = it.current();
+ if (!pitem->isEmpty())
+ (*list) += pitem->flags();
+ }
+
+ QPtrListIterator<FlagSpinEdit> it2(slist);
+ for (; it2.current(); ++it2) {
+ FlagSpinEdit *sitem = it2.current();
+ if (!sitem->isDefault())
+ (*list) << sitem->flags();
+ }
+}
+
+void FlagEditController::addListEdit( FlagListEdit * item )
+{
+ plist.append(item);
+}
+
+void FlagEditController::addSpinBox(FlagSpinEdit *item)
+{
+ slist.append(item);
+}
+
+
+FlagListEdit::FlagListEdit( QWidget * parent, QString listDelimiter, FlagEditController * controller,
+ const QString & flagstr, const QString & description)
+ : QWidget(parent), delimiter(listDelimiter), flag(flagstr), m_description(description)
+{
+ QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
+ topLayout->addWidget(new QLabel(description, this));
+ QBoxLayout *layout = new QHBoxLayout(topLayout, KDialog::spacingHint());
+
+ edit = new KLineEdit(this);
+ layout->addWidget(edit);
+ if (! listDelimiter.isEmpty())
+ {
+ details = new QPushButton("...", this);
+ details->setMaximumWidth(30);
+ connect(details, SIGNAL(clicked()), this, SLOT(showListDetails()));
+ layout->addWidget(details);
+ }
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QToolTip::add(this, flagstr);
+ controller->addListEdit(this);
+}
+
+void FlagListEdit::setText( const QString text )
+{
+ edit->setText(text);
+}
+
+bool FlagListEdit::isEmpty( )
+{
+ return edit->text().isEmpty();
+}
+
+QString FlagListEdit::text( )
+{
+ return edit->text();
+}
+
+void FlagListEdit::showListDetails( )
+{
+ KDialogBase *dia = new KDialogBase(0, "flag_list_edit_dia", true, m_description,
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true);
+
+ QBoxLayout *diaLayout = new QVBoxLayout(dia, KDialog::marginHint(), KDialog::spacingHint());
+ diaLayout->setAutoAdd(true);
+
+ KEditListBox *elb = new KEditListBox( "", dia );
+ dia->setMainWidget(elb);
+
+ elb->insertStringList(QStringList::split(delimiter, text()));
+
+ if (dia->exec() == QDialog::Accepted)
+ {
+ setText(elb->items().join(delimiter));
+ }
+
+ delete dia;
+}
+
+void FlagListEdit::appendText( const QString text )
+{
+ edit->setText(edit->text() + (edit->text().isEmpty()?QString(""):delimiter) + text);
+}
+
+QStringList FlagListEdit::flags( )
+{
+ QStringList fl = QStringList::split(delimiter, text());
+ for (QStringList::iterator it = fl.begin(); it != fl.end(); ++it)
+ {
+ (*it).prepend(flag);
+ }
+ return fl;
+}
+
+FlagSpinEdit::FlagSpinEdit( QWidget * parent, int minVal, int maxVal, int incr, int defaultVal, FlagEditController * controller, const QString & flagstr, const QString & description )
+ :QWidget(parent), m_defaultVal(defaultVal), flag(flagstr)
+{
+ QBoxLayout *topLayout = new QVBoxLayout(this, 0, 1);
+ topLayout->addWidget(new QLabel(description, this));
+
+ spb = new QSpinBox(minVal, maxVal, incr, this);
+ spb->setValue(defaultVal);
+ topLayout->addWidget(spb);
+
+ QApplication::sendPostedEvents(this, QEvent::ChildInserted);
+
+ QToolTip::add(this, flagstr);
+ controller->addSpinBox(this);
+}
+
+void FlagSpinEdit::setText( const QString text )
+{
+ spb->setValue(text.toInt());
+}
+
+QString FlagSpinEdit::text( )
+{
+ return QString("%1").arg(spb->value());
+}
+
+QString FlagSpinEdit::flags( )
+{
+ return flag + text();
+}
+
+bool FlagSpinEdit::isDefault( )
+{
+ if (spb->value() == m_defaultVal)
+ return true;
+ return false;
+}
+
+
+#include "flagboxes.moc"