summaryrefslogtreecommitdiffstats
path: root/kcontrol/kcontrol/searchwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/kcontrol/searchwidget.cpp')
-rw-r--r--kcontrol/kcontrol/searchwidget.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/kcontrol/kcontrol/searchwidget.cpp b/kcontrol/kcontrol/searchwidget.cpp
new file mode 100644
index 000000000..9701d2d20
--- /dev/null
+++ b/kcontrol/kcontrol/searchwidget.cpp
@@ -0,0 +1,205 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2004 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qsortedlist.h>
+#include <qregexp.h>
+
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <klistbox.h>
+
+#include "searchwidget.h"
+#include "searchwidget.moc"
+
+/**
+ * Helper class for sorting icon modules by name without losing the fileName ID
+ */
+class ModuleItem : public QListBoxPixmap
+{
+public:
+ ModuleItem(ConfigModule *module, QListBox * listbox = 0) :
+ QListBoxPixmap(listbox,
+ KGlobal::iconLoader()->loadIcon(module->icon(), KIcon::Desktop, KIcon::SizeSmall),
+ module->moduleName())
+ , m_module(module)
+ {
+
+ }
+
+ ConfigModule *module() const { return m_module; };
+
+protected:
+ ConfigModule *m_module;
+
+};
+
+KeywordListEntry::KeywordListEntry(const QString& name, ConfigModule* module)
+ : _name(name)
+{
+ if(module)
+ _modules.append(module);
+}
+
+void KeywordListEntry::addModule(ConfigModule* module)
+{
+ if(module)
+ _modules.append(module);
+}
+
+SearchWidget::SearchWidget(QWidget *parent , const char *name)
+ : QWidget(parent, name)
+{
+ _keywords.setAutoDelete(true);
+
+ QVBoxLayout * l = new QVBoxLayout(this, 0, 2);
+
+ // keyword list
+ _keyList = new KListBox(this);
+ QLabel *keyl = new QLabel(_keyList, i18n("&Keywords:"), this);
+
+ l->addWidget(keyl);
+ l->addWidget(_keyList);
+
+ // result list
+ _resultList = new KListBox(this);
+ QLabel *resultl = new QLabel(_resultList, i18n("&Results:"), this);
+
+ l->addWidget(resultl);
+ l->addWidget(_resultList);
+
+
+ connect(_keyList, SIGNAL(highlighted(const QString&)),
+ this, SLOT(slotKeywordSelected(const QString&)));
+
+ connect(_resultList, SIGNAL(selected(QListBoxItem*)),
+ this, SLOT(slotModuleSelected(QListBoxItem *)));
+ connect(_resultList, SIGNAL(clicked(QListBoxItem *)),
+ this, SLOT(slotModuleClicked(QListBoxItem *)));
+}
+
+void SearchWidget::populateKeywordList(ConfigModuleList *list)
+{
+ ConfigModule *module;
+
+ // loop through all control modules
+ for (module=list->first(); module != 0; module=list->next())
+ {
+ if (module->library().isEmpty())
+ continue;
+
+ // get the modules keyword list
+ QStringList kw = module->keywords();
+ kw << module->moduleName();
+
+ // loop through the keyword list to populate _keywords
+ for(QStringList::ConstIterator it = kw.begin(); it != kw.end(); ++it)
+ {
+ QString name = (*it).lower();
+ bool found = false;
+
+ // look if _keywords already has an entry for this keyword
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ // if there is an entry for this keyword, add the module to the entries modul list
+ if (k->moduleName() == name)
+ {
+ k->addModule(module);
+ found = true;
+ break;
+ }
+ }
+
+ // if there is entry for this keyword, create a new one
+ if (!found)
+ {
+ KeywordListEntry *k = new KeywordListEntry(name, module);
+ _keywords.append(k);
+ }
+ }
+ }
+ populateKeyListBox("*");
+}
+
+void SearchWidget::populateKeyListBox(const QString& s)
+{
+ _keyList->clear();
+
+ QStringList matches;
+
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ if ( QRegExp(s, false, true).search(k->moduleName()) >= 0)
+ matches.append(k->moduleName().stripWhiteSpace());
+ }
+
+ for(QStringList::ConstIterator it = matches.begin(); it != matches.end(); it++)
+ _keyList->insertItem(*it);
+
+ _keyList->sort();
+}
+
+void SearchWidget::populateResultListBox(const QString& s)
+{
+ _resultList->clear();
+
+ QPtrList<ModuleItem> results;
+
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ if (k->moduleName() == s)
+ {
+ QPtrList<ConfigModule> modules = k->modules();
+
+ for(ConfigModule *m = modules.first(); m != 0; m = modules.next())
+ new ModuleItem(m, _resultList);
+ }
+ }
+
+ _resultList->sort();
+}
+
+void SearchWidget::searchTextChanged(const QString & s)
+{
+ QString regexp = s;
+ regexp += "*";
+ populateKeyListBox(regexp);
+ if (_keyList->count()==1)
+ _keyList->setSelected(0,true);
+}
+
+void SearchWidget::slotKeywordSelected(const QString & s)
+{
+ populateResultListBox(s);
+}
+
+void SearchWidget::slotModuleSelected(QListBoxItem *item)
+{
+ if (item)
+ emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
+}
+
+void SearchWidget::slotModuleClicked(QListBoxItem *item)
+{
+ if (item)
+ emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
+}