]> git.saurik.com Git - wxWidgets.git/blob - samples/dataview/dataview.cpp
Added wxDataViewProgressCell with native code
[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 class MyTextModel: public wxDataViewListModel
34 {
35 public:
36 MyTextModel()
37 {
38 size_t i;
39 for (i = 0; i < 1000; i++)
40 m_list.Add( wxT("Test") );
41 for (i = 0; i < 500; i++)
42 { m_bools.Add( 0 ); m_bools.Add( 1 ); }
43 for (i = 0; i < 500; i++)
44 { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); }
45 for (i = 0; i < 1000; i++)
46 { m_progress.Add( i/10 ); }
47 }
48
49 virtual size_t GetNumberOfRows()
50 { return 1000; }
51 virtual size_t GetNumberOfCols()
52 { return 6; }
53
54 // as reported by wxVariant
55 virtual wxString GetColType( size_t col )
56 {
57 if (col == 5)
58 return wxT("long");
59
60 if (col == 3)
61 return wxT("bool");
62
63 return wxT("string");
64 }
65
66 virtual wxVariant GetValue( size_t col, size_t row )
67 {
68 if (col == 5)
69 {
70 return (long) m_progress[row];
71 } else
72 if (col == 4)
73 {
74 return m_colours[row];
75 } else
76 if (col == 3)
77 {
78 return (bool) m_bools[row];
79 } else
80 if (col == 2)
81 {
82 return m_list[row];
83 }
84 else
85 {
86 wxString tmp;
87 tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
88 return tmp;
89 }
90 }
91 virtual bool SetValue( wxVariant &value, size_t col, size_t row )
92 {
93 if (col == 3)
94 {
95 m_bools[row] = (int) value.GetBool();
96 } else
97 if (col == 2)
98 {
99 m_list[row] = value.GetString();
100 }
101 return true;
102 }
103
104 wxArrayString m_list;
105 wxArrayInt m_bools;
106 wxArrayString m_colours;
107 wxArrayInt m_progress;
108 };
109
110 // -------------------------------------
111 // MyCustomCell
112 // -------------------------------------
113
114 class MyCustomCell: public wxDataViewCustomCell
115 {
116 public:
117 MyCustomCell() :
118 wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_INERT )
119 {
120 m_colour = wxT("black");
121 }
122 bool SetValue( const wxVariant &value )
123 {
124 m_colour = value.GetString();
125 return true;
126 }
127 bool Render( wxRect rect, wxDC *dc, int state )
128 {
129 dc->SetPen( *wxBLACK_PEN );
130 if (m_colour == wxT("red"))
131 dc->SetBrush( *wxRED_BRUSH );
132 else if (m_colour == wxT("green"))
133 dc->SetBrush( *wxGREEN_BRUSH );
134 else
135 dc->SetBrush( *wxBLACK_BRUSH );
136 dc->DrawRectangle( rect );
137 return true;
138 }
139 wxSize GetSize()
140 {
141 return wxSize(20,8);
142 }
143
144 private:
145 wxString m_colour;
146 };
147
148 // -------------------------------------
149 // MyApp
150 // -------------------------------------
151
152 class MyApp: public wxApp
153 {
154 public:
155 bool OnInit(void);
156 };
157
158 // -------------------------------------
159 // MyFrame
160 // -------------------------------------
161
162 class MyFrame: public wxFrame
163 {
164 public:
165 MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
166
167 public:
168 void OnQuit(wxCommandEvent& event);
169 void OnAbout(wxCommandEvent& event);
170
171 private:
172 wxDataViewCtrl* dataview_left;
173 wxDataViewCtrl* dataview_right;
174 };
175
176 // -------------------------------------
177 // MyApp
178 // -------------------------------------
179
180 #define DYNAMIC_QUIT wxID_EXIT
181 #define DYNAMIC_ABOUT wxID_ABOUT
182
183 IMPLEMENT_APP (MyApp)
184
185 bool MyApp::OnInit(void)
186 {
187 MyFrame *frame = new MyFrame(NULL, _T("Dynamic wxWidgets App"), 50, 50, 600, 340);
188
189 frame->Show(true);
190
191 SetTopWindow(frame);
192
193 return true;
194 }
195
196 // -------------------------------------
197 // MyFrame
198 // -------------------------------------
199
200 MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
201 wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
202 {
203 #ifdef __WXMSW__
204 SetIcon(wxIcon(_T("mondrian")));
205 #else
206 SetIcon(wxIcon(mondrian_xpm));
207 #endif
208
209 wxMenu *file_menu = new wxMenu;
210
211 file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
212 file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
213 wxMenuBar *menu_bar = new wxMenuBar;
214 menu_bar->Append(file_menu, _T("&File"));
215 SetMenuBar(menu_bar);
216
217 // You used to have to do some casting for param 4, but now there are type-safe handlers
218 Connect( DYNAMIC_QUIT, wxID_ANY,
219 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
220 Connect( DYNAMIC_ABOUT, wxID_ANY,
221 wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnAbout) );
222
223 CreateStatusBar();
224
225
226 // Left wxDataViewCtrl
227 dataview_left = new wxDataViewCtrl( this, -1 );
228
229 MyTextModel *model = new MyTextModel;
230 dataview_left->AssociateModel( model );
231
232 dataview_left->AppendTextColumn( wxT("first"), 0 );
233 dataview_left->AppendTextColumn( wxT("second"), 1 );
234
235 wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
236 wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
237 dataview_left->AppendColumn( column );
238
239 dataview_left->AppendToggleColumn( wxT("fourth"), 3 );
240
241 MyCustomCell *custom_cell = new MyCustomCell;
242 column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
243 dataview_left->AppendColumn( column );
244
245 dataview_left->AppendProgressColumn( wxT("progress"), 5 );
246
247 // Right wxDataViewCtrl using the same model
248 dataview_right = new wxDataViewCtrl( this, -1 );
249 dataview_right->AssociateModel( model );
250
251 text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
252 column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
253 dataview_right->AppendColumn( column );
254 dataview_right->AppendTextColumn( wxT("first"), 0 );
255 dataview_right->AppendTextColumn( wxT("second"), 1 );
256 wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE );
257 column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 );
258 dataview_right->AppendColumn( column );
259
260 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
261 sizer->Add( dataview_left, 1, wxGROW );
262 sizer->Add(10,10);
263 sizer->Add( dataview_right, 1, wxGROW );
264 SetSizer( sizer );
265 }
266
267 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
268 {
269 Close(true);
270 }
271
272 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
273 {
274 wxMessageDialog dialog(this, _T("This demonstrates the dataview control handling"),
275 _T("About DataView"), wxOK);
276
277 dialog.ShowModal();
278 }
279
280