summaryrefslogtreecommitdiff
path: root/noncore/apps/tableviewer/tableviewer.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/tableviewer/tableviewer.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tableviewer/tableviewer.cpp455
1 files changed, 455 insertions, 0 deletions
diff --git a/noncore/apps/tableviewer/tableviewer.cpp b/noncore/apps/tableviewer/tableviewer.cpp
new file mode 100644
index 0000000..0d4a412
--- a/dev/null
+++ b/noncore/apps/tableviewer/tableviewer.cpp
@@ -0,0 +1,455 @@
+/**********************************************************************
+** 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.
+**
+**********************************************************************/
+
+/* local includes */
+#include "tableviewer.h"
+#include "ui/tvbrowseview.h"
+#include "ui/tvfilterview.h"
+#include "ui/tvlistview.h"
+#include "ui/tveditview.h"
+#include "ui/tvkeyedit.h"
+#include "db/datacache.h"
+
+/* QPE includes */
+#include "fileselector.h"
+#include "resource.h"
+
+/* QTE includes */
+#include <qpe/qpemenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qwidgetstack.h>
+#include <qlayout.h>
+#include <qbuffer.h>
+
+/*!
+ \class TableViewerWindow
+ \brief The main window widget of the application
+
+ This is the main widget of the table viewer application.
+ It is the co-ordination point.
+*/
+
+/*!
+ Constructs a new TableViewerWindow
+*/
+TableViewerWindow::TableViewerWindow(QWidget *parent, const char *name, WFlags f)
+ : QMainWindow(parent, name, f)
+{
+ setCaption(tr("Table Viewer"));
+
+/* Build data */
+ ds = new DBStore();
+ doc.setType("text/x-xml-tableviewer");
+ doc.setName("table");
+
+ dirty = FALSE;
+ ts.current_column = 0;
+ ts.kRep = ds->getKeys();
+
+/* build menus */
+ menu = new QPEMenuBar(this, 0);
+
+ QPopupMenu *file_menu = new QPopupMenu;
+ file_menu->insertItem("New", this, SLOT(newDocument()));
+
+ file_menu->insertItem("Open", this, SLOT(selectDocument()));
+ file_menu->insertSeparator();
+ file_menu->insertItem("Properties");
+
+ /* later will want to set this up to clean up first via this, SLOT(quit) */
+ menu->insertItem("Document", file_menu);
+
+ QPopupMenu *edit_menu = new QPopupMenu;
+ edit_menu->insertItem("Edit Item", this, SLOT(editItemSlot()));
+ edit_menu->insertItem("Edit Keys", this, SLOT(editKeysSlot()));
+ edit_menu->insertItem("Edit filters", this, SLOT(filterViewSlot()));
+ menu->insertItem("Edit", edit_menu);
+
+ QPopupMenu *view_menu = new QPopupMenu;
+ view_menu->insertItem("Browse View", this, SLOT(browseViewSlot()));
+ view_menu->insertItem("List View", this, SLOT(listViewSlot()));
+ menu->insertItem("View", view_menu);
+
+ QVBoxLayout *main_layout = new QVBoxLayout;
+
+ /* Build tool bar */
+ navigation = new QPEToolBar(this, "navigation");
+ QToolButton *newItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("new")), "New Item", QString::null,
+ this, SLOT(newItemSlot()), navigation, "New Item");
+ QToolButton *editItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("edit")), "Edit Item", QString::null,
+ this, SLOT(editItemSlot()), navigation, "Edit Item");
+ QToolButton *deleteItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("trash")), "Delete Item",
+ QString::null, this,
+ SLOT(deleteItemSlot()), navigation, "Delete Item");
+
+ navigation->addSeparator();
+
+ QToolButton *firstItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("fastback")), "First Item",
+ QString::null, this,
+ SLOT(firstItem()), navigation, "First Item");
+ QToolButton *previousItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("back")), "Previous Item",
+ QString::null, this,
+ SLOT(previousItem()), navigation, "Previous Item");
+ QToolButton *nextItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("forward")), "Next Item",
+ QString::null, this,
+ SLOT(nextItem()), navigation, "Next Item");
+ QToolButton *lastItemButton = new QToolButton(
+ QIconSet(Resource::loadImage("fastforward")), "Last Item",
+ QString::null, this,
+ SLOT(lastItem()), navigation, "Last Item");
+
+ navigation->addSeparator();
+ QToolButton *browseButton = new QToolButton(
+ QIconSet(Resource::loadImage("day")), "View Single Item",
+ QString::null, this,
+ SLOT(browseViewSlot()), navigation, "View Single Item");
+ QToolButton *listButton = new QToolButton(
+ QIconSet(Resource::loadImage("month")), "View Multiple Items",
+ QString::null, this,
+ SLOT(listViewSlot()), navigation, "View Multiple Items");
+
+ setToolBarsMovable(FALSE);
+ setToolBarsMovable(FALSE);
+ setToolBarsMovable(FALSE);
+
+/* Build widgets */
+ browseView = new TVBrowseView(&ts, this, 0);
+ listView = new TVListView(&ts, this, 0);
+ filterView = new TVFilterView(&ts, this, 0);
+ fileSelector = new FileSelector("text/csv;text/x-xml-tableviewer",
+ this, "fileselector");
+ fileSelector->setNewVisible(FALSE);
+ fileSelector->setCloseVisible(FALSE);
+
+ cw = new QWidgetStack(this, 0);
+ cw->addWidget(listView, ListState);
+ cw->addWidget(browseView, BrowseState);
+ cw->addWidget(filterView, FilterState);
+ cw->addWidget(fileSelector, FileState);
+
+ current_view = FileState;
+ cw->raiseWidget(current_view);
+ fileSelector->reread();
+
+ connect(browseView, SIGNAL(searchOnKey(int, TVVariant)),
+ this, SLOT(searchOnKey(int, TVVariant)));
+ connect(browseView, SIGNAL(sortChanged(int)),
+ this, SLOT(setPrimaryKey(int)));
+
+ connect(fileSelector, SIGNAL(closeMe()), this, SLOT(browseViewSlot()));
+ connect(fileSelector, SIGNAL(fileSelected(const DocLnk &)),
+ this, SLOT(openDocument(const DocLnk &)));
+
+ main_layout->addWidget(menu);
+ main_layout->addWidget(cw);
+
+ setCentralWidget(cw);
+
+}
+
+/*!
+ Destroys the TableViewerWindow
+*/
+TableViewerWindow::~TableViewerWindow()
+{
+ if(dirty)
+ saveDocument();
+}
+
+/*!
+ Opens a file dialog and loads the file specified by the dialog
+*/
+void TableViewerWindow::selectDocument()
+{
+ if(dirty)
+ saveDocument();
+ current_view = FileState;
+ cw->raiseWidget(current_view);
+ fileSelector->reread();
+}
+
+void TableViewerWindow::saveDocument()
+{
+ if(!dirty)
+ return;
+
+ FileManager fm;
+ QIODevice *dev = fm.saveFile(doc);
+
+ if(!ds->saveSource(dev, doc.type())){
+ qWarning("Save unsuccessful");
+ return;
+ }
+ dev->close();
+ dirty = FALSE;
+}
+
+void TableViewerWindow::newDocument()
+{
+ DocLnk nf;
+ nf.setType("text/x-xml-tableviewer");
+ nf.setName("table");
+
+ delete ds;
+ ds = new DBStore();
+
+ ts.current_column = 0;
+ ts.kRep = ds->getKeys();
+ browseView->reset();
+ listView->reset();
+ filterView->reset();
+
+ doc = nf;
+ dirty = FALSE;
+
+ current_view = BrowseState;
+ cw->raiseWidget(current_view);
+
+ /* now set up for editing the keys */
+ ts.kRep->addKey("key", TVVariant::String);
+ editKeysSlot();
+}
+
+void TableViewerWindow::openDocument(const DocLnk &f)
+{
+
+ if (!f.isValid())
+ return;
+
+ FileManager fm;
+ QIODevice *dev = fm.openFile(f);
+ doc = f;
+
+ if(ds->openSource(dev, doc.type())) {
+ DataElem *d;
+
+ browseView->reset();
+ listView->reset();
+ filterView->reset();
+
+ current_view = BrowseState;
+ cw->raiseWidget(current_view);
+
+ /* set up new table state and ensure sub widgets have a reference */
+ ts.current_column = 0;
+ ts.kRep = ds->getKeys();
+ browseView->rebuildKeys();
+ listView->rebuildKeys();
+ filterView->rebuildKeys();
+
+ ds->first();
+ /* set up the list view */
+ listView->clearItems();
+ do {
+ d = ds->getCurrentData();
+ if(d)
+ listView->addItem(d);
+ } while(ds->next());
+
+ /* Set up browse view, Will be based of structure of listView */
+ listView->first();
+ ts.current_elem = listView->getCurrentData();
+ browseView->rebuildData();
+ listView->rebuildData();
+
+ QString scratch = "Table Viewer";/* later take from constant */
+ scratch += " - ";
+ scratch += ds->getName();
+ setCaption(tr(scratch));
+
+ dirty = FALSE;
+ } else {
+ qWarning(tr("could not load Document"));
+ }
+ dev->close();
+}
+
+/*!
+ Moves to the next item of the current table
+*/
+void TableViewerWindow::nextItem()
+{
+ listView->next();
+ ts.current_elem = listView->getCurrentData();
+ browseView->rebuildData();
+}
+
+/*!
+ Moves to the previous item of the current table
+*/
+void TableViewerWindow::previousItem()
+{
+ listView->previous();
+ ts.current_elem = listView->getCurrentData();
+ browseView->rebuildData();
+}
+
+/*!
+ Raises the List View. This is a mode change for the application.
+*/
+void TableViewerWindow::listViewSlot()
+{
+ if(current_view == FilterState)
+ applyFilter();
+ current_view = ListState;
+ cw->raiseWidget(current_view);
+}
+
+void TableViewerWindow::applyFilter()
+{
+ DataElem *d;
+
+ listView->clearItems();
+ ds->first();
+ do {
+ d = ds->getCurrentData();
+ if(d)
+ if(filterView->passesFilter(d))
+ listView->addItem(d);
+ } while(ds->next());
+ listView->first();
+ listView->rebuildData();
+}
+
+/*!
+ Raises the Browse View. This is a mode change for the application.
+*/
+void TableViewerWindow::browseViewSlot()
+{
+ if(current_view == FilterState)
+ applyFilter();
+
+ ts.current_elem = listView->getCurrentData();
+ browseView->rebuildData();
+
+ current_view = BrowseState;
+ cw->raiseWidget(current_view);
+}
+
+/*!
+ Raises the List View. This is a mode change for the application.
+*/
+void TableViewerWindow::filterViewSlot()
+{
+ current_view = FilterState;
+ cw->raiseWidget(current_view);
+}
+
+
+
+
+void TableViewerWindow::editItemSlot()
+{
+ if(TVEditView::openEditItemDialog(&ts, ts.current_elem, this)) {
+ listView->rebuildData();
+ browseView->rebuildData();
+ dirty = TRUE;
+ }
+}
+
+void TableViewerWindow::newItemSlot()
+{
+ DataElem *d = new DataElem(ds);
+ if (TVEditView::openEditItemDialog(&ts, d, this)) {
+
+ ds->addItem(d);
+ ts.current_elem = d;
+ applyFilter();
+ listView->rebuildData();
+ browseView->rebuildData();
+ dirty = TRUE;
+ }
+}
+
+void TableViewerWindow::deleteItemSlot()
+{
+ /* delete the actual item, then do a 'filter' */
+ DataElem *to_remove = ts.current_elem;
+
+ if(!to_remove)
+ return;
+
+ listView->removeItem();
+ ds->removeItem(to_remove);
+
+ applyFilter();
+ listView->rebuildData();
+ browseView->rebuildData();
+ dirty = TRUE;
+}
+
+void TableViewerWindow::editKeysSlot()
+{
+ DataElem *d;
+ KeyList *k = TVKeyEdit::openEditKeysDialog(&ts, this);
+
+ if(k) {
+ /* set as new keys */
+ ds->setKeys(k);
+
+ ts.current_column = 0;
+ ts.kRep = k;
+
+ browseView->reset();
+ listView->reset();
+ filterView->reset();
+
+ browseView->rebuildKeys();
+ listView->rebuildKeys();
+ filterView->rebuildKeys();
+
+ ds->first();
+ /* set up the list view */
+ listView->clearItems();
+ do {
+ d = ds->getCurrentData();
+ if(d)
+ listView->addItem(d);
+ } while(ds->next());
+
+ /* Set up browse view, Will be based of structure of listView */
+ dirty = TRUE;
+ }
+}
+
+/*!
+ A Slot that allows for widgets above to indicate a search should be
+ done on a specified key index for a specified value
+*/
+void TableViewerWindow::searchOnKey(int i, TVVariant v)
+{
+ listView->findItem(i, v);
+ ts.current_elem = listView->getCurrentData();
+ browseView->rebuildData();
+}
+
+void TableViewerWindow::setPrimaryKey(int i)
+{
+ ts.current_column = i;
+ listView->rebuildData();
+ browseView->rebuildData();
+}