summaryrefslogtreecommitdiff
path: root/noncore/apps/tableviewer/ui/tvfilterview.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/tableviewer/ui/tvfilterview.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tableviewer/ui/tvfilterview.cpp304
1 files changed, 304 insertions, 0 deletions
diff --git a/noncore/apps/tableviewer/ui/tvfilterview.cpp b/noncore/apps/tableviewer/ui/tvfilterview.cpp
new file mode 100644
index 0000000..72d39d6
--- a/dev/null
+++ b/noncore/apps/tableviewer/ui/tvfilterview.cpp
@@ -0,0 +1,304 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#include "tvfilterview.h"
+#include <qtoolbutton.h>
+#include <qcombobox.h>
+#include <qlistview.h>
+#include <qlayout.h>
+#include <qheader.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+
+TVFilterView::TVFilterView(TableState *t, QWidget* parent = 0,
+ const char *name = 0, WFlags fl =0) : QDialog(parent, name, TRUE, fl)
+{
+ if ( !name )
+ setName( "Filter View" );
+
+ QVBoxLayout *vlayout = new QVBoxLayout(this);
+
+ display = new QListView(this, "display");
+ display->addColumn("Key");
+ display->addColumn("Constraint");
+ display->addColumn("Value");
+ display->header()->setClickEnabled(FALSE);
+ display->header()->setResizeEnabled(FALSE);
+
+ vlayout->addWidget(display);
+
+ QHBoxLayout *hlayout = new QHBoxLayout;
+ hlayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
+
+ newFilterButton = new QPushButton(this, "new Filter");
+ newFilterButton->setMaximumSize(QSize(50, 32767));
+ newFilterButton->setText("New");
+ hlayout->addWidget(newFilterButton);
+
+ deleteFilterButton = new QPushButton(this, "delete Filter");
+ deleteFilterButton->setMaximumSize(QSize(50, 32767));
+ deleteFilterButton->setText("Delete");
+ hlayout->addWidget(deleteFilterButton);
+
+ clearFilterButton = new QPushButton(this, "delete Filter");
+ clearFilterButton->setMaximumSize(QSize(60, 32767));
+ clearFilterButton->setText("Clear All");
+ hlayout->addWidget(clearFilterButton);
+
+ vlayout->addLayout(hlayout);
+
+ QHBoxLayout *hlayout2 = new QHBoxLayout;
+
+ keyNameCombo = new QComboBox(FALSE, this, "key name");
+ keyNameCombo->setEnabled(FALSE);
+ hlayout2->addWidget(keyNameCombo);
+
+ QLabel *label = new QLabel(this);
+ label->setText("has value");
+ hlayout2->addWidget(label);
+
+ keyEntry = new TVFilterKeyEntry(this, "key entry");
+ keyEntry->setEnabled(FALSE);
+
+ vlayout->addLayout(hlayout2);
+ vlayout->addWidget(keyEntry);
+
+ connect(newFilterButton, SIGNAL( clicked() ), this, SLOT( newTerm() ));
+ connect(deleteFilterButton, SIGNAL( clicked() ), this, SLOT( deleteTerm()));
+ connect(clearFilterButton, SIGNAL( clicked() ), this, SLOT( clearTerms()));
+
+ connect(keyEntry, SIGNAL(valueChanged()), this, SLOT( updateTerm() ));
+ connect(keyNameCombo, SIGNAL(activated(int)), this, SLOT( updateTerm() ));
+
+ connect(display, SIGNAL(selectionChanged(QListViewItem*)), this,
+ SLOT(setTerm(QListViewItem *)));
+
+ ts = t;
+ current = 0;
+ terms.setAutoDelete(true);
+ do_filter = false;
+
+#ifdef Q_WS_QWS
+ showMaximized();
+#endif
+}
+
+/*!
+ Destroys the TVFilterView widget
+*/
+TVFilterView::~TVFilterView()
+{
+}
+
+void TVFilterView::rebuildData()
+{
+}
+
+void TVFilterView::reset()
+{
+ keyNameCombo->clear();
+ keyIds.clear();
+}
+
+void TVFilterView::rebuildKeys()
+{
+ int i;
+
+ if (!ts) return;
+ if(!ts->kRep) return;
+ keyEntry->setTableState(ts);
+
+ /* set up the list of keys that can be compared on */
+ keyNameCombo->clear();
+ KeyListIterator it(*ts->kRep);
+
+ i = 0;
+ while(it.current()) {
+ if(ts->kRep->validIndex(it.currentKey())) {
+ keyNameCombo->insertItem(it.current()->name());
+ keyIds.insert(i, it.currentKey());
+ ++i;
+ }
+ ++it;
+ }
+}
+
+bool TVFilterView::passesFilter(DataElem *d) {
+ if (!filterActive()) return true;
+
+
+ FilterTerm *t;
+
+ for (t = terms.first(); t != 0; t = terms.next() ) {
+ /* check against filter */
+ switch(t->ct) {
+ case ct_less:
+ if (!d->lessThan(t->keyIndex, t->value))
+ return false;
+ break;
+ case ct_more:
+ if (!d->moreThan(t->keyIndex, t->value))
+ return false;
+ break;
+ case ct_equal:
+ if (!d->equalTo(t->keyIndex, t->value))
+ return false;
+ break;
+ case ct_contains:
+ if (!d->contains(t->keyIndex, t->value))
+ return false;
+ break;
+ case ct_startswith:
+ if (!d->startsWith(t->keyIndex, t->value))
+ return false;
+ break;
+ case ct_endswith:
+ if (!d->endsWith(t->keyIndex, t->value))
+ return false;
+ break;
+ default:
+ qWarning("TVFilterView::passesFilter() "
+ "unrecognized filter type");
+ return false;
+ }
+ }
+ return true;
+}
+
+bool TVFilterView::filterActive() const
+{
+ /* when button operated, also check the do_filter value
+ return do_filter;
+ */
+ if (terms.isEmpty())
+ return false;
+ return true;
+}
+
+/* SLOTS */
+void TVFilterView::newTerm()
+{
+ if (!ts) return;
+
+ FilterTerm *term = new FilterTerm;
+ current = term;
+
+ term->view = 0;
+
+ updateTerm();
+
+ display->setSelected(term->view, true);
+ terms.append(term);
+
+ keyEntry->setEnabled(true);
+ keyNameCombo->setEnabled(true);
+}
+
+void TVFilterView::updateTerm()
+{
+ FilterTerm *term;
+ /* Read the widget values (keyname, compare type, value)
+ * and build the lists */
+ if (!ts) return;
+ if (!current) return;
+
+ QString keyString;
+ QString cmpString;
+ QString vString;
+
+ term = current;
+
+ /* create new list item, set initial values, enable widgets */
+ term->keyIndex = keyIds[keyNameCombo->currentItem()];
+ keyEntry->setKey(term->keyIndex); /* so the next two items make sense */
+ term->ct = keyEntry->getCompareType(),
+ term->value = keyEntry->getCompareValue();
+
+ keyString = keyNameCombo->currentText();
+
+ switch(term->ct) {
+ case ct_less:
+ cmpString = " less than ";
+ break;
+ case ct_more:
+ cmpString = " more than ";
+ break;
+ case ct_equal:
+ cmpString = " equal to ";
+ break;
+ case ct_contains:
+ cmpString = " containing ";
+ break;
+ case ct_startswith:
+ cmpString = " starting with ";
+ break;
+ case ct_endswith:
+ cmpString = " ending with ";
+ break;
+ default:
+ cmpString = " ERROR ";
+ }
+
+ vString = term->value.toString();
+
+ /* remove old view */
+ if (term->view)
+ delete(term->view);
+ term->view = new QListViewItem(display, 0, keyString, cmpString, vString);
+ display->setSelected(term->view, true);
+}
+
+/* deletes current term */
+void TVFilterView::deleteTerm()
+{
+ if(!current) return;
+ if (current->view)
+ delete(current->view);
+
+ terms.removeRef(current);
+
+ current = terms.first();
+
+ if(terms.isEmpty()) {
+ keyEntry->setEnabled(false);
+ keyNameCombo->setEnabled(false);
+ }
+}
+
+/* clears all terminations */
+void TVFilterView::clearTerms()
+{
+ while(current)
+ deleteTerm();
+}
+
+void TVFilterView::setTerm(QListViewItem *target)
+{
+ /* Iterate through the list to find item with view=target..
+ * set as current, delete */
+ FilterTerm *term = current;
+
+ for (current = terms.first(); current != 0; current = terms.next() )
+ if (current->view == target)
+ break;
+
+ if (!current) {
+ current = term;
+ }
+}