PageRenderTime 28ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/ExtLibs/wxWidgets/src/osx/dataview_osx.cpp

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