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 #ifndef KEXIDATAAWAREOBJECTINTERFACE_H
00027 #define KEXIDATAAWAREOBJECTINTERFACE_H
00028
00029 #include <qguardedptr.h>
00030
00031 #include <qtimer.h>
00032 #include <kdebug.h>
00033 #include <widget/utils/kexiarrowtip.h>
00034 #include "kexitableviewdata.h"
00035
00036 class QObject;
00037 class QScrollBar;
00038 class KPopupMenu;
00039 class KexiTableItem;
00040 class KexiTableViewData;
00041 class KexiRecordMarker;
00042 class KexiTableViewHeader;
00043 class KexiRecordNavigator;
00044 #include <kexidataiteminterface.h>
00045
00046 namespace KexiDB {
00047 class RowEditBuffer;
00048 }
00049
00051 #define KEXI_DEFAULT_DATA_COLUMN_WIDTH 120
00052
00054
00067 class KEXIDATATABLE_EXPORT KexiDataAwareObjectInterface
00068 {
00069 public:
00070 KexiDataAwareObjectInterface();
00071 virtual ~KexiDataAwareObjectInterface();
00072
00079 void setData( KexiTableViewData *data, bool owner = true );
00080
00082 inline KexiTableViewData *data() const { return m_data; }
00083
00085 inline int currentColumn() const { return m_curCol; }
00086
00088 inline int currentRow() const { return m_curRow; }
00089
00093 virtual int lastVisibleRow() const = 0;
00094
00096 KexiTableItem *selectedItem() const { return m_currentItem; }
00097
00099 int rows() const;
00100
00106 virtual int columns() const { return dataColumns(); }
00107
00110 int dataColumns() const;
00111
00115 virtual bool isReadOnly() const;
00116
00130 void setReadOnly(bool set);
00131
00133 inline bool isSortingEnabled() const { return m_isSortingEnabled; }
00134
00137 virtual void setSorting(int col, bool ascending=true);
00138
00144 virtual void setSortingEnabled(bool set);
00145
00149 int dataSortedColumn() const;
00150
00156 int dataSortingOrder() const;
00157
00162 virtual bool sort();
00163
00166 void sortAscending();
00167
00170 void sortDescending();
00171
00173 virtual bool isInsertingEnabled() const;
00174
00187 void setInsertingEnabled(bool set);
00188
00191 bool isDeleteEnabled() const;
00192
00197 bool isEmptyRowInsertingEnabled() const { return m_emptyRowInsertingEnabled; }
00198
00201 void setEmptyRowInsertingEnabled(bool set);
00202
00204 virtual void setFilteringEnabled(bool set);
00205
00207 inline bool isFilteringEnabled() const { return m_isFilteringEnabled; }
00208
00215 virtual void setSpreadSheetMode();
00216
00218 bool spreadSheetMode() const { return m_spreadSheetMode; }
00219
00221 inline bool rowEditing() const { return m_rowEditing; }
00222
00223 enum DeletionPolicy
00224 {
00225 NoDelete = 0,
00226 AskDelete = 1,
00227 ImmediateDelete = 2,
00228 SignalDelete = 3
00229 };
00230
00233 DeletionPolicy deletionPolicy() const { return m_deletionPolicy; }
00234
00235 virtual void setDeletionPolicy(DeletionPolicy policy);
00236
00240 virtual void deleteCurrentRow();
00241
00250 virtual KexiTableItem *insertEmptyRow(int row = -1);
00251
00254 virtual bool beforeDeleteItem(KexiTableItem *item);
00255
00259 bool deleteItem(KexiTableItem *item);
00260
00262 void insertItem(KexiTableItem *newItem, int row = -1);
00263
00276 tristate deleteAllRows(bool ask = false, bool repaint = true);
00277
00280 virtual int rowsPerPage() const = 0;
00281
00282 virtual void selectRow(int row);
00283 virtual void selectNextRow();
00284 virtual void selectPrevRow();
00285 virtual void selectNextPage();
00286 virtual void selectPrevPage();
00287 virtual void selectFirstRow();
00288 virtual void selectLastRow();
00289 virtual void addNewRecordRequested();
00290
00293 virtual void clearSelection();
00294
00298 virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
00299
00303 virtual void ensureCellVisible(int row, int col) = 0;
00304
00308 virtual void setAcceptsRowEditAfterCellAccepting(bool set);
00309
00319 bool acceptsRowEditAfterCellAccepting() const { return m_acceptsRowEditAfterCellAccepting; }
00320
00322 bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
00323
00330 virtual void setDropsAtRowEnabled(bool set);
00331
00333 inline KexiDataItemInterface *editor() const { return m_editor; }
00334
00338 virtual bool cancelRowEdit();
00339
00344 virtual bool acceptRowEdit();
00345
00346 virtual void removeEditor();
00347
00351 virtual bool cancelEditor();
00352
00355 virtual bool acceptEditor();
00356
00358 virtual void createEditor(int row, int col, const QString& addText = QString::null,
00359 bool removeOld = false) = 0;
00360
00367 virtual void startEditCurrentCell(const QString& setText = QString::null);
00368
00371 virtual void deleteAndStartEditCurrentCell();
00372
00373 inline KexiTableItem *itemAt(int row) const;
00374
00380 virtual KexiTableViewColumn* column(int col);
00381
00384 virtual int fieldNumberForColumn(int col) { return col; }
00385
00386 bool hasDefaultValueAt(const KexiTableViewColumn& tvcol);
00387
00388 const QVariant* bufferedValueAt(int col, bool useDefaultValueIfPossible = true);
00389
00391 int columnType(int col);
00392
00394 QVariant columnDefaultValue(int col) const;
00395
00401 virtual bool columnEditable(int col);
00402
00404 virtual void updateCurrentCell() = 0;
00405
00406 inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
00407
00409 virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
00410 virtual void itemChanged(KexiTableItem *, int row, int col, QVariant oldValue) = 0;
00411 virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
00412 virtual void currentItemDeleteRequest() = 0;
00414 virtual void newItemAppendedForAfterDeletingInSpreadSheetMode() = 0;
00415
00417 virtual void dataRefreshed() = 0;
00418 virtual void dataSet( KexiTableViewData *data ) = 0;
00419
00421 KPopupMenu* contextMenu() const { return m_popupMenu; }
00422
00425 bool contextMenuEnabled() const { return m_contextMenuEnabled; }
00426
00428 void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
00429
00431 bool scrollbarToolTipsEnabled() const;
00432
00434 void setScrollbarToolTipsEnabled(bool set);
00435
00439 void startEditOrToggleValue();
00440
00442 inline bool newRowEditing() const { return m_newRowEditing; }
00443
00446 virtual void boolToggled();
00447
00448 virtual void connectCellSelectedSignal(const QObject* receiver,
00449 const char* intIntMember) = 0;
00450
00451 virtual void connectRowEditStartedSignal(const QObject* receiver,
00452 const char* intMember) = 0;
00453
00454 virtual void connectRowEditTerminatedSignal(const QObject* receiver,
00455 const char* voidMember) = 0;
00456
00457 virtual void connectReloadActionsSignal(const QObject* receiver,
00458 const char* voidMember) = 0;
00459
00460 virtual void connectDataSetSignal(const QObject* receiver,
00461 const char* kexiTableViewDataMember) = 0;
00462
00463 virtual void connectToReloadDataSlot(const QObject* sender,
00464 const char* voidSignal) = 0;
00465
00466 virtual void slotDataDestroying();
00467
00469 virtual void copySelection() = 0;
00470
00472 virtual void cutSelection() = 0;
00473
00475 virtual void paste() = 0;
00476
00478 virtual QScrollBar* verticalScrollBar() const = 0;
00479
00497 virtual bool handleKeyPress(QKeyEvent *e, int &curRow, int &curCol, bool fullRowSelection,
00498 bool *moveToFirstField = 0, bool *moveToLastField = 0);
00499
00500 protected:
00508 virtual void initDataContents();
00509
00512 virtual void clearColumns(bool repaint = true);
00513
00516 virtual void clearColumnsInternal(bool repaint) = 0;
00517
00521 virtual void addHeaderColumn(const QString& caption, const QString& description,
00522 const QIconSet& icon, int size) = 0;
00523
00529 virtual int currentLocalSortingOrder() const = 0;
00530
00538 virtual int currentLocalSortColumn() const = 0;
00539
00545 virtual void setLocalSortingOrder(int col, int order) = 0;
00546
00549 virtual void sortColumnInternal(int col, int order = 0);
00550
00557 virtual void updateGUIAfterSorting() = 0;
00558
00562 virtual void reloadActions() = 0;
00563
00565 virtual void reloadData();
00566
00568 virtual void itemSelected(KexiTableItem *) = 0;
00569
00571 virtual void cellSelected(int col, int row) = 0;
00572
00574 virtual void sortedColumnChanged(int col) = 0;
00575
00577 virtual void rowEditTerminated(int row) = 0;
00578
00581 virtual void clearVariables();
00582
00589 virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
00590
00593 virtual void editorShowFocus( int row, int col ) = 0;
00594
00596 virtual void updateCell(int row, int col) = 0;
00597
00599 virtual void updateRow(int row) = 0;
00600
00602 virtual void updateWidgetContents() = 0;
00603
00605 virtual void updateWidgetContentsSize() = 0;
00606
00609 virtual void updateWidgetScrollBars() = 0;
00610
00615 virtual void updateAfterCancelRowEdit();
00616
00621 virtual void updateAfterAcceptRowEdit();
00622
00624 virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
00625
00627 virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result,
00628 bool repaint);
00629
00631 virtual void slotRowDeleted();
00632
00634 virtual void slotRowInserted(KexiTableItem *item, bool repaint);
00635
00637 virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
00638
00639 virtual void slotRowsDeleted( const QValueList<int> & ) {}
00640
00642 inline bool hasData() const;
00643
00646 virtual void selectCellInternal() {}
00647
00651 virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
00652
00654 virtual void focusOutEvent(QFocusEvent* e);
00655
00659 virtual void vScrollBarValueChanged(int v);
00660
00662 virtual void vScrollBarSliderReleased();
00663
00667 virtual void scrollBarTipTimeout();
00668
00673 int showErrorMessageForResult(KexiDB::ResultInfo* resultInfo);
00674
00676 KexiTableViewData *m_data;
00677
00679 bool m_owner : 1;
00680
00682 int m_curRow, m_curCol;
00683
00685 KexiTableItem *m_currentItem;
00686
00688 KexiTableViewData::Iterator *m_itemIterator;
00689
00691 KexiTableItem *m_insertItem;
00692
00694
00695
00697 bool m_rowEditing : 1;
00698
00700 bool m_newRowEditing : 1;
00701
00703 bool m_isSortingEnabled : 1;
00704
00706 bool m_isFilteringEnabled : 1;
00707
00711 bool m_acceptsRowEditAfterCellAccepting : 1;
00712
00715 bool m_inside_acceptEditor : 1;
00716
00720 bool m_internal_acceptsRowEditAfterCellAccepting : 1;
00721
00723 bool m_emptyRowInsertingEnabled : 1;
00724
00729 int m_readOnly;
00730
00732
00734 bool m_contentsMousePressEvent_dblClick : 1;
00735
00737 int m_insertingEnabled;
00738
00740 bool m_initDataContentsOnShow : 1;
00741
00745 bool m_cursorPositionSetExplicityBeforeShow : 1;
00746
00749 bool m_spreadSheetMode : 1;
00750
00752 bool m_dropsAtRowEnabled : 1;
00753
00756 bool m_updateEntireRowWhenMovingToOtherRow : 1;
00757
00758 DeletionPolicy m_deletionPolicy;
00759
00761 KexiRecordMarker *m_verticalHeader;
00762
00764 KexiTableViewHeader *m_horizontalHeader;
00765
00766 KexiDataItemInterface *m_editor;
00767
00768
00770 KexiRecordNavigator *m_navPanel;
00771
00772 bool m_navPanelEnabled : 1;
00773
00777 bool m_verticalHeaderAlreadyAdded : 1;
00778
00782 int m_dragIndicatorLine;
00783
00785 KPopupMenu *m_popupMenu;
00786
00787 bool m_contextMenuEnabled : 1;
00788
00790 bool m_alsoUpdateNextRow : 1;
00791
00797 int m_rowWillBeDeleted;
00798
00800 QGuardedPtr<KexiArrowTip> m_errorMessagePopup;
00801
00804 bool m_vScrollBarValueChanged_enabled : 1;
00805
00807 bool m_scrollbarToolTipsEnabled : 1;
00808
00809 QLabel* m_scrollBarTip;
00810 QTimer m_scrollBarTipTimer;
00811 uint m_scrollBarTipTimerCnt;
00812 };
00813
00814 inline bool KexiDataAwareObjectInterface::hasData() const
00815 {
00816 if (!m_data)
00817 kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
00818 return m_data!=0;
00819 }
00820
00821 inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
00822 {
00823 KexiTableItem *item = m_data->at(row);
00824 if (!item)
00825 kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
00826 else {
00827
00828
00829
00830
00831 }
00832 return item;
00833 }
00834
00836 #define KEXI_DATAAWAREOBJECTINTERFACE \
00837 public: \
00838 void connectCellSelectedSignal(const QObject* receiver, const char* intIntMember) { \
00839 connect(this, SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
00840 } \
00841 void connectRowEditStartedSignal(const QObject* receiver, const char* intMember) { \
00842 connect(this, SIGNAL(rowEditStarted(int)), receiver, intMember); \
00843 } \
00844 void connectRowEditTerminatedSignal(const QObject* receiver, const char* voidMember) { \
00845 connect(this, SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
00846 } \
00847 void connectReloadActionsSignal(const QObject* receiver, const char* voidMember) { \
00848 connect(this, SIGNAL(reloadActions()), receiver, voidMember); \
00849 } \
00850 void connectDataSetSignal(const QObject* receiver, \
00851 const char* kexiTableViewDataMember) { \
00852 connect(this, SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
00853 } \
00854 void connectToReloadDataSlot(const QObject* sender, const char* voidSignal) { \
00855 connect(sender, voidSignal, this, SLOT(reloadData())); \
00856 }
00857
00858 #endif