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 void AddViewingColumn( wxDataViewColumn
*view_column
, unsigned int model_column
);
135 void RemoveViewingColumn( wxDataViewColumn
*column
);
137 void AddNotifier( wxDataViewListModelNotifier
*notifier
);
138 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 bool AppendTextColumn( const wxString
&label
, unsigned int model_column
,
324 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1 );
325 bool AppendToggleColumn( const wxString
&label
, unsigned int model_column
,
326 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= 30 );
327 bool AppendProgressColumn( const wxString
&label
, unsigned int model_column
,
328 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= 80 );
329 bool AppendDateColumn( const wxString
&label
, unsigned int model_column
,
330 wxDataViewCellMode mode
= wxDATAVIEW_CELL_ACTIVATABLE
, int width
= -1 );
331 bool AppendBitmapColumn( const wxString
&label
, unsigned int model_column
,
332 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1 );
333 bool AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
,
334 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1 );
335 bool AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
336 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= 30 );
337 bool AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
338 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= 80 );
339 bool AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
,
340 wxDataViewCellMode mode
= wxDATAVIEW_CELL_ACTIVATABLE
, int width
= -1 );
341 bool AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
342 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1 );
344 virtual bool AppendColumn( wxDataViewColumn
*col
);
345 virtual unsigned int GetNumberOfColumns();
346 virtual bool DeleteColumn( unsigned int pos
);
347 virtual bool ClearColumns();
348 virtual wxDataViewColumn
* GetColumn( unsigned int pos
);
350 virtual void SetSelection( int row
) = 0; // -1 for unselect
351 inline void ClearSelection() { SetSelection( -1 ); }
352 virtual void Unselect( unsigned int row
) = 0;
353 virtual void SetSelectionRange( unsigned int from
, unsigned int to
) = 0;
354 virtual void SetSelections( const wxArrayInt
& aSelections
) = 0;
356 virtual bool IsSelected( unsigned int row
) const = 0;
357 virtual int GetSelection() const = 0;
358 virtual int GetSelections(wxArrayInt
& aSelections
) const = 0;
361 wxDataViewListModel
*m_model
;
365 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase
)
369 // ----------------------------------------------------------------------------
370 // wxDataViewEvent - the event class for the wxDataViewCtrl notifications
371 // ----------------------------------------------------------------------------
373 class WXDLLIMPEXP_ADV wxDataViewEvent
: public wxNotifyEvent
376 wxDataViewEvent(wxEventType commandType
= wxEVT_NULL
, int winid
= 0)
377 : wxNotifyEvent(commandType
, winid
),
381 m_value(wxNullVariant
),
382 m_editCancelled(false),
386 wxDataViewEvent(const wxDataViewEvent
& event
)
387 : wxNotifyEvent(event
),
390 m_model(event
.m_model
),
391 m_value(event
.m_value
),
392 m_editCancelled(event
.m_editCancelled
),
393 m_column(event
.m_column
)
396 int GetColumn() const { return m_col
; }
397 void SetColumn( int col
) { m_col
= col
; }
398 int GetRow() const { return m_row
; }
399 void SetRow( int row
) { m_row
= row
; }
400 wxDataViewModel
* GetModel() const { return m_model
; }
401 void SetModel( wxDataViewModel
*model
) { m_model
= model
; }
402 const wxVariant
&GetValue() const { return m_value
; }
403 void SetValue( const wxVariant
&value
) { m_value
= value
; }
405 // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only
406 void SetDataViewColumn( wxDataViewColumn
*col
) { m_column
= col
; }
407 wxDataViewColumn
*GetDataViewColumn() { return m_column
; }
409 // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only)
410 bool IsEditCancelled() const { return m_editCancelled
; }
411 void SetEditCanceled(bool editCancelled
) { m_editCancelled
= editCancelled
; }
413 virtual wxEvent
*Clone() const { return new wxDataViewEvent(*this); }
418 wxDataViewModel
*m_model
;
420 bool m_editCancelled
;
421 wxDataViewColumn
*m_column
;
424 DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent
)
427 BEGIN_DECLARE_EVENT_TYPES()
428 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_ROW_SELECTED
, -1)
429 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED
, -1)
430 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
, -1)
431 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
, -1)
432 END_DECLARE_EVENT_TYPES()
434 typedef void (wxEvtHandler::*wxDataViewEventFunction
)(wxDataViewEvent
&);
436 #define wxDataViewEventHandler(func) \
437 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func)
439 #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
440 wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
442 #define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn)
443 #define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn)
444 #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn)
445 #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
448 #if defined(wxUSE_GENERICDATAVIEWCTRL)
449 #include "wx/generic/dataview.h"
450 #elif defined(__WXGTK20__)
451 #include "wx/gtk/dataview.h"
452 #elif defined(__WXMAC__)
454 // #include "wx/mac/dataview.h"
456 #include "wx/generic/dataview.h"
459 #endif // wxUSE_DATAVIEWCTRL
462 // _WX_DATAVIEW_H_BASE_