1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/dataview_osx.cpp
3 // Purpose: wxDataViewCtrl native mac implementation
5 // Id: $Id: dataview_osx.cpp 58317 2009-01-27
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
13 #if (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
19 #include "wx/settings.h"
20 #include "wx/dcclient.h"
24 #include "wx/osx/core/dataview.h"
25 #include "wx/osx/private.h"
26 #include "wx/renderer.h"
28 // ============================================================================
29 // Helper functions for dataviewe implementation on OSX
30 // ============================================================================
31 wxString
ConcatenateDataViewItemValues(wxDataViewCtrl
const* dataViewCtrlPtr
, wxDataViewItem
const& dataViewItem
)
33 wxString dataString
; // contains the TAB concatenated data
36 for (size_t i
=0; i
<dataViewCtrlPtr
->GetColumnCount(); i
++)
38 // variable definition:
41 dataViewCtrlPtr
->GetModel()->GetValue(dataValue
,dataViewItem
,dataViewCtrlPtr
->GetColumn(i
)->GetModelColumn());
43 dataString
<< wxT('\t');
44 dataString
<< dataValue
.MakeString();
49 // ============================================================================
50 // wxOSXDataViewModelNotifier
51 // ============================================================================
52 class wxOSXDataViewModelNotifier
: public wxDataViewModelNotifier
56 // constructors / destructor
58 wxOSXDataViewModelNotifier(wxDataViewCtrl
* initDataViewCtrlPtr
);
61 // inherited methods from wxDataViewModelNotifier
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();
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
);
81 wxDataViewCtrl
* m_DataViewCtrlPtr
;
85 // constructors / destructor
87 wxOSXDataViewModelNotifier::wxOSXDataViewModelNotifier(wxDataViewCtrl
* initDataViewCtrlPtr
)
88 :m_DataViewCtrlPtr(initDataViewCtrlPtr
)
90 if (initDataViewCtrlPtr
== NULL
)
91 wxFAIL_MSG(_("Pointer to dataview control must not be NULL"));
94 bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
99 wxCHECK_MSG(item
.IsOk(),false,_("Added item is invalid."));
100 noFailureFlag
= m_DataViewCtrlPtr
->GetDataViewPeer()->Add(parent
,item
);
101 AdjustRowHeight(item
);
102 return noFailureFlag
;
105 bool wxOSXDataViewModelNotifier::ItemsAdded(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
110 // insert all valid items into control:
111 noFailureFlag
= m_DataViewCtrlPtr
->GetDataViewPeer()->Add(parent
,items
);
112 // adjust row heights:
113 AdjustRowHeights(items
);
115 return noFailureFlag
;
118 bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem
const& item
)
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
))
124 // sent the equivalent wxWidget event:
125 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,m_DataViewCtrlPtr
->GetId());
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
);
140 bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray
const& items
)
142 size_t const noOfItems
= items
.GetCount();
144 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,m_DataViewCtrlPtr
->GetId());
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
]))
151 // send for all changed items a wxWidget event:
152 dataViewEvent
.SetItem(items
[indexItem
]);
153 m_DataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
);
157 // if this location is reached all items have been updated:
158 AdjustRowHeights(items
);
163 bool wxOSXDataViewModelNotifier::ItemDeleted(wxDataViewItem
const& parent
, wxDataViewItem
const& item
)
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);
178 return noFailureFlag
;
181 bool wxOSXDataViewModelNotifier::ItemsDeleted(wxDataViewItem
const& parent
, wxDataViewItemArray
const& items
)
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);
196 return noFailureFlag
;
199 bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem
const& item
, unsigned int col
)
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
))
205 wxDataViewEvent
dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED
,m_DataViewCtrlPtr
->GetId());
207 dataViewEvent
.SetEventObject(m_DataViewCtrlPtr
);
208 dataViewEvent
.SetColumn(col
);
209 dataViewEvent
.SetItem(item
);
210 // send the equivalent wxWidget event:
211 m_DataViewCtrlPtr
->HandleWindowEvent(dataViewEvent
);
219 bool wxOSXDataViewModelNotifier::Cleared()
221 return m_DataViewCtrlPtr
->GetDataViewPeer()->Reload();
224 void wxOSXDataViewModelNotifier::Resort()
226 m_DataViewCtrlPtr
->GetDataViewPeer()->Resort();
229 void wxOSXDataViewModelNotifier::AdjustRowHeight(wxDataViewItem
const& item
)
231 if ((m_DataViewCtrlPtr
->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT
) != 0)
233 wxDataViewModel
*model
= GetOwner();
235 int height
= 20; // TODO find out standard height
236 unsigned int num
= m_DataViewCtrlPtr
->GetColumnCount();
238 for (col
= 0; col
< num
; col
++)
240 wxDataViewColumn
* column(m_DataViewCtrlPtr
->GetColumnPtr(col
));
242 if (!(column
->IsHidden()))
244 wxDataViewCustomRenderer
*renderer
= dynamic_cast<wxDataViewCustomRenderer
*>(column
->GetRenderer());
248 model
->GetValue( value
, item
, column
->GetModelColumn() );
249 renderer
->SetValue( value
);
250 height
= wxMax( height
, renderer
->GetSize().y
);
255 m_DataViewCtrlPtr
->GetDataViewPeer()->SetRowHeight(item
,height
);
259 void wxOSXDataViewModelNotifier::AdjustRowHeights(wxDataViewItemArray
const& items
)
261 if ((m_DataViewCtrlPtr
->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT
) != 0)
263 size_t const noOfItems
= items
.GetCount();
265 wxDataViewModel
*model
= GetOwner();
267 for (size_t itemIndex
=0; itemIndex
<noOfItems
; ++itemIndex
)
269 int height
= 20; // TODO find out standard height
270 unsigned int num
= m_DataViewCtrlPtr
->GetColumnCount();
273 for (col
= 0; col
< num
; col
++)
275 wxDataViewColumn
* column(m_DataViewCtrlPtr
->GetColumnPtr(col
));
277 if (!(column
->IsHidden()))
279 wxDataViewCustomRenderer
*renderer
= dynamic_cast<wxDataViewCustomRenderer
*>(column
->GetRenderer());
283 model
->GetValue( value
, items
[itemIndex
], column
->GetModelColumn() );
284 renderer
->SetValue( value
);
285 height
= wxMax( height
, renderer
->GetSize().y
);
290 m_DataViewCtrlPtr
->GetDataViewPeer()->SetRowHeight(items
[itemIndex
],height
);
295 // ---------------------------------------------------------
296 // wxDataViewCustomRenderer
297 // The constructor, the implementation macro and environment
298 // dependent methods can be found in the environment's
300 // ---------------------------------------------------------
301 wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
306 void wxDataViewCustomRenderer::RenderText( const wxString
&text
, int xoffset
, wxRect cell
, wxDC
*dc
, int state
)
308 wxDataViewCtrl
*view
= GetOwner()->GetOwner();
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));
315 wxDC
* wxDataViewCustomRenderer::GetDC()
317 if ((m_DCPtr
== NULL
) && (GetOwner() != NULL
) && (GetOwner()->GetOwner() != NULL
))
318 m_DCPtr
= new wxClientDC(GetOwner()->GetOwner());
322 void wxDataViewCustomRenderer::SetDC(wxDC
* newDCPtr
)
328 //-----------------------------------------------------------------------------
330 //-----------------------------------------------------------------------------
332 wxDataViewCtrl::~wxDataViewCtrl()
337 void wxDataViewCtrl::Init()
339 m_CustomRendererPtr
= NULL
;
341 m_macIsUserPane
= false;
345 bool wxDataViewCtrl::Create(wxWindow
*parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
, const wxValidator
& validator
)
347 if (!(wxControl::Create(parent
,id
,pos
,size
,style
& ~(wxHSCROLL
| wxVSCROLL
),validator
)))
349 m_peer
= ::CreateDataView(this,parent
,id
,pos
,size
,style
,GetExtraStyle());
351 MacPostControlCreate(pos
,size
);
356 bool wxDataViewCtrl::AssociateModel(wxDataViewModel
* model
)
358 wxDataViewWidgetImpl
* dataViewWidgetPtr(GetDataViewPeer());
361 wxCHECK_MSG(dataViewWidgetPtr
!= NULL
,false,_("Pointer to native control must not be NULL."));
362 if (wxDataViewCtrlBase::AssociateModel(model
) && dataViewWidgetPtr
->AssociateModel(model
))
365 model
->AddNotifier(new wxOSXDataViewModelNotifier(this));
372 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn
* columnPtr
)
374 return wxDataViewCtrl::InsertColumn( GetColumnCount(), columnPtr
);
377 bool wxDataViewCtrl::PrependColumn(wxDataViewColumn
* columnPtr
)
379 return wxDataViewCtrl::InsertColumn( 0, columnPtr
);
382 bool wxDataViewCtrl::InsertColumn(unsigned int pos
, wxDataViewColumn
* columnPtr
)
384 wxDataViewWidgetImpl
* dataViewWidgetPtr(GetDataViewPeer());
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."));
394 // add column to wxWidget's internal structure:
395 if (wxDataViewCtrlBase::InsertColumn(pos
,columnPtr
))
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
))
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
);
412 m_ColumnPtrs
.Remove(columnPtr
);
414 // and send a message in debug mode:
415 wxFAIL_MSG(_("Column could not be added to native control."));
424 wxFAIL_MSG(_("Could not add column to internal structures."));
430 bool wxDataViewCtrl::ClearColumns()
432 if (GetDataViewPeer()->ClearColumns())
434 WX_CLEAR_ARRAY(m_ColumnPtrs
);
441 bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn
* columnPtr
)
443 if (GetDataViewPeer()->DeleteColumn(columnPtr
))
445 m_ColumnPtrs
.Remove(columnPtr
);
453 wxDataViewColumn
* wxDataViewCtrl::GetColumn(unsigned int pos
) const
455 return GetDataViewPeer()->GetColumn(pos
);
458 unsigned int wxDataViewCtrl::GetColumnCount() const
460 return m_ColumnPtrs
.GetCount();
463 int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn
const* columnPtr
) const
465 return GetDataViewPeer()->GetColumnPosition(columnPtr
);
468 void wxDataViewCtrl::Collapse(wxDataViewItem
const& item
)
470 GetDataViewPeer()->Collapse(item
);
473 void wxDataViewCtrl::EnsureVisible(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
)
477 ExpandAncestors(item
); // make sure that the item exists in the control
478 GetDataViewPeer()->EnsureVisible(item
,columnPtr
);
482 void wxDataViewCtrl::Expand(wxDataViewItem
const& item
)
484 return GetDataViewPeer()->Expand(item
);
487 bool wxDataViewCtrl::IsExpanded( const wxDataViewItem
& item
) const
489 return (item
.IsOk() && GetDataViewPeer()->IsExpanded(item
));
492 wxDataViewColumn
* wxDataViewCtrl::GetSortingColumn() const
494 return GetDataViewPeer()->GetSortingColumn();
497 unsigned int wxDataViewCtrl::GetCount() const
499 return GetDataViewPeer()->GetCount();
502 wxRect
wxDataViewCtrl::GetItemRect(wxDataViewItem
const& item
, wxDataViewColumn
const* columnPtr
) const
504 if (item
.IsOk() && (columnPtr
!= NULL
))
505 return GetDataViewPeer()->GetRectangle(item
,columnPtr
);
510 wxDataViewItem
wxDataViewCtrl::GetSelection() const
512 wxDataViewItemArray itemIDs
;
515 if (GetDataViewPeer()->GetSelections(itemIDs
) > 0)
518 return wxDataViewItem();
521 int wxDataViewCtrl::GetSelections(wxDataViewItemArray
& sel
) const
523 return GetDataViewPeer()->GetSelections(sel
);
526 void wxDataViewCtrl::HitTest(wxPoint
const& point
, wxDataViewItem
& item
, wxDataViewColumn
*& columnPtr
) const
528 return GetDataViewPeer()->HitTest(point
,item
,columnPtr
);
531 bool wxDataViewCtrl::IsSelected(wxDataViewItem
const& item
) const
533 return GetDataViewPeer()->IsSelected(item
);
536 void wxDataViewCtrl::Select(wxDataViewItem
const& item
)
540 ExpandAncestors(item
); // make sure that the item exists in the control
541 GetDataViewPeer()->Select(item
);
545 void wxDataViewCtrl::SelectAll()
547 GetDataViewPeer()->SelectAll();
550 void wxDataViewCtrl::SetSelections(wxDataViewItemArray
const& sel
)
552 size_t const noOfSelections
= sel
.GetCount();
556 wxDataViewItem last_parent
;
559 // make sure that all to be selected items are visible in the control:
560 for (i
= 0; i
< noOfSelections
; i
++)
562 wxDataViewItem item
= sel
[i
];
563 wxDataViewItem parent
= GetModel()->GetParent( item
);
565 if (parent
.IsOk() && (parent
!= last_parent
))
566 ExpandAncestors(item
);
567 last_parent
= parent
;
570 // finally select the items:
571 wxDataViewWidgetImpl
* dataViewWidgetPtr(GetDataViewPeer()); // variable definition for abbreviational purposes
573 for (i
=0; i
<noOfSelections
; ++i
)
574 dataViewWidgetPtr
->Select(sel
[i
]);
577 void wxDataViewCtrl::Unselect(wxDataViewItem
const& item
)
580 GetDataViewPeer()->Unselect(item
);
583 void wxDataViewCtrl::UnselectAll()
585 GetDataViewPeer()->UnselectAll();
591 wxDataViewWidgetImpl
* wxDataViewCtrl::GetDataViewPeer() const
593 return dynamic_cast<wxDataViewWidgetImpl
*>(GetPeer());
596 void wxDataViewCtrl::AddChildren(wxDataViewItem
const& parentItem
)
600 wxDataViewItemArray items
;
603 wxCHECK_RET(GetModel() != NULL
,_("Model pointer not initialized."));
604 noOfChildren
= GetModel()->GetChildren(parentItem
,items
);
605 (void) GetModel()->ItemsAdded(parentItem
,items
);
608 void wxDataViewCtrl::FinishCustomItemEditing()
610 if (GetCustomRendererItem().IsOk())
612 GetCustomRendererPtr()->FinishEditing();
613 SetCustomRendererItem(wxDataViewItem());
614 SetCustomRendererPtr (NULL
);
620 wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant
WXUNUSED(variant
))
622 wxVisualAttributes attr
;
624 attr
.colFg
= wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT
);
625 attr
.colBg
= wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX
);
626 attr
.font
.CreateSystemFont(wxOSX_SYSTEM_FONT_VIEWS
);
631 // inherited methods from wxDataViewCtrlBase
632 void wxDataViewCtrl::DoSetExpanderColumn()
634 if (GetExpanderColumn() != NULL
)
635 GetDataViewPeer()->DoSetExpanderColumn(GetExpanderColumn());
638 void wxDataViewCtrl::DoSetIndent()
640 GetDataViewPeer()->DoSetIndent(GetIndent());
644 void wxDataViewCtrl::OnSize(wxSizeEvent
& event
)
646 unsigned int const noOfColumns
= GetColumnCount();
649 // reset DC of all custom renderers because DC has changed:
650 for (unsigned int i
=0; i
<noOfColumns
; ++i
)
652 wxDataViewColumn
* dataViewColumnPtr(GetColumn(i
));
654 if (dataViewColumnPtr
!= NULL
)
656 wxDataViewCustomRenderer
* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer
*>(dataViewColumnPtr
->GetRenderer()));
658 if (dataViewCustomRendererPtr
!= NULL
)
659 dataViewCustomRendererPtr
->SetDC(NULL
);
663 // update the layout of the native control after a size event:
664 GetDataViewPeer()->OnSize();
669 wxSize
wxDataViewCtrl::DoGetBestSize() const
671 wxSize best
= wxControl::DoGetBestSize();
677 void wxDataViewCtrl::OnMouse(wxMouseEvent
& event
)
681 if (GetModel() == NULL
)
685 // Doesn't compile anymore
686 wxMacDataViewDataBrowserListViewControlPointer
MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer
>(m_peer
));
689 wxDataViewItemArray items
;
690 NoOfChildren
= GetModel()->GetChildren( wxDataViewItem(), items
);
691 if (NoOfChildren
== 0)
693 wxDataViewItem firstChild
= items
[0];
695 UInt16 headerHeight
= 0;
696 MacDataViewListCtrlPtr
->GetHeaderButtonHeight(&headerHeight
);
699 if (event
.GetY() < headerHeight
)
701 unsigned int col_count
= GetColumnCount();
703 for (col
= 0; col
< col_count
; col
++)
705 wxDataViewColumn
*column
= GetColumn( col
);
706 if (column
->IsHidden())
710 ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr
->GetControlRef(),
711 reinterpret_cast<DataBrowserItemID
>(firstChild
.GetID()), column
->GetPropertyID(),
712 kDataBrowserPropertyEnclosingPart
, &itemrect
);
714 if (abs( event
.GetX() - itemrect
.right
) < 3)
716 if (column
->GetFlags() & wxDATAVIEW_COL_RESIZABLE
)
717 SetCursor( wxCursor( wxCURSOR_SIZEWE
) );
719 SetCursor( *wxSTANDARD_CURSOR
);
726 SetCursor( *wxSTANDARD_CURSOR
);
730 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl
,wxDataViewCtrlBase
)
732 BEGIN_EVENT_TABLE(wxDataViewCtrl
,wxDataViewCtrlBase
)
733 EVT_SIZE(wxDataViewCtrl::OnSize
)
734 EVT_MOTION(wxDataViewCtrl::OnMouse
)
737 #endif // (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))