1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/generic/dataview.h
3 // Purpose: wxDataViewCtrl generic implementation header
4 // Author: Robert Roebling
5 // Modified By: Bo Yang
7 // Copyright: (c) 1998 Robert Roebling
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef __GENERICDATAVIEWCTRLH__
12 #define __GENERICDATAVIEWCTRLH__
15 #include "wx/object.h"
17 #include "wx/control.h"
18 #include "wx/scrolwin.h"
21 // ---------------------------------------------------------
23 // ---------------------------------------------------------
25 class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl
;
26 class WXDLLIMPEXP_FWD_ADV wxDataViewMainWindow
;
27 class WXDLLIMPEXP_FWD_ADV wxDataViewHeaderWindow
;
29 // ---------------------------------------------------------
31 // ---------------------------------------------------------
33 class WXDLLIMPEXP_ADV wxDataViewRenderer
: public wxDataViewRendererBase
36 wxDataViewRenderer( const wxString
&varianttype
,
37 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
38 int align
= wxDVR_DEFAULT_ALIGNMENT
);
39 virtual ~wxDataViewRenderer();
41 // these methods are used to draw the cell contents, Render() doesn't care
42 // about the attributes while RenderWithAttr() does -- override it if you
43 // want to take the attributes defined for this cell into account, otherwise
44 // overriding Render() is enough
45 virtual bool Render( wxRect cell
, wxDC
*dc
, int state
) = 0;
47 // NB: RenderWithAttr() also has more standard parameter order and types
49 RenderWithAttr(wxDC
& dc
,
51 int align
, // combination of horizontal and vertical
52 const wxDataViewItemAttr
*attr
, // may be NULL if none
55 virtual wxSize
GetSize() const = 0;
57 virtual void SetAlignment( int align
);
58 virtual int GetAlignment() const;
60 virtual void SetMode( wxDataViewCellMode mode
)
62 virtual wxDataViewCellMode
GetMode() const
65 virtual bool Activate( wxRect
WXUNUSED(cell
),
66 wxDataViewModel
*WXUNUSED(model
),
67 const wxDataViewItem
& WXUNUSED(item
),
68 unsigned int WXUNUSED(col
) )
71 virtual bool LeftClick( wxPoint
WXUNUSED(cursor
),
72 wxRect
WXUNUSED(cell
),
73 wxDataViewModel
*WXUNUSED(model
),
74 const wxDataViewItem
& WXUNUSED(item
),
75 unsigned int WXUNUSED(col
) )
77 virtual bool RightClick( wxPoint
WXUNUSED(cursor
),
78 wxRect
WXUNUSED(cell
),
79 wxDataViewModel
*WXUNUSED(model
),
80 const wxDataViewItem
& WXUNUSED(item
),
81 unsigned int WXUNUSED(col
) )
83 virtual bool StartDrag( wxPoint
WXUNUSED(cursor
),
84 wxRect
WXUNUSED(cell
),
85 wxDataViewModel
*WXUNUSED(model
),
86 const wxDataViewItem
& WXUNUSED(item
),
87 unsigned int WXUNUSED(col
) )
90 // Create DC on request
91 virtual wxDC
*GetDC();
94 int CalculateAlignment() const;
97 // This is just a convenience for the derived classes overriding
98 // RenderWithAttr() to avoid repeating the same wxFAIL_MSG() in all of them
99 bool DummyRender(wxRect
WXUNUSED(cell
),
103 wxFAIL_MSG("shouldn't be called at all, use RenderWithAttr() instead");
111 wxDataViewCellMode m_mode
;
113 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer
)
116 // ---------------------------------------------------------
117 // wxDataViewCustomRenderer
118 // ---------------------------------------------------------
120 class WXDLLIMPEXP_ADV wxDataViewCustomRenderer
: public wxDataViewRenderer
123 wxDataViewCustomRenderer( const wxString
&varianttype
= wxT("string"),
124 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
125 int align
= wxDVR_DEFAULT_ALIGNMENT
);
127 // Draw the text using the provided attributes
128 void RenderText(wxDC
& dc
,
131 const wxString
& text
,
132 const wxDataViewItemAttr
*attr
, // may be NULL if none
136 // Overload using standard attributes
137 void RenderText(const wxString
& text
,
143 RenderText(*dc
, cell
, wxALIGN_NOT
, text
, NULL
, state
, xoffset
);
147 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer
)
151 // ---------------------------------------------------------
152 // wxDataViewTextRenderer
153 // ---------------------------------------------------------
155 class WXDLLIMPEXP_ADV wxDataViewTextRenderer
: public wxDataViewCustomRenderer
158 wxDataViewTextRenderer( const wxString
&varianttype
= wxT("string"),
159 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
160 int align
= wxDVR_DEFAULT_ALIGNMENT
);
162 bool SetValue( const wxVariant
&value
);
163 bool GetValue( wxVariant
&value
) const;
165 virtual bool RenderWithAttr(wxDC
& dc
,
168 const wxDataViewItemAttr
*attr
,
170 virtual bool Render(wxRect cell
, wxDC
*dc
, int state
)
172 return DummyRender(cell
, dc
, state
);
175 wxSize
GetSize() const;
178 virtual bool HasEditorCtrl() const;
179 virtual wxControl
* CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
,
180 const wxVariant
&value
);
181 virtual bool GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
);
187 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer
)
190 // ---------------------------------------------------------
191 // wxDataViewBitmapRenderer
192 // ---------------------------------------------------------
194 class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer
: public wxDataViewCustomRenderer
197 wxDataViewBitmapRenderer( const wxString
&varianttype
= wxT("wxBitmap"),
198 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
199 int align
= wxDVR_DEFAULT_ALIGNMENT
);
201 bool SetValue( const wxVariant
&value
);
202 bool GetValue( wxVariant
&value
) const;
204 bool Render( wxRect cell
, wxDC
*dc
, int state
);
205 wxSize
GetSize() const;
212 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer
)
215 // ---------------------------------------------------------
216 // wxDataViewToggleRenderer
217 // ---------------------------------------------------------
219 class WXDLLIMPEXP_ADV wxDataViewToggleRenderer
: public wxDataViewCustomRenderer
222 wxDataViewToggleRenderer( const wxString
&varianttype
= wxT("bool"),
223 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
224 int align
= wxDVR_DEFAULT_ALIGNMENT
);
226 bool SetValue( const wxVariant
&value
);
227 bool GetValue( wxVariant
&value
) const;
229 bool Render( wxRect cell
, wxDC
*dc
, int state
);
230 bool Activate( wxRect cell
, wxDataViewModel
*model
, const wxDataViewItem
& item
,
232 wxSize
GetSize() const;
238 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer
)
241 // ---------------------------------------------------------
242 // wxDataViewProgressRenderer
243 // ---------------------------------------------------------
245 class WXDLLIMPEXP_ADV wxDataViewProgressRenderer
: public wxDataViewCustomRenderer
248 wxDataViewProgressRenderer( const wxString
&label
= wxEmptyString
,
249 const wxString
&varianttype
= wxT("long"),
250 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
251 int align
= wxDVR_DEFAULT_ALIGNMENT
);
253 bool SetValue( const wxVariant
&value
);
254 bool GetValue( wxVariant
& value
) const;
256 virtual bool RenderWithAttr(wxDC
& dc
,
259 const wxDataViewItemAttr
*attr
,
261 virtual bool Render(wxRect cell
, wxDC
*dc
, int state
)
263 return DummyRender(cell
, dc
, state
);
265 virtual wxSize
GetSize() const;
272 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer
)
275 // ---------------------------------------------------------
276 // wxDataViewIconTextRenderer
277 // ---------------------------------------------------------
279 class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer
: public wxDataViewCustomRenderer
282 wxDataViewIconTextRenderer( const wxString
&varianttype
= wxT("wxDataViewIconText"),
283 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
284 int align
= wxDVR_DEFAULT_ALIGNMENT
);
286 bool SetValue( const wxVariant
&value
);
287 bool GetValue( wxVariant
&value
) const;
289 virtual bool RenderWithAttr(wxDC
& dc
,
292 const wxDataViewItemAttr
*attr
,
294 virtual bool Render(wxRect cell
, wxDC
*dc
, int state
)
296 return DummyRender(cell
, dc
, state
);
298 virtual wxSize
GetSize() const;
300 virtual bool HasEditorCtrl() const { return true; }
301 virtual wxControl
* CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
,
302 const wxVariant
&value
);
303 virtual bool GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
);
306 wxDataViewIconText m_value
;
309 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer
)
312 // ---------------------------------------------------------
313 // wxDataViewDateRenderer
314 // ---------------------------------------------------------
316 class WXDLLIMPEXP_ADV wxDataViewDateRenderer
: public wxDataViewCustomRenderer
319 wxDataViewDateRenderer( const wxString
&varianttype
= wxT("datetime"),
320 wxDataViewCellMode mode
= wxDATAVIEW_CELL_ACTIVATABLE
,
321 int align
= wxDVR_DEFAULT_ALIGNMENT
);
323 bool SetValue( const wxVariant
&value
);
324 bool GetValue( wxVariant
& value
) const;
326 virtual bool Render( wxRect cell
, wxDC
*dc
, int state
);
327 virtual wxSize
GetSize() const;
328 virtual bool Activate( wxRect cell
,
329 wxDataViewModel
*model
,
330 const wxDataViewItem
& item
,
337 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer
)
340 // ---------------------------------------------------------
342 // ---------------------------------------------------------
344 class WXDLLIMPEXP_ADV wxDataViewColumn
: public wxDataViewColumnBase
347 wxDataViewColumn(const wxString
& title
,
348 wxDataViewRenderer
*renderer
,
349 unsigned int model_column
,
350 int width
= wxDVC_DEFAULT_WIDTH
,
351 wxAlignment align
= wxALIGN_CENTER
,
352 int flags
= wxDATAVIEW_COL_RESIZABLE
)
353 : wxDataViewColumnBase(renderer
, model_column
),
356 Init(width
, align
, flags
);
359 wxDataViewColumn(const wxBitmap
& bitmap
,
360 wxDataViewRenderer
*renderer
,
361 unsigned int model_column
,
362 int width
= wxDVC_DEFAULT_WIDTH
,
363 wxAlignment align
= wxALIGN_CENTER
,
364 int flags
= wxDATAVIEW_COL_RESIZABLE
)
365 : wxDataViewColumnBase(bitmap
, renderer
, model_column
)
367 Init(width
, align
, flags
);
370 // implement wxHeaderColumnBase methods
371 virtual void SetTitle(const wxString
& title
) { m_title
= title
; }
372 virtual wxString
GetTitle() const { return m_title
; }
374 virtual void SetWidth(int width
) { m_width
= width
; }
375 virtual int GetWidth() const { return m_width
; }
377 virtual void SetMinWidth(int minWidth
) { m_minWidth
= minWidth
; }
378 virtual int GetMinWidth() const { return m_minWidth
; }
380 virtual void SetAlignment(wxAlignment align
) { m_align
= align
; }
381 virtual wxAlignment
GetAlignment() const { return m_align
; }
383 virtual void SetFlags(int flags
) { m_flags
= flags
; }
384 virtual int GetFlags() const { return m_flags
; }
386 virtual void SetAsSortKey(bool sort
= true) { m_sort
= sort
; }
387 virtual bool IsSortKey() const { return m_sort
; }
389 virtual void SetSortOrder(bool ascending
) { m_sortAscending
= ascending
; }
390 virtual bool IsSortOrderAscending() const { return m_sortAscending
; }
393 // common part of all ctors
394 void Init(int width
, wxAlignment align
, int flags
)
396 m_width
= width
== wxCOL_WIDTH_DEFAULT
? wxDVC_DEFAULT_WIDTH
: width
;
401 m_sortAscending
= true;
412 friend class wxDataViewHeaderWindowBase
;
413 friend class wxDataViewHeaderWindow
;
414 friend class wxDataViewHeaderWindowMSW
;
417 // ---------------------------------------------------------
419 // ---------------------------------------------------------
421 WX_DECLARE_LIST_WITH_DECL(wxDataViewColumn
, wxDataViewColumnList
,
422 class WXDLLIMPEXP_ADV
);
424 class WXDLLIMPEXP_ADV wxDataViewCtrl
: public wxDataViewCtrlBase
,
425 public wxScrollHelper
427 friend class wxDataViewMainWindow
;
428 friend class wxDataViewHeaderWindowBase
;
429 friend class wxDataViewHeaderWindow
;
430 friend class wxDataViewHeaderWindowMSW
;
431 friend class wxDataViewColumn
;
434 wxDataViewCtrl() : wxScrollHelper(this)
439 wxDataViewCtrl( wxWindow
*parent
, wxWindowID id
,
440 const wxPoint
& pos
= wxDefaultPosition
,
441 const wxSize
& size
= wxDefaultSize
, long style
= 0,
442 const wxValidator
& validator
= wxDefaultValidator
)
443 : wxScrollHelper(this)
445 Create(parent
, id
, pos
, size
, style
, validator
);
448 virtual ~wxDataViewCtrl();
452 bool Create(wxWindow
*parent
, wxWindowID id
,
453 const wxPoint
& pos
= wxDefaultPosition
,
454 const wxSize
& size
= wxDefaultSize
, long style
= 0,
455 const wxValidator
& validator
= wxDefaultValidator
);
457 virtual bool AssociateModel( wxDataViewModel
*model
);
459 virtual bool AppendColumn( wxDataViewColumn
*col
);
460 virtual bool PrependColumn( wxDataViewColumn
*col
);
461 virtual bool InsertColumn( unsigned int pos
, wxDataViewColumn
*col
);
463 virtual void DoSetExpanderColumn();
464 virtual void DoSetIndent();
466 virtual unsigned int GetColumnCount() const;
467 virtual wxDataViewColumn
* GetColumn( unsigned int pos
) const;
468 virtual bool DeleteColumn( wxDataViewColumn
*column
);
469 virtual bool ClearColumns();
470 virtual int GetColumnPosition( const wxDataViewColumn
*column
) const;
472 virtual wxDataViewColumn
*GetSortingColumn() const;
474 virtual wxDataViewItem
GetSelection() const;
475 virtual int GetSelections( wxDataViewItemArray
& sel
) const;
476 virtual void SetSelections( const wxDataViewItemArray
& sel
);
477 virtual void Select( const wxDataViewItem
& item
);
478 virtual void Unselect( const wxDataViewItem
& item
);
479 virtual bool IsSelected( const wxDataViewItem
& item
) const;
481 virtual void SelectAll();
482 virtual void UnselectAll();
484 virtual void EnsureVisible( const wxDataViewItem
& item
,
485 const wxDataViewColumn
*column
= NULL
);
486 virtual void HitTest( const wxPoint
& point
, wxDataViewItem
& item
,
487 wxDataViewColumn
* &column
) const;
488 virtual wxRect
GetItemRect( const wxDataViewItem
& item
,
489 const wxDataViewColumn
*column
= NULL
) const;
491 virtual void Expand( const wxDataViewItem
& item
);
492 virtual void Collapse( const wxDataViewItem
& item
);
493 virtual bool IsExpanded( const wxDataViewItem
& item
) const;
495 virtual void SetFocus();
497 #if wxUSE_DRAG_AND_DROP
498 virtual bool EnableDragSource( const wxDataFormat
&format
);
499 virtual bool EnableDropTarget( const wxDataFormat
&format
);
500 #endif // wxUSE_DRAG_AND_DROP
502 virtual wxBorder
GetDefaultBorder() const;
504 void StartEditor( const wxDataViewItem
& item
, unsigned int column
);
507 virtual int GetSelections( wxArrayInt
& sel
) const;
508 virtual void SetSelections( const wxArrayInt
& sel
);
509 virtual void Select( int row
);
510 virtual void Unselect( int row
);
511 virtual bool IsSelected( int row
) const;
512 virtual void SelectRange( int from
, int to
);
513 virtual void UnselectRange( int from
, int to
);
515 virtual void EnsureVisible( int row
, int column
);
517 virtual wxDataViewItem
GetItemByRow( unsigned int row
) const;
518 virtual int GetRowByItem( const wxDataViewItem
& item
) const;
520 int GetSortingColumnIndex() const { return m_sortingColumnIdx
; }
521 void SetSortingColumnIndex(int idx
) { m_sortingColumnIdx
= idx
; }
523 public: // utility functions not part of the API
525 // returns the "best" width for the idx-th column
526 unsigned int GetBestColumnWidth(int WXUNUSED(idx
)) const
528 return GetClientSize().GetWidth() / GetColumnCount();
531 // called by header window after reorder
532 void ColumnMoved( wxDataViewColumn
* col
, unsigned int new_pos
);
534 // update the display after a change to an individual column
535 void OnColumnChange(unsigned int idx
);
537 // update after a change to the number of columns
538 void OnColumnsCountChanged();
540 wxWindow
*GetMainWindow() { return (wxWindow
*) m_clientArea
; }
542 // return the index of the given column in m_cols
543 int GetColumnIndex(const wxDataViewColumn
*column
) const;
545 // return the column displayed at the given position in the control
546 wxDataViewColumn
*GetColumnAt(unsigned int pos
) const;
549 wxDataViewColumnList m_cols
;
550 wxDataViewModelNotifier
*m_notifier
;
551 wxDataViewMainWindow
*m_clientArea
;
552 wxDataViewHeaderWindow
*m_headerArea
;
554 // the index of the column currently used for sorting or -1
555 int m_sortingColumnIdx
;
558 void OnSize( wxSizeEvent
&event
);
559 virtual wxSize
GetSizeAvailableForScrollTarget(const wxSize
& size
);
561 // we need to return a special WM_GETDLGCODE value to process just the
562 // arrows but let the other navigation characters through
564 virtual WXLRESULT
MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
);
567 WX_FORWARD_TO_SCROLL_HELPER()
570 DECLARE_DYNAMIC_CLASS(wxDataViewCtrl
)
571 wxDECLARE_NO_COPY_CLASS(wxDataViewCtrl
);
572 DECLARE_EVENT_TABLE()
576 #endif // __GENERICDATAVIEWCTRLH__