1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/dvrenderers.h
3 // Purpose: Declare all wxDataViewCtrl classes
4 // Author: Robert Roebling, Vadim Zeitlin
5 // Created: 2009-11-08 (extracted from wx/dataview.h)
7 // Copyright: (c) 2006 Robert Roebling
8 // (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_DVRENDERERS_H_
13 #define _WX_DVRENDERERS_H_
16 Note about the structure of various headers: they're organized in a more
17 complicated way than usual because of the various dependencies which are
18 different for different ports. In any case the only public header, i.e. the
19 one which can be included directly is wx/dataview.h. It, in turn, includes
20 this one to define all the renderer classes.
22 We define the base wxDataViewRendererBase class first and then include a
23 port-dependent wx/xxx/dvrenderer.h which defines wxDataViewRenderer itself.
24 After this we can define wxDataViewRendererCustomBase (and maybe in the
25 future base classes for other renderers if the need arises, i.e. if there
26 is any non-trivial code or API which it makes sense to keep in common code)
27 and include wx/xxx/dvrenderers.h (notice the plural) which defines all the
28 rest of the renderer classes.
31 class WXDLLIMPEXP_FWD_ADV wxDataViewCustomRenderer
;
33 // ----------------------------------------------------------------------------
34 // wxDataViewIconText: helper class used by wxDataViewIconTextRenderer
35 // ----------------------------------------------------------------------------
37 class WXDLLIMPEXP_ADV wxDataViewIconText
: public wxObject
40 wxDataViewIconText( const wxString
&text
= wxEmptyString
,
41 const wxIcon
& icon
= wxNullIcon
)
46 wxDataViewIconText( const wxDataViewIconText
&other
)
52 void SetText( const wxString
&text
) { m_text
= text
; }
53 wxString
GetText() const { return m_text
; }
54 void SetIcon( const wxIcon
&icon
) { m_icon
= icon
; }
55 const wxIcon
&GetIcon() const { return m_icon
; }
61 DECLARE_DYNAMIC_CLASS(wxDataViewIconText
)
65 bool operator==(const wxDataViewIconText
& left
, const wxDataViewIconText
& right
)
67 return left
.GetText() == right
.GetText() &&
68 left
.GetIcon().IsSameAs(right
.GetIcon());
72 bool operator!=(const wxDataViewIconText
& left
, const wxDataViewIconText
& right
)
74 return !(left
== right
);
77 DECLARE_VARIANT_OBJECT_EXPORTED(wxDataViewIconText
, WXDLLIMPEXP_ADV
)
79 // ----------------------------------------------------------------------------
80 // wxDataViewRendererBase
81 // ----------------------------------------------------------------------------
83 enum wxDataViewCellMode
85 wxDATAVIEW_CELL_INERT
,
86 wxDATAVIEW_CELL_ACTIVATABLE
,
87 wxDATAVIEW_CELL_EDITABLE
90 enum wxDataViewCellRenderState
92 wxDATAVIEW_CELL_SELECTED
= 1,
93 wxDATAVIEW_CELL_PRELIT
= 2,
94 wxDATAVIEW_CELL_INSENSITIVE
= 4,
95 wxDATAVIEW_CELL_FOCUSED
= 8
98 class WXDLLIMPEXP_ADV wxDataViewRendererBase
: public wxObject
101 wxDataViewRendererBase( const wxString
&varianttype
,
102 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
103 int alignment
= wxDVR_DEFAULT_ALIGNMENT
);
104 virtual ~wxDataViewRendererBase();
106 virtual bool Validate( wxVariant
& WXUNUSED(value
) )
109 void SetOwner( wxDataViewColumn
*owner
) { m_owner
= owner
; }
110 wxDataViewColumn
* GetOwner() const { return m_owner
; }
112 // renderer value and attributes: SetValue() and SetAttr() are called
113 // before a cell is rendered using this renderer
114 virtual bool SetValue(const wxVariant
& value
) = 0;
115 virtual bool GetValue(wxVariant
& value
) const = 0;
117 virtual void SetAttr(const wxDataViewItemAttr
& WXUNUSED(attr
)) { }
119 wxString
GetVariantType() const { return m_variantType
; }
121 // renderer properties:
122 virtual void SetMode( wxDataViewCellMode mode
) = 0;
123 virtual wxDataViewCellMode
GetMode() const = 0;
125 // NOTE: Set/GetAlignment do not take/return a wxAlignment enum but
126 // rather an "int"; that's because for rendering cells it's allowed
127 // to combine alignment flags (e.g. wxALIGN_LEFT|wxALIGN_BOTTOM)
128 virtual void SetAlignment( int align
) = 0;
129 virtual int GetAlignment() const = 0;
131 // enable or disable (if called with wxELLIPSIZE_NONE) replacing parts of
132 // the item text (hence this only makes sense for renderers showing
133 // text...) with ellipsis in order to make it fit the column width
134 virtual void EnableEllipsize(wxEllipsizeMode mode
= wxELLIPSIZE_MIDDLE
) = 0;
135 void DisableEllipsize() { EnableEllipsize(wxELLIPSIZE_NONE
); }
137 virtual wxEllipsizeMode
GetEllipsizeMode() const = 0;
140 virtual bool HasEditorCtrl() const
142 virtual wxControl
* CreateEditorCtrl(wxWindow
* WXUNUSED(parent
),
143 wxRect
WXUNUSED(labelRect
),
144 const wxVariant
& WXUNUSED(value
))
146 virtual bool GetValueFromEditorCtrl(wxControl
* WXUNUSED(editor
),
147 wxVariant
& WXUNUSED(value
))
150 virtual bool StartEditing( const wxDataViewItem
&item
, wxRect labelRect
);
151 virtual void CancelEditing();
152 virtual bool FinishEditing();
154 wxControl
*GetEditorCtrl() { return m_editorCtrl
; }
157 // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl
158 void DestroyEditControl();
160 wxString m_variantType
;
161 wxDataViewColumn
*m_owner
;
162 wxWeakRef
<wxControl
> m_editorCtrl
;
163 wxDataViewItem m_item
; // for m_editorCtrl
166 const wxDataViewCtrl
* GetView() const;
169 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase
)
172 // include the real wxDataViewRenderer declaration for the native ports
173 #ifdef wxHAS_GENERIC_DATAVIEWCTRL
174 // in the generic implementation there is no real wxDataViewRenderer, all
175 // renderers are custom so it's the same as wxDataViewCustomRenderer and
176 // wxDataViewCustomRendererBase derives from wxDataViewRendererBase directly
178 // this is a rather ugly hack but unfortunately it just doesn't seem to be
179 // possible to have the same class hierarchy in all ports and avoid
180 // duplicating the entire wxDataViewCustomRendererBase in the generic
181 // wxDataViewRenderer class (well, we could use a mix-in but this would
182 // make classes hierarchy non linear and arguably even more complex)
183 #define wxDataViewCustomRendererRealBase wxDataViewRendererBase
185 #if defined(__WXGTK20__)
186 #include "wx/gtk/dvrenderer.h"
187 #elif defined(__WXMAC__)
188 #include "wx/osx/dvrenderer.h"
190 #error "unknown native wxDataViewCtrl implementation"
192 #define wxDataViewCustomRendererRealBase wxDataViewRenderer
195 // ----------------------------------------------------------------------------
196 // wxDataViewCustomRendererBase
197 // ----------------------------------------------------------------------------
199 class WXDLLIMPEXP_ADV wxDataViewCustomRendererBase
200 : public wxDataViewCustomRendererRealBase
203 // Constructor must specify the usual renderer parameters which we simply
204 // pass to the base class
205 wxDataViewCustomRendererBase(const wxString
& varianttype
= "string",
206 wxDataViewCellMode mode
= wxDATAVIEW_CELL_INERT
,
207 int align
= wxDVR_DEFAULT_ALIGNMENT
)
208 : wxDataViewCustomRendererRealBase(varianttype
, mode
, align
)
213 // Render the item using the current value (returned by GetValue()).
214 virtual bool Render(wxRect cell
, wxDC
*dc
, int state
) = 0;
216 // Return the size of the item appropriate to its current value.
217 virtual wxSize
GetSize() const = 0;
219 // Define virtual function which are called when the item is activated
220 // (double-clicked or Enter is pressed on it), clicked or the user starts
221 // to drag it: by default they all simply return false indicating that the
222 // events are not handled
224 virtual bool Activate(wxRect
WXUNUSED(cell
),
225 wxDataViewModel
*WXUNUSED(model
),
226 const wxDataViewItem
& WXUNUSED(item
),
227 unsigned int WXUNUSED(col
))
230 virtual bool LeftClick(wxPoint
WXUNUSED(cursor
),
231 wxRect
WXUNUSED(cell
),
232 wxDataViewModel
*WXUNUSED(model
),
233 const wxDataViewItem
& WXUNUSED(item
),
234 unsigned int WXUNUSED(col
) )
237 virtual bool StartDrag(wxPoint
WXUNUSED(cursor
),
238 wxRect
WXUNUSED(cell
),
239 wxDataViewModel
*WXUNUSED(model
),
240 const wxDataViewItem
& WXUNUSED(item
),
241 unsigned int WXUNUSED(col
) )
245 // Helper which can be used by Render() implementation in the derived
246 // classes: it will draw the text in the same manner as the standard
248 virtual void RenderText(const wxString
& text
,
255 // Override the base class virtual method to simply store the attribute so
256 // that it can be accessed using GetAttr() from Render() if needed.
257 virtual void SetAttr(const wxDataViewItemAttr
& attr
) { m_attr
= attr
; }
258 const wxDataViewItemAttr
& GetAttr() const { return m_attr
; }
261 // Implementation only from now on
263 // Retrieve the DC to use for drawing. This is implemented in derived
264 // platform-specific classes.
265 virtual wxDC
*GetDC() = 0;
267 // Prepare DC to use attributes and call Render().
268 void WXCallRender(wxRect rect
, wxDC
*dc
, int state
);
271 // helper for GetSize() implementations, respects attributes
272 wxSize
GetTextExtent(const wxString
& str
) const;
275 wxDataViewItemAttr m_attr
;
277 wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase
);
280 // include the declaration of all the other renderers to get the real
281 // wxDataViewCustomRenderer from which we need to inherit below
282 #ifdef wxHAS_GENERIC_DATAVIEWCTRL
283 // because of the different renderer classes hierarchy in the generic
284 // version, as explained above, we can include the header defining
285 // wxDataViewRenderer only here and not before wxDataViewCustomRendererBase
286 // declaration as for the native ports
287 #include "wx/generic/dvrenderer.h"
288 #include "wx/generic/dvrenderers.h"
289 #elif defined(__WXGTK20__)
290 #include "wx/gtk/dvrenderers.h"
291 #elif defined(__WXMAC__)
292 #include "wx/osx/dvrenderers.h"
294 #error "unknown native wxDataViewCtrl implementation"
297 // ----------------------------------------------------------------------------
298 // wxDataViewSpinRenderer
299 // ----------------------------------------------------------------------------
301 class WXDLLIMPEXP_ADV wxDataViewSpinRenderer
: public wxDataViewCustomRenderer
304 wxDataViewSpinRenderer( int min
, int max
,
305 wxDataViewCellMode mode
= wxDATAVIEW_CELL_EDITABLE
,
306 int alignment
= wxDVR_DEFAULT_ALIGNMENT
);
307 virtual bool HasEditorCtrl() const { return true; }
308 virtual wxControl
* CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
, const wxVariant
&value
);
309 virtual bool GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
);
310 virtual bool Render( wxRect rect
, wxDC
*dc
, int state
);
311 virtual wxSize
GetSize() const;
312 virtual bool SetValue( const wxVariant
&value
);
313 virtual bool GetValue( wxVariant
&value
) const;
320 #if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__)
322 // ----------------------------------------------------------------------------
323 // wxDataViewChoiceRenderer
324 // ----------------------------------------------------------------------------
326 class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer
: public wxDataViewCustomRenderer
329 wxDataViewChoiceRenderer( const wxArrayString
&choices
,
330 wxDataViewCellMode mode
= wxDATAVIEW_CELL_EDITABLE
,
331 int alignment
= wxDVR_DEFAULT_ALIGNMENT
);
332 virtual bool HasEditorCtrl() const { return true; }
333 virtual wxControl
* CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
, const wxVariant
&value
);
334 virtual bool GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
);
335 virtual bool Render( wxRect rect
, wxDC
*dc
, int state
);
336 virtual wxSize
GetSize() const;
337 virtual bool SetValue( const wxVariant
&value
);
338 virtual bool GetValue( wxVariant
&value
) const;
340 wxString
GetChoice(size_t index
) const { return m_choices
[index
]; }
341 const wxArrayString
& GetChoices() const { return m_choices
; }
344 wxArrayString m_choices
;
348 // ----------------------------------------------------------------------------
349 // wxDataViewChoiceByIndexRenderer
350 // ----------------------------------------------------------------------------
352 class WXDLLIMPEXP_ADV wxDataViewChoiceByIndexRenderer
: public wxDataViewChoiceRenderer
355 wxDataViewChoiceByIndexRenderer( const wxArrayString
&choices
,
356 wxDataViewCellMode mode
= wxDATAVIEW_CELL_EDITABLE
,
357 int alignment
= wxDVR_DEFAULT_ALIGNMENT
);
359 virtual wxControl
* CreateEditorCtrl( wxWindow
*parent
, wxRect labelRect
, const wxVariant
&value
);
360 virtual bool GetValueFromEditorCtrl( wxControl
* editor
, wxVariant
&value
);
362 virtual bool SetValue( const wxVariant
&value
);
363 virtual bool GetValue( wxVariant
&value
) const;
367 #endif // generic or Carbon versions
369 // this class is obsolete, its functionality was merged in
370 // wxDataViewTextRenderer itself now, don't use it any more
371 #define wxDataViewTextRendererAttr wxDataViewTextRenderer
373 #endif // _WX_DVRENDERERS_H_