No real changes, just minor cleanup in Cocoa wxDataViewCtrl.
[wxWidgets.git] / src / osx / dataview_osx.cpp
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
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 // ============================================================================
31 wxString 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;
40
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 // ============================================================================
52 class wxOSXDataViewModelNotifier : public wxDataViewModelNotifier
53 {
54 public:
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
73 protected:
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
80 private:
81 wxDataViewCtrl* m_DataViewCtrlPtr;
82 };
83
84 //
85 // constructors / destructor
86 //
87 wxOSXDataViewModelNotifier::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
94 bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataViewItem const& item)
95 {
96 bool noFailureFlag;
97
98
99 wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
100 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,item);
101 AdjustRowHeight(item);
102 return noFailureFlag;
103 }
104
105 bool wxOSXDataViewModelNotifier::ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
106 {
107 bool noFailureFlag;
108
109
110 // insert all valid items into control:
111 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,items);
112 // adjust row heights:
113 AdjustRowHeights(items);
114 // done:
115 return noFailureFlag;
116 }
117
118 bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
119 {
120 wxCHECK_MSG(item.IsOk(), false,_("Changed item is invalid."));
121 wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
122 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
123 {
124 // sent the equivalent wxWidget event:
125 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
126
127 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
128 dataViewEvent.SetItem(item);
129 // sent the equivalent wxWidget event:
130 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
131 // row height may have to be adjusted:
132 AdjustRowHeight(item);
133 // done
134 return true;
135 }
136 else
137 return false;
138 }
139
140 bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
141 {
142 size_t const noOfItems = items.GetCount();
143
144 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
145
146
147 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
148 for (size_t indexItem=0; indexItem<noOfItems; ++indexItem)
149 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(items[indexItem]),items[indexItem]))
150 {
151 // send for all changed items a wxWidget event:
152 dataViewEvent.SetItem(items[indexItem]);
153 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
154 }
155 else
156 return false;
157 // if this location is reached all items have been updated:
158 AdjustRowHeights(items);
159 // done:
160 return true;
161 }
162
163 bool 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:
173 m_DataViewCtrlPtr->SetDeleting(true);
174 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,item);
175 // enable automatic updating again:
176 m_DataViewCtrlPtr->SetDeleting(false);
177 // done:
178 return noFailureFlag;
179 }
180
181 bool 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:
190 m_DataViewCtrlPtr->SetDeleting(true);
191 // delete all specified items:
192 noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
193 // enable automatic updating again:
194 m_DataViewCtrlPtr->SetDeleting(false);
195 // done:
196 return noFailureFlag;
197 }
198
199 bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsigned int col)
200 {
201 wxCHECK_MSG(item.IsOk(), false,_("Passed item is invalid."));
202 wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
203 if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
204 {
205 wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
206
207 dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
208 dataViewEvent.SetColumn(col);
209 dataViewEvent.SetItem(item);
210 // send the equivalent wxWidget event:
211 m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
212 // done
213 return true;
214 }
215 else
216 return false;
217 }
218
219 bool wxOSXDataViewModelNotifier::Cleared()
220 {
221 return m_DataViewCtrlPtr->GetDataViewPeer()->Reload();
222 }
223
224 void wxOSXDataViewModelNotifier::Resort()
225 {
226 m_DataViewCtrlPtr->GetDataViewPeer()->Resort();
227 }
228
229 void wxOSXDataViewModelNotifier::AdjustRowHeight(wxDataViewItem const& item)
230 {
231 if ((m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
232 {
233 wxDataViewModel *model = GetOwner();
234
235 int height = 20; // TODO find out standard height
236 unsigned int num = m_DataViewCtrlPtr->GetColumnCount();
237 unsigned int col;
238 for (col = 0; col < num; col++)
239 {
240 wxDataViewColumn* column(m_DataViewCtrlPtr->GetColumnPtr(col));
241
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)
255 m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(item,height);
256 }
257 }
258
259 void wxOSXDataViewModelNotifier::AdjustRowHeights(wxDataViewItemArray const& items)
260 {
261 if ((m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
262 {
263 size_t const noOfItems = items.GetCount();
264
265 wxDataViewModel *model = GetOwner();
266
267 for (size_t itemIndex=0; itemIndex<noOfItems; ++itemIndex)
268 {
269 int height = 20; // TODO find out standard height
270 unsigned int num = m_DataViewCtrlPtr->GetColumnCount();
271 unsigned int col;
272
273 for (col = 0; col < num; col++)
274 {
275 wxDataViewColumn* column(m_DataViewCtrlPtr->GetColumnPtr(col));
276
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)
290 m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(items[itemIndex],height);
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 // ---------------------------------------------------------
301 wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
302 {
303 delete m_DCPtr;
304 }
305
306 void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
307 {
308 wxDataViewCtrl *view = GetOwner()->GetOwner();
309
310 wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? *wxWHITE : view->GetForegroundColour();
311 dc->SetTextForeground(col);
312 dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
313 }
314
315 wxDC* wxDataViewCustomRenderer::GetDC()
316 {
317 if ((m_DCPtr == NULL) && (GetOwner() != NULL) && (GetOwner()->GetOwner() != NULL))
318 m_DCPtr = new wxClientDC(GetOwner()->GetOwner());
319 return m_DCPtr;
320 }
321
322 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
323 {
324 delete m_DCPtr;
325 m_DCPtr = newDCPtr;
326 }
327
328 //-----------------------------------------------------------------------------
329 // wxDataViewCtrl
330 //-----------------------------------------------------------------------------
331
332 wxDataViewCtrl::~wxDataViewCtrl()
333 {
334 ClearColumns();
335 }
336
337 void wxDataViewCtrl::Init()
338 {
339 m_CustomRendererPtr = NULL;
340 m_Deleting = false;
341 m_macIsUserPane = false;
342 m_cgContext = NULL;
343 }
344
345 bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
346 {
347 if (!(wxControl::Create(parent,id,pos,size,style & ~(wxHSCROLL | wxVSCROLL),validator)))
348 return false;
349 m_peer = ::CreateDataView(this,parent,id,pos,size,style,GetExtraStyle());
350
351 MacPostControlCreate(pos,size);
352
353 return true;
354 }
355
356 bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
357 {
358 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
359
360
361 wxCHECK_MSG(dataViewWidgetPtr != NULL,false,_("Pointer to native control must not be NULL."));
362 if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model))
363 {
364 if (model != NULL)
365 model->AddNotifier(new wxOSXDataViewModelNotifier(this));
366 return true;
367 }
368 else
369 return false;
370 }
371
372 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
373 {
374 return wxDataViewCtrl::InsertColumn( GetColumnCount(), columnPtr );
375 }
376
377 bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
378 {
379 return wxDataViewCtrl::InsertColumn( 0, columnPtr );
380 }
381
382 bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
383 {
384 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
385
386 // first, some error checking:
387 wxCHECK_MSG(dataViewWidgetPtr != NULL, false,_("Pointer to native control must not be NULL."));
388 wxCHECK_MSG(columnPtr != NULL, false,_("Column pointer must not be NULL."));
389 wxCHECK_MSG(columnPtr->GetRenderer() != NULL, false,_("Column does not have a renderer."));
390 wxCHECK_MSG(GetModel() != NULL, false,_("No model associated with control."));
391 wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
392 (columnPtr->GetModelColumn() < GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
393
394 // add column to wxWidget's internal structure:
395 if (wxDataViewCtrlBase::InsertColumn(pos,columnPtr))
396 {
397 m_ColumnPtrs.Add(columnPtr);
398 // if the insertion in the native control is successful the rest can also be initialized:
399 if (dataViewWidgetPtr->InsertColumn(pos,columnPtr))
400 {
401 // make sure that the data is up-to-date...
402 // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
403 // otherwise ask the control to 'update' the data in the newly appended column:
404 if (GetColumnCount() == 1)
405 SetExpanderColumn(columnPtr);
406 // done:
407 return true;
408 }
409 else
410 {
411 // clean-up:
412 m_ColumnPtrs.Remove(columnPtr);
413 delete columnPtr;
414 // and send a message in debug mode:
415 wxFAIL_MSG(_("Column could not be added to native control."));
416 // failed:
417 return false;
418 }
419 }
420 else
421 {
422 // clean-up:
423 delete columnPtr;
424 wxFAIL_MSG(_("Could not add column to internal structures."));
425 // failed:
426 return false;
427 }
428 }
429
430 bool wxDataViewCtrl::ClearColumns()
431 {
432 if (GetDataViewPeer()->ClearColumns())
433 {
434 WX_CLEAR_ARRAY(m_ColumnPtrs);
435 return true;
436 }
437 else
438 return false;
439 }
440
441 bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
442 {
443 if (GetDataViewPeer()->DeleteColumn(columnPtr))
444 {
445 m_ColumnPtrs.Remove(columnPtr);
446 delete columnPtr;
447 return true;
448 }
449 else
450 return false;
451 }
452
453 wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
454 {
455 return GetDataViewPeer()->GetColumn(pos);
456 }
457
458 unsigned int wxDataViewCtrl::GetColumnCount() const
459 {
460 return m_ColumnPtrs.GetCount();
461 }
462
463 int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
464 {
465 return GetDataViewPeer()->GetColumnPosition(columnPtr);
466 }
467
468 void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
469 {
470 GetDataViewPeer()->Collapse(item);
471 }
472
473 void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
474 {
475 if (item.IsOk())
476 {
477 ExpandAncestors(item); // make sure that the item exists in the control
478 GetDataViewPeer()->EnsureVisible(item,columnPtr);
479 }
480 }
481
482 void wxDataViewCtrl::Expand(wxDataViewItem const& item)
483 {
484 return GetDataViewPeer()->Expand(item);
485 }
486
487 bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
488 {
489 return (item.IsOk() && GetDataViewPeer()->IsExpanded(item));
490 }
491
492 wxDataViewColumn* wxDataViewCtrl::GetSortingColumn() const
493 {
494 return GetDataViewPeer()->GetSortingColumn();
495 }
496
497 unsigned int wxDataViewCtrl::GetCount() const
498 {
499 return GetDataViewPeer()->GetCount();
500 }
501
502 wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
503 {
504 if (item.IsOk() && (columnPtr != NULL))
505 return GetDataViewPeer()->GetRectangle(item,columnPtr);
506 else
507 return wxRect();
508 }
509
510 wxDataViewItem wxDataViewCtrl::GetSelection() const
511 {
512 wxDataViewItemArray itemIDs;
513
514
515 if (GetDataViewPeer()->GetSelections(itemIDs) > 0)
516 return itemIDs[0];
517 else
518 return wxDataViewItem();
519 }
520
521 int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
522 {
523 return GetDataViewPeer()->GetSelections(sel);
524 }
525
526 void wxDataViewCtrl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
527 {
528 return GetDataViewPeer()->HitTest(point,item,columnPtr);
529 }
530
531 bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
532 {
533 return GetDataViewPeer()->IsSelected(item);
534 }
535
536 void wxDataViewCtrl::Select(wxDataViewItem const& item)
537 {
538 if (item.IsOk())
539 {
540 ExpandAncestors(item); // make sure that the item exists in the control
541 GetDataViewPeer()->Select(item);
542 }
543 }
544
545 void wxDataViewCtrl::SelectAll()
546 {
547 GetDataViewPeer()->SelectAll();
548 }
549
550 void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
551 {
552 size_t const noOfSelections = sel.GetCount();
553
554 size_t i;
555
556 wxDataViewItem last_parent;
557
558
559 // make sure that all to be selected items are visible in the control:
560 for (i = 0; i < noOfSelections; i++)
561 {
562 wxDataViewItem item = sel[i];
563 wxDataViewItem parent = GetModel()->GetParent( item );
564
565 if (parent.IsOk() && (parent != last_parent))
566 ExpandAncestors(item);
567 last_parent = parent;
568 }
569
570 // finally select the items:
571 wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer()); // variable definition for abbreviational purposes
572
573 for (i=0; i<noOfSelections; ++i)
574 dataViewWidgetPtr->Select(sel[i]);
575 }
576
577 void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
578 {
579 if (item.IsOk())
580 GetDataViewPeer()->Unselect(item);
581 }
582
583 void wxDataViewCtrl::UnselectAll()
584 {
585 GetDataViewPeer()->UnselectAll();
586 }
587
588 //
589 // implementation
590 //
591 wxDataViewWidgetImpl* wxDataViewCtrl::GetDataViewPeer() const
592 {
593 return dynamic_cast<wxDataViewWidgetImpl*>(GetPeer());
594 }
595
596 void wxDataViewCtrl::AddChildren(wxDataViewItem const& parentItem)
597 {
598 int noOfChildren;
599
600 wxDataViewItemArray items;
601
602
603 wxCHECK_RET(GetModel() != NULL,_("Model pointer not initialized."));
604 noOfChildren = GetModel()->GetChildren(parentItem,items);
605 (void) GetModel()->ItemsAdded(parentItem,items);
606 }
607
608 void wxDataViewCtrl::FinishCustomItemEditing()
609 {
610 if (GetCustomRendererItem().IsOk())
611 {
612 GetCustomRendererPtr()->FinishEditing();
613 SetCustomRendererItem(wxDataViewItem());
614 SetCustomRendererPtr (NULL);
615 }
616 }
617
618 /*static*/
619 wxVisualAttributes
620 wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
621 {
622 wxVisualAttributes attr;
623
624 attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
625 attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
626 attr.font.CreateSystemFont(wxOSX_SYSTEM_FONT_VIEWS);
627
628 return attr;
629 }
630
631 // inherited methods from wxDataViewCtrlBase
632 void wxDataViewCtrl::DoSetExpanderColumn()
633 {
634 if (GetExpanderColumn() != NULL)
635 GetDataViewPeer()->DoSetExpanderColumn(GetExpanderColumn());
636 }
637
638 void wxDataViewCtrl::DoSetIndent()
639 {
640 GetDataViewPeer()->DoSetIndent(GetIndent());
641 }
642
643 // event handling:
644 void wxDataViewCtrl::OnSize(wxSizeEvent& event)
645 {
646 unsigned int const noOfColumns = GetColumnCount();
647
648
649 // reset DC of all custom renderers because DC has changed:
650 for (unsigned int i=0; i<noOfColumns; ++i)
651 {
652 wxDataViewColumn* dataViewColumnPtr(GetColumn(i));
653
654 if (dataViewColumnPtr != NULL)
655 {
656 wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
657
658 if (dataViewCustomRendererPtr != NULL)
659 dataViewCustomRendererPtr->SetDC(NULL);
660 }
661 }
662
663 // update the layout of the native control after a size event:
664 GetDataViewPeer()->OnSize();
665
666 event.Skip();
667 }
668
669 wxSize wxDataViewCtrl::DoGetBestSize() const
670 {
671 wxSize best = wxControl::DoGetBestSize();
672 best.y = 80;
673
674 return best;
675 }
676
677 void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
678 {
679 event.Skip();
680
681 if (GetModel() == NULL)
682 return;
683
684 #if 0
685 // Doesn't compile anymore
686 wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
687
688 int NoOfChildren;
689 wxDataViewItemArray items;
690 NoOfChildren = GetModel()->GetChildren( wxDataViewItem(), items);
691 if (NoOfChildren == 0)
692 return;
693 wxDataViewItem firstChild = items[0];
694
695 UInt16 headerHeight = 0;
696 MacDataViewListCtrlPtr->GetHeaderButtonHeight(&headerHeight);
697
698
699 if (event.GetY() < headerHeight)
700 {
701 unsigned int col_count = GetColumnCount();
702 unsigned int col;
703 for (col = 0; col < col_count; col++)
704 {
705 wxDataViewColumn *column = GetColumn( col );
706 if (column->IsHidden())
707 continue;
708
709 Rect itemrect;
710 ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr->GetControlRef(),
711 reinterpret_cast<DataBrowserItemID>(firstChild.GetID()), column->GetPropertyID(),
712 kDataBrowserPropertyEnclosingPart, &itemrect );
713
714 if (abs( event.GetX() - itemrect.right) < 3)
715 {
716 if (column->GetFlags() & wxDATAVIEW_COL_RESIZABLE)
717 SetCursor( wxCursor( wxCURSOR_SIZEWE ) );
718 else
719 SetCursor( *wxSTANDARD_CURSOR );
720 return;
721 }
722 }
723
724 }
725
726 SetCursor( *wxSTANDARD_CURSOR );
727 #endif
728 }
729
730 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)
731
732 BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
733 EVT_SIZE(wxDataViewCtrl::OnSize)
734 EVT_MOTION(wxDataViewCtrl::OnMouse)
735 END_EVENT_TABLE()
736
737 #endif // (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
738