1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxDataViewCtrl base classes
4 // Author: Robert Roebling
8 // Copyright: (c) Robert Roebling
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_DATAVIEW_H_BASE_
13 #define _WX_DATAVIEW_H_BASE_
17 #if wxUSE_DATAVIEWCTRL
19 #include "wx/control.h"
20 #include "wx/textctrl.h"
21 #include "wx/bitmap.h"
22 #include "wx/variant.h"
25 #if defined(__WXGTK20__)
27 // #define wxUSE_GENERICDATAVIEWCTRL 1
28 #elif defined(__WXMAC__)
29 #define wxUSE_GENERICDATAVIEWCTRL 1
31 #define wxUSE_GENERICDATAVIEWCTRL 1
34 // ----------------------------------------------------------------------------
35 // wxDataViewCtrl flags
36 // ----------------------------------------------------------------------------
38 // ----------------------------------------------------------------------------
39 // wxDataViewCtrl globals
40 // ----------------------------------------------------------------------------
42 class WXDLLIMPEXP_ADV wxDataViewModel
;
43 class WXDLLIMPEXP_ADV wxDataViewListModel
;
44 class WXDLLIMPEXP_ADV wxDataViewCtrl
;
45 class WXDLLIMPEXP_ADV wxDataViewColumn
;
46 class WXDLLIMPEXP_ADV wxDataViewRenderer
;
48 extern WXDLLIMPEXP_DATA_ADV(const wxChar
) wxDataViewCtrlNameStr
[];
50 // ---------------------------------------------------------
52 // ---------------------------------------------------------
54 class WXDLLIMPEXP_ADV wxDataViewModel
: public wxObject
58 virtual ~wxDataViewModel() { }
61 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewModel
)
64 // ---------------------------------------------------------
65 // wxDataViewListModelNotifier
66 // ---------------------------------------------------------
69 class WXDLLIMPEXP_ADV wxDataViewListModelNotifier
: public wxObject
72 wxDataViewListModelNotifier() { }
73 virtual ~wxDataViewListModelNotifier() { }
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;
84 void SetOwner( wxDataViewListModel
*owner
) { m_owner
= owner
; }
85 wxDataViewListModel
*GetOwner() { return m_owner
; }
88 wxDataViewListModel
*m_owner
;
91 // ---------------------------------------------------------
92 // wxDataViewListModel
93 // ---------------------------------------------------------
95 class WXDLLIMPEXP_ADV wxDataViewViewingColumn
: public wxObject
98 wxDataViewViewingColumn( wxDataViewColumn
*view_column
, unsigned int model_column
)
100 m_viewColumn
= view_column
;
101 m_modelColumn
= model_column
;
104 wxDataViewColumn
*m_viewColumn
;
105 unsigned int m_modelColumn
;
108 class WXDLLIMPEXP_ADV wxDataViewListModel
: public wxDataViewModel
111 wxDataViewListModel();
112 virtual ~wxDataViewListModel();
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;
123 // delegated notifiers
124 virtual bool RowAppended();
125 virtual bool RowPrepended();
126 virtual bool RowInserted( unsigned int before
);
127 virtual bool RowDeleted( unsigned int row
);
128 virtual bool RowChanged( unsigned int row
);
129 virtual bool ValueChanged( unsigned int col
, unsigned int row
);
130 virtual bool RowsReordered( unsigned int *new_order
);
131 virtual bool Cleared();
134 virtual void AddViewingColumn( wxDataViewColumn
*view_column
, unsigned int model_column
);
135 virtual void RemoveViewingColumn( wxDataViewColumn
*column
);
137 virtual void AddNotifier( wxDataViewListModelNotifier
*notifier
);
138 virtual void RemoveNotifier( wxDataViewListModelNotifier
*notifier
);
141 wxList m_viewingColumns
;
144 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewListModel
)
147 // ---------------------------------------------------------
148 // wxDataViewSortedListModel
149 // ---------------------------------------------------------
151 typedef int (wxCALLBACK
*wxDataViewListModelCompare
)
152 (unsigned int row1
, unsigned int row2
, unsigned int col
, wxDataViewListModel
* model
);
154 WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSortedIndexArray
, WXDLLIMPEXP_ADV
);
156 class WXDLLIMPEXP_ADV wxDataViewSortedListModel
: public wxDataViewListModel
159 wxDataViewSortedListModel( wxDataViewListModel
*child
);
160 virtual ~wxDataViewSortedListModel();
162 void SetAscending( bool ascending
) { m_ascending
= ascending
; }
163 bool GetAscending() { return m_ascending
; }
165 virtual unsigned int GetNumberOfRows();
166 virtual unsigned int GetNumberOfCols();
167 // return type as reported by wxVariant
168 virtual wxString
GetColType( unsigned int col
);
169 // get value into a wxVariant
170 virtual void GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
);
171 // set value, call ValueChanged() afterwards!
172 virtual bool SetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
);
175 virtual bool RowAppended();
176 virtual bool RowPrepended();
177 virtual bool RowInserted( unsigned int before
);
178 virtual bool RowDeleted( unsigned int row
);
179 virtual bool RowChanged( unsigned int row
);
180 virtual bool ValueChanged( unsigned int col
, unsigned int row
);
181 virtual bool RowsReordered( unsigned int *new_order
);
182 virtual bool Cleared();
184 // called if child's notifiers are called
185 bool ChildRowAppended();
186 bool ChildRowPrepended();
187 bool ChildRowInserted( unsigned int before
);
188 bool ChildRowDeleted( unsigned int row
);
189 bool ChildRowChanged( unsigned int row
);
190 bool ChildValueChanged( unsigned int col
, unsigned int row
);
191 bool ChildRowsReordered( unsigned int *new_order
);
194 virtual void Resort();
198 wxDataViewListModel
*m_child
;
199 wxDataViewSortedIndexArray m_array
;
200 wxDataViewListModelNotifier
*m_notifierOnChild
;
202 void InitStatics(); // BAD
205 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewSortedListModel
)
208 // ---------------------------------------------------------
209 // wxDataViewRendererBase
210 // ---------------------------------------------------------
212 enum wxDataViewCellMode
214 wxDATAVIEW_CELL_INERT
,
215 wxDATAVIEW_CELL_ACTIVATABLE
,
216 wxDATAVIEW_CELL_EDITABLE
219 enum wxDataViewCellRenderState
221 wxDATAVIEW_CELL_SELECTED
= 1,
222 wxDATAVIEW_CELL_PRELIT
= 2,
223 wxDATAVIEW_CELL_INSENSITIVE
= 4,
224 wxDATAVIEW_CELL_FOCUSED
= 8
227 class WXDLLIMPEXP_ADV wxDataViewRendererBase
: public wxObject
230 wxDataViewRendererBase( const wxString
&varianttype
, wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
);
232 virtual bool SetValue( const wxVariant
& WXUNUSED(value
) ) { return true; }
233 virtual bool GetValue( wxVariant
& WXUNUSED(value
) ) { return true; }
234 virtual bool Validate( wxVariant
& WXUNUSED(value
) ) { return true; }
236 wxString
GetVariantType() { return m_variantType
; }
237 wxDataViewCellMode
GetMode() { return m_mode
; }
239 void SetOwner( wxDataViewColumn
*owner
) { m_owner
= owner
; }
240 wxDataViewColumn
* GetOwner() { return m_owner
; }
243 wxDataViewCellMode m_mode
;
244 wxString m_variantType
;
245 wxDataViewColumn
*m_owner
;
248 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase
)
251 // ---------------------------------------------------------
252 // wxDataViewColumnBase
253 // ---------------------------------------------------------
255 enum wxDataViewColumnFlags
257 wxDATAVIEW_COL_RESIZABLE
= 1,
258 wxDATAVIEW_COL_SORTABLE
= 2,
259 wxDATAVIEW_COL_HIDDEN
= 4
262 class WXDLLIMPEXP_ADV wxDataViewColumnBase
: public wxObject
265 wxDataViewColumnBase( const wxString
&title
, wxDataViewRenderer
*renderer
, unsigned int model_column
,
266 int width
= 80, int flags
= wxDATAVIEW_COL_RESIZABLE
);
267 wxDataViewColumnBase( const wxBitmap
&bitmap
, wxDataViewRenderer
*renderer
, unsigned int model_column
,
268 int width
= 80, int flags
= wxDATAVIEW_COL_RESIZABLE
);
269 virtual ~wxDataViewColumnBase();
271 virtual void SetTitle( const wxString
&title
);
272 virtual wxString
GetTitle();
274 virtual void SetBitmap( const wxBitmap
&bitmap
);
275 virtual const wxBitmap
&GetBitmap();
277 virtual void SetAlignment( wxAlignment align
) = 0;
279 virtual void SetSortable( bool sortable
) = 0;
280 virtual bool GetSortable() = 0;
281 virtual void SetSortOrder( bool ascending
) = 0;
282 virtual bool IsSortOrderAscending() = 0;
284 wxDataViewRenderer
* GetRenderer() { return m_renderer
; }
286 unsigned int GetModelColumn() { return m_model_column
; }
288 void SetOwner( wxDataViewCtrl
*owner
) { m_owner
= owner
; }
289 wxDataViewCtrl
*GetOwner() { return m_owner
; }
291 virtual int GetWidth() = 0;
294 wxDataViewCtrl
*m_ctrl
;
295 wxDataViewRenderer
*m_renderer
;
300 wxDataViewCtrl
*m_owner
;
303 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumnBase
)
306 // ---------------------------------------------------------
307 // wxDataViewCtrlBase
308 // ---------------------------------------------------------
310 #define wxDV_SINGLE 0x0000 // for convenience
311 #define wxDV_MULTIPLE 0x0020 // can select multiple items
313 class WXDLLIMPEXP_ADV wxDataViewCtrlBase
: public wxControl
316 wxDataViewCtrlBase();
317 virtual ~wxDataViewCtrlBase();
319 virtual bool AssociateModel( wxDataViewListModel
*model
);
320 wxDataViewListModel
* GetModel();
323 virtual bool AppendTextColumn( const wxString
&label
, unsigned int model_column
);
324 virtual bool AppendToggleColumn( const wxString
&label
, unsigned int model_column
);
325 virtual bool AppendProgressColumn( const wxString
&label
, unsigned int model_column
);
326 virtual bool AppendDateColumn( const wxString
&label
, unsigned int model_column
);
327 virtual bool AppendBitmapColumn( const wxString
&label
, unsigned int model_column
);
328 virtual bool AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
);
329 virtual bool AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
);
330 virtual bool AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
);
331 virtual bool AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
);
332 virtual bool AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
);
334 virtual bool AppendColumn( wxDataViewColumn
*col
);
335 virtual unsigned int GetNumberOfColumns();
336 virtual bool DeleteColumn( unsigned int pos
);
337 virtual bool ClearColumns();
338 virtual wxDataViewColumn
* GetColumn( unsigned int pos
);
340 virtual void SetSelection( int row
) = 0; // -1 for unselect
341 inline void ClearSelection() { SetSelection( -1 ); }
342 virtual void Unselect( unsigned int row
) = 0;
343 virtual void SetSelectionRange( unsigned int from
, unsigned int to
) = 0;
344 virtual void SetSelections( const wxArrayInt
& aSelections
) = 0;
346 virtual bool IsSelected( unsigned int row
) const = 0;
347 virtual int GetSelection() const = 0;
348 virtual int GetSelections(wxArrayInt
& aSelections
) const = 0;
351 wxDataViewListModel
*m_model
;
355 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase
)
359 // ----------------------------------------------------------------------------
360 // wxDataViewEvent - the event class for the wxDataViewCtrl notifications
361 // ----------------------------------------------------------------------------
363 class WXDLLIMPEXP_ADV wxDataViewEvent
: public wxNotifyEvent
366 wxDataViewEvent(wxEventType commandType
= wxEVT_NULL
, int winid
= 0)
367 : wxNotifyEvent(commandType
, winid
),
371 m_value(wxNullVariant
),
372 m_editCancelled(false),
376 wxDataViewEvent(const wxDataViewEvent
& event
)
377 : wxNotifyEvent(event
),
380 m_model(event
.m_model
),
381 m_value(event
.m_value
),
382 m_editCancelled(event
.m_editCancelled
),
383 m_column(event
.m_column
)
386 int GetColumn() const { return m_col
; }
387 void SetColumn( int col
) { m_col
= col
; }
388 int GetRow() const { return m_row
; }
389 void SetRow( int row
) { m_row
= row
; }
390 wxDataViewModel
* GetModel() const { return m_model
; }
391 void SetModel( wxDataViewModel
*model
) { m_model
= model
; }
392 const wxVariant
&GetValue() const { return m_value
; }
393 void SetValue( const wxVariant
&value
) { m_value
= value
; }
395 // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only
396 void SetDataViewColumn( wxDataViewColumn
*col
) { m_column
= col
; }
397 wxDataViewColumn
*GetDataViewColumn() { return m_column
; }
399 // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only)
400 bool IsEditCancelled() const { return m_editCancelled
; }
401 void SetEditCanceled(bool editCancelled
) { m_editCancelled
= editCancelled
; }
403 virtual wxEvent
*Clone() const { return new wxDataViewEvent(*this); }
408 wxDataViewModel
*m_model
;
410 bool m_editCancelled
;
411 wxDataViewColumn
*m_column
;
414 DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent
)
417 BEGIN_DECLARE_EVENT_TYPES()
418 DECLARE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_SELECTED
, -1)
419 DECLARE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED
, -1)
420 DECLARE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
, -1)
421 DECLARE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
, -1)
422 END_DECLARE_EVENT_TYPES()
424 typedef void (wxEvtHandler::*wxDataViewEventFunction
)(wxDataViewEvent
&);
426 #define wxDataViewEventHandler(func) \
427 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func)
429 #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
430 wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
432 #define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn)
433 #define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn)
434 #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn)
435 #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
438 #if defined(wxUSE_GENERICDATAVIEWCTRL)
439 #include "wx/generic/dataview.h"
440 #elif defined(__WXGTK20__)
441 #include "wx/gtk/dataview.h"
442 #elif defined(__WXMAC__)
444 // #include "wx/mac/dataview.h"
446 #include "wx/generic/dataview.h"
449 #endif // wxUSE_DATAVIEWCTRL
452 // _WX_DATAVIEW_H_BASE_