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
00026
00027 #ifndef KEXIDATAAWAREOBJECTINTERFACE_H
00028 #define KEXIDATAAWAREOBJECTINTERFACE_H
00029
00030 #include <qguardedptr.h>
00031 #include <qlabel.h>
00032
00033 #include <kdebug.h>
00034 #include "kexitableviewdata.h"
00035
00036 class QObject;
00037 class KPopupMenu;
00038 class KexiTableItem;
00039 class KexiTableViewData;
00040 class KexiRecordMarker;
00041 class KexiRecordNavigator;
00042 #include <kexidataiteminterface.h>
00043
00044 namespace KexiDB {
00045 class RowEditBuffer;
00046 }
00047
00049 #define KEXI_DEFAULT_DATA_COLUMN_WIDTH 120
00050
00052
00065 class KEXIDATATABLE_EXPORT KexiDataAwareObjectInterface
00066 {
00067 public:
00068 KexiDataAwareObjectInterface();
00069 virtual ~KexiDataAwareObjectInterface();
00070
00077 void setData( KexiTableViewData *data, bool owner = true );
00078
00080 inline KexiTableViewData *data() const { return m_data; }
00081
00083 inline int currentColumn() const { return m_curCol; }
00084
00086 inline int currentRow() const { return m_curRow; }
00087
00089 KexiTableItem *selectedItem() const { return m_currentItem; }
00090
00092 int rows() const;
00093
00099 virtual int columns() const { return dataColumns(); }
00100
00103 int dataColumns() const;
00104
00108 virtual bool isReadOnly() const;
00109
00123 void setReadOnly(bool set);
00124
00126 inline bool isSortingEnabled() const { return m_isSortingEnabled; }
00127
00130 virtual void setSorting(int col, bool ascending=true);
00131
00137 virtual void setSortingEnabled(bool set);
00138
00142 int dataSortedColumn() const;
00143
00149 int dataSortingOrder() const;
00150
00155 virtual bool sort();
00156
00159 void sortAscending();
00160
00163 void sortDescending();
00164
00166 virtual bool isInsertingEnabled() const;
00167
00180 void setInsertingEnabled(bool set);
00181
00184 bool isDeleteEnabled() const;
00185
00190 bool isEmptyRowInsertingEnabled() const { return m_emptyRowInsertingEnabled; }
00191
00194 void setEmptyRowInsertingEnabled(bool set);
00195
00197 virtual void setFilteringEnabled(bool set);
00198
00200 inline bool isFilteringEnabled() const { return m_isFilteringEnabled; }
00201
00208 virtual void setSpreadSheetMode();
00209
00211 bool spreadSheetMode() const { return m_spreadSheetMode; }
00212
00214 inline bool rowEditing() const { return m_rowEditing; }
00215
00216 enum DeletionPolicy
00217 {
00218 NoDelete = 0,
00219 AskDelete = 1,
00220 ImmediateDelete = 2,
00221 SignalDelete = 3
00222 };
00223
00226 DeletionPolicy deletionPolicy() const { return m_deletionPolicy; }
00227
00228 virtual void setDeletionPolicy(DeletionPolicy policy);
00229
00233 void deleteCurrentRow();
00234
00243 KexiTableItem *insertEmptyRow(int row = -1);
00244
00247 virtual bool beforeDeleteItem(KexiTableItem *item);
00248
00252 bool deleteItem(KexiTableItem *item);
00253
00255 void insertItem(KexiTableItem *newItem, int row = -1);
00256
00269 tristate deleteAllRows(bool ask = false, bool repaint = true);
00270
00273 virtual int rowsPerPage() const = 0;
00274
00275 virtual void selectRow(int row);
00276 virtual void selectNextRow();
00277 virtual void selectPrevRow();
00278 virtual void selectNextPage();
00279 virtual void selectPrevPage();
00280 virtual void selectFirstRow();
00281 virtual void selectLastRow();
00282
00285 virtual void clearSelection();
00286
00290 virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
00291
00295 virtual void ensureCellVisible(int row, int col) = 0;
00296
00300 void setAcceptsRowEditAfterCellAccepting(bool set);
00301
00311 bool acceptsRowEditAfterCellAccepting() const { return m_acceptsRowEditAfterCellAccepting; }
00312
00314 bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
00315
00322 void setDropsAtRowEnabled(bool set);
00323
00325 inline KexiDataItemInterface *editor() const { return m_editor; }
00326
00329 virtual void cancelRowEdit();
00330
00335 virtual bool acceptRowEdit();
00336
00337 virtual void removeEditor();
00338 virtual void cancelEditor();
00339 virtual bool acceptEditor();
00340
00342 virtual void createEditor(int row, int col, const QString& addText = QString::null,
00343 bool removeOld = false) = 0;
00344
00350 virtual void startEditCurrentCell(const QString& setText = QString::null);
00351
00354 virtual void deleteAndStartEditCurrentCell();
00355
00356 inline KexiTableItem *itemAt(int row) const;
00357
00363 virtual KexiTableViewColumn* column(int col);
00364
00367 virtual int fieldNumberForColumn(int col) { return col; }
00368
00369 const QVariant* bufferedValueAt(int col);
00370
00372 int columnType(int col);
00373
00375 QVariant columnDefaultValue(int col) const;
00376
00382 virtual bool columnEditable(int col);
00383
00384 inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
00385
00387 virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
00388 virtual void itemChanged(KexiTableItem *, int row, int col, QVariant oldValue) = 0;
00389 virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
00390 virtual void currentItemDeleteRequest() = 0;
00391
00393 virtual void dataRefreshed() = 0;
00394 virtual void dataSet( KexiTableViewData *data ) = 0;
00395
00396 KPopupMenu* contextMenu() const { return m_popup; }
00397
00400 bool contextMenuEnabled() const { return m_contextMenuEnabled; }
00401
00403 void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
00404
00408 void startEditOrToggleValue();
00409
00412 virtual void boolToggled();
00413
00414 virtual void connectCellSelectedSignal(const QObject* receiver,
00415 const char* intIntMember) = 0;
00416
00417 virtual void connectRowEditStartedSignal(const QObject* receiver,
00418 const char* intMember) = 0;
00419
00420 virtual void connectRowEditTerminatedSignal(const QObject* receiver,
00421 const char* voidMember) = 0;
00422
00423 virtual void connectReloadActionsSignal(const QObject* receiver,
00424 const char* voidMember) = 0;
00425
00426 virtual void connectDataSetSignal(const QObject* receiver,
00427 const char* kexiTableViewDataMember) = 0;
00428
00429 virtual void connectToReloadDataSlot(const QObject* sender,
00430 const char* voidSignal) = 0;
00431
00432 virtual void slotDataDestroying();
00433
00434 protected:
00442 virtual void initDataContents();
00443
00446 virtual void clearColumns(bool repaint = true);
00447
00450 virtual void clearColumnsInternal(bool repaint) = 0;
00451
00455 virtual void addHeaderColumn(const QString& caption, const QString& description, int width) = 0;
00456
00462 virtual int currentLocalSortingOrder() const = 0;
00463
00471 virtual int currentLocalSortColumn() const = 0;
00472
00478 virtual void setLocalSortingOrder(int col, int order) = 0;
00479
00482 virtual void sortColumnInternal(int col, int order = 0);
00483
00490 virtual void updateGUIAfterSorting() = 0;
00491
00495 virtual void reloadActions() = 0;
00496
00498 virtual void reloadData();
00499
00501 virtual void itemSelected(KexiTableItem *) = 0;
00502
00504 virtual void cellSelected(int col, int row) = 0;
00505
00507 virtual void sortedColumnChanged(int col) = 0;
00508
00510 virtual void rowEditTerminated(int row) = 0;
00511
00514 virtual void clearVariables();
00515
00522 virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
00523
00526 virtual void editorShowFocus( int row, int col ) = 0;
00527
00529 virtual void updateCell(int row, int col) = 0;
00530
00532 virtual void updateRow(int row) = 0;
00533
00535 virtual void updateWidgetContents() = 0;
00536
00538 virtual void updateWidgetContentsSize() = 0;
00539
00542 virtual void updateWidgetScrollBars() = 0;
00543
00548 virtual void updateAfterCancelRowEdit();
00549
00554 virtual void updateAfterAcceptRowEdit();
00555
00557 virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
00558
00560 virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result,
00561 bool repaint);
00562
00564 virtual void slotRowDeleted();
00565
00567 virtual void slotRowInserted(KexiTableItem *item, bool repaint);
00568
00570 virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
00571
00572 virtual void slotRowsDeleted( const QValueList<int> & ) {}
00573
00575 inline bool hasData() const;
00576
00579 virtual void selectCellInternal() {}
00580
00584 virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
00585
00586 virtual void addNewRecordRequested();
00587
00589 KexiTableViewData *m_data;
00590
00592 bool m_owner : 1;
00593
00595 int m_curRow, m_curCol;
00596
00598 KexiTableItem *m_currentItem;
00599
00601 KexiTableViewData::Iterator *m_itemIterator;
00602
00604 KexiTableItem *m_insertItem;
00605
00607 KexiDB::RowEditBuffer *m_rowEditBuffer;
00608
00610 bool m_rowEditing : 1;
00611
00614 bool m_newRowEditing : 1;
00615
00617 bool m_isSortingEnabled : 1;
00618
00620 bool m_isFilteringEnabled : 1;
00621
00625 bool m_acceptsRowEditAfterCellAccepting : 1;
00626
00629 bool m_inside_acceptEditor : 1;
00630
00634 bool m_internal_acceptsRowEditAfterCellAccepting : 1;
00635
00637 bool m_emptyRowInsertingEnabled : 1;
00638
00643 int m_readOnly;
00644
00646
00648 bool m_contentsMousePressEvent_dblClick : 1;
00649
00651 int m_insertingEnabled;
00652
00654 bool m_initDataContentsOnShow : 1;
00655
00659 bool m_cursorPositionSetExplicityBeforeShow : 1;
00660
00663 bool m_spreadSheetMode : 1;
00664
00666 bool m_dropsAtRowEnabled : 1;
00667
00670 bool m_updateEntireRowWhenMovingToOtherRow : 1;
00671
00672 DeletionPolicy m_deletionPolicy;
00673
00675 KexiRecordMarker *m_verticalHeader;
00676
00677 KexiDataItemInterface *m_editor;
00678
00679
00681 KexiRecordNavigator *m_navPanel;
00682
00683 bool m_navPanelEnabled : 1;
00684
00688 bool m_verticalHeaderAlreadyAdded : 1;
00689
00693 int m_dragIndicatorLine;
00694
00696 KPopupMenu *m_popup;
00697
00698 bool m_contextMenuEnabled : 1;
00699
00701 bool m_alsoUpdateNextRow : 1;
00702
00708 int m_rowWillBeDeleted;
00709
00711 QGuardedPtr<QLabel> m_errorMessagePopup;
00712 };
00713
00714 inline bool KexiDataAwareObjectInterface::hasData() const
00715 {
00716 if (!m_data)
00717 kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
00718 return m_data!=0;
00719 }
00720
00721 inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
00722 {
00723 KexiTableItem *item = m_data->at(row);
00724 if (!item)
00725 kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
00726 else {
00727
00728
00729
00730
00731 }
00732 return item;
00733 }
00734
00736 #define KEXI_DATAAWAREOBJECTINTERFACE \
00737 public: \
00738 void connectCellSelectedSignal(const QObject* receiver, const char* intIntMember) { \
00739 connect(this, SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
00740 } \
00741 \
00742 void connectRowEditStartedSignal(const QObject* receiver, const char* intMember) { \
00743 connect(this, SIGNAL(rowEditStarted(int)), receiver, intMember); \
00744 } \
00745 \
00746 void connectRowEditTerminatedSignal(const QObject* receiver, const char* voidMember) { \
00747 connect(this, SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
00748 } \
00749 \
00750 void connectReloadActionsSignal(const QObject* receiver, const char* voidMember) { \
00751 connect(this, SIGNAL(reloadActions()), receiver, voidMember); \
00752 } \
00753 \
00754 void connectDataSetSignal(const QObject* receiver, \
00755 const char* kexiTableViewDataMember) { \
00756 connect(this, SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
00757 } \
00758 \
00759 void connectToReloadDataSlot(const QObject* sender, const char* voidSignal) { \
00760 connect(sender, voidSignal, this, SLOT(reloadData())); \
00761 }
00762
00763 #endif