kexi

kexitableviewdata.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2002   Lucijan Busch <lucijan@gmx.at>
00003    Copyright (C) 2003   Daniel Molkentin <molkentin@kde.org>
00004    Copyright (C) 2003-2006 Jaroslaw Staniek <js@iidea.pl>
00005 
00006    This program is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License as published by the Free Software Foundation; either
00009    version 2 of the License, or (at your option) any later version.
00010 
00011    This program is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Library General Public License for more details.
00015 
00016    You should have received a copy of the GNU Library General Public License
00017    along with this program; see the file COPYING.  If not, write to
00018    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019  * Boston, MA 02110-1301, USA.
00020  
00021    Original Author:  Till Busch <till@bux.at>
00022    Original Project: buX (www.bux.at)
00023 */
00024 
00025 #ifndef KEXITABLEVIEWDATA_H
00026 #define KEXITABLEVIEWDATA_H
00027 
00028 #include <qptrlist.h>
00029 #include <qvariant.h>
00030 #include <qvaluevector.h>
00031 #include <qstring.h>
00032 #include <qobject.h>
00033 
00034 #include "kexitableitem.h"
00035 
00036 #include <kexidb/error.h>
00037 
00038 namespace KexiDB {
00039 class Field;
00040 class QuerySchema;
00041 class RowEditBuffer;
00042 class Cursor;
00043 }
00044 
00045 namespace KexiUtils {
00046 class Validator;
00047 }
00048 class KexiTableViewData;
00049 
00050 
00052 class KEXIDATATABLE_EXPORT KexiTableViewColumn {
00053     public:
00054         typedef QPtrList<KexiTableViewColumn> List;
00055         typedef QPtrListIterator<KexiTableViewColumn> ListIterator;
00056 
00059         KexiTableViewColumn(KexiDB::Field& f, bool owner = false);
00060 
00065         KexiTableViewColumn(const QString& name, KexiDB::Field::Type ctype,
00066             uint cconst = KexiDB::Field::NoConstraints,
00067             uint options = KexiDB::Field::NoOptions,
00068             uint length=0, uint precision=0,
00069             QVariant defaultValue=QVariant(),
00070             const QString& caption = QString::null,
00071             const QString& description = QString::null,
00072             uint width = 0);
00073 
00075         KexiTableViewColumn(const QString& name, KexiDB::Field::Type ctype, const QString& caption,
00076             const QString& description = QString::null);
00077 
00079         KexiTableViewColumn(const KexiDB::QuerySchema &query, KexiDB::QueryColumnInfo& aColumnInfo,
00080             KexiDB::QueryColumnInfo* aVisibleLookupColumnInfo = 0);
00081 
00082         virtual ~KexiTableViewColumn();
00083 
00084         virtual bool acceptsFirstChar(const QChar& ch) const;
00085 
00089         inline bool isReadOnly() const { return m_readOnly; }
00090 
00091 //TODO: synchronize this with table view:
00093         inline void setReadOnly(bool ro) { m_readOnly=ro; }
00094 
00096         inline bool visible() const { return columnInfo ? columnInfo->visible : m_visible; }
00097 
00099         inline void setVisible(bool v) {
00100             if (columnInfo)
00101                 columnInfo->visible = v;
00102             m_visible=v; 
00103         }
00104 
00106         void setIcon(const QIconSet& icon) { m_icon = icon; }
00107 
00109         QIconSet icon() const { return m_icon; }
00110 
00113         void setHeaderTextVisible(bool visible) { m_headerTextVisible = visible; }
00114 
00117         bool isHeaderTextVisible() const { return m_headerTextVisible; }
00118 
00123         inline QString captionAliasOrName() const { return m_captionAliasOrName; }
00124 
00128         void setValidator( KexiUtils::Validator* v );
00129 
00131         inline KexiUtils::Validator* validator() const { return m_validator; }
00132 
00140         void setRelatedData(KexiTableViewData *data);
00141 
00145         inline KexiTableViewData *relatedData() const { return m_relatedData; }
00146 
00149         inline KexiDB::Field* field() const { return m_field; }
00150 
00154         void setRelatedDataEditable(bool set);
00155 
00159         inline bool relatedDataEditable() const { return m_relatedDataEditable; }
00160 
00163         KexiDB::QueryColumnInfo* columnInfo;
00164 
00170         KexiDB::QueryColumnInfo* visibleLookupColumnInfo;
00171 
00172         bool isDBAware : 1; 
00173 
00174 /*      QString caption;
00175         int type; //!< one of KexiDB::Field::Type
00176         uint width;
00177 */
00178 //      bool isNull() const;
00179         
00180 /*      virtual QString caption() const;
00181         virtual void setCaption(const QString& c);
00182     */  
00183     protected:
00185         KexiTableViewColumn(bool);
00186 
00187         void init();
00188 
00189         QString m_captionAliasOrName;
00190 
00191         QIconSet m_icon;
00192 
00193         KexiUtils::Validator* m_validator;
00194 
00196         KexiTableViewData* m_data;
00197 
00198         KexiTableViewData* m_relatedData;
00199         uint m_relatedDataPKeyID;
00200 
00201         KexiDB::Field* m_field;
00202 
00203         bool m_readOnly : 1;
00204         bool m_fieldOwned : 1;
00205         bool m_visible : 1;
00206         bool m_relatedDataEditable : 1;
00207         bool m_headerTextVisible : 1;
00208         
00209     friend class KexiTableViewData;
00210 };
00211 
00212 
00214 //typedef QValueVector<KexiTableViewColumn> KexiTableViewColumnList;
00215 
00216 typedef QPtrList<KexiTableItem> KexiTableViewDataBase;
00217 
00222 class KEXIDATATABLE_EXPORT KexiTableViewData : public QObject, protected KexiTableViewDataBase
00223 {
00224     Q_OBJECT
00225 
00226 public: 
00227     typedef QPtrListIterator<KexiTableItem> Iterator;
00228 
00230     KexiTableViewData();
00231 
00233     KexiTableViewData(KexiDB::Cursor *c);
00234 
00235 //TODO: make this more generic: allow to add more columns!
00244     KexiTableViewData(
00245         const QValueList<QVariant> &keys, const QValueList<QVariant> &values,
00246         KexiDB::Field::Type keyType = KexiDB::Field::Text, 
00247         KexiDB::Field::Type valueType = KexiDB::Field::Text);
00248 
00253     KexiTableViewData(KexiDB::Field::Type keyType, KexiDB::Field::Type valueType);
00254 
00255     virtual ~KexiTableViewData();
00256 //js    void setSorting(int key, bool order=true, short type=1);
00257 
00259 
00260     void preloadAllRows();
00261 
00263     void setSorting(int column, bool ascending=true);
00264 
00268     inline int sortedColumn() const { return m_sortedColumn; }
00269 
00273     inline int sortingOrder() const { return m_order; }
00274 
00277     void addColumn( KexiTableViewColumn* col );
00278 
00279     inline int globalColumnID(int visibleID) { return m_globalColumnsIDs.at( visibleID ); }
00280     inline int visibleColumnID(int globalID) { return m_visibleColumnsIDs.at( globalID ); }
00281 
00282     /*virtual?*/
00284     inline bool isDBAware() { return m_cursor; }
00285 
00288     QString dbTableName() const;
00289 
00290     inline KexiDB::Cursor* cursor() const { return m_cursor; }
00291 
00292     inline uint columnsCount() const { return columns.count(); }
00293 
00294     inline KexiTableViewColumn* column(uint c) { return columns.at(c); }
00295 
00297     KexiTableViewColumn::List columns;
00298 
00302     virtual bool isReadOnly() const;
00303 
00307     virtual void setReadOnly(bool set);
00308 
00310     virtual bool isInsertingEnabled() const { return m_insertingEnabled; }
00311 
00315     virtual void setInsertingEnabled(bool set);
00316 
00323     void clearRowEditBuffer();
00324 
00335     bool updateRowEditBufferRef(KexiTableItem *item, 
00336         int colnum, KexiTableViewColumn* col, QVariant& newval, bool allowSignals = true,
00337         QVariant *visibleValueForLookupField = 0);
00338 
00340     inline bool updateRowEditBuffer(KexiTableItem *item, int colnum, KexiTableViewColumn* col, 
00341         QVariant newval, bool allowSignals = true)
00342     {
00343         QVariant newv(newval);
00344         return updateRowEditBufferRef(item, colnum, col, newv, allowSignals);
00345     }
00346 
00349     inline bool updateRowEditBuffer(KexiTableItem *item, int colnum, 
00350         QVariant newval, bool allowSignals = true)
00351     {
00352         KexiTableViewColumn* col = columns.at(colnum);
00353         return col ? updateRowEditBufferRef(item, colnum, col, newval, allowSignals) : false;
00354     }
00355 
00356     inline KexiDB::RowEditBuffer* rowEditBuffer() const { return m_pRowEditBuffer; }
00357 
00359     inline KexiDB::ResultInfo* result() { return &m_result; }
00360 
00361     bool saveRowChanges(KexiTableItem& item, bool repaint = false);
00362 
00363     bool saveNewRow(KexiTableItem& item, bool repaint = false);
00364 
00365     bool deleteRow(KexiTableItem& item, bool repaint = false);
00366 
00369     void deleteRows( const QValueList<int> &rowsToDelete, bool repaint = false );
00370 
00381     virtual bool deleteAllRows(bool repaint = false);
00382 
00387     virtual void clearInternal();
00388 
00392     void insertRow(KexiTableItem& item, uint index, bool repaint = false);
00393 
00394 /*TODO: add this as well? 
00395     void insertRow(KexiTableItem& item, KexiTableItem& aboveItem); */
00396 
00400     int autoIncrementedColumn();
00401 
00403     void reload() { emit reloadRequested(); }
00404 
00405     inline KexiTableItem* at( uint index ) { return KexiTableViewDataBase::at(index); }
00406     inline virtual uint count() const { return KexiTableViewDataBase::count(); }
00407     inline bool isEmpty () const { return KexiTableViewDataBase::isEmpty(); }
00408     inline KexiTableItem* first() { return KexiTableViewDataBase::first(); }
00409     inline KexiTableItem* last() { return KexiTableViewDataBase::last(); }
00410     inline int findRef( const KexiTableItem* item ) { return KexiTableViewDataBase::findRef(item); }
00411     inline void sort() { KexiTableViewDataBase::sort(); }
00412     inline bool removeFirst() { return KexiTableViewDataBase::removeFirst(); }
00413     inline bool removeLast() { return KexiTableViewDataBase::removeLast(); }
00414     inline void append( const KexiTableItem* item ) { KexiTableViewDataBase::append(item); }
00415     inline void prepend( const KexiTableItem* item ) { KexiTableViewDataBase::prepend(item); }
00416     inline Iterator iterator() { return Iterator(*this); }
00417     inline Iterator* createIterator() { return new Iterator(*this); }
00418 
00425     inline bool containsROWIDInfo() const { return m_containsROWIDInfo; }
00426 
00427     inline KexiTableItem* createItem() const
00428     { return new KexiTableItem(m_itemSize); }
00429 
00430 public slots:
00432     void deleteLater();
00433 
00434 signals:
00435     void destroying();
00436 
00441     void aboutToChangeCell(KexiTableItem *item, int colnum, QVariant& newValue,
00442         KexiDB::ResultInfo* result);
00443 
00447     void aboutToInsertRow(KexiTableItem *item, KexiDB::ResultInfo* result, bool repaint);
00448 
00452     void aboutToUpdateRow(KexiTableItem *item, KexiDB::RowEditBuffer* buffer,
00453         KexiDB::ResultInfo* result);
00454 
00455     void rowUpdated(KexiTableItem*); 
00456 
00457     void rowInserted(KexiTableItem*, bool repaint); 
00458 
00460     void rowInserted(KexiTableItem*, uint index, bool repaint);
00461 
00465     void aboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result, bool repaint);
00466 
00468     void rowDeleted(); 
00469 
00471     void rowsDeleted( const QValueList<int> &rowsToDelete );
00472 
00474     void reloadRequested();
00475 
00476     void rowRepaintRequested(KexiTableItem&);
00477 
00478 protected:
00479     void init();
00480     void init(
00481         const QValueList<QVariant> &keys, const QValueList<QVariant> &values,
00482         KexiDB::Field::Type keyType, KexiDB::Field::Type valueType);
00483 
00484     virtual int compareItems(Item item1, Item item2);
00485     int cmpStr(Item item1, Item item2);
00486     int cmpInt(Item item1, Item item2);
00487     int cmpUInt(Item item1, Item item2);
00488     int cmpLongLong(Item item1, Item item2);
00489     int cmpULongLong(Item item1, Item item2);
00490     int cmpDouble(Item item1, Item item2);
00491     int cmpDate(Item item1, Item item2);
00492     int cmpDateTime(Item item1, Item item2);
00493     int cmpTime(Item item1, Item item2);
00494 
00496     int cmpBLOB(Item item1, Item item2);
00497 
00499     bool saveRow(KexiTableItem& item, bool insert, bool repaint);
00500 
00503     int m_sortedColumn;
00505     int m_realSortedColumn;
00506     short m_order;
00507     short m_type;
00508     int m_itemSize;
00509     static unsigned short charTable[];
00510     KexiDB::RowEditBuffer *m_pRowEditBuffer;
00511     QGuardedPtr<KexiDB::Cursor> m_cursor;
00512 
00514 //  QDict<KexiTableViewColumn> *m_simpleColumnsByName;
00515 
00516     KexiDB::ResultInfo m_result;
00517 
00518     uint m_visibleColumnsCount;
00519     QValueVector<int> m_visibleColumnsIDs, m_globalColumnsIDs;
00520 
00521     bool m_readOnly : 1;
00522     bool m_insertingEnabled : 1;
00523 
00526     bool m_inside_acceptEditor : 1;
00527 
00529     bool m_containsROWIDInfo : 1;
00530 
00531     int m_autoIncrementedColumn;
00532 
00533     int (KexiTableViewData::*cmpFunc)(void *, void *);
00534 
00537     QVariant m_leftTmp, m_rightTmp;
00538 };
00539 
00540 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys