kexi

kexidataawareobjectiface.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2005 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    Copyright (C) 2003-2005 Jaroslaw Staniek <js@iidea.pl>
00010 
00011    This program is free software; you can redistribute it and/or
00012    modify it under the terms of the GNU Library General Public
00013    License as published by the Free Software Foundation; either
00014    version 2 of the License, or (at your option) any later version.
00015 
00016    This program is distributed in the hope that it will be useful,
00017    but WITHOUT ANY WARRANTY; without even the implied warranty of
00018    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019    Library General Public License for more details.
00020 
00021    You should have received a copy of the GNU Library General Public License
00022    along with this program; see the file COPYING.  If not, write to
00023    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00024  * Boston, MA 02110-1301, USA.
00025 */
00026 
00027 #ifndef KEXIDATAAWAREOBJECTINTERFACE_H
00028 #define KEXIDATAAWAREOBJECTINTERFACE_H
00029 
00030 #include <qguardedptr.h>
00031 #include <qlabel.h>
00032 
00033 #include <kdebug.h>
00034 #include "kexitableviewdata.h"
00035 
00036 class QObject;
00037 class KPopupMenu;
00038 class KexiTableItem;
00039 class KexiTableViewData;
00040 class KexiRecordMarker;
00041 class KexiRecordNavigator;
00042 #include <kexidataiteminterface.h>
00043 
00044 namespace KexiDB {
00045     class RowEditBuffer;
00046 }
00047 
00049 #define KEXI_DEFAULT_DATA_COLUMN_WIDTH 120
00050 
00052 
00065 class KEXIDATATABLE_EXPORT KexiDataAwareObjectInterface
00066 {
00067     public:
00068         KexiDataAwareObjectInterface();
00069         virtual ~KexiDataAwareObjectInterface();
00070 
00077         void setData( KexiTableViewData *data, bool owner = true );
00078 
00080         inline KexiTableViewData *data() const { return m_data; }
00081 
00083         inline int currentColumn() const { return m_curCol; }
00084 
00086         inline int currentRow() const { return m_curRow; }
00087 
00089         KexiTableItem *selectedItem() const { return m_currentItem; }
00090 
00092         int rows() const;
00093 
00099         virtual int columns() const { return dataColumns(); }
00100 
00103         int dataColumns() const;
00104 
00108         virtual bool isReadOnly() const;
00109 
00123         void setReadOnly(bool set);
00124 
00126         inline bool isSortingEnabled() const { return m_isSortingEnabled; }
00127 
00130         virtual void setSorting(int col, bool ascending=true);
00131 
00137         virtual void setSortingEnabled(bool set);
00138 
00142         int dataSortedColumn() const;
00143 
00149         int dataSortingOrder() const;
00150 
00155         virtual bool sort();
00156 
00159         void sortAscending();
00160 
00163         void sortDescending();
00164 
00166         virtual bool isInsertingEnabled() const;
00167 
00180         void setInsertingEnabled(bool set);
00181 
00184         bool isDeleteEnabled() const;
00185 
00190         bool isEmptyRowInsertingEnabled() const { return m_emptyRowInsertingEnabled; }
00191 
00194         void setEmptyRowInsertingEnabled(bool set);
00195 
00197         virtual void setFilteringEnabled(bool set);
00198 
00200         inline bool isFilteringEnabled() const { return m_isFilteringEnabled; }
00201 
00208         virtual void setSpreadSheetMode();
00209 
00211         bool spreadSheetMode() const { return m_spreadSheetMode; }
00212 
00214         inline bool rowEditing() const { return m_rowEditing; }
00215 
00216         enum DeletionPolicy
00217         {
00218             NoDelete = 0,
00219             AskDelete = 1,
00220             ImmediateDelete = 2,
00221             SignalDelete = 3
00222         };
00223 
00226         DeletionPolicy deletionPolicy() const { return m_deletionPolicy; }
00227 
00228         virtual void setDeletionPolicy(DeletionPolicy policy);
00229 
00233         void deleteCurrentRow();
00234 
00243         KexiTableItem *insertEmptyRow(int row = -1);
00244 
00247         virtual bool beforeDeleteItem(KexiTableItem *item);
00248 
00252         bool deleteItem(KexiTableItem *item);//, bool moveCursor=true);
00253 
00255         void insertItem(KexiTableItem *newItem, int row = -1);
00256 
00269         tristate deleteAllRows(bool ask = false, bool repaint = true);
00270 
00273         virtual int rowsPerPage() const = 0;
00274 
00275         virtual void selectRow(int row);
00276         virtual void selectNextRow();
00277         virtual void selectPrevRow();
00278         virtual void selectNextPage(); 
00279         virtual void selectPrevPage(); 
00280         virtual void selectFirstRow();
00281         virtual void selectLastRow();
00282 
00285         virtual void clearSelection();
00286 
00290         virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
00291 
00295         virtual void ensureCellVisible(int row, int col/*=-1*/) = 0;
00296 
00300         void setAcceptsRowEditAfterCellAccepting(bool set);
00301 
00311         bool acceptsRowEditAfterCellAccepting() const { return m_acceptsRowEditAfterCellAccepting; }
00312 
00314         bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
00315 
00322         void setDropsAtRowEnabled(bool set);
00323 
00325         inline KexiDataItemInterface *editor() const { return m_editor; }
00326 
00329         virtual void cancelRowEdit();
00330 
00335         virtual bool acceptRowEdit();
00336 
00337         virtual void removeEditor();
00338         virtual void cancelEditor();
00339         virtual bool acceptEditor();
00340 
00342         virtual void createEditor(int row, int col, const QString& addText = QString::null, 
00343             bool removeOld = false) = 0;
00344 
00350         virtual void startEditCurrentCell(const QString& setText = QString::null);
00351 
00354         virtual void deleteAndStartEditCurrentCell();
00355 
00356         inline KexiTableItem *itemAt(int row) const;
00357 
00363         virtual KexiTableViewColumn* column(int col);
00364 
00367         virtual int fieldNumberForColumn(int col) { return col; }
00368 
00369         const QVariant* bufferedValueAt(int col);
00370 
00372         int columnType(int col);
00373 
00375         QVariant columnDefaultValue(int col) const;
00376 
00382         virtual bool columnEditable(int col);
00383 
00384         inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
00385 
00387         virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
00388         virtual void itemChanged(KexiTableItem *, int row, int col, QVariant oldValue) = 0;
00389         virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
00390         virtual void currentItemDeleteRequest() = 0;
00391 
00393         virtual void dataRefreshed() = 0;
00394         virtual void dataSet( KexiTableViewData *data ) = 0;
00395 
00396         KPopupMenu* contextMenu() const { return m_popup; }
00397 
00400         bool contextMenuEnabled() const { return m_contextMenuEnabled; }
00401 
00403         void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
00404 
00408         void startEditOrToggleValue();
00409 
00412         virtual void boolToggled();
00413 
00414         virtual void connectCellSelectedSignal(const QObject* receiver, 
00415             const char* intIntMember) = 0;
00416 
00417         virtual void connectRowEditStartedSignal(const QObject* receiver, 
00418             const char* intMember) = 0;
00419 
00420         virtual void connectRowEditTerminatedSignal(const QObject* receiver, 
00421             const char* voidMember) = 0;
00422 
00423         virtual void connectReloadActionsSignal(const QObject* receiver, 
00424             const char* voidMember) = 0;
00425 
00426         virtual void connectDataSetSignal(const QObject* receiver, 
00427             const char* kexiTableViewDataMember) = 0;
00428 
00429         virtual void connectToReloadDataSlot(const QObject* sender, 
00430             const char* voidSignal) = 0;
00431 
00432         virtual void slotDataDestroying();
00433 
00434     protected:
00442         virtual void initDataContents();
00443 
00446         virtual void clearColumns(bool repaint = true);
00447 
00450         virtual void clearColumnsInternal(bool repaint) = 0;
00451 
00455         virtual void addHeaderColumn(const QString& caption, const QString& description, int width) = 0;
00456 
00462         virtual int currentLocalSortingOrder() const = 0;
00463 
00471         virtual int currentLocalSortColumn() const = 0;
00472 
00478         virtual void setLocalSortingOrder(int col, int order) = 0;
00479 
00482         virtual void sortColumnInternal(int col, int order = 0);
00483 
00490         virtual void updateGUIAfterSorting() = 0;
00491 
00495         virtual void reloadActions() = 0;
00496 
00498         virtual void reloadData();
00499 
00501         virtual void itemSelected(KexiTableItem *) = 0;
00502 
00504         virtual void cellSelected(int col, int row) = 0;
00505 
00507         virtual void sortedColumnChanged(int col) = 0;
00508 
00510         virtual void rowEditTerminated(int row) = 0;
00511 
00514         virtual void clearVariables();
00515 
00522         virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
00523 
00526         virtual void editorShowFocus( int row, int col ) = 0;
00527 
00529         virtual void updateCell(int row, int col) = 0;
00530 
00532         virtual void updateRow(int row) = 0;
00533 
00535         virtual void updateWidgetContents() = 0;
00536 
00538         virtual void updateWidgetContentsSize() = 0;
00539 
00542         virtual void updateWidgetScrollBars() = 0;
00543 
00548         virtual void updateAfterCancelRowEdit();
00549 
00554         virtual void updateAfterAcceptRowEdit();
00555 
00557         virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
00558 
00560         virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result, 
00561             bool repaint);
00562 
00564         virtual void slotRowDeleted();
00565 
00567         virtual void slotRowInserted(KexiTableItem *item, bool repaint);
00568 
00570         virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
00571 
00572         virtual void slotRowsDeleted( const QValueList<int> & ) {}
00573 
00575         inline bool hasData() const;
00576 
00579         virtual void selectCellInternal() {}
00580 
00584         virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
00585 
00586         virtual void addNewRecordRequested();
00587 
00589         KexiTableViewData *m_data;
00590 
00592         bool m_owner : 1;
00593 
00595         int m_curRow, m_curCol;
00596 
00598         KexiTableItem *m_currentItem;
00599 
00601         KexiTableViewData::Iterator *m_itemIterator;
00602 
00604         KexiTableItem *m_insertItem;
00605 
00607         KexiDB::RowEditBuffer *m_rowEditBuffer; 
00608 
00610         bool m_rowEditing : 1;
00611 
00614         bool m_newRowEditing : 1;
00615 
00617         bool m_isSortingEnabled : 1;
00618 
00620         bool m_isFilteringEnabled : 1;
00621 
00625         bool m_acceptsRowEditAfterCellAccepting : 1;
00626 
00629         bool m_inside_acceptEditor : 1;
00630 
00634         bool m_internal_acceptsRowEditAfterCellAccepting : 1;
00635 
00637         bool m_emptyRowInsertingEnabled : 1;
00638 
00643         int m_readOnly;
00644 
00646 
00648         bool m_contentsMousePressEvent_dblClick : 1;
00649 
00651         int m_insertingEnabled;
00652 
00654         bool m_initDataContentsOnShow : 1;
00655 
00659         bool m_cursorPositionSetExplicityBeforeShow : 1;
00660 
00663         bool m_spreadSheetMode : 1;
00664 
00666         bool m_dropsAtRowEnabled : 1;
00667 
00670         bool m_updateEntireRowWhenMovingToOtherRow : 1;
00671 
00672         DeletionPolicy m_deletionPolicy;
00673 
00675         KexiRecordMarker *m_verticalHeader;
00676 
00677         KexiDataItemInterface *m_editor;
00678 //      KexiTableEdit *m_editor;
00679 
00681         KexiRecordNavigator *m_navPanel; 
00682 
00683         bool m_navPanelEnabled : 1;
00684 
00688         bool m_verticalHeaderAlreadyAdded : 1;
00689 
00693         int m_dragIndicatorLine;
00694 
00696         KPopupMenu *m_popup;
00697 
00698         bool m_contextMenuEnabled : 1;
00699 
00701         bool m_alsoUpdateNextRow : 1;
00702 
00708         int m_rowWillBeDeleted;
00709 
00711         QGuardedPtr<QLabel> m_errorMessagePopup;
00712 };
00713 
00714 inline bool KexiDataAwareObjectInterface::hasData() const
00715 {
00716     if (!m_data)
00717         kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
00718     return m_data!=0;
00719 }
00720 
00721 inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
00722 {
00723     KexiTableItem *item = m_data->at(row);
00724     if (!item)
00725         kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
00726     else {
00727 /*      kdDebug() << "KexiTableView::itemAt(" << row << "):" << endl;
00728         int i=1;
00729         for (KexiTableItem::Iterator it = item->begin();it!=item->end();++it,i++)
00730             kdDebug() << i<<": " << (*it).toString()<< endl;*/
00731     }
00732     return item;
00733 }
00734 
00736 #define KEXI_DATAAWAREOBJECTINTERFACE \
00737 public: \
00738     void connectCellSelectedSignal(const QObject* receiver, const char* intIntMember) { \
00739         connect(this, SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
00740     } \
00741     \
00742     void connectRowEditStartedSignal(const QObject* receiver, const char* intMember) { \
00743         connect(this, SIGNAL(rowEditStarted(int)), receiver, intMember); \
00744     } \
00745     \
00746     void connectRowEditTerminatedSignal(const QObject* receiver, const char* voidMember) { \
00747         connect(this, SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
00748     } \
00749     \
00750     void connectReloadActionsSignal(const QObject* receiver, const char* voidMember) { \
00751         connect(this, SIGNAL(reloadActions()), receiver, voidMember); \
00752     } \
00753     \
00754     void connectDataSetSignal(const QObject* receiver, \
00755         const char* kexiTableViewDataMember) { \
00756         connect(this, SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
00757     } \
00758     \
00759     void connectToReloadDataSlot(const QObject* sender, const char* voidSignal) { \
00760         connect(sender, voidSignal, this, SLOT(reloadData())); \
00761     }
00762 
00763 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys