1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/dataview.h
3 // Purpose:     wxDataViewCtrl base classes
4 // Author:      Robert Roebling
5 // Modified by:
6 // Created:     08.01.06
7 // RCS-ID:      $Id: dataview.h 66925 2011-02-16 23:19:32Z JS $
8 // Copyright:   (c) Robert Roebling
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_DATAVIEW_H_BASE_
13 #define _WX_DATAVIEW_H_BASE_
14 
15 #include "wx/defs.h"
16 
17 #if wxUSE_DATAVIEWCTRL
18 
19 #include "wx/control.h"
20 #include "wx/textctrl.h"
21 #include "wx/bitmap.h"
22 #include "wx/variant.h"
23 
24 
25 #if defined(__WXGTK20__)
26     // for testing
27     // #define wxUSE_GENERICDATAVIEWCTRL 1
28 #elif defined(__WXMAC__)
29     #define wxUSE_GENERICDATAVIEWCTRL 1
30 #else
31     #define wxUSE_GENERICDATAVIEWCTRL 1
32 #endif
33 
34 // ----------------------------------------------------------------------------
35 // wxDataViewCtrl flags
36 // ----------------------------------------------------------------------------
37 
38 // ----------------------------------------------------------------------------
39 // wxDataViewCtrl globals
40 // ----------------------------------------------------------------------------
41 
42 class WXDLLIMPEXP_FWD_ADV wxDataViewModel;
43 class WXDLLIMPEXP_FWD_ADV wxDataViewListModel;
44 class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl;
45 class WXDLLIMPEXP_FWD_ADV wxDataViewColumn;
46 class WXDLLIMPEXP_FWD_ADV wxDataViewRenderer;
47 
48 extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxDataViewCtrlNameStr[];
49 
50 // ---------------------------------------------------------
51 // wxDataViewModel
52 // ---------------------------------------------------------
53 
54 class WXDLLIMPEXP_ADV wxDataViewModel: public wxObject
55 {
56 public:
wxDataViewModel()57     wxDataViewModel() { }
~wxDataViewModel()58     virtual ~wxDataViewModel() { }
59 
60 protected:
61     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewModel)
62 };
63 
64 // ---------------------------------------------------------
65 // wxDataViewListModelNotifier
66 // ---------------------------------------------------------
67 
68 
69 class WXDLLIMPEXP_ADV wxDataViewListModelNotifier: public wxObject
70 {
71 public:
wxDataViewListModelNotifier()72     wxDataViewListModelNotifier() { }
~wxDataViewListModelNotifier()73     virtual ~wxDataViewListModelNotifier() { }
74 
75     virtual bool RowAppended() = 0;
76     virtual bool RowPrepended() = 0;
77     virtual bool RowInserted( unsigned int before ) = 0;
78     virtual bool RowDeleted( unsigned int row ) = 0;
79     virtual bool RowChanged( unsigned int row ) = 0;
80     virtual bool ValueChanged( unsigned int col, unsigned int row ) = 0;
81     virtual bool RowsReordered( unsigned int *new_order ) = 0;
82     virtual bool Cleared() = 0;
83 
SetOwner(wxDataViewListModel * owner)84     void SetOwner( wxDataViewListModel *owner ) { m_owner = owner; }
GetOwner()85     wxDataViewListModel *GetOwner()             { return m_owner; }
86 
87 private:
88     wxDataViewListModel *m_owner;
89 };
90 
91 // ---------------------------------------------------------
92 // wxDataViewListModel
93 // ---------------------------------------------------------
94 
95 class WXDLLIMPEXP_ADV wxDataViewViewingColumn: public wxObject
96 {
97 public:
wxDataViewViewingColumn(wxDataViewColumn * view_column,unsigned int model_column)98     wxDataViewViewingColumn( wxDataViewColumn *view_column, unsigned int model_column )
99     {
100         m_viewColumn = view_column;
101         m_modelColumn = model_column;
102     }
103 
104     wxDataViewColumn   *m_viewColumn;
105     unsigned int        m_modelColumn;
106 };
107 
108 class WXDLLIMPEXP_ADV wxDataViewListModel: public wxDataViewModel
109 {
110 public:
111     wxDataViewListModel();
112     virtual ~wxDataViewListModel();
113 
114     virtual unsigned int GetNumberOfRows() = 0;
115     virtual unsigned int GetNumberOfCols() = 0;
116     // return type as reported by wxVariant
117     virtual wxString GetColType( unsigned int col ) = 0;
118     // get value into a wxVariant
119     virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0;
120     // set value, call ValueChanged() afterwards!
121     virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0;
122 
123 #if wxABI_VERSION >= 20812
124     // Notes:
125     // - In wx 2.9 GetValue/SetValue are removed, replaced with GetValueByRow and SetValueByRow
126     // - GetValueByRow/SetValueByRow has (row,col) parameters, GetValue/SetValue is vice versa, (col,row)
127 
128     // virtual in wx 2.9
GetValueByRow(wxVariant & variant,unsigned row,unsigned col)129     void GetValueByRow(wxVariant& variant, unsigned row, unsigned col) const
130     {
131         const_cast<wxDataViewListModel*>(this)->GetValue(variant, col, row);
132     }
133 
134     // virtual in wx 2.9
SetValueByRow(const wxVariant & variant,unsigned row,unsigned col)135     bool SetValueByRow(const wxVariant& variant, unsigned row, unsigned col)
136     {
137         return SetValue((wxVariant&)variant, col, row);
138     }
139 #endif // wx >= 2.8.12
140 
141     // delegated notifiers
142     virtual bool RowAppended();
143     virtual bool RowPrepended();
144     virtual bool RowInserted( unsigned int before );
145     virtual bool RowDeleted( unsigned int row );
146     virtual bool RowChanged( unsigned int row );
147     virtual bool ValueChanged( unsigned int col, unsigned int row );
148     virtual bool RowsReordered( unsigned int *new_order );
149     virtual bool Cleared();
150 
151     // Used internally
152     void AddViewingColumn( wxDataViewColumn *view_column, unsigned int model_column );
153     void RemoveViewingColumn( wxDataViewColumn *column );
154 
155     void AddNotifier( wxDataViewListModelNotifier *notifier );
156     void RemoveNotifier( wxDataViewListModelNotifier *notifier );
157 
158     wxList                      m_notifiers;
159     wxList                      m_viewingColumns;
160 
161 protected:
162     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewListModel)
163 };
164 
165 // ---------------------------------------------------------
166 // wxDataViewSortedListModel
167 // ---------------------------------------------------------
168 
169 typedef int (wxCALLBACK *wxDataViewListModelCompare)
170     (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model );
171 
172 WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSortedIndexArray, WXDLLIMPEXP_ADV);
173 
174 class WXDLLIMPEXP_ADV wxDataViewSortedListModel: public wxDataViewListModel
175 {
176 public:
177     wxDataViewSortedListModel( wxDataViewListModel *child );
178     virtual ~wxDataViewSortedListModel();
179 
SetAscending(bool ascending)180     void SetAscending( bool ascending ) { m_ascending = ascending; }
GetAscending()181     bool GetAscending() { return m_ascending; }
182 
183     virtual unsigned int GetNumberOfRows();
184     virtual unsigned int GetNumberOfCols();
185     // return type as reported by wxVariant
186     virtual wxString GetColType( unsigned int col );
187     // get value into a wxVariant
188     virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row );
189     // set value, call ValueChanged() afterwards!
190     virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row );
191 
192     // called from user
193     virtual bool RowAppended();
194     virtual bool RowPrepended();
195     virtual bool RowInserted( unsigned int before );
196     virtual bool RowDeleted( unsigned int row );
197     virtual bool RowChanged( unsigned int row );
198     virtual bool ValueChanged( unsigned int col, unsigned int row );
199     virtual bool RowsReordered( unsigned int *new_order );
200     virtual bool Cleared();
201 
202     // called if child's notifiers are called
203     bool ChildRowAppended();
204     bool ChildRowPrepended();
205     bool ChildRowInserted( unsigned int before );
206     bool ChildRowDeleted( unsigned int row );
207     bool ChildRowChanged( unsigned int row );
208     bool ChildValueChanged( unsigned int col, unsigned int row );
209     bool ChildRowsReordered( unsigned int *new_order );
210     bool ChildCleared();
211 
212     virtual void Resort();
213 
214 private:
215     bool                             m_ascending;
216     wxDataViewListModel             *m_child;
217     wxDataViewSortedIndexArray       m_array;
218     wxDataViewListModelNotifier     *m_notifierOnChild;
219 
220     void InitStatics(); // BAD
221 
222 protected:
223     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewSortedListModel)
224 };
225 
226 // ---------------------------------------------------------
227 // wxDataViewRendererBase
228 // ---------------------------------------------------------
229 
230 enum wxDataViewCellMode
231 {
232     wxDATAVIEW_CELL_INERT,
233     wxDATAVIEW_CELL_ACTIVATABLE,
234     wxDATAVIEW_CELL_EDITABLE
235 };
236 
237 enum wxDataViewCellRenderState
238 {
239     wxDATAVIEW_CELL_SELECTED    = 1,
240     wxDATAVIEW_CELL_PRELIT      = 2,
241     wxDATAVIEW_CELL_INSENSITIVE = 4,
242     wxDATAVIEW_CELL_FOCUSED     = 8
243 };
244 
245 class WXDLLIMPEXP_ADV wxDataViewRendererBase: public wxObject
246 {
247 public:
248     wxDataViewRendererBase( const wxString &varianttype, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
249 
SetValue(const wxVariant & WXUNUSED (value))250     virtual bool SetValue( const wxVariant& WXUNUSED(value) ) { return true; }
GetValue(wxVariant & WXUNUSED (value))251     virtual bool GetValue( wxVariant& WXUNUSED(value) )       { return true; }
Validate(wxVariant & WXUNUSED (value))252     virtual bool Validate( wxVariant& WXUNUSED(value) )       { return true; }
253 
GetVariantType()254     wxString GetVariantType()       { return m_variantType; }
GetMode()255     wxDataViewCellMode GetMode()    { return m_mode; }
256 
SetOwner(wxDataViewColumn * owner)257     void SetOwner( wxDataViewColumn *owner )    { m_owner = owner; }
GetOwner()258     wxDataViewColumn* GetOwner()                { return m_owner; }
259 
260 protected:
261     wxDataViewCellMode      m_mode;
262     wxString                m_variantType;
263     wxDataViewColumn       *m_owner;
264 
265 protected:
266     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase)
267 };
268 
269 // ---------------------------------------------------------
270 // wxDataViewColumnBase
271 // ---------------------------------------------------------
272 
273 enum wxDataViewColumnFlags
274 {
275     wxDATAVIEW_COL_RESIZABLE  = 1,
276     wxDATAVIEW_COL_SORTABLE   = 2,
277     wxDATAVIEW_COL_HIDDEN     = 4
278 };
279 
280 class WXDLLIMPEXP_ADV wxDataViewColumnBase: public wxObject
281 {
282 public:
283     wxDataViewColumnBase( const wxString &title, wxDataViewRenderer *renderer, unsigned int model_column,
284         int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE );
285     wxDataViewColumnBase( const wxBitmap &bitmap, wxDataViewRenderer *renderer, unsigned int model_column,
286         int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE );
287     virtual ~wxDataViewColumnBase();
288 
289     virtual void SetTitle( const wxString &title );
290     virtual wxString GetTitle();
291 
292     virtual void SetBitmap( const wxBitmap &bitmap );
293     virtual const wxBitmap &GetBitmap();
294 
295     virtual void SetAlignment( wxAlignment align ) = 0;
296 
297     virtual void SetSortable( bool sortable ) = 0;
298     virtual bool GetSortable() = 0;
299     virtual void SetSortOrder( bool ascending ) = 0;
300     virtual bool IsSortOrderAscending() = 0;
301 
GetRenderer()302     wxDataViewRenderer* GetRenderer()       { return m_renderer; }
303 
GetModelColumn()304     unsigned int GetModelColumn()           { return m_model_column; }
305 
SetOwner(wxDataViewCtrl * owner)306     virtual void SetOwner( wxDataViewCtrl *owner )  { m_owner = owner; }
GetOwner()307     wxDataViewCtrl *GetOwner()              { return m_owner; }
308 
309     virtual int GetWidth() = 0;
310 
311 private:
312     wxDataViewCtrl          *m_ctrl;
313     wxDataViewRenderer      *m_renderer;
314     int                      m_model_column;
315     int                      m_flags;
316     wxString                 m_title;
317     wxBitmap                 m_bitmap;
318     wxDataViewCtrl          *m_owner;
319 
320 protected:
321     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumnBase)
322 };
323 
324 // ---------------------------------------------------------
325 // wxDataViewCtrlBase
326 // ---------------------------------------------------------
327 
328 #define wxDV_SINGLE                  0x0000     // for convenience
329 #define wxDV_MULTIPLE                0x0020     // can select multiple items
330 
331 class WXDLLIMPEXP_ADV wxDataViewCtrlBase: public wxControl
332 {
333 public:
334     wxDataViewCtrlBase();
335     virtual ~wxDataViewCtrlBase();
336 
337     virtual bool AssociateModel( wxDataViewListModel *model );
338     wxDataViewListModel* GetModel();
339 
340     // short cuts
341     bool AppendTextColumn( const wxString &label, unsigned int model_column,
342                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 );
343     bool AppendToggleColumn( const wxString &label, unsigned int model_column,
344                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 );
345     bool AppendProgressColumn( const wxString &label, unsigned int model_column,
346                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 );
347     bool AppendDateColumn( const wxString &label, unsigned int model_column,
348                     wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 );
349     bool AppendBitmapColumn( const wxString &label, unsigned int model_column,
350                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 );
351     bool AppendTextColumn( const wxBitmap &label, unsigned int model_column,
352                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 );
353     bool AppendToggleColumn( const wxBitmap &label, unsigned int model_column,
354                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 );
355     bool AppendProgressColumn( const wxBitmap &label, unsigned int model_column,
356                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 );
357     bool AppendDateColumn( const wxBitmap &label, unsigned int model_column,
358                     wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 );
359     bool AppendBitmapColumn( const wxBitmap &label, unsigned int model_column,
360                     wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 );
361 
362     virtual bool AppendColumn( wxDataViewColumn *col );
363     virtual unsigned int GetNumberOfColumns();
364     virtual bool DeleteColumn( unsigned int pos );
365     virtual bool ClearColumns();
366     virtual wxDataViewColumn* GetColumn( unsigned int pos );
367 
368     virtual void SetSelection( int row ) = 0; // -1 for unselect
ClearSelection()369     inline void ClearSelection() { SetSelection( -1 ); }
370     virtual void Unselect( unsigned int row ) = 0;
371     virtual void SetSelectionRange( unsigned int from, unsigned int to ) = 0;
372     virtual void SetSelections( const wxArrayInt& aSelections) = 0;
373 
374     virtual bool IsSelected( unsigned int row ) const = 0;
375     virtual int GetSelection() const = 0;
376     virtual int GetSelections(wxArrayInt& aSelections) const = 0;
377 
378 private:
379     wxDataViewListModel    *m_model;
380     wxList                  m_cols;
381 
382 protected:
383     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase)
384 };
385 
386 
387 // ----------------------------------------------------------------------------
388 // wxDataViewEvent - the event class for the wxDataViewCtrl notifications
389 // ----------------------------------------------------------------------------
390 
391 class WXDLLIMPEXP_ADV wxDataViewEvent : public wxNotifyEvent
392 {
393 public:
394     wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
wxNotifyEvent(commandType,winid)395         : wxNotifyEvent(commandType, winid),
396         m_col(-1),
397         m_row(-1),
398         m_model(NULL),
399         m_value(wxNullVariant),
400         m_editCancelled(false),
401         m_column(NULL)
402         { }
403 
wxDataViewEvent(const wxDataViewEvent & event)404     wxDataViewEvent(const wxDataViewEvent& event)
405         : wxNotifyEvent(event),
406         m_col(event.m_col),
407         m_row(event.m_col),
408         m_model(event.m_model),
409         m_value(event.m_value),
410         m_editCancelled(event.m_editCancelled),
411         m_column(event.m_column)
412         { }
413 
GetColumn()414     int GetColumn() const { return m_col; }
SetColumn(int col)415     void SetColumn( int col ) { m_col = col; }
GetRow()416     int GetRow() const { return m_row; }
SetRow(int row)417     void SetRow( int row ) { m_row = row; }
GetModel()418     wxDataViewModel* GetModel() const { return m_model; }
SetModel(wxDataViewModel * model)419     void SetModel( wxDataViewModel *model ) { m_model = model; }
GetValue()420     const wxVariant &GetValue() const { return m_value; }
SetValue(const wxVariant & value)421     void SetValue( const wxVariant &value ) { m_value = value; }
422 
423     // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only
SetDataViewColumn(wxDataViewColumn * col)424     void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; }
GetDataViewColumn()425     wxDataViewColumn *GetDataViewColumn() { return m_column; }
426 
427     // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only)
IsEditCancelled()428     bool IsEditCancelled() const { return m_editCancelled; }
SetEditCanceled(bool editCancelled)429     void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; }
430 
Clone()431     virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); }
432 
433 protected:
434     int                 m_col;
435     int                 m_row;
436     wxDataViewModel    *m_model;
437     wxVariant           m_value;
438     bool                m_editCancelled;
439     wxDataViewColumn   *m_column;
440 
441 private:
442     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent)
443 };
444 
445 BEGIN_DECLARE_EVENT_TYPES()
446     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, -1)
447     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, -1)
448     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, -1)
449     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, -1)
450 END_DECLARE_EVENT_TYPES()
451 
452 typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
453 
454 #define wxDataViewEventHandler(func) \
455     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func)
456 
457 #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
458     wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
459 
460 #define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn)
461 #define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn)
462 #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn)
463 #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
464 
465 
466 #if defined(wxUSE_GENERICDATAVIEWCTRL)
467     #include "wx/generic/dataview.h"
468 #elif defined(__WXGTK20__)
469     #include "wx/gtk/dataview.h"
470 #elif defined(__WXMAC__)
471     // TODO
472     // #include "wx/mac/dataview.h"
473 #else
474     #include "wx/generic/dataview.h"
475 #endif
476 
477 #endif // wxUSE_DATAVIEWCTRL
478 
479 #endif
480     // _WX_DATAVIEW_H_BASE_
481