summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2002-03-09 20:00:31 (UTC)
committer llornkcor <llornkcor>2002-03-09 20:00:31 (UTC)
commit767f33638631d29bca260aab66c1224ab2108af7 (patch) (side-by-side diff)
treee8c66841e18a4f106e0650e1e29d21e706bcef14
parent3095bf47c523afcf5441057db23050767f69ebf9 (diff)
downloadopie-767f33638631d29bca260aab66c1224ab2108af7.zip
opie-767f33638631d29bca260aab66c1224ab2108af7.tar.gz
opie-767f33638631d29bca260aab66c1224ab2108af7.tar.bz2
got tableviewer compiling to find out what the heck it is- and I still can't tell
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tableviewer/db/common.cpp40
-rw-r--r--noncore/apps/tableviewer/main.cpp2
-rw-r--r--noncore/apps/tableviewer/tableviewer.cpp116
-rw-r--r--noncore/apps/tableviewer/tableviewer.h4
-rw-r--r--noncore/apps/tableviewer/ui/commonwidgets.cpp3
-rw-r--r--noncore/apps/tableviewer/ui/tvbrowseview.cpp12
6 files changed, 89 insertions, 88 deletions
diff --git a/noncore/apps/tableviewer/db/common.cpp b/noncore/apps/tableviewer/db/common.cpp
index 4c70e54..71844a5 100644
--- a/noncore/apps/tableviewer/db/common.cpp
+++ b/noncore/apps/tableviewer/db/common.cpp
@@ -1,1465 +1,1465 @@
/**********************************************************************
** 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 <stdlib.h>
#include <qstring.h>
#include <qheader.h>
#include <qvector.h>
#include <qdatetime.h>
-#include <timestring.h>
+#include <qpe/timestring.h>
#include "common.h"
#include "datacache.h"
#include <assert.h>
static const int del_flag = 0x1;
static const int new_flag = 0x2;
/* Helper function */
int parseNextNumber(QString *q) {
QChar c;
uint i;
int result = 0;
bool found_digits = FALSE;
for(i = 0; i < q->length(); i++) {
c = q->at(i);
if (c.isDigit()) {
if (found_digits)
result *= 10;
found_digits = TRUE;
result += c.digitValue();
} else {
if (found_digits)
break;
/* just skip this char */
}
}
/* now truncate q */
if (found_digits)
q->remove(0, i);
return result;
}
/*!
\class QStringVector
\brief A Vector of QStrings that can be sorted and searched
Implmented in order to allow reverse lookup on the string name
*/
/*!
This function implements the compare function in order to allow the
searching and sorting of the QStringVector to occur
\returns an int which is either
<UL>
<LI> < 0 if the first string is smaller than the second,</LI>
<LI> > 0 if the first string is bigger then the second,</LI>
<LI> == 0 if the first string is equal to the second.</LI>
</UL>
*/
int QStringVector::compareItems(Item a, Item b)
{
QString *qa = (QString *)a;
QString *qb = (QString *)b;
return QString::compare(*qa, *qb);
}
/*!
\class TVVariant
A way of abstracting void * and keeping information on
the keytypes and behaviours in one place
*/
TVVariantPrivate::TVVariantPrivate()
{
typ = TVVariant::Invalid;
}
TVVariantPrivate::TVVariantPrivate( TVVariantPrivate *d)
{
switch(d->typ)
{
case TVVariant::Invalid:
break;
case TVVariant::String:
value.ptr = new QString(*((QString *)d->value.ptr));
break;
case TVVariant::Date:
value.ptr = new QDate(*((QDate *)d->value.ptr));
break;
case TVVariant::Time:
value.ptr = new QTime(*((QTime *)d->value.ptr));
break;
case TVVariant::Int:
value.i = d->value.i;
break;
default:
ASSERT( 0 );
}
typ = d->typ;
}
TVVariantPrivate::~TVVariantPrivate()
{
clear();
}
void TVVariantPrivate::clear()
{
switch( typ )
{
case TVVariant::String:
delete (QString *)value.ptr;
break;
case TVVariant::Date:
delete (QDate *)value.ptr;
break;
case TVVariant::Time:
delete (QTime *)value.ptr;
break;
case TVVariant::Invalid:
case TVVariant::Int:
break;
}
typ = TVVariant::Invalid;
}
/*!
\class TVVariant
blah
*/
TVVariant::TVVariant()
{
d = new TVVariantPrivate;
}
TVVariant::~TVVariant()
{
if (d->deref())
delete d;
}
TVVariant::TVVariant(const TVVariant& p)
{
d = new TVVariantPrivate;
*this = p;
}
TVVariant::TVVariant(QDataStream& s)
{
d = new TVVariantPrivate;
s >> *this;
}
TVVariant::TVVariant(const QString &val)
{
d = new TVVariantPrivate;
d->typ = String;
d->value.ptr = new QString(val);
}
TVVariant::TVVariant(const QDate &val)
{
d = new TVVariantPrivate;
d->typ = Date;
d->value.ptr = new QDate(val);
}
TVVariant::TVVariant(const QTime &val)
{
d = new TVVariantPrivate;
d->typ = Time;
d->value.ptr = new QTime(val);
}
TVVariant::TVVariant( int val )
{
d = new TVVariantPrivate;
d->typ = Int;
d->value.i = val;
}
TVVariant& TVVariant::operator=(const TVVariant& variant )
{
TVVariant& other = (TVVariant&) variant;
other.d->ref();
if ( d->deref() )
delete d;
d = other.d;
return *this;
}
void TVVariant::detach()
{
if (d->count == 1)
return;
d->deref();
d = new TVVariantPrivate(d);
}
const QString TVVariant::typeName() const
{
return typeToName(d->typ);
}
void TVVariant::clear()
{
if (d->count > 1)
{
d->deref();
d = new TVVariantPrivate;
return;
}
d->clear();
}
const QString TVVariant::typeToName(KeyType typ)
{
switch(typ) {
case String:
return QString("String");
case Date:
return QString("Date");
case Time:
return QString("Time");
case Int:
return QString("Int");
case Invalid:
default:
return QString("Invalid");
}
return QString("Invalid");
}
TVVariant::KeyType TVVariant::nameToType(const QString &name)
{
if(!qstrcmp("String", name))
return String;
if(!qstrcmp("Date", name))
return Date;
if(!qstrcmp("Time", name))
return Time;
if(!qstrcmp("Int", name))
return Int;
return Invalid;
}
void TVVariant::load(QDataStream &s )
{
KeyType t;
s >> t;
d->typ = t;
switch(t) {
case Invalid:
d->typ = t;
break;
case String:
{
QString *x = new QString;
s >> *x;
d->value.ptr = x;
}
break;
case Time:
{
QTime *x = new QTime;
s >> *x;
d->value.ptr = x;
}
break;
case Date:
{
QDate *x = new QDate;
s >> *x;
d->value.ptr = x;
}
break;
case Int:
{
int x;
s >> x;
d->value.i = x;
}
- break;
+ break;
default:
- qFatal("Unrecognized data type");
+ qFatal("Unrecognized data type");
}
}
void TVVariant::save( QDataStream &s ) const
{
s << type();
switch( d->typ ) {
case String:
s << *((QString *)d->value.ptr);
break;
case Date:
s << *((QDate *)d->value.ptr);
break;
case Time:
s << *((QTime *)d->value.ptr);
break;
case Int:
s << d->value.i;
break;
case Invalid:
break;
}
}
QDataStream& operator>>(QDataStream& s, TVVariant& p)
{
p.load( s );
return s;
}
QDataStream& operator<<(QDataStream &s, const TVVariant& p)
{
p.save( s );
return s;
}
QDataStream& operator>> (QDataStream &s, TVVariant::KeyType& p)
{
Q_UINT8 u = 0;
s >> u;
p = (TVVariant::KeyType) u;
return s;
}
QDataStream& operator<< (QDataStream& s, const TVVariant::KeyType& p)
{
s << (Q_UINT8)p;
return s;
}
const QString TVVariant::toString() const
{
switch(d->typ) {
case String:
return *((QString*)d->value.ptr);
case Date:
return ((QDate*)d->value.ptr)->toString();
case Time:
return ((QTime*)d->value.ptr)->toString();
case Int:
return QString::number(d->value.i);
case Invalid:
default:
return QString::null;
}
return QString::null;
}
// TODO DO, this properly, */
int TVVariant::toInt() const
{
if(d->typ == Int)
return d->value.i;
if(d->typ == String) {
- QString tmpq(*(QString *)d->value.ptr);
+ QString tmpq(*(QString *)d->value.ptr);
return parseNextNumber(&tmpq);
}
return 0;
}
const QDate TVVariant::toDate() const
{
if(d->typ == Date)
return *((QDate *)d->value.ptr);
if(d->typ == String) {
QString q = toString();
/* date format is day mon d yyyy */
/* ignore the first three letters, read the next
three for month.. etc */
int day = parseNextNumber(&q);
int month = parseNextNumber(&q);
int year = parseNextNumber(&q);
if (!QDate::isValid(year, month, day))
return QDate();
return QDate(year, month, day);
}
return QDate();
}
const QTime TVVariant::toTime() const
{
if(d->typ == Time)
return *((QTime *)d->value.ptr);
if(d->typ == String) {
QString q = toString();
int hour = parseNextNumber(&q);
int minute = parseNextNumber(&q);
int second = parseNextNumber(&q);
int msecond = parseNextNumber(&q);
if (!QTime::isValid(hour, minute, second, msecond))
return QTime();
return QTime(hour, minute, second, msecond);
}
return QTime();
}
#define TV_VARIANT_AS( f ) Q##f& TVVariant::as##f() { \
if ( d->typ != f ) \
*this = TVVariant( to##f() ); \
else \
detach(); \
return *((Q##f*)d->value.ptr); }
TV_VARIANT_AS(String)
TV_VARIANT_AS(Date)
TV_VARIANT_AS(Time)
#undef TV_VARIANT_AS
int& TVVariant::asInt()
{
detach();
if (d->typ != Int) {
d->value.i = toInt();
d->typ = Int;
}
return d->value.i;
}
/*!
valid cast is
anything to String
same to same
*/
bool TVVariant::canCast(KeyType t) const
{
if(d->typ == t)
return TRUE;
if(t == String)
return TRUE;
if(t == Int) {
if (d->typ == Date)
return TRUE;
if (d->typ == Time)
return TRUE;
if (d->typ == String)
return TRUE;
}
return FALSE;
}
bool TVVariant::operator==( const TVVariant &v ) const
{
switch(d->typ) {
case String:
return v.toString() == toString();
case Date:
return v.toDate() == toDate();
case Time:
return v.toTime() == toTime();
case Int:
return v.toInt() == toInt();
case Invalid:
break;
}
return FALSE;
}
bool TVVariant::operator!=( const TVVariant &v ) const
{
return !( v == *this);
}
bool TVVariant::operator<( const TVVariant &v ) const
{
switch(d->typ) {
case String:
return toString().lower() < v.toString().lower();
case Date:
return toDate() < v.toDate();
case Time:
return toTime() < v.toTime();
case Int:
return toInt() < v.toInt();
case Invalid:
default:
break;
}
return FALSE;
}
bool TVVariant::operator>( const TVVariant &v ) const
{
switch(d->typ) {
case String:
return toString().lower() > v.toString().lower();
case Date:
return toDate() > v.toDate();
case Time:
return toTime() > v.toTime();
case Int:
return toInt() > v.toInt();
case Invalid:
default:
break;
}
return FALSE;
}
/*! True if n is closer to this than o */
bool TVVariant::closer(TVVariant n, TVVariant o)
{
/* Nothing is close to an invalid, so nothing can be closer */
if(d->typ == Invalid)
return FALSE;
/* can't be closer if of different type */
if(n.type() != type())
return FALSE;
/* if new shares type, and old doesn't, then new is closer */
if(o.type() != type())
return TRUE;
switch(type()){
case String: {
/* case for strings is close is a substring.. closer is
* earlier alphabetically */
QString qs1 = n.toString().lower();
QString qs2 = o.toString().lower();
QString qsv = toString().lower();
if (!qs1.startsWith(qsv))
return FALSE;
/* contains sub-str, if later than is not closer */
if(QString::compare(qs1, qs2) > 0)
return FALSE;
return TRUE;
}
case Int: {
/* case for int is smallest absolute difference */
int i1 = n.toInt();
int i2 = o.toInt();
int iv = toInt();
int diff1 = (i1 - iv);
if (diff1 < 0)
diff1 = -diff1;
int diff2 = (i2 - iv);
if (diff2 < 0)
diff2 = -diff2;
if (diff1 < diff2)
return TRUE;
return FALSE;
}
case Date: {
QDate i1 = n.toDate();
QDate i2 = o.toDate();
QDate iv = toDate();
/* definition of closer is the least difference in days */
int diff1 = i1.daysTo(iv);
if (diff1 < 0)
diff1 = -diff1;
int diff2 = i2.daysTo(iv);
if (diff2 < 0)
diff2 = -diff2;
if (diff1 < diff2)
return TRUE;
return FALSE;
}
case Time: {
QTime i1 = n.toTime();
QTime i2 = o.toTime();
QTime iv = toTime();
/* definition of closer is the least difference in days */
int diff1 = i1.msecsTo(iv);
if (diff1 < 0)
diff1 = -diff1;
int diff2 = i2.msecsTo(iv);
if (diff2 < 0)
diff2 = -diff2;
if (diff1 < diff2)
return TRUE;
return FALSE;
}
default:
/* don't know how to do 'closer' on this type, hence never closer
* or even close */
break;
}
return FALSE;
}
/*! True if n is close to this */
bool TVVariant::close(TVVariant n)
{
/* Nothing is close to an invalid, so nothing can be closer */
if(type() == Invalid)
return FALSE;
/* can't be close if of different type */
if(n.type() != type())
return FALSE;
switch(type()){
case String: {
/* case for strings is close is a substring.. closer is
* earlier alphabetically */
QString qs1 = n.toString().lower();
QString qsv = toString().lower();
if (!qs1.startsWith(qsv))
return FALSE;
return TRUE;
}
case Int:
case Date:
case Time:
return TRUE;
default:
/* don't know how to do 'closer' on this type, hence never closer
* or even close */
break;
}
return FALSE;
}
/*!
\class Key
\brief document me!
document me!
*/
Key::Key() : kname(), kexample(), kflags(0) { }
Key::Key(QString name, TVVariant example, int flags = 0) :
kname(name), kexample(example), kflags(flags) { }
Key::Key(const Key &other)
{
- kname = other.kname;
- kexample = other.kexample;
- kflags = other.kflags;
+ kname = other.kname;
+ kexample = other.kexample;
+ kflags = other.kflags;
}
Key& Key::operator=(const Key& key)
{
kname = key.kname;
kexample = key.kexample;
kflags = key.kflags;
return *this;
}
QString Key::name() const
{
return QString(kname);
}
TVVariant Key::example() const
{
return TVVariant(kexample);
}
TVVariant::KeyType Key::type() const
{
return kexample.type();
}
void Key::setName(const QString &name)
{
kname = QString(name);
}
void Key::setExample(const TVVariant &e)
{
kexample = TVVariant(e);
}
int Key::flags() const
{
return kflags;
}
void Key::setFlags(int fl)
{
kflags = fl;
}
bool Key::delFlag() const
{
if(kflags & del_flag)
return TRUE;
return FALSE;
}
bool Key::newFlag() const
{
if(kflags & new_flag)
return TRUE;
return FALSE;
}
void Key::setDelFlag(bool v)
{
if(delFlag() != v)
kflags = kflags ^ del_flag;
}
void Key::setNewFlag(bool v)
{
if(newFlag() != v)
kflags = kflags ^ new_flag;
}
/*!
\class KeyList
\brief A represntation of keys used for a table.
The KeyList class is used to store the representation of keys used in table
headings by DBStore. It stores the names and types of the keys
*/
/*!
Constructs a KeyList
*/
KeyList::KeyList() : QIntDict<Key>(20)
{
setAutoDelete(TRUE);
}
/* Should be deep copy, but isn't */
KeyList::KeyList(const KeyList &k) : QIntDict<Key>(k)
{
KeyListIterator it(k);
- while(it.current()) {
- replace(it.currentKey(), new Key(*it.current()));
- ++it;
- }
+ while(it.current()) {
+ replace(it.currentKey(), new Key(*it.current()));
+ ++it;
+ }
setAutoDelete(TRUE);
}
/*!
Destroys a KeyList
*/
KeyList::~KeyList() {
}
/* Do a comparision base on Keys */
bool KeyList::operator!=(const KeyList &other)
{
KeyListIterator it(*this);
if (other.getNumFields() != getNumFields())
- return TRUE;
+ return TRUE;
while(it.current()) {
- //it.currentKey(), it.current();
- if (other.getKeyName(it.currentKey()) != getKeyName(it.currentKey()))
- return TRUE;
- if (other.getKeyType(it.currentKey()) != getKeyType(it.currentKey()))
- return TRUE;
- ++it;
+ //it.currentKey(), it.current();
+ if (other.getKeyName(it.currentKey()) != getKeyName(it.currentKey()))
+ return TRUE;
+ if (other.getKeyType(it.currentKey()) != getKeyType(it.currentKey()))
+ return TRUE;
+ ++it;
}
return FALSE;
}
/*!
Returns the number of keys stored in the KeyList
*/
int KeyList::getNumFields() const
{
return count();
}
/*!
Adds a new key to the KeyList
\param name the name of the new key
\param type the type of the new key
*/
int KeyList::addKey(QString name, TVVariant example)
{
int i = count();
while(find(i) && (i > -1))
i--;
replace(i, new Key(name, example, 0));
return i;
}
int KeyList::addKey(QString name, TVVariant::KeyType type)
{
/* generate a valid type for the example? */
TVVariant e = TVVariant("0");
switch(type) {
case TVVariant::String:
return addKey(name, TVVariant("<undefined>").asString());
break;
case TVVariant::Date:
return addKey(name, TVVariant(QDate::currentDate()).asDate());
break;
case TVVariant::Time:
return addKey(name, TVVariant(QTime(0,0,0)).toTime());
break;
case TVVariant::Int:
return addKey(name, TVVariant(0).toInt());
break;
default:
qWarning(QObject::tr("KeyList::addKey() Cannot make default "
"value for type %1, Key not added.").arg(type));
break;
}
return -1;
}
void KeyList::setKeyFlags(int i, int flag)
{
if(find(i))
find(i)->setFlags(flag);
}
int KeyList::getKeyFlags(int i) const
{
if(find(i))
return find(i)->flags();
return 0;
}
bool KeyList::checkNewFlag(int i) const
{
if (find(i))
return find(i)->newFlag();
return false;
}
void KeyList::setNewFlag(int i, bool f)
{
if(!find(i))
return;
find(i)->setNewFlag(f);
}
bool KeyList::checkDeleteFlag(int i) const
{
if (find(i))
return find(i)->delFlag();
return false;
}
void KeyList::setDeleteFlag(int i, bool f)
{
if(!find(i))
return;
find(i)->setDelFlag(f);
}
/*!
Returns the name of the key at index i
*/
QString KeyList::getKeyName(int i) const
{
if (find (i))
return find(i)->name();
return QString();
}
void KeyList::setKeyName(int i, const QString &n)
{
if(find(i))
find(i)->setName(n);
}
/*!
Returns the type of the key at index i
*/
TVVariant::KeyType KeyList::getKeyType(int i) const
{
if(find(i))
return find(i)->type();
return TVVariant::Invalid;
}
void KeyList::setKeyType(int i, TVVariant::KeyType t)
{
if(!find(i))
return;
switch(t) {
case TVVariant::String:
find(i)->setExample(TVVariant(QString("default")));
return;
case TVVariant::Int:
find(i)->setExample(TVVariant(int(0)));
return;
case TVVariant::Date:
find(i)->setExample(TVVariant(QDate::currentDate()));
return;
case TVVariant::Time:
find(i)->setExample(TVVariant(QTime(0,0,0,0)));
return;
default:
break;
}
return;
}
TVVariant KeyList::getKeyExample(int i) const
{
if(find(i))
return find(i)->example();
return TVVariant();
}
void KeyList::setKeyExample(int i, TVVariant example)
{
if(find(i))
find(i)->setExample(example);
}
/*!
Returns the index of the key with name q
*/
int KeyList::getKeyIndex(QString q) const
{
KeyListIterator it(*this);
while(it.current()) {
if(it.current()->name() == q)
return it.currentKey();
++it;
}
return -1;
}
bool KeyList::validIndex(int i) const
{
if(!find(i))
return FALSE;
if(find(i)->delFlag())
return FALSE;
return TRUE;
}
QDataStream &operator<<( QDataStream &s, const KeyList &k)
{
s << k.getNumFields();
KeyListIterator it(k);
while(it.current()) {
s << (Q_UINT16)it.currentKey();
s << it.current()->name();
s << it.current()->example();
s << (Q_UINT16)it.current()->flags();
++it;
}
return s;
}
QDataStream &operator>>( QDataStream &s, KeyList &k)
{
int i;
int size;
int index = 0;
int flags = 0;
TVVariant type = TVVariant();
QString name;
s >> size;
for (i=0; i < size; i++) {
s >> (Q_UINT16 &)index;
s >> name;
s >> type;
s >> (Q_UINT16 &)flags;
k.replace(index, new Key(name, type, flags));
}
return s;
}
/*!
\class DataElem
\brief A class representing a single row or element of a table in a DBStore
This class holds the data of a row in a table.
*/
/*!
Constructs a DataElem. This function needs a container because the
size, types of keys and primary key are all defined by the containing
database
*/
DataElem::DataElem(DBStore *c) : values(20)
{
int size;
contained = c;
size = c->getNumFields();
values.setAutoDelete(TRUE);
}
/*!
Destroys a DataElem and frees memory used by the DataElem
*/
DataElem::~DataElem() {
}
QDataStream &operator<<( QDataStream &s, const DataElem &d)
{
int size = d.getNumFields();
s << size; /* redundent data but makes streaming easier */
KeyList k = d.getKeys();
KeyListIterator it(k);
while(it.current()) {
s << (Q_UINT16)it.currentKey();
s << d.getField(it.currentKey());
++it;
}
return s;
}
QDataStream &operator>>( QDataStream &s, DataElem &d)
{
int i;
int size;
TVVariant t;
int index = 0;
s >> size; /* redundent data but makes streaming easier */
if (size != d.getNumFields()) {
qWarning("DataSize mis-match");
return s; /* sanity check failed.. don't load */
}
for(i = 0; i < size; i++) {
s >> (Q_UINT16)index;
s >> t;
d.setField(index, t);
}
return s;
}
/*! Returns the number of possible (not valid) fields in the data element */
int DataElem::getNumFields() const
{
return contained->getNumFields();
}
KeyList DataElem::getKeys() const
{
return *(contained->getKeys());
}
/*!
This function determines whether field index i of the element has been
set yet.
\return A boolean value that is TRUE if the specfied field of this
element has been set and FALSE if the field has not yet been set
*/
bool DataElem::hasValidValue(int i) const
{
if(!values.find(i))
return FALSE;
if(!contained->getKeys()->validIndex(i))
return FALSE;
return values.find(i)->isValid();
}
/*!
This function determines whether field name qs of the element has been
set yet.
\return A boolean value that is TRUE if the specfied field of this
element has been set and FALSE if the field has not yet been set
*/
bool DataElem::hasValidValue(QString qs) const
{
int i = contained->getKeyIndex(qs);
return hasValidValue(i);
}
/*! returns the type of the field specified by index i */
TVVariant::KeyType DataElem::getFieldType(int i) const
{
return contained->getKeyType(i);
}
/*! returns the type of the field specified by name qs */
TVVariant::KeyType DataElem::getFieldType(QString qs) const
{
int i = contained->getKeyIndex(qs);
return contained->getKeyType(i);
}
/*!
returns a pointer to the data stored in field index i for this
data element, (value may not be valid)
*/
TVVariant DataElem::getField(int i) const
{
if(hasValidValue(i))
return TVVariant(*values.find(i));
return TVVariant();
}
/*!
returns a pointer to the data stored in field name qs for this
data element, (value may not be valid)
*/
TVVariant DataElem::getField(QString qs) const
{
int i = contained->getKeyIndex(qs);
return getField(i);
}
/*!
Sets the value of the elements field index i to the value represented in
the QString q.
\param i index of the field to set
\param q a string that can be parsed to get the value to be set
*/
void DataElem::setField(int i, QString q)
{
/* from the type of the field, parse q and store */
TVVariant::KeyType kt = contained->getKeyType(i);
TVVariant t = TVVariant(q);
switch(kt) {
case TVVariant::Int: {
t.asInt();
setField(i, t);
- return;
+ return;
}
case TVVariant::String: {
t.asString();
setField(i, t);
return;
}
case TVVariant::Date: {
t.asDate();
setField(i, t);
return;
}
case TVVariant::Time: {
t.asTime();
setField(i, t);
return;
}
default:
qWarning(
QObject::tr("DataElem::setField(%1, %2) No valid type found").arg(i).arg(q)
);
}
}
/*!
Sets the value of the elements field index i to the value at the pointer
value.
\param i index of the field to set
\param value a pointer to the (already allocated) value to set
*/
void DataElem::setField(int i, TVVariant value)
{
if (value.isValid()) {
values.remove(i);
values.replace(i, new TVVariant(value));
}
}
/*!
Sets the value of the elements field name qs to the value represented in
the QString q.
\param qs name of the field to set
\param q a string that can be parsed to get the value to be set
*/
void DataElem::setField(QString qs, QString q)
{
/* from the type of the field, parse q and store */
int i = contained->getKeyIndex(qs);
setField(i, qs);
}
/*!
Sets the value of the elements field name qs to the value at the pointer
value.
\param qs name of the field to set
\param value a pointer to the (already allocated) value to set
*/
void DataElem::setField(QString qs, TVVariant value)
{
int i = contained->getKeyIndex(qs);
setField(i, value);
}
void DataElem::unsetField(int i) {
values.remove(i);
}
void DataElem::unsetField(QString qs)
{
int i = contained->getKeyIndex(qs);
unsetField(i);
}
/*!
Converts the data element to a Rich Text QString
*/
QString DataElem::toQString() const
{
/* lets make an attempt at this function */
int i;
QString scratch = "";
QIntDictIterator<TVVariant> it(values);
while (it.current()) {
- i = it.currentKey();
+ i = it.currentKey();
if(hasValidValue(i)) {
scratch += "<B>" + contained->getKeyName(i) + ":</B> ";
scratch += getField(i).toString();
scratch += "<br>";
}
++it;
}
return scratch;
}
/*! formats individual fields to strings so can be displayed */
QString DataElem::toQString(int i) const
{
if(hasValidValue(i)) {
return getField(i).toString();
}
return "";
}
/*! formats individual fields to strings so can be sorted by QListView */
QString DataElem::toSortableQString(int i) const
{
QString scratch = "";
if(hasValidValue(i)) {
switch (contained->getKeyType(i)) {
case TVVariant::String: {
scratch += getField(i).toString();
break;
}
case TVVariant::Int: {
scratch.sprintf("%08d", getField(i).toInt());
break;
}
case TVVariant::Date: {
static QDate epochD(1800, 1, 1);
scratch.sprintf("%08d",
epochD.daysTo(getField(i).toDate()));
break;
}
case TVVariant::Time: {
static QTime epochT(0, 0, 0);
scratch.sprintf("%08d",
epochT.msecsTo(getField(i).toTime()));
break;
}
default:
scratch += "Unknown type";
break;
}
}
return scratch;
}
/* compare functions */
bool DataElem::lessThan(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
return (getField(i) < v);
}
bool DataElem::moreThan(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
return (getField(i) > v);
}
bool DataElem::equalTo(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
return (getField(i) == v);
}
bool DataElem::contains(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
switch(getField(i).type()) {
case TVVariant::String: {
QString qs1 = getField(i).toString().lower();
QString qs2 = v.toString().lower();
if (qs1.contains(qs2) > 0) return TRUE;
break;
}
/* meaningless for ints */
/* meaningless for time */
/* meaningless for dates */
case TVVariant::Int:
case TVVariant::Time:
case TVVariant::Date:
break;
default:
qWarning("Tried to compare unknown data type");
}
return FALSE;
}
bool DataElem::startsWith(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
switch(getField(i).type()) {
case TVVariant::String: {
QString qs1 = getField(i).toString().lower();
QString qs2 = v.toString().lower();
return qs1.startsWith(qs2);
}
/* meaningless for ints */
/* meaningless for time */
/* meaningless for dates */
case TVVariant::Int:
case TVVariant::Time:
case TVVariant::Date:
return FALSE;
default:
qWarning("Tried to compare unknown data type");
}
return FALSE;
}
bool DataElem::endsWith(int i, TVVariant v) const
{
if (!hasValidValue(i)) return FALSE;
if (getField(i).type() != v.type())
return FALSE;
switch(getField(i).type()) {
case TVVariant::String: {
QString qs1 = getField(i).toString().lower();
QString qs2 = v.toString().lower();
return qs1.startsWith(qs2);
}
/* meaningless for ints */
/* meaningless for time */
/* meaningless for dates */
case TVVariant::Int:
case TVVariant::Time:
case TVVariant::Date:
return FALSE;
default:
qWarning("Tried to compare unknown data type");
}
return FALSE;
}
/*!
Determins which of the first to parameters are closer to the third, target
parameter.
\return
<UL>
<LI>TRUE if the first element is a closer match to the target than the
second element</LI>
<LI>FALSE if the first element is not a closer match to the target than
the second element</LI>
</UL>
*/
bool DataElem::closer(DataElem*d1, DataElem *d2, TVVariant target, int column)
{
int type;
if(!d1) return FALSE;
if (!d1->hasValidValue(column)) return FALSE;
if(!target.isValid()) return FALSE;
type = d1->getField(column).type();
if(d2) {
if (type != d2->getField(column).type()) {
/* can't do compare */
qWarning("Tried to compare two incompatable types");
return FALSE;
diff --git a/noncore/apps/tableviewer/main.cpp b/noncore/apps/tableviewer/main.cpp
index 736e1cf..56c567f 100644
--- a/noncore/apps/tableviewer/main.cpp
+++ b/noncore/apps/tableviewer/main.cpp
@@ -1,32 +1,32 @@
/**********************************************************************
** 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 "tableviewer.h"
-#include <qpeapplication.h>
+#include <qpe/qpeapplication.h>
int main( int argc, char ** argv )
{
QPEApplication a( argc, argv );
TableViewerWindow * mw = new TableViewerWindow;
mw->setCaption( TableViewerWindow::tr("Table Viewer") );
a.showMainWidget(mw);
return a.exec();
}
diff --git a/noncore/apps/tableviewer/tableviewer.cpp b/noncore/apps/tableviewer/tableviewer.cpp
index 0d4a412..0456b41 100644
--- a/noncore/apps/tableviewer/tableviewer.cpp
+++ b/noncore/apps/tableviewer/tableviewer.cpp
@@ -1,455 +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"
+#include <qpe/fileselector.h>
+#include <qpe/resource.h>
+#include <qpe/qpetoolbar.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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ QIconSet(Resource::loadPixmap("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");
+ 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 &)));
+ this, SLOT(openDocument(const DocLnk &)));
main_layout->addWidget(menu);
main_layout->addWidget(cw);
setCentralWidget(cw);
}
/*!
Destroys the TableViewerWindow
*/
TableViewerWindow::~TableViewerWindow()
{
if(dirty)
- saveDocument();
+ saveDocument();
}
/*!
Opens a file dialog and loads the file specified by the dialog
*/
void TableViewerWindow::selectDocument()
{
if(dirty)
- saveDocument();
+ saveDocument();
current_view = FileState;
cw->raiseWidget(current_view);
fileSelector->reread();
}
void TableViewerWindow::saveDocument()
{
if(!dirty)
- return;
+ return;
FileManager fm;
QIODevice *dev = fm.saveFile(doc);
if(!ds->saveSource(dev, doc.type())){
- qWarning("Save unsuccessful");
- return;
+ 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();
+ /* now set up for editing the keys */
+ ts.kRep->addKey("key", TVVariant::String);
+ editKeysSlot();
}
void TableViewerWindow::openDocument(const DocLnk &f)
{
if (!f.isValid())
- return;
+ 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);
+ 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;
+ 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);
+ 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;
+ 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;
+ 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;
+ /* delete the actual item, then do a 'filter' */
+ DataElem *to_remove = ts.current_elem;
- if(!to_remove)
- return;
+ if(!to_remove)
+ return;
listView->removeItem();
- ds->removeItem(to_remove);
+ 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;
+ 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();
}
diff --git a/noncore/apps/tableviewer/tableviewer.h b/noncore/apps/tableviewer/tableviewer.h
index 2d4686a..0d3c39d 100644
--- a/noncore/apps/tableviewer/tableviewer.h
+++ b/noncore/apps/tableviewer/tableviewer.h
@@ -1,109 +1,109 @@
/**********************************************************************
** 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.
**
**********************************************************************/
#ifndef Tableviewer_H
#define Tableviewer_H
#include <qmainwindow.h>
#include "db/common.h"
-#include "fileselector.h"
+#include <qpe/fileselector.h>
/* Forward class declarations */
class QWidgetStack;
class QDialog;
class QMenuBar;
class TVListView;
class TVBrowseView;
class TVFilterView;
class TVEditView;
class DBStore;
class TableViewerWindow: public QMainWindow
{
Q_OBJECT
public:
TableViewerWindow( QWidget *parent = 0,
const char *name = 0, WFlags f = 0 );
~TableViewerWindow();
public slots:
void selectDocument();
void newDocument();
void saveDocument();
void openDocument(const DocLnk &);
void nextItem();
void previousItem();
void listViewSlot();
void browseViewSlot();
void filterViewSlot();
void editItemSlot();
void newItemSlot();
void deleteItemSlot();
void editKeysSlot();
/* reveiw the sig. for this function TODO */
void searchOnKey(int, TVVariant);
void setPrimaryKey(int);
/* TODO add new event */
protected:
/* TODO add new slots */
private slots:
/* TODO add other widgets used here */
private:
bool dirty;
QMenuBar *menu;
QToolBar *navigation;
TVListView *listView;
TVBrowseView *browseView;
TVFilterView *filterView;
TVEditView *editView;
FileSelector *fileSelector;
DocLnk doc;
QWidgetStack *cw;
DBStore *ds;
TableState ts; /* not a pointer.. this class keeps the state */
enum UserState {
BrowseState = 0,
ListState,
FilterState,
EditState,
- FileState,
+ FileState,
};
UserState current_view;
void applyFilter();
};
#endif
diff --git a/noncore/apps/tableviewer/ui/commonwidgets.cpp b/noncore/apps/tableviewer/ui/commonwidgets.cpp
index 0b4f3c2..bf4c36f 100644
--- a/noncore/apps/tableviewer/ui/commonwidgets.cpp
+++ b/noncore/apps/tableviewer/ui/commonwidgets.cpp
@@ -1,209 +1,210 @@
/**********************************************************************
** 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 <qlineedit.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qcombobox.h>
-#include <datebookmonth.h>
+
+#include <qpe/datebookmonth.h>
#include <qpopupmenu.h>
#include <qspinbox.h>
#include "commonwidgets.h"
DateEdit::DateEdit( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
: QToolButton(parent, name)
{
QPopupMenu *m1 = new QPopupMenu(this);
dateSelector = new DateBookMonth(m1, 0, TRUE);
m1->insertItem(dateSelector);
setPopup(m1);
setPopupDelay(0);
connect(dateSelector, SIGNAL(dateClicked(int, int, int)),
this, SLOT(subValueChanged()));
setText(dateSelector->selectedDate().toString());
}
DateEdit::~DateEdit() {}
QDate DateEdit::date() const
{
return dateSelector->selectedDate();
}
void DateEdit::setDate(QDate d)
{
dateSelector->setDate(d.year(), d.month(), d.day());
setText(d.toString());
}
QSizePolicy DateEdit::sizePolicy() const
{
QSizePolicy sp;
sp.setHorData(QToolButton::sizePolicy().horData());
sp.setVerData(QSizePolicy::Fixed);
return sp;
}
void DateEdit::clear()
{
QDate today = QDate::currentDate();
dateSelector->setDate(today.year(), today.month(), today.day());
setText(today.toString());
}
void DateEdit::subValueChanged()
{
QDate current = dateSelector->selectedDate();
setText(current.toString());
emit valueChanged(current);
}
TimeEdit::TimeEdit( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
: QWidget(parent, name, f)
{
QHBoxLayout *layout = new QHBoxLayout(this, 0);
layout->addWidget(hourKey = new QSpinBox(1, 12, 1, this));
hourKey->setWrapping(true);
hourKey->setMinimumWidth(30);
hourKey->setMaximumWidth(35);
layout->addWidget(new QLabel(" : ", this));
layout->addWidget(minuteKey = new QSpinBox(0, 59, 1, this));
minuteKey->setWrapping(true);
minuteKey->setMinimumWidth(30);
minuteKey->setMaximumWidth(35);
layout->addWidget(new QLabel(" : ", this));
layout->addWidget(secondKey = new QSpinBox(0, 59, 1, this, 0));
secondKey->setWrapping(true);
secondKey->setMinimumWidth(30);
secondKey->setMaximumWidth(35);
layout->addWidget(ampm = new QComboBox(this));
ampm->insertItem("AM");
ampm->insertItem("PM");
layout->addStretch(-1);
clear();
connect(secondKey, SIGNAL(valueChanged(const QString&)),
this, SLOT(subValueChanged()));
connect(minuteKey, SIGNAL(valueChanged(const QString&)),
this, SLOT(subValueChanged()));
connect(hourKey, SIGNAL(valueChanged(const QString&)),
this, SLOT(subValueChanged()));
connect(ampm, SIGNAL(activated(int)),
this, SLOT(subValueChanged()));
}
TimeEdit::~TimeEdit() {}
QTime TimeEdit::time() const
{
int s,m,h;
s = secondKey->text().toInt();
m = minuteKey->text().toInt();
h = hourKey->text().toInt();
if(ampm->currentItem() == 1) {
/* pm */
h = h + 12;
}
/* hour now ranges 1->24 */
if (h == 12)
h = 0;
if (h == 24)
h = 12;
if(QTime::isValid(h, m, s))
return QTime(h, m, s);
return QTime(0, 0, 0);
}
void TimeEdit::setTime(QTime t)
{
int h = t.hour();
secondKey->setValue(t.second());
minuteKey->setValue(t.minute());
/* h 0..23 */
if (h > 11) {
h -= 12;
ampm->setCurrentItem(1);
} else {
ampm->setCurrentItem(0);
}
if (h == 0) h = 12;
hourKey->setValue(h);
}
QSizePolicy TimeEdit::sizePolicy() const
{
QSizePolicy sp;
sp.setHorData(QSizePolicy::Preferred);
sp.setVerData(QSizePolicy::Fixed);
return sp;
}
void TimeEdit::clear()
{
secondKey->setValue(0);
minuteKey->setValue(0);
hourKey->setValue(12);
ampm->setCurrentItem(0);
}
void TimeEdit::subValueChanged()
{
emit valueChanged(time());
}
IntEdit::IntEdit( QWidget *parent = 0, const char *name = 0, WFlags f = 0 )
: QSpinBox(INT_MIN, INT_MAX, 1, parent, name)
{
setValue(0);
}
IntEdit::~IntEdit() {}
int IntEdit::value()
{
return cleanText().toInt();
}
void IntEdit::clear()
{
setValue(0);
}
diff --git a/noncore/apps/tableviewer/ui/tvbrowseview.cpp b/noncore/apps/tableviewer/ui/tvbrowseview.cpp
index f6da7b1..9bfc791 100644
--- a/noncore/apps/tableviewer/ui/tvbrowseview.cpp
+++ b/noncore/apps/tableviewer/ui/tvbrowseview.cpp
@@ -1,122 +1,122 @@
/**********************************************************************
** 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 "tvbrowseview.h"
#include "browsekeyentry.h"
#include <qtoolbutton.h>
#include <qtextview.h>
#include <qtextbrowser.h>
#include <qlayout.h>
/*!
\class TVBrowseView
\brief The widget describing how to draw the browse view user interface
This widget allows for the user to browse through the table, one element
at a time, or search on a single key. Its main goal is to show a
single element in a readable format and make it easy for the user to
rapidly find specific elements in the table.
*/
/*!
Constructs a new TVBrowseView widget
*/
TVBrowseView::TVBrowseView(TableState *t, QWidget* parent = 0, const char *name = 0,
- WFlags fl =0)
+ WFlags fl =0)
{
if (!name)
- setName("BrowseView");
+ setName("BrowseView");
- setSizePolicy(QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding, 0, 0, sizePolicy().hasHeightForWidth() ) );
+// setSizePolicy(QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding, 0, 0, sizePolicy().hasHeightForWidth() ) );
QVBoxLayout *vlayout = new QVBoxLayout(this);
textViewDisplay = new QTextBrowser(this, "textViewDisplay");
vlayout->addWidget( textViewDisplay );
keyEntry = new TVBrowseKeyEntry(this, "keyEntry");
vlayout->addWidget( keyEntry );
/* connect the signals down */
connect(keyEntry, SIGNAL(searchOnKey(int, TVVariant)),
this, SIGNAL(searchOnKey(int, TVVariant)));
connect(keyEntry, SIGNAL(sortChanged(int)),
this, SIGNAL(sortChanged(int)));
ts = t;
keyEntry->setTableState(t);
}
/*!
Destroys the TVBrowseView widget
*/
TVBrowseView::~TVBrowseView()
{
}
void TVBrowseView::rebuildData()
{
if(!ts)
return;
if(!ts->current_elem) {
- /* also disable buttons */
- textViewDisplay->setText("");
+ /* also disable buttons */
+ textViewDisplay->setText("");
return;
- }
+ }
setDisplayText(ts->current_elem);
}
/* Reset to initial state */
void TVBrowseView::reset()
{
textViewDisplay->setText("");
keyEntry->reset();
}
/*!
sets the data element to be displayed to element
*/
void TVBrowseView::setDisplayText(const DataElem *element)
{
QString rep = "";
KeyListIterator it(*ts->kRep);
while (it.current()) {
if (element->hasValidValue(it.currentKey())) {
if(it.currentKey() == ts->current_column) {
rep += "<A name=\"ckey\"></A><B><FONT COLOR=#FF0000>"
+ it.current()->name()
+ ":</FONT></B> ";
} else {
rep += "<B>" + it.current()->name() + ":</B> ";
}
rep += element->toQString(it.currentKey()) + "<BR>";
}
++it;
}
textViewDisplay->setText(rep);
textViewDisplay->scrollToAnchor("ckey");
}
void TVBrowseView::rebuildKeys()
{
keyEntry->rebuildKeys();
}