00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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 bool isReadOnly() const;
00090
00091
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
00175
00176
00177
00178
00179
00180
00181
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
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
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
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
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
00395
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
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