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 
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/*=-1*/) = 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 //      KexiDB::RowEditBuffer *m_rowEditBuffer; 
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 //      KexiTableEdit *m_editor;
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 /*      kdDebug() << "KexiTableView::itemAt(" << row << "):" << endl;
00829         int i=1;
00830         for (KexiTableItem::Iterator it = item->begin();it!=item->end();++it,i++)
00831             kdDebug() << i<<": " << (*it).toString()<< endl;*/
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
KDE Home | KDE Accessibility Home | Description of Access Keys