Fix crash in wxDataViewProgressRenderer in non-Unicode build.
[wxWidgets.git] / include / wx / gtk / dvrenderers.h
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/gtk/dvrenderers.h
3 // Purpose: All GTK wxDataViewCtrl renderer classes
4 // Author: Robert Roebling, Vadim Zeitlin
5 // Created: 2009-11-07 (extracted from wx/gtk/dataview.h)
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006 Robert Roebling
8 // (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_GTK_DVRENDERERS_H_
13 #define _WX_GTK_DVRENDERERS_H_
14
15 typedef struct _GdkRectangle GdkRectangle;
16
17 // ---------------------------------------------------------
18 // wxDataViewTextRenderer
19 // ---------------------------------------------------------
20
21 class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer
22 {
23 public:
24 wxDataViewTextRenderer( const wxString &varianttype = "string",
25 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
26 int align = wxDVR_DEFAULT_ALIGNMENT );
27
28 virtual bool SetValue( const wxVariant &value )
29 {
30 return SetTextValue(value);
31 }
32
33 virtual bool GetValue( wxVariant &value ) const
34 {
35 wxString str;
36 if ( !GetTextValue(str) )
37 return false;
38
39 value = str;
40
41 return true;
42 }
43
44 virtual void SetAlignment( int align );
45
46 virtual bool GtkSupportsAttrs() const { return true; }
47 virtual bool GtkSetAttr(const wxDataViewItemAttr& attr);
48
49 virtual GtkCellRendererText *GtkGetTextRenderer() const;
50
51 protected:
52 // implementation of Set/GetValue()
53 bool SetTextValue(const wxString& str);
54 bool GetTextValue(wxString& str) const;
55
56
57 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
58 };
59
60 // ---------------------------------------------------------
61 // wxDataViewBitmapRenderer
62 // ---------------------------------------------------------
63
64 class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer
65 {
66 public:
67 wxDataViewBitmapRenderer( const wxString &varianttype = "wxBitmap",
68 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
69 int align = wxDVR_DEFAULT_ALIGNMENT );
70
71 bool SetValue( const wxVariant &value );
72 bool GetValue( wxVariant &value ) const;
73
74 protected:
75 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer)
76 };
77
78 // ---------------------------------------------------------
79 // wxDataViewToggleRenderer
80 // ---------------------------------------------------------
81
82 class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer
83 {
84 public:
85 wxDataViewToggleRenderer( const wxString &varianttype = "bool",
86 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
87 int align = wxDVR_DEFAULT_ALIGNMENT );
88
89 bool SetValue( const wxVariant &value );
90 bool GetValue( wxVariant &value ) const;
91
92 protected:
93 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer)
94 };
95
96 // ---------------------------------------------------------
97 // wxDataViewCustomRenderer
98 // ---------------------------------------------------------
99
100 class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewCustomRendererBase
101 {
102 public:
103 wxDataViewCustomRenderer( const wxString &varianttype = "string",
104 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
105 int align = wxDVR_DEFAULT_ALIGNMENT,
106 bool no_init = false );
107 virtual ~wxDataViewCustomRenderer();
108
109
110 // Create DC on request
111 virtual wxDC *GetDC();
112
113 // override the base class function to use GTK text cell renderer
114 virtual void RenderText(const wxString& text,
115 int xoffset,
116 wxRect cell,
117 wxDC *dc,
118 int state);
119
120 // store GTK render call parameters for possible later use
121 void GTKStashRenderParams(GdkWindow *window,
122 GtkWidget *widget,
123 GdkRectangle *background_area,
124 GdkRectangle *expose_area,
125 int flags)
126 {
127 m_renderParams.window = window;
128 m_renderParams.widget = widget;
129 m_renderParams.background_area = background_area;
130 m_renderParams.expose_area = expose_area;
131 m_renderParams.flags = flags;
132 }
133
134 // we may or not support attributes, as we don't know it, return true to
135 // make it possible to use them
136 virtual bool GtkSupportsAttrs() const { return true; }
137
138 virtual bool GtkSetAttr(const wxDataViewItemAttr& attr)
139 {
140 SetAttr(attr);
141 return !attr.IsDefault();
142 }
143
144 virtual GtkCellRendererText *GtkGetTextRenderer() const;
145
146 protected:
147 bool Init(wxDataViewCellMode mode, int align);
148
149 private:
150 wxDC *m_dc;
151
152 GtkCellRendererText *m_text_renderer;
153
154 // parameters of the original render() call stored so that we could pass
155 // them forward to m_text_renderer if our RenderText() is called
156 struct GTKRenderParams
157 {
158 GdkWindow *window;
159 GtkWidget *widget;
160 GdkRectangle *background_area;
161 GdkRectangle *expose_area;
162 int flags;
163 } m_renderParams;
164
165 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer)
166 };
167
168 // ---------------------------------------------------------
169 // wxDataViewProgressRenderer
170 // ---------------------------------------------------------
171
172 class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewCustomRenderer
173 {
174 public:
175 wxDataViewProgressRenderer( const wxString &label = wxEmptyString,
176 const wxString &varianttype = "long",
177 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
178 int align = wxDVR_DEFAULT_ALIGNMENT );
179 virtual ~wxDataViewProgressRenderer();
180
181 bool SetValue( const wxVariant &value );
182 bool GetValue( wxVariant &value ) const;
183
184 virtual bool Render( wxRect cell, wxDC *dc, int state );
185 virtual wxSize GetSize() const;
186
187 private:
188 void GTKSetLabel();
189
190 wxString m_label;
191 int m_value;
192
193 #if !wxUSE_UNICODE
194 // Flag used to indicate that we need to set the label because we were
195 // unable to do it in the ctor (see comments there).
196 bool m_needsToSetLabel;
197 #endif // !wxUSE_UNICODE
198
199 protected:
200 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer)
201 };
202
203 // ---------------------------------------------------------
204 // wxDataViewIconTextRenderer
205 // ---------------------------------------------------------
206
207 class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewTextRenderer
208 {
209 public:
210 wxDataViewIconTextRenderer( const wxString &varianttype = "wxDataViewIconText",
211 wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
212 int align = wxDVR_DEFAULT_ALIGNMENT );
213 virtual ~wxDataViewIconTextRenderer();
214
215 bool SetValue( const wxVariant &value );
216 bool GetValue( wxVariant &value ) const;
217
218 virtual void GtkPackIntoColumn(GtkTreeViewColumn *column);
219
220 protected:
221 virtual void GtkOnCellChanged(const wxVariant& value,
222 const wxDataViewItem& item,
223 unsigned col);
224
225 private:
226 wxDataViewIconText m_value;
227
228 // we use the base class m_renderer for the text and this one for the icon
229 GtkCellRenderer *m_rendererIcon;
230
231 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer)
232 };
233
234 // ---------------------------------------------------------
235 // wxDataViewDateRenderer
236 // ---------------------------------------------------------
237
238 class WXDLLIMPEXP_ADV wxDataViewDateRenderer: public wxDataViewCustomRenderer
239 {
240 public:
241 wxDataViewDateRenderer( const wxString &varianttype = "datetime",
242 wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE,
243 int align = wxDVR_DEFAULT_ALIGNMENT );
244
245 bool SetValue( const wxVariant &value );
246 bool GetValue( wxVariant &value ) const;
247
248 virtual bool Render( wxRect cell, wxDC *dc, int state );
249 virtual wxSize GetSize() const;
250 virtual bool Activate( const wxRect& cell,
251 wxDataViewModel *model,
252 const wxDataViewItem &item,
253 unsigned int col );
254
255 private:
256 wxDateTime m_date;
257
258 protected:
259 DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer)
260 };
261
262 // -------------------------------------
263 // wxDataViewChoiceRenderer
264 // -------------------------------------
265
266 class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer
267 {
268 public:
269 wxDataViewChoiceRenderer(const wxArrayString &choices,
270 wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
271 int alignment = wxDVR_DEFAULT_ALIGNMENT );
272 virtual bool Render( wxRect rect, wxDC *dc, int state );
273 virtual wxSize GetSize() const;
274 virtual bool SetValue( const wxVariant &value );
275 virtual bool GetValue( wxVariant &value ) const;
276
277 void SetAlignment( int align );
278
279 wxString GetChoice(size_t index) const { return m_choices[index]; }
280 const wxArrayString& GetChoices() const { return m_choices; }
281
282 private:
283 wxArrayString m_choices;
284 wxString m_data;
285 };
286
287 // ----------------------------------------------------------------------------
288 // wxDataViewChoiceByIndexRenderer
289 // ----------------------------------------------------------------------------
290
291 class WXDLLIMPEXP_ADV wxDataViewChoiceByIndexRenderer: public wxDataViewChoiceRenderer
292 {
293 public:
294 wxDataViewChoiceByIndexRenderer( const wxArrayString &choices,
295 wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
296 int alignment = wxDVR_DEFAULT_ALIGNMENT );
297
298 virtual bool SetValue( const wxVariant &value );
299 virtual bool GetValue( wxVariant &value ) const;
300
301 private:
302 virtual void GtkOnTextEdited(const gchar *itempath, const wxString& str);
303 };
304
305
306
307 #endif // _WX_GTK_DVRENDERERS_H_
308