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 <kexisearchandreplaceiface.h>
00035 #include "kexitableviewdata.h"
00036
00037 class QObject;
00038 class QScrollBar;
00039 class KPopupMenu;
00040 class KexiTableItem;
00041 class KexiTableViewData;
00042 class KexiRecordMarker;
00043 class KexiTableViewHeader;
00044 class KexiRecordNavigator;
00045 #include <kexidataiteminterface.h>
00046
00047 namespace KexiDB {
00048 class RowEditBuffer;
00049 }
00050
00052 #define KEXI_DEFAULT_DATA_COLUMN_WIDTH 120
00053
00055
00068 class KEXIDATATABLE_EXPORT KexiDataAwareObjectInterface
00069 {
00070 public:
00071 KexiDataAwareObjectInterface();
00072 virtual ~KexiDataAwareObjectInterface();
00073
00080 void setData( KexiTableViewData *data, bool owner = true );
00081
00083 inline KexiTableViewData *data() const { return m_data; }
00084
00086 inline int currentColumn() const { return m_curCol; }
00087
00089 inline int currentRow() const { return m_curRow; }
00090
00094 virtual int lastVisibleRow() const = 0;
00095
00097 KexiTableItem *selectedItem() const { return m_currentItem; }
00098
00100 int rows() const;
00101
00107 virtual int columns() const { return dataColumns(); }
00108
00111 int dataColumns() const;
00112
00116 virtual bool isReadOnly() const;
00117
00131 void setReadOnly(bool set);
00132
00134 inline bool isSortingEnabled() const { return m_isSortingEnabled; }
00135
00138 virtual void setSorting(int col, bool ascending=true);
00139
00145 virtual void setSortingEnabled(bool set);
00146
00150 int dataSortedColumn() const;
00151
00157 int dataSortingOrder() const;
00158
00163 virtual bool sort();
00164
00167 void sortAscending();
00168
00171 void sortDescending();
00172
00174 virtual bool isInsertingEnabled() const;
00175
00188 void setInsertingEnabled(bool set);
00189
00192 bool isDeleteEnabled() const;
00193
00198 bool isEmptyRowInsertingEnabled() const { return m_emptyRowInsertingEnabled; }
00199
00202 void setEmptyRowInsertingEnabled(bool set);
00203
00205 virtual void setFilteringEnabled(bool set);
00206
00208 inline bool isFilteringEnabled() const { return m_isFilteringEnabled; }
00209
00216 virtual void setSpreadSheetMode();
00217
00219 bool spreadSheetMode() const { return m_spreadSheetMode; }
00220
00222 inline bool rowEditing() const { return m_rowEditing; }
00223
00224 enum DeletionPolicy
00225 {
00226 NoDelete = 0,
00227 AskDelete = 1,
00228 ImmediateDelete = 2,
00229 SignalDelete = 3
00230 };
00231
00234 DeletionPolicy deletionPolicy() const { return m_deletionPolicy; }
00235
00236 virtual void setDeletionPolicy(DeletionPolicy policy);
00237
00241 virtual void deleteCurrentRow();
00242
00251 virtual KexiTableItem *insertEmptyRow(int row = -1);
00252
00255 virtual bool beforeDeleteItem(KexiTableItem *item);
00256
00260 bool deleteItem(KexiTableItem *item);
00261
00263 void insertItem(KexiTableItem *newItem, int row = -1);
00264
00277 tristate deleteAllRows(bool ask = false, bool repaint = true);
00278
00281 virtual int rowsPerPage() const = 0;
00282
00283 virtual void selectRow(int row);
00284 virtual void selectNextRow();
00285 virtual void selectPrevRow();
00286 virtual void selectNextPage();
00287 virtual void selectPrevPage();
00288 virtual void selectFirstRow();
00289 virtual void selectLastRow();
00290 virtual void addNewRecordRequested();
00291
00294 virtual void clearSelection();
00295
00299 virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
00300
00304 virtual void ensureCellVisible(int row, int col) = 0;
00305
00309 virtual void setAcceptsRowEditAfterCellAccepting(bool set);
00310
00320 bool acceptsRowEditAfterCellAccepting() const { return m_acceptsRowEditAfterCellAccepting; }
00321
00323 bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
00324
00331 virtual void setDropsAtRowEnabled(bool set);
00332
00334 inline KexiDataItemInterface *editor() const { return m_editor; }
00335
00339 virtual bool cancelRowEdit();
00340
00345 virtual bool acceptRowEdit();
00346
00347 virtual void removeEditor();
00348
00352 virtual bool cancelEditor();
00353
00356 virtual bool acceptEditor();
00357
00359 virtual void createEditor(int row, int col, const QString& addText = QString::null,
00360 bool removeOld = false) = 0;
00361
00368 virtual void startEditCurrentCell(const QString& setText = QString::null);
00369
00372 virtual void deleteAndStartEditCurrentCell();
00373
00374 inline KexiTableItem *itemAt(int row) const;
00375
00381 virtual KexiTableViewColumn* column(int col);
00382
00385 virtual int fieldNumberForColumn(int col) { return col; }
00386
00387 bool hasDefaultValueAt(const KexiTableViewColumn& tvcol);
00388
00389 const QVariant* bufferedValueAt(int col, bool useDefaultValueIfPossible = true);
00390
00392 int columnType(int col);
00393
00395 QVariant columnDefaultValue(int col) const;
00396
00402 virtual bool columnEditable(int col);
00403
00405 virtual void updateCurrentCell() = 0;
00406
00407 inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
00408
00410 virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
00411 virtual void itemChanged(KexiTableItem *, int row, int col, QVariant oldValue) = 0;
00412 virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
00413 virtual void currentItemDeleteRequest() = 0;
00415 virtual void newItemAppendedForAfterDeletingInSpreadSheetMode() = 0;
00416
00418 virtual void dataRefreshed() = 0;
00419 virtual void dataSet( KexiTableViewData *data ) = 0;
00420
00422 KPopupMenu* contextMenu() const { return m_popupMenu; }
00423
00426 bool contextMenuEnabled() const { return m_contextMenuEnabled; }
00427
00429 void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
00430
00432 bool scrollbarToolTipsEnabled() const;
00433
00435 void setScrollbarToolTipsEnabled(bool set);
00436
00440 void startEditOrToggleValue();
00441
00443 inline bool newRowEditing() const { return m_newRowEditing; }
00444
00447 virtual void boolToggled();
00448
00449 virtual void connectCellSelectedSignal(const QObject* receiver,
00450 const char* intIntMember) = 0;
00451
00452 virtual void connectRowEditStartedSignal(const QObject* receiver,
00453 const char* intMember) = 0;
00454
00455 virtual void connectRowEditTerminatedSignal(const QObject* receiver,
00456 const char* voidMember) = 0;
00457
00458 virtual void connectReloadActionsSignal(const QObject* receiver,
00459 const char* voidMember) = 0;
00460
00461 virtual void connectDataSetSignal(const QObject* receiver,
00462 const char* kexiTableViewDataMember) = 0;
00463
00464 virtual void connectToReloadDataSlot(const QObject* sender,
00465 const char* voidSignal) = 0;
00466
00467 virtual void slotDataDestroying();
00468
00470 virtual void copySelection() = 0;
00471
00473 virtual void cutSelection() = 0;
00474
00476 virtual void paste() = 0;
00477
00493 virtual tristate find(const QVariant& valueToFind,
00494 const KexiSearchAndReplaceViewInterface::Options& options, bool next);
00495
00502 virtual tristate findNextAndReplace(const QVariant& valueToFind,
00503 const QVariant& replacement,
00504 const KexiSearchAndReplaceViewInterface::Options& options, bool replaceAll);
00505
00507 virtual QScrollBar* verticalScrollBar() const = 0;
00508
00526 virtual bool handleKeyPress(QKeyEvent *e, int &curRow, int &curCol, bool fullRowSelection,
00527 bool *moveToFirstField = 0, bool *moveToLastField = 0);
00528
00529 protected:
00537 virtual void initDataContents();
00538
00541 virtual void clearColumns(bool repaint = true);
00542
00545 virtual void clearColumnsInternal(bool repaint) = 0;
00546
00550 virtual void addHeaderColumn(const QString& caption, const QString& description,
00551 const QIconSet& icon, int size) = 0;
00552
00558 virtual int currentLocalSortingOrder() const = 0;
00559
00567 virtual int currentLocalSortColumn() const = 0;
00568
00574 virtual void setLocalSortingOrder(int col, int order) = 0;
00575
00578 virtual void sortColumnInternal(int col, int order = 0);
00579
00586 virtual void updateGUIAfterSorting() = 0;
00587
00591 virtual void reloadActions() = 0;
00592
00594 virtual void reloadData();
00595
00597 virtual void itemSelected(KexiTableItem *) = 0;
00598
00600 virtual void cellSelected(int col, int row) = 0;
00601
00603 virtual void sortedColumnChanged(int col) = 0;
00604
00606 virtual void rowEditTerminated(int row) = 0;
00607
00610 virtual void clearVariables();
00611
00618 virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
00619
00622 virtual void editorShowFocus( int row, int col ) = 0;
00623
00625 virtual void updateCell(int row, int col) = 0;
00626
00628 virtual void updateRow(int row) = 0;
00629
00631 virtual void updateWidgetContents() = 0;
00632
00634 virtual void updateWidgetContentsSize() = 0;
00635
00638 virtual void updateWidgetScrollBars() = 0;
00639
00644 virtual void updateAfterCancelRowEdit();
00645
00650 virtual void updateAfterAcceptRowEdit();
00651
00653 virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
00654
00656 virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result,
00657 bool repaint);
00658
00660 virtual void slotRowDeleted();
00661
00663 virtual void slotRowInserted(KexiTableItem *item, bool repaint);
00664
00666 virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
00667
00668 virtual void slotRowsDeleted( const QValueList<int> & ) {}
00669
00671 inline bool hasData() const;
00672
00675 virtual void selectCellInternal() {}
00676
00680 virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
00681
00683 virtual void focusOutEvent(QFocusEvent* e);
00684
00688 virtual void vScrollBarValueChanged(int v);
00689
00691 virtual void vScrollBarSliderReleased();
00692
00696 virtual void scrollBarTipTimeout();
00697
00702 int showErrorMessageForResult(KexiDB::ResultInfo* resultInfo);
00703
00709 void updateIndicesForVisibleValues();
00710
00712 KexiTableViewData *m_data;
00713
00715 bool m_owner : 1;
00716
00718 int m_curRow, m_curCol;
00719
00721 KexiTableItem *m_currentItem;
00722
00724 KexiTableViewData::Iterator *m_itemIterator;
00725
00727 KexiTableItem *m_insertItem;
00728
00730
00731
00733 bool m_rowEditing : 1;
00734
00736 bool m_newRowEditing : 1;
00737
00739 bool m_isSortingEnabled : 1;
00740
00742 bool m_isFilteringEnabled : 1;
00743
00747 bool m_acceptsRowEditAfterCellAccepting : 1;
00748
00751 bool m_inside_acceptEditor : 1;
00752
00756 bool m_internal_acceptsRowEditAfterCellAccepting : 1;
00757
00759 bool m_emptyRowInsertingEnabled : 1;
00760
00765 int m_readOnly;
00766
00768
00770 bool m_contentsMousePressEvent_dblClick : 1;
00771
00773 int m_insertingEnabled;
00774
00776 bool m_initDataContentsOnShow : 1;
00777
00781 bool m_cursorPositionSetExplicityBeforeShow : 1;
00782
00785 bool m_spreadSheetMode : 1;
00786
00788 bool m_dropsAtRowEnabled : 1;
00789
00792 bool m_updateEntireRowWhenMovingToOtherRow : 1;
00793
00794 DeletionPolicy m_deletionPolicy;
00795
00797 KexiRecordMarker *m_verticalHeader;
00798
00800 KexiTableViewHeader *m_horizontalHeader;
00801
00802 KexiDataItemInterface *m_editor;
00803
00804
00806 KexiRecordNavigator *m_navPanel;
00807
00808 bool m_navPanelEnabled : 1;
00809
00813 bool m_verticalHeaderAlreadyAdded : 1;
00814
00818 int m_dragIndicatorLine;
00819
00821 KPopupMenu *m_popupMenu;
00822
00823 bool m_contextMenuEnabled : 1;
00824
00826 bool m_alsoUpdateNextRow : 1;
00827
00833 int m_rowWillBeDeleted;
00834
00836 QGuardedPtr<KexiArrowTip> m_errorMessagePopup;
00837
00840 bool m_vScrollBarValueChanged_enabled : 1;
00841
00843 bool m_scrollbarToolTipsEnabled : 1;
00844
00845 QLabel* m_scrollBarTip;
00846 QTimer m_scrollBarTipTimer;
00847 uint m_scrollBarTipTimerCnt;
00848
00850 class PositionOfValue {
00851 public:
00852 PositionOfValue() : firstCharacter(0), lastCharacter(0), exists(false)
00853 {}
00854 uint firstCharacter;
00855 uint lastCharacter;
00856 bool exists : 1;
00857 };
00858
00862 PositionOfValue m_positionOfRecentlyFoundValue;
00863
00865 QVariant m_recentlySearchedValue;
00866
00868 KexiSearchAndReplaceViewInterface::Options::SearchDirection m_recentSearchDirection;
00869
00871 QValueVector<uint> m_indicesForVisibleValues;
00872 };
00873
00874 inline bool KexiDataAwareObjectInterface::hasData() const
00875 {
00876 if (!m_data)
00877 kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
00878 return m_data!=0;
00879 }
00880
00881 inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
00882 {
00883 KexiTableItem *item = m_data->at(row);
00884 if (!item)
00885 kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
00886 else {
00887
00888
00889
00890
00891 }
00892 return item;
00893 }
00894
00896 #define KEXI_DATAAWAREOBJECTINTERFACE \
00897 public: \
00898 void connectCellSelectedSignal(const QObject* receiver, const char* intIntMember) { \
00899 connect(this, SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
00900 } \
00901 void connectRowEditStartedSignal(const QObject* receiver, const char* intMember) { \
00902 connect(this, SIGNAL(rowEditStarted(int)), receiver, intMember); \
00903 } \
00904 void connectRowEditTerminatedSignal(const QObject* receiver, const char* voidMember) { \
00905 connect(this, SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
00906 } \
00907 void connectReloadActionsSignal(const QObject* receiver, const char* voidMember) { \
00908 connect(this, SIGNAL(reloadActions()), receiver, voidMember); \
00909 } \
00910 void connectDataSetSignal(const QObject* receiver, \
00911 const char* kexiTableViewDataMember) { \
00912 connect(this, SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
00913 } \
00914 void connectToReloadDataSlot(const QObject* sender, const char* voidSignal) { \
00915 connect(sender, voidSignal, this, SLOT(reloadData())); \
00916 }
00917
00918 #endif