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
00292 virtual void clearSelection();
00293
00297 virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
00298
00302 virtual void ensureCellVisible(int row, int col) = 0;
00303
00307 virtual void setAcceptsRowEditAfterCellAccepting(bool set);
00308
00318 bool acceptsRowEditAfterCellAccepting() const { return m_acceptsRowEditAfterCellAccepting; }
00319
00321 bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
00322
00329 virtual void setDropsAtRowEnabled(bool set);
00330
00332 inline KexiDataItemInterface *editor() const { return m_editor; }
00333
00337 virtual bool cancelRowEdit();
00338
00343 virtual bool acceptRowEdit();
00344
00345 virtual void removeEditor();
00346
00350 virtual bool cancelEditor();
00351
00354 virtual bool acceptEditor();
00355
00357 virtual void createEditor(int row, int col, const QString& addText = QString::null,
00358 bool removeOld = false) = 0;
00359
00366 virtual void startEditCurrentCell(const QString& setText = QString::null);
00367
00370 virtual void deleteAndStartEditCurrentCell();
00371
00372 inline KexiTableItem *itemAt(int row) const;
00373
00379 virtual KexiTableViewColumn* column(int col);
00380
00383 virtual int fieldNumberForColumn(int col) { return col; }
00384
00385 bool hasDefaultValueAt(const KexiTableViewColumn& tvcol);
00386
00387 const QVariant* bufferedValueAt(int col, bool useDefaultValueIfPossible = true);
00388
00390 int columnType(int col);
00391
00393 QVariant columnDefaultValue(int col) const;
00394
00400 virtual bool columnEditable(int col);
00401
00403 virtual void updateCurrentCell() = 0;
00404
00405 inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
00406
00408 virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
00409 virtual void itemChanged(KexiTableItem *, int row, int col, QVariant oldValue) = 0;
00410 virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
00411 virtual void currentItemDeleteRequest() = 0;
00413 virtual void newItemAppendedForAfterDeletingInSpreadSheetMode() = 0;
00414
00416 virtual void dataRefreshed() = 0;
00417 virtual void dataSet( KexiTableViewData *data ) = 0;
00418
00420 KPopupMenu* contextMenu() const { return m_popupMenu; }
00421
00424 bool contextMenuEnabled() const { return m_contextMenuEnabled; }
00425
00427 void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
00428
00430 bool scrollbarToolTipsEnabled() const;
00431
00433 void setScrollbarToolTipsEnabled(bool set);
00434
00438 void startEditOrToggleValue();
00439
00441 inline bool newRowEditing() const { return m_newRowEditing; }
00442
00445 virtual void boolToggled();
00446
00447 virtual void connectCellSelectedSignal(const QObject* receiver,
00448 const char* intIntMember) = 0;
00449
00450 virtual void connectRowEditStartedSignal(const QObject* receiver,
00451 const char* intMember) = 0;
00452
00453 virtual void connectRowEditTerminatedSignal(const QObject* receiver,
00454 const char* voidMember) = 0;
00455
00456 virtual void connectReloadActionsSignal(const QObject* receiver,
00457 const char* voidMember) = 0;
00458
00459 virtual void connectDataSetSignal(const QObject* receiver,
00460 const char* kexiTableViewDataMember) = 0;
00461
00462 virtual void connectToReloadDataSlot(const QObject* sender,
00463 const char* voidSignal) = 0;
00464
00465 virtual void slotDataDestroying();
00466
00468 virtual void copySelection() = 0;
00469
00471 virtual void cutSelection() = 0;
00472
00474 virtual void paste() = 0;
00475
00477 virtual QScrollBar* verticalScrollBar() const = 0;
00478
00496 virtual bool handleKeyPress(QKeyEvent *e, int &curRow, int &curCol, bool fullRowSelection,
00497 bool *moveToFirstField = 0, bool *moveToLastField = 0);
00498
00499 protected:
00507 virtual void initDataContents();
00508
00511 virtual void clearColumns(bool repaint = true);
00512
00515 virtual void clearColumnsInternal(bool repaint) = 0;
00516
00520 virtual void addHeaderColumn(const QString& caption, const QString& description,
00521 const QIconSet& icon, int size) = 0;
00522
00528 virtual int currentLocalSortingOrder() const = 0;
00529
00537 virtual int currentLocalSortColumn() const = 0;
00538
00544 virtual void setLocalSortingOrder(int col, int order) = 0;
00545
00548 virtual void sortColumnInternal(int col, int order = 0);
00549
00556 virtual void updateGUIAfterSorting() = 0;
00557
00561 virtual void reloadActions() = 0;
00562
00564 virtual void reloadData();
00565
00567 virtual void itemSelected(KexiTableItem *) = 0;
00568
00570 virtual void cellSelected(int col, int row) = 0;
00571
00573 virtual void sortedColumnChanged(int col) = 0;
00574
00576 virtual void rowEditTerminated(int row) = 0;
00577
00580 virtual void clearVariables();
00581
00588 virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
00589
00592 virtual void editorShowFocus( int row, int col ) = 0;
00593
00595 virtual void updateCell(int row, int col) = 0;
00596
00598 virtual void updateRow(int row) = 0;
00599
00601 virtual void updateWidgetContents() = 0;
00602
00604 virtual void updateWidgetContentsSize() = 0;
00605
00608 virtual void updateWidgetScrollBars() = 0;
00609
00614 virtual void updateAfterCancelRowEdit();
00615
00620 virtual void updateAfterAcceptRowEdit();
00621
00623 virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
00624
00626 virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result,
00627 bool repaint);
00628
00630 virtual void slotRowDeleted();
00631
00633 virtual void slotRowInserted(KexiTableItem *item, bool repaint);
00634
00636 virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
00637
00638 virtual void slotRowsDeleted( const QValueList<int> & ) {}
00639
00641 inline bool hasData() const;
00642
00645 virtual void selectCellInternal() {}
00646
00650 virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
00651
00652 virtual void addNewRecordRequested();
00653
00655 virtual void focusOutEvent(QFocusEvent* e);
00656
00660 virtual void vScrollBarValueChanged(int v);
00661
00663 virtual void vScrollBarSliderReleased();
00664
00668 virtual void scrollBarTipTimeout();
00669
00674 int showErrorMessageForResult(KexiDB::ResultInfo* resultInfo);
00675
00677 KexiTableViewData *m_data;
00678
00680 bool m_owner : 1;
00681
00683 int m_curRow, m_curCol;
00684
00686 KexiTableItem *m_currentItem;
00687
00689 KexiTableViewData::Iterator *m_itemIterator;
00690
00692 KexiTableItem *m_insertItem;
00693
00695
00696
00698 bool m_rowEditing : 1;
00699
00701 bool m_newRowEditing : 1;
00702
00704 bool m_isSortingEnabled : 1;
00705
00707 bool m_isFilteringEnabled : 1;
00708
00712 bool m_acceptsRowEditAfterCellAccepting : 1;
00713
00716 bool m_inside_acceptEditor : 1;
00717
00721 bool m_internal_acceptsRowEditAfterCellAccepting : 1;
00722
00724 bool m_emptyRowInsertingEnabled : 1;
00725
00730 int m_readOnly;
00731
00733
00735 bool m_contentsMousePressEvent_dblClick : 1;
00736
00738 int m_insertingEnabled;
00739
00741 bool m_initDataContentsOnShow : 1;
00742
00746 bool m_cursorPositionSetExplicityBeforeShow : 1;
00747
00750 bool m_spreadSheetMode : 1;
00751
00753 bool m_dropsAtRowEnabled : 1;
00754
00757 bool m_updateEntireRowWhenMovingToOtherRow : 1;
00758
00759 DeletionPolicy m_deletionPolicy;
00760
00762 KexiRecordMarker *m_verticalHeader;
00763
00765 KexiTableViewHeader *m_horizontalHeader;
00766
00767 KexiDataItemInterface *m_editor;
00768
00769
00771 KexiRecordNavigator *m_navPanel;
00772
00773 bool m_navPanelEnabled : 1;
00774
00778 bool m_verticalHeaderAlreadyAdded : 1;
00779
00783 int m_dragIndicatorLine;
00784
00786 KPopupMenu *m_popupMenu;
00787
00788 bool m_contextMenuEnabled : 1;
00789
00791 bool m_alsoUpdateNextRow : 1;
00792
00798 int m_rowWillBeDeleted;
00799
00801 QGuardedPtr<KexiArrowTip> m_errorMessagePopup;
00802
00805 bool m_vScrollBarValueChanged_enabled : 1;
00806
00808 bool m_scrollbarToolTipsEnabled : 1;
00809
00810 QLabel* m_scrollBarTip;
00811 QTimer m_scrollBarTipTimer;
00812 uint m_scrollBarTipTimerCnt;
00813 };
00814
00815 inline bool KexiDataAwareObjectInterface::hasData() const
00816 {
00817 if (!m_data)
00818 kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
00819 return m_data!=0;
00820 }
00821
00822 inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
00823 {
00824 KexiTableItem *item = m_data->at(row);
00825 if (!item)
00826 kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
00827 else {
00828
00829
00830
00831
00832 }
00833 return item;
00834 }
00835
00837 #define KEXI_DATAAWAREOBJECTINTERFACE \
00838 public: \
00839 void connectCellSelectedSignal(const QObject* receiver, const char* intIntMember) { \
00840 connect(this, SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
00841 } \
00842 \
00843 void connectRowEditStartedSignal(const QObject* receiver, const char* intMember) { \
00844 connect(this, SIGNAL(rowEditStarted(int)), receiver, intMember); \
00845 } \
00846 \
00847 void connectRowEditTerminatedSignal(const QObject* receiver, const char* voidMember) { \
00848 connect(this, SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
00849 } \
00850 \
00851 void connectReloadActionsSignal(const QObject* receiver, const char* voidMember) { \
00852 connect(this, SIGNAL(reloadActions()), receiver, voidMember); \
00853 } \
00854 \
00855 void connectDataSetSignal(const QObject* receiver, \
00856 const char* kexiTableViewDataMember) { \
00857 connect(this, SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
00858 } \
00859 \
00860 void connectToReloadDataSlot(const QObject* sender, const char* voidSignal) { \
00861 connect(sender, voidSignal, this, SLOT(reloadData())); \
00862 }
00863
00864 #endif