]> git.saurik.com Git - wxWidgets.git/blob - samples/dataview/dataview.cpp
Most things about wxDataViewDateCell work.
[wxWidgets.git] / samples / dataview / dataview.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dataview.cpp
3 // Purpose: DataVewCtrl wxWidgets sample
4 // Author: Robert Roebling
5 // Modified by:
6 // Created: 06/01/06
7 // RCS-ID: $Id$
8 // Copyright: (c) Robert Roebling
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22
23 #ifndef __WXMSW__
24 #include "mondrian.xpm"
25 #endif
26
27 #include "wx/dataview.h"
28
29 // -------------------------------------
30 // MyTextModel
31 // -------------------------------------
32
33 WX_DECLARE_LIST(wxDateTime,wxArrayDate);
34 #include <wx/listimpl.cpp>
35 WX_DEFINE_LIST(wxArrayDate);
36
37 class MyTextModel: public wxDataViewListModel
38 {
39 public:
40 MyTextModel()
41 {
42 size_t i;
43 for (i = 0; i < 1000; i++)
44 m_list.Add( wxT("Test") );
45 for (i = 0; i < 500; i++)
46 { m_bools.Add( 0 ); m_bools.Add( 1 ); }
47 for (i = 0; i < 500; i++)
48 { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); }
49 for (i = 0; i < 1000; i++)
50 { m_progress.Add( i/10 ); }
51 for (i = 0; i < 1000; i++)
52 {
53 wxDateTime *date = new wxDateTime( wxDateTime::Now() );
54 m_dates.Append( date );
55 }
56 }
57
58 virtual size_t GetNumberOfRows()
59 { return 1000; }
60 virtual size_t GetNumberOfCols()
61 { return 7; }
62
63 // as reported by wxVariant
64 virtual wxString GetColType( size_t col )
65 {
66 if (col == 6)
67 return wxT("datetime");
68
69 if (col == 5)
70 return wxT("long");
71
72 if (col == 3)
73 return wxT("bool");
74
75 return wxT("string");
76 }
77
78 virtual wxVariant GetValue( size_t col, size_t row )
79 {
80 if (col == 6)
81 {
82 return (wxDateTime) *m_dates[row];
83 } else
84 if (col == 5)
85 {
86 return (long) m_progress[row];
87 } else
88 if (col == 4)
89 {
90 return m_colours[row];
91 } else
92 if (col == 3)
93 {
94 return (bool) m_bools[row];
95 } else
96 if (col == 2)
97 {
98 return m_list[row];
99 }
100 else
101 {
102 wxString tmp;
103 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
104 return tmp;
105 }
106 }
107 virtual bool SetValue( wxVariant &value, size_t col, size_t row )
108 {
109 if (col == 6)
110 {
111 *m_dates[row] = value.GetDateTime();
112 } else
113 if (col == 3)
114 {
115 m_bools[row] = (int) value.GetBool();
116 } else
117 if (col == 2)
118 {
119 m_list[row] = value.GetString();
120 }
121 return true;
122 }
123
124 wxArrayString m_list;
125 wxArrayInt m_bools;
126 wxArrayString m_colours;
127 wxArrayInt m_progress;
128 wxArrayDate m_dates;
129 };
130
131 // -------------------------------------
132 // MyCustomCell
133 // -------------------------------------
134
135 class MyCustomCell: public wxDataViewCustomCell
136 {
137 public:
138 MyCustomCell() :
139 wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE )
140 {
141 m_colour = wxT("black");
142 }
143 bool SetValue( const wxVariant &value )
144 {
145 m_colour = value.GetString();
146 return true;
147 }
148 bool Render( wxRect rect, wxDC *dc, int state )
149 {
150 dc->SetPen( *wxBLACK_PEN );
151 if (m_colour == wxT("red"))
152 dc->SetBrush( *wxRED_BRUSH );
153 else if (m_colour == wxT("green"))
154 dc->SetBrush( *wxGREEN_BRUSH );
155 else
156 dc->SetBrush( *wxBLACK_BRUSH );
157 dc->DrawRectangle( rect );
158 return true;
159 }
160 wxSize GetSize()
161 {
162 return wxSize(20,8);
163 }
164 bool Activate( wxRect rect,
165 wxDataViewListModel *model, size_t col, size_t row )
166 {
167 return false;
168 }
169
170 private:
171 wxString m_colour;
172 };
173
174 // -------------------------------------
175 // MyApp
176 // -------------------------------------
177
178 class MyApp: public wxApp
179 {
180 public:
181 bool OnInit(void);
182 };
183
184 // -------------------------------------
185 // MyFrame
186 // -------------------------------------
187
188 class MyFrame: public wxFrame
189 {
190 public:
191 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
192
193 public:
194 void OnQuit(wxCommandEvent& event);
195 void OnAbout(wxCommandEvent& event);
196
197 private:
198 wxDataViewCtrl* dataview_left;
199 wxDataViewCtrl* dataview_right;
200 };
201
202 // -------------------------------------
203 // MyApp
204 // -------------------------------------
205
206 #define DYNAMIC_QUIT wxID_EXIT
207 #define DYNAMIC_ABOUT wxID_ABOUT
208
209 IMPLEMENT_APP (MyApp)
210
211 bool MyApp::OnInit(void)
212 {
213 MyFrame *frame = new MyFrame(NULL, _T("Dynamic wxWidgets App"), 50, 50, 600, 340);
214
215 frame->Show(true);
216
217 SetTopWindow(frame);
218
219 return true;
220 }
221
222 // -------------------------------------
223 // MyFrame
224 // -------------------------------------
225
226 MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
227 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
228 {
229 #ifdef __WXMSW__
230 SetIcon(wxIcon(_T("mondrian")));
231 #else
232 SetIcon(wxIcon(mondrian_xpm));
233 #endif
234
235 wxMenu *file_menu = new wxMenu;
236
237 file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
238 file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
239 wxMenuBar *menu_bar = new wxMenuBar;
240 menu_bar->Append(file_menu, _T("&File"));
241 SetMenuBar(menu_bar);
242
243 // You used to have to do some casting for param 4, but now there are type-safe handlers
244 Connect( DYNAMIC_QUIT, wxID_ANY,
245 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
246 Connect( DYNAMIC_ABOUT, wxID_ANY,
247 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) );
248
249 CreateStatusBar();
250
251
252 // Left wxDataViewCtrl
253 dataview_left = new wxDataViewCtrl( this, -1 );
254
255 MyTextModel *model = new MyTextModel;
256 dataview_left->AssociateModel( model );
257
258 dataview_left->AppendTextColumn( wxT("first"), 0 );
259 dataview_left->AppendTextColumn( wxT("second"), 1 );
260
261 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
262 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
263 dataview_left->AppendColumn( column );
264
265 dataview_left->AppendToggleColumn( wxT("fourth"), 3 );
266
267 MyCustomCell *custom_cell = new MyCustomCell;
268 column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
269 dataview_left->AppendColumn( column );
270
271 dataview_left->AppendProgressColumn( wxT("progress"), 5 );
272
273 dataview_left->AppendDateColumn( wxT("date"), 6 );
274
275 // Right wxDataViewCtrl using the same model
276 dataview_right = new wxDataViewCtrl( this, -1 );
277 dataview_right->AssociateModel( model );
278
279 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
280 column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
281 dataview_right->AppendColumn( column );
282 dataview_right->AppendTextColumn( wxT("first"), 0 );
283 dataview_right->AppendTextColumn( wxT("second"), 1 );
284 wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE );
285 column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 );
286 dataview_right->AppendColumn( column );
287
288 dataview_right->AppendDateColumn( wxT("date"), 6 );
289
290 // layout dataview controls.
291
292 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
293 sizer->Add( dataview_left, 3, wxGROW );
294 sizer->Add(10,10);
295 sizer->Add( dataview_right, 2, wxGROW );
296 SetSizer( sizer );
297 }
298
299 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
300 {
301 Close(true);
302 }
303
304 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
305 {
306 wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
307 _T("About DataView"), wxOK);
308
309 dialog.ShowModal();
310 }
311
312