]>
Commit | Line | Data |
---|---|---|
239eaa41 RR |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: src/common/datavcmn.cpp | |
3 | // Purpose: wxDataViewCtrl base classes and common parts | |
4 | // Author: Robert Roebling | |
5 | // Created: 2006/02/20 | |
6 | // RCS-ID: $Id$ | |
7 | // Copyright: (c) 2006, Robert Roebling | |
8 | // Licence: wxWindows licence | |
9 | ///////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | // For compilers that support precompilation, includes "wx.h". | |
12 | #include "wx/wxprec.h" | |
13 | ||
14 | #ifdef __BORLANDC__ | |
15 | #pragma hdrstop | |
16 | #endif | |
17 | ||
8045736e RR |
18 | #if wxUSE_DATAVIEWCTRL |
19 | ||
e7445ff8 PC |
20 | #include "wx/dataview.h" |
21 | ||
f554a14b | 22 | #ifndef WX_PRECOMP |
f554a14b WS |
23 | #include "wx/log.h" |
24 | #endif | |
25 | ||
4a2e5ee8 | 26 | const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl"); |
239eaa41 | 27 | |
239eaa41 | 28 | |
d5025dc0 RR |
29 | bool operator == (const wxDataViewItem &left, const wxDataViewItem &right) |
30 | { | |
31 | return (left.GetID() == right.GetID() ); | |
32 | } | |
33 | ||
34 | ||
f554a14b | 35 | // --------------------------------------------------------- |
d5025dc0 | 36 | // wxDataViewModel |
f554a14b | 37 | // --------------------------------------------------------- |
239eaa41 | 38 | |
9d8fe14a RR |
39 | #include <wx/listimpl.cpp> |
40 | WX_DEFINE_LIST(wxDataViewModelNotifiers); | |
41 | ||
e0062c04 | 42 | wxDataViewModel::wxDataViewModel() |
239eaa41 | 43 | { |
8f850e28 | 44 | m_notifiers.DeleteContents( true ); |
ef427989 | 45 | m_sortingColumn = 0; |
239eaa41 RR |
46 | } |
47 | ||
e0062c04 | 48 | bool wxDataViewModel::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) |
239eaa41 | 49 | { |
8f850e28 RR |
50 | bool ret = true; |
51 | ||
9d8fe14a RR |
52 | wxDataViewModelNotifiers::iterator iter; |
53 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 54 | { |
9d8fe14a | 55 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 56 | if (!notifier->ItemAdded( parent, item )) |
8f850e28 | 57 | ret = false; |
8f850e28 | 58 | } |
f554a14b | 59 | |
8f850e28 | 60 | return ret; |
239eaa41 RR |
61 | } |
62 | ||
469d3e9b | 63 | bool wxDataViewModel::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) |
239eaa41 | 64 | { |
8f850e28 RR |
65 | bool ret = true; |
66 | ||
9d8fe14a RR |
67 | wxDataViewModelNotifiers::iterator iter; |
68 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 69 | { |
9d8fe14a | 70 | wxDataViewModelNotifier* notifier = *iter; |
469d3e9b | 71 | if (!notifier->ItemDeleted( parent, item )) |
8f850e28 | 72 | ret = false; |
8f850e28 | 73 | } |
f554a14b | 74 | |
8f850e28 | 75 | return ret; |
239eaa41 RR |
76 | } |
77 | ||
e0062c04 | 78 | bool wxDataViewModel::ItemChanged( const wxDataViewItem &item ) |
239eaa41 | 79 | { |
8f850e28 RR |
80 | bool ret = true; |
81 | ||
9d8fe14a RR |
82 | wxDataViewModelNotifiers::iterator iter; |
83 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
8f850e28 | 84 | { |
9d8fe14a | 85 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 86 | if (!notifier->ItemChanged( item )) |
8f850e28 | 87 | ret = false; |
8f850e28 | 88 | } |
f554a14b | 89 | |
8f850e28 | 90 | return ret; |
239eaa41 RR |
91 | } |
92 | ||
e0062c04 | 93 | bool wxDataViewModel::ValueChanged( const wxDataViewItem &item, unsigned int col ) |
239eaa41 | 94 | { |
8f850e28 | 95 | bool ret = true; |
b5d777c7 | 96 | |
9d8fe14a RR |
97 | wxDataViewModelNotifiers::iterator iter; |
98 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
b5d777c7 | 99 | { |
9d8fe14a | 100 | wxDataViewModelNotifier* notifier = *iter; |
e0062c04 | 101 | if (!notifier->ValueChanged( item, col )) |
8f850e28 | 102 | ret = false; |
b5d777c7 | 103 | } |
f554a14b | 104 | |
b5d777c7 | 105 | return ret; |
239eaa41 RR |
106 | } |
107 | ||
e0062c04 | 108 | bool wxDataViewModel::Cleared() |
4eccd3a1 RR |
109 | { |
110 | bool ret = true; | |
111 | ||
9d8fe14a RR |
112 | wxDataViewModelNotifiers::iterator iter; |
113 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
4eccd3a1 | 114 | { |
9d8fe14a | 115 | wxDataViewModelNotifier* notifier = *iter; |
8f850e28 RR |
116 | if (!notifier->Cleared()) |
117 | ret = false; | |
8f850e28 | 118 | } |
f554a14b | 119 | |
8f850e28 | 120 | return ret; |
239eaa41 RR |
121 | } |
122 | ||
ef427989 RR |
123 | void wxDataViewModel::Resort() |
124 | { | |
9d8fe14a RR |
125 | wxDataViewModelNotifiers::iterator iter; |
126 | for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter) | |
ef427989 | 127 | { |
9d8fe14a | 128 | wxDataViewModelNotifier* notifier = *iter; |
ef427989 | 129 | notifier->Resort(); |
ef427989 RR |
130 | } |
131 | } | |
132 | ||
e0062c04 | 133 | void wxDataViewModel::AddNotifier( wxDataViewModelNotifier *notifier ) |
239eaa41 | 134 | { |
9d8fe14a | 135 | m_notifiers.push_back( notifier ); |
8f850e28 | 136 | notifier->SetOwner( this ); |
239eaa41 RR |
137 | } |
138 | ||
e0062c04 | 139 | void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier ) |
239eaa41 | 140 | { |
8f850e28 | 141 | m_notifiers.DeleteObject( notifier ); |
239eaa41 RR |
142 | } |
143 | ||
ef427989 RR |
144 | int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ) |
145 | { | |
cf283a47 | 146 | // sort branches before leaves |
ed903e42 RR |
147 | bool item1_is_container = IsContainer(item1); |
148 | bool item2_is_container = IsContainer(item2); | |
900af470 | 149 | |
ed903e42 | 150 | if (item1_is_container && !item2_is_container) |
cf283a47 | 151 | return 1; |
ed903e42 | 152 | if (item2_is_container && !item1_is_container) |
cf283a47 | 153 | return -1; |
900af470 | 154 | |
ef427989 RR |
155 | wxVariant value1,value2; |
156 | GetValue( value1, item1, m_sortingColumn ); | |
157 | GetValue( value2, item2, m_sortingColumn ); | |
cf283a47 | 158 | |
ef427989 RR |
159 | if (value1.GetType() == wxT("string")) |
160 | { | |
161 | wxString str1 = value1.GetString(); | |
162 | wxString str2 = value2.GetString(); | |
0be79c8a | 163 | int res = str1.Cmp( str2 ); |
cf283a47 RR |
164 | if (res) return res; |
165 | } else | |
ef427989 RR |
166 | if (value1.GetType() == wxT("long")) |
167 | { | |
168 | long l1 = value1.GetLong(); | |
169 | long l2 = value2.GetLong(); | |
cf283a47 RR |
170 | long res = l1-l2; |
171 | if (res) return res; | |
172 | } else | |
ef427989 RR |
173 | if (value1.GetType() == wxT("double")) |
174 | { | |
175 | double d1 = value1.GetDouble(); | |
176 | double d2 = value2.GetDouble(); | |
ef427989 | 177 | if (d1 < d2) return 1; |
cf283a47 RR |
178 | if (d1 > d2) return -1; |
179 | } else | |
ef427989 RR |
180 | if (value1.GetType() == wxT("datetime")) |
181 | { | |
182 | wxDateTime dt1 = value1.GetDateTime(); | |
183 | wxDateTime dt2 = value2.GetDateTime(); | |
ef427989 | 184 | if (dt1.IsEarlierThan(dt2)) return 1; |
cf283a47 | 185 | if (dt2.IsEarlierThan(dt1)) return -11; |
ef427989 RR |
186 | } |
187 | ||
cf283a47 | 188 | // items must be different |
900af470 JS |
189 | unsigned long litem1 = (unsigned long) item1.GetID(); |
190 | unsigned long litem2 = (unsigned long) item2.GetID(); | |
cf283a47 | 191 | |
cf283a47 | 192 | return litem1-litem2; |
ef427989 RR |
193 | } |
194 | ||
c534e696 RR |
195 | // --------------------------------------------------------- |
196 | // wxDataViewIndexListModel | |
197 | // --------------------------------------------------------- | |
198 | ||
199 | wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size ) | |
200 | { | |
201 | // build initial index | |
202 | unsigned int i; | |
203 | for (i = 1; i < initial_size+1; i++) | |
204 | m_hash.Add( (void*) i ); | |
205 | m_lastIndex = initial_size + 1; | |
206 | } | |
207 | ||
208 | wxDataViewIndexListModel::~wxDataViewIndexListModel() | |
209 | { | |
210 | } | |
211 | ||
212 | void wxDataViewIndexListModel::RowPrepended() | |
213 | { | |
214 | unsigned int id = m_lastIndex++; | |
215 | m_hash.Insert( (void*) id, 0 ); | |
216 | wxDataViewItem item( (void*) id ); | |
217 | ItemAdded( wxDataViewItem(0), item ); | |
218 | } | |
219 | ||
220 | void wxDataViewIndexListModel::RowInserted( unsigned int before ) | |
221 | { | |
222 | unsigned int id = m_lastIndex++; | |
223 | m_hash.Insert( (void*) id, before ); | |
224 | wxDataViewItem item( (void*) id ); | |
225 | ItemAdded( wxDataViewItem(0), item ); | |
226 | } | |
227 | ||
228 | void wxDataViewIndexListModel::RowAppended() | |
229 | { | |
230 | unsigned int id = m_lastIndex++; | |
231 | m_hash.Add( (void*) id ); | |
232 | wxDataViewItem item( (void*) id ); | |
233 | ItemAdded( wxDataViewItem(0), item ); | |
234 | } | |
235 | ||
236 | void wxDataViewIndexListModel::RowDeleted( unsigned int row ) | |
237 | { | |
238 | wxDataViewItem item( m_hash[row] ); | |
469d3e9b | 239 | wxDataViewModel::ItemDeleted( wxDataViewItem(0), item ); |
d3f00f59 | 240 | m_hash.RemoveAt( row ); |
c534e696 RR |
241 | } |
242 | ||
243 | void wxDataViewIndexListModel::RowChanged( unsigned int row ) | |
244 | { | |
245 | wxDataViewModel::ItemChanged( GetItem(row) ); | |
246 | } | |
247 | ||
248 | void wxDataViewIndexListModel::RowValueChanged( unsigned int row, unsigned int col ) | |
249 | { | |
250 | wxDataViewModel::ValueChanged( GetItem(row), col ); | |
251 | } | |
252 | ||
253 | unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const | |
254 | { | |
255 | // assert for not found | |
256 | return (unsigned int) m_hash.Index( item.GetID() ); | |
257 | } | |
258 | ||
259 | wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const | |
260 | { | |
261 | return wxDataViewItem( m_hash[row] ); | |
262 | } | |
263 | ||
264 | int wxDataViewIndexListModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2 ) | |
265 | { | |
266 | return GetRow(item1) - GetRow(item2); | |
267 | } | |
268 | ||
900af470 | 269 | void wxDataViewIndexListModel::GetValue( wxVariant &variant, |
c534e696 RR |
270 | const wxDataViewItem &item, unsigned int col ) const |
271 | { | |
900af470 | 272 | GetValue( variant, GetRow(item), col ); |
c534e696 RR |
273 | } |
274 | ||
900af470 | 275 | bool wxDataViewIndexListModel::SetValue( const wxVariant &variant, |
c534e696 RR |
276 | const wxDataViewItem &item, unsigned int col ) |
277 | { | |
278 | return SetValue( variant, GetRow(item), col ); | |
279 | } | |
280 | ||
900af470 | 281 | wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const |
c534e696 RR |
282 | { |
283 | return wxDataViewItem(0); | |
284 | } | |
285 | ||
286 | bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem &item ) const | |
287 | { | |
288 | // only the invisible root item has children | |
289 | if (!item.IsOk()) | |
290 | return true; | |
900af470 | 291 | |
c534e696 RR |
292 | return false; |
293 | } | |
294 | ||
295 | wxDataViewItem wxDataViewIndexListModel::GetFirstChild( const wxDataViewItem &parent ) const | |
296 | { | |
297 | if (!parent.IsOk()) | |
298 | { | |
299 | if (m_hash.GetCount() == 0) | |
300 | return wxDataViewItem(0); | |
900af470 | 301 | |
c534e696 RR |
302 | return wxDataViewItem( m_hash[0]); |
303 | } | |
900af470 | 304 | |
c534e696 RR |
305 | return wxDataViewItem(0); |
306 | } | |
307 | ||
308 | wxDataViewItem wxDataViewIndexListModel::GetNextSibling( const wxDataViewItem &item ) const | |
309 | { | |
310 | if (!item.IsOk()) | |
311 | return wxDataViewItem(0); | |
900af470 | 312 | |
c534e696 | 313 | int pos = m_hash.Index( item.GetID() ); |
900af470 | 314 | if ((pos == wxNOT_FOUND) || (pos == (int) (m_hash.GetCount()-1))) |
c534e696 | 315 | return wxDataViewItem(0); |
900af470 | 316 | |
c534e696 RR |
317 | return wxDataViewItem( m_hash[pos+1] ); |
318 | } | |
319 | ||
f554a14b | 320 | // --------------------------------------------------------- |
baa9ebc4 | 321 | // wxDataViewRendererBase |
f554a14b | 322 | // --------------------------------------------------------- |
6842a71a | 323 | |
baa9ebc4 | 324 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject) |
6842a71a | 325 | |
900af470 | 326 | wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype, |
9861f022 RR |
327 | wxDataViewCellMode WXUNUSED(mode), |
328 | int WXUNUSED(align) ) | |
6842a71a RR |
329 | { |
330 | m_variantType = varianttype; | |
1e510b1e | 331 | m_editorCtrl = NULL; |
9861f022 RR |
332 | } |
333 | ||
334 | const wxDataViewCtrl* wxDataViewRendererBase::GetView() const | |
335 | { | |
336 | return wx_const_cast(wxDataViewRendererBase*, this)->GetOwner()->GetOwner(); | |
6842a71a | 337 | } |
f554a14b | 338 | |
e0062c04 | 339 | bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect ) |
1e510b1e | 340 | { |
e0062c04 | 341 | m_item = item; // remember for later |
900af470 | 342 | |
1e510b1e RR |
343 | unsigned int col = GetOwner()->GetModelColumn(); |
344 | wxVariant value; | |
e0062c04 | 345 | GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col ); |
900af470 | 346 | |
1e510b1e | 347 | m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value ); |
900af470 JS |
348 | |
349 | wxDataViewEditorCtrlEvtHandler *handler = | |
30715fa1 | 350 | new wxDataViewEditorCtrlEvtHandler( m_editorCtrl, (wxDataViewRenderer*) this ); |
900af470 | 351 | |
30715fa1 | 352 | m_editorCtrl->PushEventHandler( handler ); |
900af470 | 353 | |
30715fa1 RR |
354 | #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL) |
355 | handler->SetFocusOnIdle(); | |
356 | #else | |
1e510b1e | 357 | m_editorCtrl->SetFocus(); |
30715fa1 RR |
358 | #endif |
359 | ||
1e510b1e RR |
360 | return true; |
361 | } | |
362 | ||
363 | void wxDataViewRendererBase::CancelEditing() | |
364 | { | |
2fa73716 | 365 | wxPendingDelete.Append( m_editorCtrl ); |
900af470 | 366 | |
1e510b1e | 367 | GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); |
900af470 | 368 | |
2fa73716 | 369 | // m_editorCtrl->PopEventHandler( true ); |
1e510b1e RR |
370 | } |
371 | ||
372 | bool wxDataViewRendererBase::FinishEditing() | |
373 | { | |
1e510b1e RR |
374 | wxVariant value; |
375 | GetValueFromEditorCtrl( m_editorCtrl, value ); | |
376 | ||
2fa73716 | 377 | wxPendingDelete.Append( m_editorCtrl ); |
900af470 | 378 | |
1e510b1e | 379 | GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); |
900af470 | 380 | |
1e510b1e RR |
381 | if (!Validate(value)) |
382 | return false; | |
900af470 | 383 | |
1e510b1e | 384 | unsigned int col = GetOwner()->GetModelColumn(); |
e0062c04 RR |
385 | GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col ); |
386 | GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col ); | |
900af470 | 387 | |
2fa73716 | 388 | // m_editorCtrl->PopEventHandler( true ); |
900af470 | 389 | |
1e510b1e RR |
390 | return true; |
391 | } | |
392 | ||
393 | //----------------------------------------------------------------------------- | |
394 | // wxDataViewEditorCtrlEvtHandler | |
395 | //----------------------------------------------------------------------------- | |
396 | ||
397 | BEGIN_EVENT_TABLE(wxDataViewEditorCtrlEvtHandler, wxEvtHandler) | |
398 | EVT_CHAR (wxDataViewEditorCtrlEvtHandler::OnChar) | |
399 | EVT_KILL_FOCUS (wxDataViewEditorCtrlEvtHandler::OnKillFocus) | |
30715fa1 | 400 | EVT_IDLE (wxDataViewEditorCtrlEvtHandler::OnIdle) |
1e510b1e RR |
401 | END_EVENT_TABLE() |
402 | ||
403 | wxDataViewEditorCtrlEvtHandler::wxDataViewEditorCtrlEvtHandler( | |
404 | wxControl *editorCtrl, | |
405 | wxDataViewRenderer *owner ) | |
406 | { | |
407 | m_owner = owner; | |
408 | m_editorCtrl = editorCtrl; | |
409 | ||
410 | m_finished = false; | |
411 | } | |
412 | ||
30715fa1 RR |
413 | void wxDataViewEditorCtrlEvtHandler::OnIdle( wxIdleEvent &event ) |
414 | { | |
415 | if (m_focusOnIdle) | |
416 | { | |
417 | m_focusOnIdle = false; | |
418 | if (wxWindow::FindFocus() != m_editorCtrl) | |
419 | m_editorCtrl->SetFocus(); | |
420 | } | |
900af470 | 421 | |
30715fa1 RR |
422 | event.Skip(); |
423 | } | |
424 | ||
1e510b1e RR |
425 | void wxDataViewEditorCtrlEvtHandler::OnChar( wxKeyEvent &event ) |
426 | { | |
427 | switch ( event.m_keyCode ) | |
428 | { | |
429 | case WXK_RETURN: | |
430 | m_finished = true; | |
431 | m_owner->FinishEditing(); | |
432 | break; | |
433 | ||
434 | case WXK_ESCAPE: | |
435 | m_finished = true; | |
436 | m_owner->CancelEditing(); | |
437 | break; | |
438 | ||
439 | default: | |
440 | event.Skip(); | |
441 | } | |
442 | } | |
443 | ||
444 | void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event ) | |
445 | { | |
446 | if (!m_finished) | |
447 | { | |
448 | m_finished = true; | |
449 | m_owner->FinishEditing(); | |
450 | } | |
451 | ||
1e510b1e RR |
452 | event.Skip(); |
453 | } | |
454 | ||
f554a14b | 455 | // --------------------------------------------------------- |
fa28826d | 456 | // wxDataViewColumnBase |
f554a14b | 457 | // --------------------------------------------------------- |
fa28826d RR |
458 | |
459 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject) | |
460 | ||
9861f022 | 461 | wxDataViewColumnBase::wxDataViewColumnBase(const wxString& WXUNUSED(title), |
baa9ebc4 | 462 | wxDataViewRenderer *renderer, |
0a71f9e9 | 463 | unsigned int model_column, |
008b5a66 | 464 | int WXUNUSED(width), |
87f0efe2 | 465 | wxAlignment WXUNUSED(align), |
900af470 | 466 | int WXUNUSED(flags)) |
fa28826d | 467 | { |
baa9ebc4 | 468 | m_renderer = renderer; |
6842a71a | 469 | m_model_column = model_column; |
6842a71a | 470 | m_owner = NULL; |
baa9ebc4 | 471 | m_renderer->SetOwner( (wxDataViewColumn*) this ); |
9861f022 RR |
472 | |
473 | // NOTE: the wxDataViewColumn's ctor must store the width, align, flags | |
474 | // parameters inside the native control! | |
6842a71a RR |
475 | } |
476 | ||
07a84e7b RR |
477 | wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap, |
478 | wxDataViewRenderer *renderer, | |
479 | unsigned int model_column, | |
480 | int WXUNUSED(width), | |
87f0efe2 | 481 | wxAlignment WXUNUSED(align), |
900af470 | 482 | int WXUNUSED(flags) ) |
07a84e7b RR |
483 | { |
484 | m_renderer = renderer; | |
485 | m_model_column = model_column; | |
07a84e7b RR |
486 | m_bitmap = bitmap; |
487 | m_owner = NULL; | |
488 | m_renderer->SetOwner( (wxDataViewColumn*) this ); | |
489 | } | |
490 | ||
6842a71a RR |
491 | wxDataViewColumnBase::~wxDataViewColumnBase() |
492 | { | |
baa9ebc4 RR |
493 | if (m_renderer) |
494 | delete m_renderer; | |
fa28826d RR |
495 | } |
496 | ||
9861f022 | 497 | int wxDataViewColumnBase::GetFlags() const |
fa28826d | 498 | { |
9861f022 | 499 | int ret = 0; |
fa28826d | 500 | |
9861f022 RR |
501 | if (IsSortable()) |
502 | ret |= wxDATAVIEW_COL_SORTABLE; | |
503 | if (IsResizeable()) | |
504 | ret |= wxDATAVIEW_COL_RESIZABLE; | |
505 | if (IsHidden()) | |
506 | ret |= wxDATAVIEW_COL_HIDDEN; | |
fa28826d | 507 | |
9861f022 | 508 | return ret; |
07a84e7b RR |
509 | } |
510 | ||
9861f022 | 511 | void wxDataViewColumnBase::SetFlags(int flags) |
07a84e7b | 512 | { |
9861f022 RR |
513 | SetSortable((flags & wxDATAVIEW_COL_SORTABLE) != 0); |
514 | SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0); | |
515 | SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0); | |
07a84e7b RR |
516 | } |
517 | ||
f554a14b | 518 | // --------------------------------------------------------- |
239eaa41 | 519 | // wxDataViewCtrlBase |
f554a14b | 520 | // --------------------------------------------------------- |
239eaa41 RR |
521 | |
522 | IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl) | |
523 | ||
524 | wxDataViewCtrlBase::wxDataViewCtrlBase() | |
525 | { | |
526 | m_model = NULL; | |
fa28826d | 527 | m_cols.DeleteContents( true ); |
3b6280be RR |
528 | m_expander_column = 0; |
529 | m_indent = 8; | |
239eaa41 RR |
530 | } |
531 | ||
532 | wxDataViewCtrlBase::~wxDataViewCtrlBase() | |
533 | { | |
900af470 | 534 | // IMPORTANT: before calling DecRef() on our model (since it may |
87f0efe2 RR |
535 | // result in a free() call), erase all columns (since |
536 | // they hold a pointer to our model) | |
537 | m_cols.Clear(); | |
538 | ||
539 | if (m_model) | |
540 | { | |
541 | m_model->DecRef(); | |
542 | m_model = NULL; | |
543 | } | |
239eaa41 RR |
544 | } |
545 | ||
e0062c04 | 546 | bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model ) |
239eaa41 | 547 | { |
1821abd1 RR |
548 | if (m_model) |
549 | { | |
87f0efe2 | 550 | m_model->DecRef(); // discard old model, if any |
1821abd1 | 551 | } |
87f0efe2 RR |
552 | |
553 | // add our own reference to the new model: | |
239eaa41 | 554 | m_model = model; |
1821abd1 RR |
555 | if (m_model) |
556 | { | |
900af470 | 557 | m_model->IncRef(); |
1821abd1 | 558 | } |
f554a14b | 559 | |
239eaa41 RR |
560 | return true; |
561 | } | |
562 | ||
e0062c04 | 563 | wxDataViewModel* wxDataViewCtrlBase::GetModel() |
239eaa41 RR |
564 | { |
565 | return m_model; | |
566 | } | |
567 | ||
1286b7ba | 568 | bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column, |
87f0efe2 | 569 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
fa28826d | 570 | { |
900af470 JS |
571 | return AppendColumn( new wxDataViewColumn( label, |
572 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), | |
9861f022 | 573 | model_column, width, align, flags ) ); |
fa28826d RR |
574 | } |
575 | ||
1286b7ba | 576 | bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column, |
87f0efe2 | 577 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
605c2c4a | 578 | { |
900af470 JS |
579 | return AppendColumn( new wxDataViewColumn( label, |
580 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), | |
9861f022 | 581 | model_column, width, align, flags ) ); |
605c2c4a RR |
582 | } |
583 | ||
1286b7ba | 584 | bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column, |
87f0efe2 | 585 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
ad63bf41 | 586 | { |
900af470 JS |
587 | return AppendColumn( new wxDataViewColumn( label, |
588 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), | |
9861f022 | 589 | model_column, width, align, flags ) ); |
ad63bf41 RR |
590 | } |
591 | ||
1286b7ba | 592 | bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column, |
87f0efe2 | 593 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
4d496ecb | 594 | { |
900af470 JS |
595 | return AppendColumn( new wxDataViewColumn( label, |
596 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), | |
9861f022 | 597 | model_column, width, align, flags ) ); |
4d496ecb RR |
598 | } |
599 | ||
1286b7ba | 600 | bool wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column, |
87f0efe2 | 601 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 602 | { |
900af470 JS |
603 | return AppendColumn( new wxDataViewColumn( label, |
604 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), | |
9861f022 | 605 | model_column, width, align, flags ) ); |
07a84e7b RR |
606 | } |
607 | ||
1286b7ba | 608 | bool wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column, |
87f0efe2 | 609 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 610 | { |
900af470 JS |
611 | return AppendColumn( new wxDataViewColumn( label, |
612 | new wxDataViewTextRenderer( wxT("string"), mode, (int)align ), | |
9861f022 | 613 | model_column, width, align, flags ) ); |
07a84e7b RR |
614 | } |
615 | ||
1286b7ba | 616 | bool wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column, |
87f0efe2 | 617 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 618 | { |
900af470 JS |
619 | return AppendColumn( new wxDataViewColumn( label, |
620 | new wxDataViewToggleRenderer( wxT("bool"), mode, (int)align ), | |
9861f022 | 621 | model_column, width, align, flags ) ); |
07a84e7b RR |
622 | } |
623 | ||
1286b7ba | 624 | bool wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column, |
87f0efe2 | 625 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 626 | { |
900af470 JS |
627 | return AppendColumn( new wxDataViewColumn( label, |
628 | new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode, (int)align ), | |
9861f022 | 629 | model_column, width, align, flags ) ); |
07a84e7b RR |
630 | } |
631 | ||
1286b7ba | 632 | bool wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column, |
87f0efe2 | 633 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 634 | { |
900af470 JS |
635 | return AppendColumn( new wxDataViewColumn( label, |
636 | new wxDataViewDateRenderer( wxT("datetime"), mode, (int)align ), | |
9861f022 | 637 | model_column, width, align, flags ) ); |
07a84e7b RR |
638 | } |
639 | ||
1286b7ba | 640 | bool wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, |
87f0efe2 | 641 | wxDataViewCellMode mode, int width, wxAlignment align, int flags ) |
07a84e7b | 642 | { |
900af470 JS |
643 | return AppendColumn( new wxDataViewColumn( label, |
644 | new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode, (int)align ), | |
9861f022 | 645 | model_column, width, align, flags ) ); |
07a84e7b RR |
646 | } |
647 | ||
fa28826d RR |
648 | bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col ) |
649 | { | |
650 | m_cols.Append( (wxObject*) col ); | |
6842a71a | 651 | col->SetOwner( (wxDataViewCtrl*) this ); |
fa28826d RR |
652 | return true; |
653 | } | |
654 | ||
9861f022 | 655 | unsigned int wxDataViewCtrlBase::GetColumnCount() const |
fa28826d RR |
656 | { |
657 | return m_cols.GetCount(); | |
658 | } | |
659 | ||
0a71f9e9 | 660 | bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos) ) |
fa28826d RR |
661 | { |
662 | return false; | |
663 | } | |
664 | ||
665 | bool wxDataViewCtrlBase::ClearColumns() | |
666 | { | |
667 | return false; | |
668 | } | |
669 | ||
0a71f9e9 | 670 | wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos ) |
fa28826d RR |
671 | { |
672 | return (wxDataViewColumn*) m_cols[ pos ]; | |
673 | } | |
674 | ||
eb7f97f8 RR |
675 | // --------------------------------------------------------- |
676 | // wxDataViewEvent | |
677 | // --------------------------------------------------------- | |
678 | ||
679 | IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent) | |
680 | ||
e0062c04 RR |
681 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED) |
682 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED) | |
31fb32e1 RR |
683 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK) |
684 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) | |
c0a66d92 | 685 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED) |
eb7f97f8 | 686 | |
e0062c04 RR |
687 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED) |
688 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED) | |
689 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED) | |
1821abd1 | 690 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED) |
1821abd1 | 691 | DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED) |
eb7f97f8 | 692 | |
8045736e | 693 | #endif |