Diffstat (limited to 'noncore/apps/tableviewer/ui/tvlistview.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/tableviewer/ui/tvlistview.cpp | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/noncore/apps/tableviewer/ui/tvlistview.cpp b/noncore/apps/tableviewer/ui/tvlistview.cpp new file mode 100644 index 0000000..82d67c6 --- a/dev/null +++ b/noncore/apps/tableviewer/ui/tvlistview.cpp @@ -0,0 +1,315 @@ +/********************************************************************** +** 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 "tvlistview.h" +#include "../db/common.h" +#include <qtoolbutton.h> +#include <qlistview.h> +#include <qlayout.h> + +void TVListViewPrivate::setColumnWidth(int column, int width) +{ + if(width > 70) width = 70; + QListView::setColumnWidth(column, width); +} + +void TVListViewPrivate::setSorting(int column, bool increasing) +{ + emit sortChanged(column); + QListView::setSorting(column, increasing); +} + +TVListViewPrivate::TVListViewPrivate(QWidget *parent, const char* name, + WFlags fl) : QListView(parent, name, fl) { + ; +} + +class TVListViewItem : public QListViewItem +{ +public: + + TVListViewItem(QListView *parent, DataElem *d); + ~TVListViewItem(); + + QString text(int i) const + { + return data_reference->toQString(i); + } + + /* Do nothing... all data for this item should be generated */ + void setText(int i, const QString &) + { + ; + } + QString key(int i, bool a) const + { + return data_reference->toSortableQString(i); + } + + void setDataElem(DataElem *d) + { + data_reference = d; + } + + DataElem *getDataElem() { + return data_reference; + } +private: + DataElem *data_reference; +}; + +TVListViewItem::TVListViewItem(QListView *parent, DataElem *d) + : QListViewItem(parent) +{ + data_reference = d; +} + +TVListViewItem::~TVListViewItem() +{ + data_reference = 0; +} + +TVListView::TVListView(TableState *t, QWidget* parent = 0, + const char *name = 0, WFlags fl =0) : QWidget(parent, name, fl) +{ + if (!name) + setName("TVListView"); + + // the next two lines need to be rationalized. + resize(318,457); + setSizePolicy(QSizePolicy((QSizePolicy::SizeType)7, + (QSizePolicy::SizeType)7, sizePolicy().hasHeightForWidth())); + setCaption(tr("List View")); + + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setSpacing(0); + layout->setMargin(0); + + listViewDisplay = new TVListViewPrivate(this, "listViewDisplay"); + layout->addWidget(listViewDisplay); + + connect(listViewDisplay, SIGNAL(currentChanged(QListViewItem *)), this, + SLOT(setCurrent(QListViewItem *))); + connect(listViewDisplay, SIGNAL(sortChanged(int)), this, + SLOT(setSorting(int))); + + listViewDisplay->setShowSortIndicator(true); + + it = new QListViewItemIterator(listViewDisplay); + ts = t; +} + +TVListView::~TVListView() +{ +} + +void TVListView::addItem(DataElem *d) +{ + TVListViewItem *i = new TVListViewItem(listViewDisplay, d); + + delete it; + it = new QListViewItemIterator(i); +} + +/* remove current (it) item */ +void TVListView::removeItem() +{ + QListViewItemIterator other(*it); + + QListViewItemIterator tmp = *it; + (*it)++; + if (!it->current()) { + *it = tmp; + (*it)--; + if (!it->current()) { + delete it; + it = 0; + } + } + + delete other.current(); +} + +void TVListView::clearItems() +{ + /* This is ok since the destructor for TVListItem does not know about + the data_reference pointer.. and hence will leave it alone */ + listViewDisplay->clear(); + delete it; + it = new QListViewItemIterator(listViewDisplay); +} + +void TVListView::first() +{ + delete it; + it = new QListViewItemIterator(listViewDisplay); +} + +void TVListView::last() +{ + qWarning("TVListView::last not yet implemented"); +} + +void TVListView::next() +{ + QListViewItemIterator tmp = *it; + (*it)++; + if (!it->current()) { + *it = tmp; + } +} + +void TVListView::previous() +{ + QListViewItemIterator tmp = *it; + (*it)--; + if (!it->current()) { + *it = tmp; + } +} + +DataElem *TVListView::getCurrentData() { + if (it->current()) { + return ((TVListViewItem *)it->current())->getDataElem(); + } + return NULL; +} + +/*! Now to implement the closest match function */ +void TVListView::findItem(int keyId, TVVariant value) +{ + QListViewItem *i; + TVListViewItem *best_so_far = NULL; + /* start at the beginning... go through till find the closest elem */ + i = listViewDisplay->firstChild(); + while (i) { + /* search stuff */ + if(best_so_far) { + if (DataElem::closer( + ((TVListViewItem *)i)->getDataElem(), + best_so_far->getDataElem(), value, keyId)) + best_so_far = (TVListViewItem *)i; + } else { + if (DataElem::closer( + ((TVListViewItem *)i)->getDataElem(), + NULL, value, keyId)) + best_so_far = (TVListViewItem *)i; + } + + i = i->itemBelow(); + } + if (best_so_far) { + /* set best_so_far to current element */ + delete it; + it = new QListViewItemIterator(best_so_far); + } +} + +void TVListView::rebuildKeys() +{ + int i; + if(!ts) return; + if(!ts->kRep) return; + + i = listViewDisplay->columns(); + + while(i > 0) + listViewDisplay->removeColumn(--i); + + KeyListIterator kit(*ts->kRep); + i = 0; + while(kit.current()) { + if(!kit.current()->delFlag()) { + listViewDisplay->addColumn(kit.current()->name()); + keyIds.insert(i, kit.currentKey()); + ++i; + } + ++kit; + } +} + + +void TVListView::setSorting(int column) +{ + /* Without table state can't do anything */ + if (ts == 0) + return; + if (keyIds[column] != ts->current_column) { + ts->current_column = keyIds[column]; + } +} + +void TVListView::rebuildData() { + int i; + QMap<int, int>::Iterator kit; + /* Need to set sort order */ + if(!ts) + return; + + /* revers lookup the column */ + i = -1; + for(kit = keyIds.begin(); kit != keyIds.end(); ++kit) { + if (kit.data() == ts->current_column) { + i = kit.key(); + break; + } + } + if (i == -1) + return; + + listViewDisplay->setSorting(i); + listViewDisplay->sort(); + + /* reset current element */ + listViewDisplay->setCurrentItem(it->current()); + listViewDisplay->setSelected(it->current(), true); + listViewDisplay->ensureItemVisible(it->current()); +} + +void TVListView::reset() +{ + int i; + listViewDisplay->clear(); + + i = listViewDisplay->columns(); + while (i > 0) + listViewDisplay->removeColumn(--i); + + keyIds.clear(); +} + +void TVListView::setCurrent(QListViewItem *i) +{ + /* cast */ + TVListViewItem *t = (TVListViewItem *)i; + + if(!t) { + /* set current to null */ + ts->current_elem = 0; + return; + } + + ts->current_elem = t->getDataElem(); + /* now also set up the iterator */ + + delete it; + it = new QListViewItemIterator(i); + + //emit browseView(); +} |