kexi

kexidataawareobjectiface.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2005-2007 Jaroslaw Staniek <js@iidea.pl>
00003 
00004    Based on KexiTableView code.
00005    Copyright (C) 2002 Till Busch <till@bux.at>
00006    Copyright (C) 2003 Lucijan Busch <lucijan@gmx.at>
00007    Copyright (C) 2003 Daniel Molkentin <molkentin@kde.org>
00008    Copyright (C) 2003 Joseph Wenninger <jowenn@kde.org>
00009 
00010    This program is free software; you can redistribute it and/or
00011    modify it under the terms of the GNU Library General Public
00012    License as published by the Free Software Foundation; either
00013    version 2 of the License, or (at your option) any later version.
00014 
00015    This program is distributed in the hope that it will be useful,
00016    but WITHOUT ANY WARRANTY; without even the implied warranty of
00017    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018    Library General Public License for more details.
00019 
00020    You should have received a copy of the GNU Library General Public License
00021    along with this program; see the file COPYING.  If not, write to
00022    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00023  * Boston, MA 02110-1301, USA.
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);//, bool moveCursor=true);
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/*=-1*/) = 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 //      KexiDB::RowEditBuffer *m_rowEditBuffer; 
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 //      KexiTableEdit *m_editor;
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 /*      kdDebug() << "KexiTableView::itemAt(" << row << "):" << endl;
00888         int i=1;
00889         for (KexiTableItem::Iterator it = item->begin();it!=item->end();++it,i++)
00890             kdDebug() << i<<": " << (*it).toString()<< endl;*/
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
KDE Home | KDE Accessibility Home | Description of Access Keys