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 // the default width of new (text) columns:
51 #define wxDVC_DEFAULT_WIDTH 80
53 // the default width of new toggle columns:
54 #define wxDVC_TOGGLE_DEFAULT_WIDTH 30
56 // the default minimal width of the columns:
57 #define wxDVC_DEFAULT_MINWIDTH 30
59 // the default alignment of wxDataViewRenderers:
60 #define wxDVR_DEFAULT_ALIGNMENT (wxALIGN_LEFT|wxALIGN_TOP)
63 // ---------------------------------------------------------
65 // ---------------------------------------------------------
67 class WXDLLIMPEXP_ADV wxDataViewModel
: public wxObjectRefData
73 // the user should not delete this class directly: he should use DecRef() instead!
74 virtual ~wxDataViewModel() { }
77 // ---------------------------------------------------------
78 // wxDataViewListModelNotifier
79 // ---------------------------------------------------------
81 class WXDLLIMPEXP_ADV wxDataViewListModelNotifier
: public wxObject
84 wxDataViewListModelNotifier() { }
85 virtual ~wxDataViewListModelNotifier() { }
87 virtual bool RowAppended() = 0;
88 virtual bool RowPrepended() = 0;
89 virtual bool RowInserted( unsigned int before
) = 0;
90 virtual bool RowDeleted( unsigned int row
) = 0;
91 virtual bool RowChanged( unsigned int row
) = 0;
92 virtual bool ValueChanged( unsigned int col
, unsigned int row
) = 0;
93 virtual bool RowsReordered( unsigned int *new_order
) = 0;
94 virtual bool Cleared() = 0;
96 { m_owner
= NULL
; return true; }
98 void SetOwner( wxDataViewListModel
*owner
) { m_owner
= owner
; }
99 wxDataViewListModel
*GetOwner() { return m_owner
; }
102 wxDataViewListModel
*m_owner
;
105 // ---------------------------------------------------------
106 // wxDataViewListModel
107 // ---------------------------------------------------------
109 class WXDLLIMPEXP_ADV wxDataViewViewingColumn
: public wxObject
112 wxDataViewViewingColumn( wxDataViewColumn
*view_column
, unsigned int model_column
)
114 m_viewColumn
= view_column
;
115 m_modelColumn
= model_column
;
118 wxDataViewColumn
*m_viewColumn
;
119 unsigned int m_modelColumn
;
122 class WXDLLIMPEXP_ADV wxDataViewListModel
: public wxDataViewModel
124 friend class WXDLLIMPEXP_ADV wxDataViewCtrl
;
125 friend class WXDLLIMPEXP_ADV wxDataViewCtrlBase
;
126 friend class WXDLLIMPEXP_ADV wxDataViewSortedListModel
;
127 friend class WXDLLIMPEXP_ADV wxDataViewColumnBase
;
128 friend class WXDLLIMPEXP_ADV wxGtkDataViewListModelNotifier
;
131 wxDataViewListModel();
133 virtual unsigned int GetRowCount() const = 0;
134 virtual unsigned int GetColumnCount() const = 0;
136 // return type as reported by wxVariant
137 virtual wxString
GetColumnType( unsigned int col
) const = 0;
139 // get value into a wxVariant
140 virtual void GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
) const = 0;
142 // set value, call ValueChanged() afterwards!
143 virtual bool SetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
) = 0;
145 // delegated notifiers
146 virtual bool RowAppended();
147 virtual bool RowPrepended();
148 virtual bool RowInserted( unsigned int before
);
149 virtual bool RowDeleted( unsigned int row
);
150 virtual bool RowChanged( unsigned int row
);
151 virtual bool ValueChanged( unsigned int col
, unsigned int row
);
152 virtual bool RowsReordered( unsigned int *new_order
);
153 virtual bool Cleared();
156 // the user should not delete this class directly: he should use DecRef() instead!
157 virtual ~wxDataViewListModel();
160 void AddViewingColumn( wxDataViewColumn
*view_column
, unsigned int model_column
);
161 void RemoveViewingColumn( wxDataViewColumn
*column
);
163 void AddNotifier( wxDataViewListModelNotifier
*notifier
);
164 void RemoveNotifier( wxDataViewListModelNotifier
*notifier
);
167 wxList m_viewingColumns
;
172 // ---------------------------------------------------------
173 // wxDataViewSortedListModel
174 // ---------------------------------------------------------
176 typedef int (wxCALLBACK
*wxDataViewListModelCompare
)
177 (unsigned int row1
, unsigned int row2
, unsigned int col
, wxDataViewListModel
* model
);
179 WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int,
180 wxDataViewSortedIndexArray
, WXDLLIMPEXP_ADV
);
182 class WXDLLIMPEXP_ADV wxDataViewSortedListModel
: public wxDataViewListModel
184 friend class wxDataViewSortedListModelNotifier
;
187 wxDataViewSortedListModel( wxDataViewListModel
*child
);
188 virtual ~wxDataViewSortedListModel();
190 void SetAscending( bool ascending
) { m_ascending
= ascending
; }
191 bool IsAscending() const { return m_ascending
; }
193 virtual unsigned int GetRowCount() const;
194 virtual unsigned int GetColumnCount() const;
196 // return type as reported by wxVariant
197 virtual wxString
GetColumnType( unsigned int col
) const;
199 // get value into a wxVariant
200 virtual void GetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
) const;
202 // set value, call ValueChanged() afterwards!
203 virtual bool SetValue( wxVariant
&variant
, unsigned int col
, unsigned int row
);
206 virtual bool RowAppended();
207 virtual bool RowPrepended();
208 virtual bool RowInserted( unsigned int before
);
209 virtual bool RowDeleted( unsigned int row
);
210 virtual bool RowChanged( unsigned int row
);
211 virtual bool ValueChanged( unsigned int col
, unsigned int row
);
212 virtual bool RowsReordered( unsigned int *new_order
);
213 virtual bool Cleared();
215 // called if child's notifiers are called
216 bool ChildRowAppended();
217 bool ChildRowPrepended();
218 bool ChildRowInserted( unsigned int before
);
219 bool ChildRowDeleted( unsigned int row
);
220 bool ChildRowChanged( unsigned int row
);
221 bool ChildValueChanged( unsigned int col
, unsigned int row
);
222 bool ChildRowsReordered( unsigned int *new_order
);
225 virtual void Resort();
229 wxDataViewListModel
*m_child
;
230 wxDataViewSortedIndexArray m_array
;
231 wxDataViewListModelNotifier
*m_notifierOnChild
;
233 void InitStatics(); // BAD
236 // ---------------------------------------------------------
237 // wxDataViewRendererBase
238 // ---------------------------------------------------------
240 enum wxDataViewCellMode
242 wxDATAVIEW_CELL_INERT
,
243 wxDATAVIEW_CELL_ACTIVATABLE
,
244 wxDATAVIEW_CELL_EDITABLE
247 enum wxDataViewCellRenderState
249 wxDATAVIEW_CELL_SELECTED
= 1,
250 wxDATAVIEW_CELL_PRELIT
= 2,
251 wxDATAVIEW_CELL_INSENSITIVE
= 4,
252 wxDATAVIEW_CELL_FOCUSED
= 8
255 class WXDLLIMPEXP_ADV wxDataViewRendererBase
: public wxObject
258 wxDataViewRendererBase( const wxString
&varianttype
,
259 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
260 int alignment
= wxDVR_DEFAULT_ALIGNMENT
);
262 virtual bool Validate( wxVariant
& WXUNUSED(value
) )
265 void SetOwner( wxDataViewColumn
*owner
) { m_owner
= owner
; }
266 wxDataViewColumn
* GetOwner() { return m_owner
; }
268 // renderer properties:
270 virtual bool SetValue( const wxVariant
& WXUNUSED(value
) ) = 0;
271 virtual bool GetValue( wxVariant
& WXUNUSED(value
) ) const = 0;
273 wxString
GetVariantType() const { return m_variantType
; }
275 virtual void SetMode( wxDataViewCellMode mode
) = 0;
276 virtual wxDataViewCellMode
GetMode() const = 0;
278 // NOTE: Set/GetAlignment do not take/return a wxAlignment enum but
279 // rather an "int"; that's because for rendering cells it's allowed
280 // to combine alignment flags (e.g. wxALIGN_LEFT|wxALIGN_BOTTOM)
281 virtual void SetAlignment( int align
) = 0;
282 virtual int GetAlignment() const = 0;
285 wxString m_variantType
;
286 wxDataViewColumn
*m_owner
;
289 const wxDataViewCtrl
* GetView() const;
292 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase
)
295 // ---------------------------------------------------------
296 // wxDataViewColumnBase
297 // ---------------------------------------------------------
299 enum wxDataViewColumnFlags
301 wxDATAVIEW_COL_RESIZABLE
= 1,
302 wxDATAVIEW_COL_SORTABLE
= 2,
303 wxDATAVIEW_COL_HIDDEN
= 4
306 class WXDLLIMPEXP_ADV wxDataViewColumnBase
: public wxObject
309 wxDataViewColumnBase( const wxString
&title
, wxDataViewRenderer
*renderer
,
310 unsigned int model_column
, int width
= wxDVC_DEFAULT_WIDTH
,
311 wxAlignment align
= wxALIGN_CENTER
,
312 int flags
= wxDATAVIEW_COL_RESIZABLE
);
313 wxDataViewColumnBase( const wxBitmap
&bitmap
, wxDataViewRenderer
*renderer
,
314 unsigned int model_column
, int width
= wxDVC_DEFAULT_WIDTH
,
315 wxAlignment align
= wxALIGN_CENTER
,
316 int flags
= wxDATAVIEW_COL_RESIZABLE
);
317 virtual ~wxDataViewColumnBase();
321 virtual void SetTitle( const wxString
&title
) = 0;
322 virtual void SetAlignment( wxAlignment align
) = 0;
323 virtual void SetSortable( bool sortable
) = 0;
324 virtual void SetResizeable( bool resizeable
) = 0;
325 virtual void SetHidden( bool hidden
) = 0;
326 virtual void SetSortOrder( bool ascending
) = 0;
327 virtual void SetFlags( int flags
);
328 virtual void SetOwner( wxDataViewCtrl
*owner
)
330 virtual void SetBitmap( const wxBitmap
&bitmap
)
333 virtual void SetMinWidth( int minWidth
) = 0;
334 virtual void SetWidth( int width
) = 0;
339 virtual wxString
GetTitle() const = 0;
340 virtual wxAlignment
GetAlignment() const = 0;
341 virtual int GetWidth() const = 0;
342 virtual int GetMinWidth() const = 0;
344 virtual int GetFlags() const;
346 virtual bool IsSortable() const = 0;
347 virtual bool IsResizeable() const = 0;
348 virtual bool IsHidden() const = 0;
349 virtual bool IsSortOrderAscending() const = 0;
351 const wxBitmap
&GetBitmap() const { return m_bitmap
; }
352 unsigned int GetModelColumn() const { return m_model_column
; }
354 wxDataViewCtrl
*GetOwner() { return m_owner
; }
355 wxDataViewRenderer
* GetRenderer() { return m_renderer
; }
358 wxDataViewRenderer
*m_renderer
;
361 wxDataViewCtrl
*m_owner
;
364 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumnBase
)
367 // ---------------------------------------------------------
368 // wxDataViewCtrlBase
369 // ---------------------------------------------------------
371 #define wxDV_SINGLE 0x0000 // for convenience
372 #define wxDV_MULTIPLE 0x0001 // can select multiple items
374 #define wxDV_NO_HEADER 0x0002 // column titles not visible
375 #define wxDV_HORIZ_RULES 0x0004 // light horizontal rules between rows
376 #define wxDV_VERT_RULES 0x0008 // light vertical rules between columns
378 class WXDLLIMPEXP_ADV wxDataViewCtrlBase
: public wxControl
381 wxDataViewCtrlBase();
382 virtual ~wxDataViewCtrlBase();
384 virtual bool AssociateModel( wxDataViewListModel
*model
);
385 wxDataViewListModel
* GetModel();
388 bool AppendTextColumn( const wxString
&label
, unsigned int model_column
,
389 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1,
390 wxAlignment align
= wxALIGN_CENTER
,
391 int flags
= wxDATAVIEW_COL_RESIZABLE
);
392 bool AppendToggleColumn( const wxString
&label
, unsigned int model_column
,
393 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= wxDVC_TOGGLE_DEFAULT_WIDTH
,
394 wxAlignment align
= wxALIGN_CENTER
,
395 int flags
= wxDATAVIEW_COL_RESIZABLE
);
396 bool AppendProgressColumn( const wxString
&label
, unsigned int model_column
,
397 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= wxDVC_DEFAULT_WIDTH
,
398 wxAlignment align
= wxALIGN_CENTER
,
399 int flags
= wxDATAVIEW_COL_RESIZABLE
);
400 bool AppendDateColumn( const wxString
&label
, unsigned int model_column
,
401 wxDataViewCellMode mode
= wxDATAVIEW_CELL_ACTIVATABLE
, int width
= -1,
402 wxAlignment align
= wxALIGN_CENTER
,
403 int flags
= wxDATAVIEW_COL_RESIZABLE
);
404 bool AppendBitmapColumn( const wxString
&label
, unsigned int model_column
,
405 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1,
406 wxAlignment align
= wxALIGN_CENTER
,
407 int flags
= wxDATAVIEW_COL_RESIZABLE
);
408 bool AppendTextColumn( const wxBitmap
&label
, unsigned int model_column
,
409 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1,
410 wxAlignment align
= wxALIGN_CENTER
,
411 int flags
= wxDATAVIEW_COL_RESIZABLE
);
412 bool AppendToggleColumn( const wxBitmap
&label
, unsigned int model_column
,
413 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= wxDVC_TOGGLE_DEFAULT_WIDTH
,
414 wxAlignment align
= wxALIGN_CENTER
,
415 int flags
= wxDATAVIEW_COL_RESIZABLE
);
416 bool AppendProgressColumn( const wxBitmap
&label
, unsigned int model_column
,
417 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= wxDVC_DEFAULT_WIDTH
,
418 wxAlignment align
= wxALIGN_CENTER
,
419 int flags
= wxDATAVIEW_COL_RESIZABLE
);
420 bool AppendDateColumn( const wxBitmap
&label
, unsigned int model_column
,
421 wxDataViewCellMode mode
= wxDATAVIEW_CELL_ACTIVATABLE
, int width
= -1,
422 wxAlignment align
= wxALIGN_CENTER
,
423 int flags
= wxDATAVIEW_COL_RESIZABLE
);
424 bool AppendBitmapColumn( const wxBitmap
&label
, unsigned int model_column
,
425 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
, int width
= -1,
426 wxAlignment align
= wxALIGN_CENTER
,
427 int flags
= wxDATAVIEW_COL_RESIZABLE
);
429 virtual bool AppendColumn( wxDataViewColumn
*col
);
431 virtual unsigned int GetColumnCount() const;
433 virtual bool DeleteColumn( unsigned int pos
);
434 virtual bool ClearColumns();
435 virtual wxDataViewColumn
* GetColumn( unsigned int pos
);
437 virtual void SetSelection( int row
) = 0; // -1 for unselect
438 inline void ClearSelection() { SetSelection( -1 ); }
439 virtual void Unselect( unsigned int row
) = 0;
440 virtual void SetSelectionRange( unsigned int from
, unsigned int to
) = 0;
441 virtual void SetSelections( const wxArrayInt
& aSelections
) = 0;
443 virtual bool IsSelected( unsigned int row
) const = 0;
444 virtual int GetSelection() const = 0;
445 virtual int GetSelections(wxArrayInt
& aSelections
) const = 0;
448 wxDataViewListModel
*m_model
;
452 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase
)
456 // ----------------------------------------------------------------------------
457 // wxDataViewEvent - the event class for the wxDataViewCtrl notifications
458 // ----------------------------------------------------------------------------
460 class WXDLLIMPEXP_ADV wxDataViewEvent
: public wxNotifyEvent
463 wxDataViewEvent(wxEventType commandType
= wxEVT_NULL
, int winid
= 0)
464 : wxNotifyEvent(commandType
, winid
),
468 m_value(wxNullVariant
),
469 m_editCancelled(false),
473 wxDataViewEvent(const wxDataViewEvent
& event
)
474 : wxNotifyEvent(event
),
477 m_model(event
.m_model
),
478 m_value(event
.m_value
),
479 m_editCancelled(event
.m_editCancelled
),
480 m_column(event
.m_column
)
483 int GetColumn() const { return m_col
; }
484 void SetColumn( int col
) { m_col
= col
; }
486 int GetRow() const { return m_row
; }
487 void SetRow( int row
) { m_row
= row
; }
489 wxDataViewModel
* GetModel() const { return m_model
; }
490 void SetModel( wxDataViewModel
*model
) { m_model
= model
; }
492 const wxVariant
&GetValue() const { return m_value
; }
493 void SetValue( const wxVariant
&value
) { m_value
= value
; }
495 // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only
496 void SetDataViewColumn( wxDataViewColumn
*col
) { m_column
= col
; }
497 wxDataViewColumn
*GetDataViewColumn() const { return m_column
; }
499 // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only)
500 bool IsEditCancelled() const { return m_editCancelled
; }
501 void SetEditCanceled(bool editCancelled
) { m_editCancelled
= editCancelled
; }
503 virtual wxEvent
*Clone() const { return new wxDataViewEvent(*this); }
508 wxDataViewModel
*m_model
;
510 bool m_editCancelled
;
511 wxDataViewColumn
*m_column
;
514 DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent
)
517 BEGIN_DECLARE_EVENT_TYPES()
518 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_ROW_SELECTED
, -1)
519 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED
, -1)
520 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK
, -1)
521 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV
, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
, -1)
522 END_DECLARE_EVENT_TYPES()
524 typedef void (wxEvtHandler::*wxDataViewEventFunction
)(wxDataViewEvent
&);
526 #define wxDataViewEventHandler(func) \
527 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func)
529 #define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
530 wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
532 #define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn)
533 #define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn)
534 #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn)
535 #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
538 #if defined(wxUSE_GENERICDATAVIEWCTRL)
539 #include "wx/generic/dataview.h"
540 #elif defined(__WXGTK20__)
541 #include "wx/gtk/dataview.h"
542 #elif defined(__WXMAC__)
544 // #include "wx/mac/dataview.h"
546 #include "wx/generic/dataview.h"
549 #endif // wxUSE_DATAVIEWCTRL
552 // _WX_DATAVIEW_H_BASE_