kexi

kexidataawareobjectiface.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2005-2006 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 "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);//, bool moveCursor=true);
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/*=-1*/) = 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 //      KexiDB::RowEditBuffer *m_rowEditBuffer; 
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 //      KexiTableEdit *m_editor;
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 /*      kdDebug() << "KexiTableView::itemAt(" << row << "):" << endl;
00828         int i=1;
00829         for (KexiTableItem::Iterator it = item->begin();it!=item->end();++it,i++)
00830             kdDebug() << i<<": " << (*it).toString()<< endl;*/
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
KDE Home | KDE Accessibility Home | Description of Access Keys