kexi

kexidataawareobjectiface.h
1/* This file is part of the KDE project
2 Copyright (C) 2005-2007 Jaroslaw Staniek <js@iidea.pl>
3
4 Based on KexiTableView code.
5 Copyright (C) 2002 Till Busch <till@bux.at>
6 Copyright (C) 2003 Lucijan Busch <lucijan@gmx.at>
7 Copyright (C) 2003 Daniel Molkentin <molkentin@kde.org>
8 Copyright (C) 2003 Joseph Wenninger <jowenn@kde.org>
9
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Library General Public
12 License as published by the Free Software Foundation; either
13 version 2 of the License, or (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Library General Public License for more details.
19
20 You should have received a copy of the GNU Library General Public License
21 along with this program; see the file COPYING. If not, write to
22 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 * Boston, MA 02110-1301, USA.
24*/
25
26#ifndef KEXIDATAAWAREOBJECTINTERFACE_H
27#define KEXIDATAAWAREOBJECTINTERFACE_H
28
29#include <tqguardedptr.h>
30
31#include <tqtimer.h>
32#include <kdebug.h>
33#include <widget/utils/kexiarrowtip.h>
34#include <kexisearchandreplaceiface.h>
35#include "kexitableviewdata.h"
36
37class TQObject;
38class TQScrollBar;
39class TDEPopupMenu;
40class KexiTableItem;
45#include <kexidataiteminterface.h>
46
47namespace KexiDB {
48 class RowEditBuffer;
49}
50
52#define KEXI_DEFAULT_DATA_COLUMN_WIDTH 120
53
55
68class KEXIDATATABLE_EXPORT KexiDataAwareObjectInterface
69{
70 public:
71 KexiDataAwareObjectInterface();
72 virtual ~KexiDataAwareObjectInterface();
73
80 void setData( KexiTableViewData *data, bool owner = true );
81
83 inline KexiTableViewData *data() const { return m_data; }
84
86 inline int currentColumn() const { return m_curCol; }
87
89 inline int currentRow() const { return m_curRow; }
90
94 virtual int lastVisibleRow() const = 0;
95
97 KexiTableItem *selectedItem() const { return m_currentItem; }
98
100 int rows() const;
101
107 virtual int columns() const { return dataColumns(); }
108
111 int dataColumns() const;
112
116 virtual bool isReadOnly() const;
117
131 void setReadOnly(bool set);
132
134 inline bool isSortingEnabled() const { return m_isSortingEnabled; }
135
138 virtual void setSorting(int col, bool ascending=true);
139
145 virtual void setSortingEnabled(bool set);
146
150 int dataSortedColumn() const;
151
157 int dataSortingOrder() const;
158
163 virtual bool sort();
164
167 void sortAscending();
168
171 void sortDescending();
172
174 virtual bool isInsertingEnabled() const;
175
188 void setInsertingEnabled(bool set);
189
192 bool isDeleteEnabled() const;
193
199
202 void setEmptyRowInsertingEnabled(bool set);
203
205 virtual void setFilteringEnabled(bool set);
206
208 inline bool isFilteringEnabled() const { return m_isFilteringEnabled; }
209
216 virtual void setSpreadSheetMode();
217
219 bool spreadSheetMode() const { return m_spreadSheetMode; }
220
222 inline bool rowEditing() const { return m_rowEditing; }
223
224 enum DeletionPolicy
225 {
226 NoDelete = 0,
227 AskDelete = 1,
228 ImmediateDelete = 2,
229 SignalDelete = 3
230 };
231
234 DeletionPolicy deletionPolicy() const { return m_deletionPolicy; }
235
236 virtual void setDeletionPolicy(DeletionPolicy policy);
237
241 virtual void deleteCurrentRow();
242
251 virtual KexiTableItem *insertEmptyRow(int row = -1);
252
255 virtual bool beforeDeleteItem(KexiTableItem *item);
256
260 bool deleteItem(KexiTableItem *item);//, bool moveCursor=true);
261
263 void insertItem(KexiTableItem *newItem, int row = -1);
264
277 tristate deleteAllRows(bool ask = false, bool repaint = true);
278
281 virtual int rowsPerPage() const = 0;
282
283 virtual void selectRow(int row);
284 virtual void selectNextRow();
285 virtual void selectPrevRow();
286 virtual void selectNextPage();
287 virtual void selectPrevPage();
288 virtual void selectFirstRow();
289 virtual void selectLastRow();
290 virtual void addNewRecordRequested();
291
294 virtual void clearSelection();
295
299 virtual void setCursorPosition(int row, int col = -1, bool forceSet = false);
300
304 virtual void ensureCellVisible(int row, int col/*=-1*/) = 0;
305
309 virtual void setAcceptsRowEditAfterCellAccepting(bool set);
310
321
323 bool dropsAtRowEnabled() const { return m_dropsAtRowEnabled; }
324
331 virtual void setDropsAtRowEnabled(bool set);
332
334 inline KexiDataItemInterface *editor() const { return m_editor; }
335
339 virtual bool cancelRowEdit();
340
345 virtual bool acceptRowEdit();
346
347 virtual void removeEditor();
348
352 virtual bool cancelEditor();
353
356 virtual bool acceptEditor();
357
359 virtual void createEditor(int row, int col, const TQString& addText = TQString(),
360 bool removeOld = false) = 0;
361
368 virtual void startEditCurrentCell(const TQString& setText = TQString());
369
372 virtual void deleteAndStartEditCurrentCell();
373
374 inline KexiTableItem *itemAt(int row) const;
375
381 virtual KexiTableViewColumn* column(int col);
382
385 virtual int fieldNumberForColumn(int col) { return col; }
386
387 bool hasDefaultValueAt(const KexiTableViewColumn& tvcol);
388
389 const TQVariant* bufferedValueAt(int col, bool useDefaultValueIfPossible = true);
390
392 int columnType(int col);
393
395 TQVariant columnDefaultValue(int col) const;
396
402 virtual bool columnEditable(int col);
403
405 virtual void updateCurrentCell() = 0;
406
407 inline KexiRecordMarker* verticalHeader() const { return m_verticalHeader; }
408
410 virtual void itemChanged(KexiTableItem *, int row, int col) = 0;
411 virtual void itemChanged(KexiTableItem *, int row, int col, TQVariant oldValue) = 0;
412 virtual void itemDeleteRequest(KexiTableItem *, int row, int col) = 0;
413 virtual void currentItemDeleteRequest() = 0;
416
418 virtual void dataRefreshed() = 0;
419 virtual void dataSet( KexiTableViewData *data ) = 0;
420
422 TDEPopupMenu* contextMenu() const { return m_popupMenu; }
423
426 bool contextMenuEnabled() const { return m_contextMenuEnabled; }
427
429 void setContextMenuEnabled(bool set) { m_contextMenuEnabled = set; }
430
432 bool scrollbarToolTipsEnabled() const;
433
435 void setScrollbarToolTipsEnabled(bool set);
436
440 void startEditOrToggleValue();
441
443 inline bool newRowEditing() const { return m_newRowEditing; }
444
447 virtual void boolToggled();
448
449 virtual void connectCellSelectedSignal(const TQObject* receiver,
450 const char* intIntMember) = 0;
451
452 virtual void connectRowEditStartedSignal(const TQObject* receiver,
453 const char* intMember) = 0;
454
455 virtual void connectRowEditTerminatedSignal(const TQObject* receiver,
456 const char* voidMember) = 0;
457
458 virtual void connectReloadActionsSignal(const TQObject* receiver,
459 const char* voidMember) = 0;
460
461 virtual void connectDataSetSignal(const TQObject* receiver,
462 const char* kexiTableViewDataMember) = 0;
463
464 virtual void connectToReloadDataSlot(const TQObject* sender,
465 const char* voidSignal) = 0;
466
467 virtual void slotDataDestroying();
468
470 virtual void copySelection() = 0;
471
473 virtual void cutSelection() = 0;
474
476 virtual void paste() = 0;
477
493 virtual tristate find(const TQVariant& valueToFind,
494 const KexiSearchAndReplaceViewInterface::Options& options, bool next);
495
502 virtual tristate findNextAndReplace(const TQVariant& valueToFind,
503 const TQVariant& replacement,
504 const KexiSearchAndReplaceViewInterface::Options& options, bool replaceAll);
505
507 virtual TQScrollBar* verticalScrollBar() const = 0;
508
526 virtual bool handleKeyPress(TQKeyEvent *e, int &curRow, int &curCol, bool fullRowSelection,
527 bool *moveToFirstField = 0, bool *moveToLastField = 0);
528
529 protected:
537 virtual void initDataContents();
538
541 virtual void clearColumns(bool repaint = true);
542
545 virtual void clearColumnsInternal(bool repaint) = 0;
546
550 virtual void addHeaderColumn(const TQString& caption, const TQString& description,
551 const TQIconSet& icon, int size) = 0;
552
558 virtual int currentLocalSortingOrder() const = 0;
559
567 virtual int currentLocalSortColumn() const = 0;
568
574 virtual void setLocalSortingOrder(int col, int order) = 0;
575
578 virtual void sortColumnInternal(int col, int order = 0);
579
586 virtual void updateGUIAfterSorting() = 0;
587
591 virtual void reloadActions() = 0;
592
594 virtual void reloadData();
595
597 virtual void itemSelected(KexiTableItem *) = 0;
598
600 virtual void cellSelected(int col, int row) = 0;
601
603 virtual void sortedColumnChanged(int col) = 0;
604
606 virtual void rowEditTerminated(int row) = 0;
607
610 virtual void clearVariables();
611
618 virtual KexiDataItemInterface *editor( int col, bool ignoreMissingEditor = false ) = 0;
619
622 virtual void editorShowFocus( int row, int col ) = 0;
623
625 virtual void updateCell(int row, int col) = 0;
626
628 virtual void updateRow(int row) = 0;
629
631 virtual void updateWidgetContents() = 0;
632
634 virtual void updateWidgetContentsSize() = 0;
635
638 virtual void updateWidgetScrollBars() = 0;
639
644 virtual void updateAfterCancelRowEdit();
645
650 virtual void updateAfterAcceptRowEdit();
651
653 virtual void slotRowRepaintRequested(KexiTableItem& item) { Q_UNUSED( item ); }
654
656 virtual void slotAboutToDeleteRow(KexiTableItem& item, KexiDB::ResultInfo* result,
657 bool repaint);
658
660 virtual void slotRowDeleted();
661
663 virtual void slotRowInserted(KexiTableItem *item, bool repaint);
664
666 virtual void slotRowInserted(KexiTableItem *item, uint row, bool repaint);
667
668 virtual void slotRowsDeleted( const TQValueList<int> & ) {}
669
671 inline bool hasData() const;
672
675 virtual void selectCellInternal() {}
676
680 virtual void updateAllVisibleRowsBelow(int row) { Q_UNUSED( row ); }
681
683 virtual void focusOutEvent(TQFocusEvent* e);
684
688 virtual void vScrollBarValueChanged(int v);
689
691 virtual void vScrollBarSliderReleased();
692
696 virtual void scrollBarTipTimeout();
697
702 int showErrorMessageForResult(KexiDB::ResultInfo* resultInfo);
703
709 void updateIndicesForVisibleValues();
710
713
715 bool m_owner : 1;
716
718 int m_curRow, m_curCol;
719
721 KexiTableItem *m_currentItem;
722
724 KexiTableViewData::Iterator *m_itemIterator;
725
727 KexiTableItem *m_insertItem;
728
730// KexiDB::RowEditBuffer *m_rowEditBuffer;
731
733 bool m_rowEditing : 1;
734
737
740
743
748
752
756 bool m_internal_acceptsRowEditAfterCellAccepting : 1;
757
760
766
768
771
774
777
782
786
789
793
794 DeletionPolicy m_deletionPolicy;
795
798
801
802 KexiDataItemInterface *m_editor;
803// KexiTableEdit *m_editor;
804
807
808 bool m_navPanelEnabled : 1;
809
814
819
821 TDEPopupMenu *m_popupMenu;
822
823 bool m_contextMenuEnabled : 1;
824
827
834
836 TQGuardedPtr<KexiArrowTip> m_errorMessagePopup;
837
841
844
845 TQLabel* m_scrollBarTip;
848
850 class PositionOfValue {
851 public:
852 PositionOfValue() : firstCharacter(0), lastCharacter(0), exists(false)
853 {}
854 uint firstCharacter;
855 uint lastCharacter;
856 bool exists : 1;
857 };
858
863
866
869
871 TQValueVector<uint> m_indicesForVisibleValues;
872};
873
875{
876 if (!m_data)
877 kdDebug() << "KexiDataAwareObjectInterface: No data assigned!" << endl;
878 return m_data!=0;
879}
880
881inline KexiTableItem *KexiDataAwareObjectInterface::itemAt(int row) const
882{
883 KexiTableItem *item = m_data->at(row);
884 if (!item)
885 kdDebug() << "KexiTableView::itemAt(" << row << "): NO ITEM!!" << endl;
886 else {
887/* kdDebug() << "KexiTableView::itemAt(" << row << "):" << endl;
888 int i=1;
889 for (KexiTableItem::Iterator it = item->begin();it!=item->end();++it,i++)
890 kdDebug() << i<<": " << (*it).toString()<< endl;*/
891 }
892 return item;
893}
894
896#define KEXI_DATAAWAREOBJECTINTERFACE \
897public: \
898 void connectCellSelectedSignal(const TQObject* receiver, const char* intIntMember) { \
899 connect(this, TQ_SIGNAL(cellSelected(int,int)), receiver, intIntMember); \
900 } \
901 void connectRowEditStartedSignal(const TQObject* receiver, const char* intMember) { \
902 connect(this, TQ_SIGNAL(rowEditStarted(int)), receiver, intMember); \
903 } \
904 void connectRowEditTerminatedSignal(const TQObject* receiver, const char* voidMember) { \
905 connect(this, TQ_SIGNAL(rowEditTerminated(int)), receiver, voidMember); \
906 } \
907 void connectReloadActionsSignal(const TQObject* receiver, const char* voidMember) { \
908 connect(this, TQ_SIGNAL(reloadActions()), receiver, voidMember); \
909 } \
910 void connectDataSetSignal(const TQObject* receiver, \
911 const char* kexiTableViewDataMember) { \
912 connect(this, TQ_SIGNAL(dataSet(KexiTableViewData*)), receiver, kexiTableViewDataMember); \
913 } \
914 void connectToReloadDataSlot(const TQObject* sender, const char* voidSignal) { \
915 connect(sender, voidSignal, this, TQ_SLOT(reloadData())); \
916 }
917
918#endif
provides data for single edited database row KexiDB::RowEditBuffer provides data for single edited ro...
virtual void updateWidgetContents()=0
bool m_alsoUpdateNextRow
Used by updateAfterCancelRowEdit().
KexiTableViewData * data() const
virtual void setCursorPosition(int row, int col=-1, bool forceSet=false)
virtual tristate find(const TQVariant &valueToFind, const KexiSearchAndReplaceViewInterface::Options &options, bool next)
KexiTableItem * m_insertItem
item data for inserting
TQLabel * m_scrollBarTip
scrollbar tooltip
virtual void rowEditTerminated(int row)=0
virtual tristate findNextAndReplace(const TQVariant &valueToFind, const TQVariant &replacement, const KexiSearchAndReplaceViewInterface::Options &options, bool replaceAll)
virtual TQScrollBar * verticalScrollBar() const =0
uint m_scrollBarTipTimerCnt
helper for timeout counting (scrollbar tooltip)
virtual void cutSelection()=0
Cut current selection to a clipboard (e.g. cell).
virtual void ensureCellVisible(int row, int col)=0
virtual void selectNextPage()
page down action
bool m_rowEditing
when (current or new) row is edited - changed field values are temporary stored here
virtual void clearColumnsInternal(bool repaint)=0
virtual bool handleKeyPress(TQKeyEvent *e, int &curRow, int &curCol, bool fullRowSelection, bool *moveToFirstField=0, bool *moveToLastField=0)
void setData(KexiTableViewData *data, bool owner=true)
virtual void paste()=0
Paste current clipboard contents (e.g. to a cell).
virtual void setAcceptsRowEditAfterCellAccepting(bool set)
virtual void updateRow(int row)=0
virtual KexiTableViewColumn * column(int col)
TQGuardedPtr< KexiArrowTip > m_errorMessagePopup
TQTimer m_scrollBarTipTimer
scrollbar tooltip's timer
bool hasData() const
for sanity checks (return true if m_data is present; else: outputs warning)
virtual int lastVisibleRow() const =0
KexiSearchAndReplaceViewInterface::Options::SearchDirection m_recentSearchDirection
KexiTableViewData * m_data
data structure displayed for this object
virtual void slotRowRepaintRequested(KexiTableItem &item)
Handles KexiTableViewData::rowRepaintRequested() signal.
virtual void createEditor(int row, int col, const TQString &addText=TQString(), bool removeOld=false)=0
Creates editors and shows it, what usually means the beginning of a cell editing.
virtual void cellSelected(int col, int row)=0
virtual void updateWidgetContentsSize()=0
virtual void updateAllVisibleRowsBelow(int row)
virtual void updateCell(int row, int col)=0
virtual void dataRefreshed()=0
virtual void updateWidgetScrollBars()=0
KexiDataItemInterface * editor() const
virtual void itemChanged(KexiTableItem *, int row, int col)=0
signals
virtual void copySelection()=0
Copy current selection to a clipboard (e.g. cell).
TQValueVector< uint > m_indicesForVisibleValues
Setup by updateIndicesForVisibleValues() and used by find().
virtual void itemSelected(KexiTableItem *)=0
virtual int rowsPerPage() const =0
KexiRecordNavigator * m_navPanel
main navigation widget
virtual void reloadActions()=0
virtual void sortedColumnChanged(int col)=0
KexiTableViewData::Iterator * m_itemIterator
data item's iterator
virtual void startEditCurrentCell(const TQString &setText=TQString())
virtual void editorShowFocus(int row, int col)=0
virtual void updateCurrentCell()=0
KexiTableItem * m_currentItem
current data item
virtual void newItemAppendedForAfterDeletingInSpreadSheetMode()=0
Emitted for spreadsheet mode when an item was deleted and a new item has been appended.
bool m_owner
true if m_data member is owned by this object
virtual void selectPrevPage()
page up action
virtual void clearColumns(bool repaint=true)
An interface for declaring widgets to be data-aware.
Record marker, usually displayed at the left side of a table view or a continuous form.
KexiRecordNavigator class provides a record navigator.
Specifies options for find and replace operations.
A table view header with additional actions.
3-state logical type with three values: true, false and cancelled and convenient operators.
Definition tristate.h:100
High-level database connectivity library with database backend drivers.