author | llornkcor <llornkcor> | 2002-03-09 20:00:31 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-03-09 20:00:31 (UTC) |
commit | 767f33638631d29bca260aab66c1224ab2108af7 (patch) (side-by-side diff) | |
tree | e8c66841e18a4f106e0650e1e29d21e706bcef14 | |
parent | 3095bf47c523afcf5441057db23050767f69ebf9 (diff) | |
download | opie-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
-rw-r--r-- | noncore/apps/tableviewer/db/common.cpp | 40 | ||||
-rw-r--r-- | noncore/apps/tableviewer/main.cpp | 2 | ||||
-rw-r--r-- | noncore/apps/tableviewer/tableviewer.cpp | 116 | ||||
-rw-r--r-- | noncore/apps/tableviewer/tableviewer.h | 4 | ||||
-rw-r--r-- | noncore/apps/tableviewer/ui/commonwidgets.cpp | 3 | ||||
-rw-r--r-- | noncore/apps/tableviewer/ui/tvbrowseview.cpp | 12 |
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(); } |