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