]> git.saurik.com Git - wxWidgets.git/blame - src/osx/dataview_osx.cpp
Swap client data pointers in wxRearrangeList too.
[wxWidgets.git] / src / osx / dataview_osx.cpp
CommitLineData
e86edab0
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/osx/dataview_osx.cpp
3// Purpose: wxDataViewCtrl native mac implementation
4// Author:
5// Id: $Id: dataview_osx.cpp 58317 2009-01-27
6// Copyright: (c) 2009
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10// For compilers that support precompilation, includes "wx.h".
11#include "wx/wxprec.h"
12
13#if (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
14
e86edab0
RR
15#include <limits>
16
17#ifndef WX_PRECOMP
18 #include "wx/timer.h"
19 #include "wx/settings.h"
20 #include "wx/dcclient.h"
21 #include "wx/icon.h"
22#endif
23
24#include "wx/osx/core/dataview.h"
25#include "wx/osx/private.h"
26#include "wx/renderer.h"
27
28// ============================================================================
29// Helper functions for dataviewe implementation on OSX
30// ============================================================================
31wxString ConcatenateDataViewItemValues(wxDataViewCtrl const* dataViewCtrlPtr, wxDataViewItem const& dataViewItem)
32{
33 wxString dataString; // contains the TAB concatenated data
34
35
36 for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); i++)
37 {
38 // variable definition:
39 wxVariant dataValue;
608129e5 40
e86edab0
RR
41 dataViewCtrlPtr->GetModel()->GetValue(dataValue,dataViewItem,dataViewCtrlPtr->GetColumn(i)->GetModelColumn());
42 if (i > 0)
43 dataString << wxT('\t');
44 dataString << dataValue.MakeString();
45 }
46 return dataString;
47}
48
49// ============================================================================
50// wxOSXDataViewModelNotifier
51// ============================================================================
52class wxOSXDataViewModelNotifier : public wxDataViewModelNotifier
53{
54public:
55 //
56 // constructors / destructor
57 //
58 wxOSXDataViewModelNotifier(wxDataViewCtrl* initDataViewCtrlPtr);
59
60 //
61 // inherited methods from wxDataViewModelNotifier
62 //
63 virtual bool ItemAdded (wxDataViewItem const &parent, wxDataViewItem const &item);
64 virtual bool ItemsAdded (wxDataViewItem const& parent, wxDataViewItemArray const& items);
65 virtual bool ItemChanged (wxDataViewItem const& item);
66 virtual bool ItemsChanged(wxDataViewItemArray const& items);
67 virtual bool ItemDeleted (wxDataViewItem const& parent, wxDataViewItem const& item);
68 virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items);
69 virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col);
70 virtual bool Cleared();
71 virtual void Resort();
72
73protected:
74 // if the dataview control can have a variable row height this method sets the dataview's control row height of
75 // the passed item to the maximum value occupied by the item in all columns
76 void AdjustRowHeight(wxDataViewItem const& item);
77 // ... and the same method for a couple of items:
78 void AdjustRowHeights(wxDataViewItemArray const& items);
79
80private:
81 wxDataViewCtrl* m_DataViewCtrlPtr;
82};
83
84//
85// constructors / destructor
86//
87wxOSXDataViewModelNotifier::wxOSXDataViewModelNotifier(wxDataViewCtrl* initDataViewCtrlPtr)
88 :m_DataViewCtrlPtr(initDataViewCtrlPtr)
89{
90 if (initDataViewCtrlPtr == NULL)
91 wxFAIL_MSG(_("Pointer to dataview control must not be NULL"));
92}
93
94bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataViewItem const& item)
95{
96 bool noFailureFlag;
97
98
99 wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
de40d736
VZ
100 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,item);
101 AdjustRowHeight(item);
e86edab0
RR
102 return noFailureFlag;
103}
104
105bool wxOSXDataViewModelNotifier::ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
106{
107 bool noFailureFlag;
108
109
110 // insert all valid items into control:
de40d736 111 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,items);
e86edab0 112 // adjust row heights:
de40d736 113 AdjustRowHeights(items);
e86edab0
RR
114 // done:
115 return noFailureFlag;
116}
117
118bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
119{
120 wxCHECK_MSG(item.IsOk(), false,_("Changed item is invalid."));
de40d736
VZ
121 wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
122 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
e86edab0
RR
123 {
124 // sent the equivalent wxWidget event:
de40d736 125 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
e86edab0 126
de40d736 127 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
e86edab0
RR
128 dataViewEvent.SetItem(item);
129 // sent the equivalent wxWidget event:
de40d736 130 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
e86edab0 131 // row height may have to be adjusted:
de40d736 132 AdjustRowHeight(item);
e86edab0
RR
133 // done
134 return true;
135 }
136 else
137 return false;
138}
139
140bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
141{
142 size_t const noOfItems = items.GetCount();
143
de40d736 144 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
e86edab0
RR
145
146
de40d736 147 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
e86edab0 148 for (size_t indexItem=0; indexItem<noOfItems; ++indexItem)
de40d736 149 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(items[indexItem]),items[indexItem]))
e86edab0
RR
150 {
151 // send for all changed items a wxWidget event:
152 dataViewEvent.SetItem(items[indexItem]);
de40d736 153 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
e86edab0
RR
154 }
155 else
156 return false;
157 // if this location is reached all items have been updated:
de40d736 158 AdjustRowHeights(items);
e86edab0
RR
159 // done:
160 return true;
161}
162
163bool wxOSXDataViewModelNotifier::ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
164{
165 bool noFailureFlag;
166
167
168 wxCHECK_MSG(item.IsOk(),false,_("To be deleted item is invalid."));
169 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
170 // not to be identical because the being edited item might be below the passed item in the hierarchy);
171 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
172 // has been started and that variables can currently not be updated even when requested by the system:
de40d736
VZ
173 m_DataViewCtrlPtr->SetDeleting(true);
174 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,item);
e86edab0 175 // enable automatic updating again:
de40d736 176 m_DataViewCtrlPtr->SetDeleting(false);
e86edab0
RR
177 // done:
178 return noFailureFlag;
179}
180
181bool wxOSXDataViewModelNotifier::ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
182{
183 bool noFailureFlag;
184
185
186 // when this method is called and currently an item is being edited this item may have already been deleted in the model (the passed item and the being edited item have
187 // not to be identical because the being edited item might be below the passed item in the hierarchy);
188 // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
189 // has been started and that variables can currently not be updated even when requested by the system:
de40d736 190 m_DataViewCtrlPtr->SetDeleting(true);
e86edab0 191 // delete all specified items:
de40d736 192 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
e86edab0 193 // enable automatic updating again:
de40d736 194 m_DataViewCtrlPtr->SetDeleting(false);
e86edab0
RR
195 // done:
196 return noFailureFlag;
197}
198
199bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsigned int col)
200{
201 wxCHECK_MSG(item.IsOk(), false,_("Passed item is invalid."));
de40d736
VZ
202 wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
203 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
e86edab0 204 {
de40d736 205 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
e86edab0 206
de40d736 207 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
e86edab0
RR
208 dataViewEvent.SetColumn(col);
209 dataViewEvent.SetItem(item);
210 // send the equivalent wxWidget event:
de40d736 211 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
e86edab0
RR
212 // done
213 return true;
214 }
215 else
216 return false;
217}
218
219bool wxOSXDataViewModelNotifier::Cleared()
220{
de40d736 221 return m_DataViewCtrlPtr->GetDataViewPeer()->Reload();
e86edab0
RR
222}
223
224void wxOSXDataViewModelNotifier::Resort()
225{
de40d736 226 m_DataViewCtrlPtr->GetDataViewPeer()->Resort();
e86edab0
RR
227}
228
229void wxOSXDataViewModelNotifier::AdjustRowHeight(wxDataViewItem const& item)
230{
de40d736 231 if ((m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
e86edab0 232 {
de40d736 233 wxDataViewModel *model = GetOwner();
e86edab0
RR
234
235 int height = 20; // TODO find out standard height
de40d736 236 unsigned int num = m_DataViewCtrlPtr->GetColumnCount();
e86edab0
RR
237 unsigned int col;
238 for (col = 0; col < num; col++)
239 {
de40d736 240 wxDataViewColumn* column(m_DataViewCtrlPtr->GetColumnPtr(col));
608129e5 241
e86edab0
RR
242 if (!(column->IsHidden()))
243 {
244 wxDataViewCustomRenderer *renderer = dynamic_cast<wxDataViewCustomRenderer*>(column->GetRenderer());
245 if (renderer)
246 {
247 wxVariant value;
248 model->GetValue( value, item, column->GetModelColumn() );
249 renderer->SetValue( value );
250 height = wxMax( height, renderer->GetSize().y );
251 }
252 }
253 }
254 if (height > 20)
de40d736 255 m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(item,height);
e86edab0
RR
256 }
257}
258
259void wxOSXDataViewModelNotifier::AdjustRowHeights(wxDataViewItemArray const& items)
260{
de40d736 261 if ((m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
e86edab0
RR
262 {
263 size_t const noOfItems = items.GetCount();
264
de40d736 265 wxDataViewModel *model = GetOwner();
e86edab0
RR
266
267 for (size_t itemIndex=0; itemIndex<noOfItems; ++itemIndex)
268 {
269 int height = 20; // TODO find out standard height
de40d736 270 unsigned int num = m_DataViewCtrlPtr->GetColumnCount();
e86edab0
RR
271 unsigned int col;
272
273 for (col = 0; col < num; col++)
274 {
de40d736 275 wxDataViewColumn* column(m_DataViewCtrlPtr->GetColumnPtr(col));
608129e5 276
e86edab0
RR
277 if (!(column->IsHidden()))
278 {
279 wxDataViewCustomRenderer *renderer = dynamic_cast<wxDataViewCustomRenderer*>(column->GetRenderer());
280 if (renderer)
281 {
282 wxVariant value;
283 model->GetValue( value, items[itemIndex], column->GetModelColumn() );
284 renderer->SetValue( value );
285 height = wxMax( height, renderer->GetSize().y );
286 }
287 }
288 }
289 if (height > 20)
de40d736 290 m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(items[itemIndex],height);
e86edab0
RR
291 }
292 }
293}
294
295// ---------------------------------------------------------
296// wxDataViewCustomRenderer
297// The constructor, the implementation macro and environment
298// dependent methods can be found in the environment's
299// source file.
300// ---------------------------------------------------------
de40d736 301wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
e86edab0 302{
de40d736 303 delete m_DCPtr;
e86edab0
RR
304}
305
e86edab0
RR
306wxDC* wxDataViewCustomRenderer::GetDC()
307{
de40d736
VZ
308 if ((m_DCPtr == NULL) && (GetOwner() != NULL) && (GetOwner()->GetOwner() != NULL))
309 m_DCPtr = new wxClientDC(GetOwner()->GetOwner());
310 return m_DCPtr;
e86edab0
RR
311}
312
313void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
314{
315 delete m_DCPtr;
316 m_DCPtr = newDCPtr;
317}
318
e86edab0
RR
319//-----------------------------------------------------------------------------
320// wxDataViewCtrl
321//-----------------------------------------------------------------------------
322
323wxDataViewCtrl::~wxDataViewCtrl()
324{
de40d736 325 ClearColumns();
e86edab0
RR
326}
327
328void wxDataViewCtrl::Init()
329{
330 m_CustomRendererPtr = NULL;
331 m_Deleting = false;
332 m_macIsUserPane = false;
333 m_cgContext = NULL;
334}
335
336bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
337{
de40d736 338 if (!(wxControl::Create(parent,id,pos,size,style & ~(wxHSCROLL | wxVSCROLL),validator)))
e86edab0 339 return false;
de40d736 340 m_peer = ::CreateDataView(this,parent,id,pos,size,style,GetExtraStyle());
e86edab0 341
de40d736 342 MacPostControlCreate(pos,size);
e86edab0
RR
343
344 return true;
345}
346
347bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
348{
de40d736 349 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
e86edab0
RR
350
351
352 wxCHECK_MSG(dataViewWidgetPtr != NULL,false,_("Pointer to native control must not be NULL."));
353 if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model))
354 {
355 if (model != NULL)
356 model->AddNotifier(new wxOSXDataViewModelNotifier(this));
357 return true;
358 }
359 else
360 return false;
361}
362
363bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
364{
365 return wxDataViewCtrl::InsertColumn( GetColumnCount(), columnPtr );
366}
367
368bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
369{
370 return wxDataViewCtrl::InsertColumn( 0, columnPtr );
371}
372
373bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
374{
de40d736 375 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
e86edab0
RR
376
377 // first, some error checking:
378 wxCHECK_MSG(dataViewWidgetPtr != NULL, false,_("Pointer to native control must not be NULL."));
379 wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL."));
380 wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer."));
de40d736 381 wxCHECK_MSG(GetModel() != NULL, false,_("No model associated with control."));
e86edab0 382 wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
de40d736 383 (columnPtr->GetModelColumn() < GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
e86edab0
RR
384
385 // add column to wxWidget's internal structure:
de40d736 386 if (wxDataViewCtrlBase::InsertColumn(pos,columnPtr))
e86edab0 387 {
de40d736 388 m_ColumnPtrs.Add(columnPtr);
e86edab0
RR
389 // if the insertion in the native control is successful the rest can also be initialized:
390 if (dataViewWidgetPtr->InsertColumn(pos,columnPtr))
391 {
392 // make sure that the data is up-to-date...
393 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
394 // otherwise ask the control to 'update' the data in the newly appended column:
de40d736
VZ
395 if (GetColumnCount() == 1)
396 SetExpanderColumn(columnPtr);
e86edab0
RR
397 // done:
398 return true;
399 }
400 else
401 {
402 // clean-up:
de40d736 403 m_ColumnPtrs.Remove(columnPtr);
e86edab0
RR
404 delete columnPtr;
405 // and send a message in debug mode:
406 wxFAIL_MSG(_("Column could not be added to native control."));
407 // failed:
408 return false;
409 }
410 }
411 else
412 {
413 // clean-up:
414 delete columnPtr;
415 wxFAIL_MSG(_("Could not add column to internal structures."));
416 // failed:
417 return false;
418 }
419}
420
421bool wxDataViewCtrl::ClearColumns()
422{
de40d736 423 if (GetDataViewPeer()->ClearColumns())
e86edab0 424 {
de40d736 425 WX_CLEAR_ARRAY(m_ColumnPtrs);
e86edab0
RR
426 return true;
427 }
428 else
429 return false;
430}
431
432bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
433{
de40d736 434 if (GetDataViewPeer()->DeleteColumn(columnPtr))
e86edab0 435 {
de40d736 436 m_ColumnPtrs.Remove(columnPtr);
e86edab0
RR
437 delete columnPtr;
438 return true;
439 }
440 else
441 return false;
442}
443
444wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
445{
de40d736 446 return GetDataViewPeer()->GetColumn(pos);
e86edab0
RR
447}
448
449unsigned int wxDataViewCtrl::GetColumnCount() const
450{
de40d736 451 return m_ColumnPtrs.GetCount();
e86edab0
RR
452}
453
454int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
455{
de40d736 456 return GetDataViewPeer()->GetColumnPosition(columnPtr);
e86edab0
RR
457}
458
459void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
460{
de40d736 461 GetDataViewPeer()->Collapse(item);
e86edab0
RR
462}
463
464void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
465{
466 if (item.IsOk())
467 {
de40d736
VZ
468 ExpandAncestors(item); // make sure that the item exists in the control
469 GetDataViewPeer()->EnsureVisible(item,columnPtr);
e86edab0
RR
470 }
471}
472
473void wxDataViewCtrl::Expand(wxDataViewItem const& item)
474{
de40d736 475 return GetDataViewPeer()->Expand(item);
e86edab0
RR
476}
477
478bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
479{
de40d736 480 return (item.IsOk() && GetDataViewPeer()->IsExpanded(item));
e86edab0
RR
481}
482
483wxDataViewColumn* wxDataViewCtrl::GetSortingColumn() const
484{
de40d736 485 return GetDataViewPeer()->GetSortingColumn();
e86edab0
RR
486}
487
488unsigned int wxDataViewCtrl::GetCount() const
489{
de40d736 490 return GetDataViewPeer()->GetCount();
e86edab0
RR
491}
492
493wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
494{
495 if (item.IsOk() && (columnPtr != NULL))
de40d736 496 return GetDataViewPeer()->GetRectangle(item,columnPtr);
e86edab0
RR
497 else
498 return wxRect();
499}
500
501wxDataViewItem wxDataViewCtrl::GetSelection() const
502{
503 wxDataViewItemArray itemIDs;
504
505
de40d736 506 if (GetDataViewPeer()->GetSelections(itemIDs) > 0)
e86edab0
RR
507 return itemIDs[0];
508 else
509 return wxDataViewItem();
510}
511
512int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
513{
de40d736 514 return GetDataViewPeer()->GetSelections(sel);
e86edab0
RR
515}
516
517void wxDataViewCtrl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
518{
de40d736 519 return GetDataViewPeer()->HitTest(point,item,columnPtr);
e86edab0
RR
520}
521
522bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
523{
de40d736 524 return GetDataViewPeer()->IsSelected(item);
e86edab0
RR
525}
526
527void wxDataViewCtrl::Select(wxDataViewItem const& item)
528{
529 if (item.IsOk())
530 {
de40d736
VZ
531 ExpandAncestors(item); // make sure that the item exists in the control
532 GetDataViewPeer()->Select(item);
e86edab0
RR
533 }
534}
535
de40d736 536void wxDataViewCtrl::SelectAll()
e86edab0 537{
de40d736 538 GetDataViewPeer()->SelectAll();
e86edab0
RR
539}
540
541void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
542{
543 size_t const noOfSelections = sel.GetCount();
544
545 size_t i;
546
547 wxDataViewItem last_parent;
548
549
550 // make sure that all to be selected items are visible in the control:
551 for (i = 0; i < noOfSelections; i++)
552 {
553 wxDataViewItem item = sel[i];
de40d736 554 wxDataViewItem parent = GetModel()->GetParent( item );
e86edab0
RR
555
556 if (parent.IsOk() && (parent != last_parent))
de40d736 557 ExpandAncestors(item);
e86edab0
RR
558 last_parent = parent;
559 }
560
561 // finally select the items:
de40d736 562 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer()); // variable definition for abbreviational purposes
e86edab0
RR
563
564 for (i=0; i<noOfSelections; ++i)
565 dataViewWidgetPtr->Select(sel[i]);
566}
567
568void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
569{
570 if (item.IsOk())
de40d736 571 GetDataViewPeer()->Unselect(item);
e86edab0
RR
572}
573
de40d736 574void wxDataViewCtrl::UnselectAll()
e86edab0 575{
de40d736 576 GetDataViewPeer()->UnselectAll();
e86edab0
RR
577}
578
579//
580// implementation
581//
de40d736 582wxDataViewWidgetImpl* wxDataViewCtrl::GetDataViewPeer() const
e86edab0 583{
de40d736 584 return dynamic_cast<wxDataViewWidgetImpl*>(GetPeer());
e86edab0
RR
585}
586
587void wxDataViewCtrl::AddChildren(wxDataViewItem const& parentItem)
588{
589 int noOfChildren;
590
591 wxDataViewItemArray items;
592
593
de40d736
VZ
594 wxCHECK_RET(GetModel() != NULL,_("Model pointer not initialized."));
595 noOfChildren = GetModel()->GetChildren(parentItem,items);
596 (void) GetModel()->ItemsAdded(parentItem,items);
e86edab0
RR
597}
598
de40d736 599void wxDataViewCtrl::FinishCustomItemEditing()
e86edab0 600{
de40d736 601 if (GetCustomRendererItem().IsOk())
e86edab0 602 {
de40d736
VZ
603 GetCustomRendererPtr()->FinishEditing();
604 SetCustomRendererItem(wxDataViewItem());
605 SetCustomRendererPtr (NULL);
e86edab0
RR
606 }
607}
608
609/*static*/
8f2a8de6
VZ
610wxVisualAttributes
611wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
e86edab0
RR
612{
613 wxVisualAttributes attr;
614
615 attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
616 attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
7eb8aeb8
SC
617 static wxFont font = wxFont(wxOSX_SYSTEM_FONT_VIEWS);
618 attr.font = font;
e86edab0
RR
619
620 return attr;
621}
622
623// inherited methods from wxDataViewCtrlBase
624void wxDataViewCtrl::DoSetExpanderColumn()
625{
de40d736
VZ
626 if (GetExpanderColumn() != NULL)
627 GetDataViewPeer()->DoSetExpanderColumn(GetExpanderColumn());
e86edab0
RR
628}
629
630void wxDataViewCtrl::DoSetIndent()
631{
de40d736 632 GetDataViewPeer()->DoSetIndent(GetIndent());
e86edab0
RR
633}
634
635// event handling:
636void wxDataViewCtrl::OnSize(wxSizeEvent& event)
637{
de40d736 638 unsigned int const noOfColumns = GetColumnCount();
e86edab0
RR
639
640
641 // reset DC of all custom renderers because DC has changed:
642 for (unsigned int i=0; i<noOfColumns; ++i)
643 {
de40d736 644 wxDataViewColumn* dataViewColumnPtr(GetColumn(i));
e86edab0
RR
645
646 if (dataViewColumnPtr != NULL)
647 {
648 wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
649
650 if (dataViewCustomRendererPtr != NULL)
651 dataViewCustomRendererPtr->SetDC(NULL);
652 }
653 }
654
655 // update the layout of the native control after a size event:
de40d736 656 GetDataViewPeer()->OnSize();
e86edab0
RR
657
658 event.Skip();
659}
660
35d85392
RR
661wxSize wxDataViewCtrl::DoGetBestSize() const
662{
663 wxSize best = wxControl::DoGetBestSize();
664 best.y = 80;
608129e5 665
35d85392
RR
666 return best;
667}
668
669void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
670{
671 event.Skip();
608129e5 672
35d85392
RR
673 if (GetModel() == NULL)
674 return;
675
676#if 0
677 // Doesn't compile anymore
678 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
679
680 int NoOfChildren;
681 wxDataViewItemArray items;
682 NoOfChildren = GetModel()->GetChildren( wxDataViewItem(), items);
683 if (NoOfChildren == 0)
684 return;
685 wxDataViewItem firstChild = items[0];
686
687 UInt16 headerHeight = 0;
688 MacDataViewListCtrlPtr->GetHeaderButtonHeight(&headerHeight);
608129e5
VZ
689
690
35d85392
RR
691 if (event.GetY() < headerHeight)
692 {
693 unsigned int col_count = GetColumnCount();
694 unsigned int col;
695 for (col = 0; col < col_count; col++)
696 {
697 wxDataViewColumn *column = GetColumn( col );
698 if (column->IsHidden())
699 continue;
608129e5 700
35d85392 701 Rect itemrect;
608129e5 702 ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr->GetControlRef(),
35d85392
RR
703 reinterpret_cast<DataBrowserItemID>(firstChild.GetID()), column->GetPropertyID(),
704 kDataBrowserPropertyEnclosingPart, &itemrect );
608129e5 705
35d85392
RR
706 if (abs( event.GetX() - itemrect.right) < 3)
707 {
708 if (column->GetFlags() & wxDATAVIEW_COL_RESIZABLE)
709 SetCursor( wxCursor( wxCURSOR_SIZEWE ) );
710 else
711 SetCursor( *wxSTANDARD_CURSOR );
712 return;
713 }
714 }
608129e5 715
35d85392 716 }
608129e5 717
35d85392
RR
718 SetCursor( *wxSTANDARD_CURSOR );
719#endif
720}
721
e86edab0
RR
722IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)
723
724BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
725 EVT_SIZE(wxDataViewCtrl::OnSize)
35d85392 726 EVT_MOTION(wxDataViewCtrl::OnMouse)
e86edab0
RR
727END_EVENT_TABLE()
728
729#endif // (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
730