]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dataview.cpp
revert last change (r48897)
[wxWidgets.git] / src / mac / carbon / dataview.cpp
index 2d4085c91df7931ba5627db433ed88d96d7c1153..c21aa0f8a3b6defadf26c900121de9d9bc2c4feb 100644 (file)
@@ -115,22 +115,8 @@ public:
 
 
     wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
-    if (!(parent.IsOk()) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,                                 &itemID) == noErr) ||
-          parent.IsOk()  && (this->m_dataViewControlPtr->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr))
-    {
-     // variable definitions and initializations:
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-      wxDataViewEvent dataViewEvent  (wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED,dataViewCtrlPtr->GetId());
-      
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetItem(item);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-     // done:
-      return true;
-    } /* if */
-    else
-      return false;
+    return (!(parent.IsOk()) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&itemID) == noErr) ||
+            parent.IsOk()  && (this->m_dataViewControlPtr->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr));
   } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */
 
   virtual bool ItemChanged(wxDataViewItem const& item)
@@ -160,26 +146,24 @@ public:
 
   virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
   {
-    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-
-
-    wxCHECK_MSG(item.IsOk(),false,_("Deleted item is invalid."));
-    if (this->m_dataViewControlPtr->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr)
+    if (item.IsOk())
     {
-     // variable definitions and initializations:
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-      wxDataViewEvent dataViewEvent  (wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED,dataViewCtrlPtr->GetId());
-
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetItem(item);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-     // done
-      return true;
+     // variable definition and initialization:
+      DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+      OSStatus          errorStatus;
+      wxDataViewCtrl*   dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
+      
+     // 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
+     // not to be identical because the being edited item might be below the passed item in the hierarchy); therefore, the control is informed that currently a deleting process
+     // is started and that variables can currently not be updated even when requested by the system:
+      dataViewCtrlPtr->SetDeleting(true);
+      errorStatus = this->m_dataViewControlPtr->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID);
+      dataViewCtrlPtr->SetDeleting(false);
+      return (errorStatus == noErr);
     } /* if */
     else
       return false;
-  } /* ItemDeleted(wxDataViewItem const&) */
+  } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
 
   virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col)
   {
@@ -231,6 +215,11 @@ public:
       return false;
   } /* Cleared(void) */
 
+  virtual void Resort(void)
+  {
+    this->m_dataViewControlPtr->Resort();
+  }
+
 protected:
 private:
 //
@@ -288,7 +277,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
 // ---------------------------------------------------------
 #pragma mark -
 wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                         :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL)
+                         :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
 {
 } /* wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const&, wxDataViewCellMode) */
 
@@ -311,7 +300,7 @@ wxDC* wxDataViewCustomRenderer::GetDC(void)
 
 bool wxDataViewCustomRenderer::Render(void)
 {
-  return false;
+  return true;
 } /* wxDataViewCustomRenderer::Render(void) */
 
 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
@@ -366,7 +355,7 @@ bool wxDataViewBitmapRenderer::Render(void)
     if (bitmap.Ok())
       return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
     else
-      return false;
+      return true;
   } /* if */
   else
     return false;
@@ -374,6 +363,37 @@ bool wxDataViewBitmapRenderer::Render(void)
 
 IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
 
+// ---------------------------------------------------------
+// wxDataViewIconTextRenderer
+// ---------------------------------------------------------
+#pragma mark -
+wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewRenderer(varianttype,mode)
+{
+}
+
+bool wxDataViewIconTextRenderer::Render(void)
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+   // variable definition:
+    wxDataViewIconText iconText;
+    
+    iconText << this->GetValue();
+
+   // variable definition:
+    wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+    
+    return ((::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) == noErr) &&
+            (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr));
+  } /* if */
+  else
+    return false;
+} /* wxDataViewIconTextRenderer::Render(void) */
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+
+
 // ---------------------------------------------------------
 // wxDataViewToggleRenderer
 // ---------------------------------------------------------
@@ -439,14 +459,14 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
 #pragma mark -
 wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
                  :wxDataViewColumnBase(title,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
-                  m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_maxWidth(std::numeric_limits<int>::max()), m_minWidth(0), m_width(width),
+                  m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
                   m_alignment(align), m_title(title)
 {
 } /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
 
 wxDataViewColumn::wxDataViewColumn(wxBitmap const& bitmap, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
                  :wxDataViewColumnBase(bitmap,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
-                  m_flags(flags & (wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_maxWidth(std::numeric_limits<int>::max()), m_minWidth(0), m_width(width),
+                  m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
                   m_alignment(align)
 {
 } /* wxDataViewColumn::wxDataViewColumn(wxBitmap const&, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
@@ -624,6 +644,7 @@ void wxDataViewColumn::SetSortOrder(bool ascending)
       else
         headerDescription.initialOrder = kDataBrowserOrderDecreasing;
       verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription));
+      macDataViewListCtrlPtr->SetSortProperty(this->GetPropertyID());
     } /* if */
   } /* if */
 } /* wxDataViewColumn::SetSortOrder(bool) */
@@ -679,8 +700,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn,wxDataViewColumnBase)
 #pragma mark -
 void wxDataViewCtrl::Init(void)
 {
+  this->m_Deleting      = false;
   this->m_macIsUserPane = false;
-  this->m_NotifierPtr   = NULL;
   this->m_cgContext     = NULL;
 } /* wxDataViewCtrl::Init(void) */
 
@@ -695,39 +716,57 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
 
   this->m_peer = new wxMacDataViewDataBrowserListViewControl(this,pos,size,style);
   this->MacPostControlCreate(pos,size);
+  ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_peer->GetControlRef()),true);
 
   InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL);
 
   return true;
 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
 
+bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
+{
+  if (!wxDataViewCtrlBase::AssociateModel(model))
+    return false;
+  
+  model->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer)));
+
+  return true;
+} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
+
 bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
 {
+  DataBrowserPropertyID NewPropertyID;
+
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+
  // first, some error checking:
+  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                            false,_("m_peer is not or incorrectly initialized"));
   wxCHECK_MSG(dataViewColumnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
   wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
   wxCHECK_MSG(this->GetModel() != NULL,                                                  false,_("No model associated with control."));
   wxCHECK_MSG((dataViewColumnPtr->GetModelColumn() >= 0) &&
               (dataViewColumnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
-  if (this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr))
+  if ((MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr) && this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr))
   {
-   // variable definition:
-    DataBrowserPropertyID                          NewPropertyID;
-    DataBrowserListViewColumnDesc                  columnDescription;
-    wxMacCFStringHolder                            cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()));
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+   // insert column into hash map:
+    this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,dataViewColumnPtr));
+
+   // variable definitions:
+    DataBrowserListViewColumnDesc columnDescription;
+    wxMacCFStringHolder           cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()));
 
    // initialize column description:
-    wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                    false,_("m_peer is not or incorrectly initialized"));
-    wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Maximum number of columns reached."));
     dataViewColumnPtr->SetPropertyID(NewPropertyID);
     columnDescription.propertyDesc.propertyID = NewPropertyID;
     columnDescription.propertyDesc.propertyType = dataViewColumnPtr->GetRenderer()->GetPropertyType();
-    columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn;
+    columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
     if (dataViewColumnPtr->IsSortable())
       columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
-    if (dataViewColumnPtr->IsResizeable())
+#if 0
+    if (dataViewColumnPtr->IsMovable())
       columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
+#endif
     if (dataViewColumnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
       columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
@@ -740,8 +779,16 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
     columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
 #endif
     columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
-    columnDescription.headerBtnDesc.minimumWidth = 0;
-    columnDescription.headerBtnDesc.maximumWidth = 30000;
+    if (dataViewColumnPtr->IsResizeable())
+    {
+      columnDescription.headerBtnDesc.minimumWidth = 0;
+      columnDescription.headerBtnDesc.maximumWidth = 30000;
+    } /* if */
+    else
+    {
+      columnDescription.headerBtnDesc.minimumWidth = dataViewColumnPtr->GetWidth();
+      columnDescription.headerBtnDesc.maximumWidth = dataViewColumnPtr->GetWidth();
+    } /* if */
     columnDescription.headerBtnDesc.titleOffset = 0;
     columnDescription.headerBtnDesc.titleString = cfTitle; // we cannot directly use the wxMacCFStringHolder constructor call because then the CFStringRef is released
                                                            // having called 'AddColumn' where the title (CFStringRef) is going to be used
@@ -771,18 +818,16 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
     wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added."));
 
    // final adjustments for the layout:
-    if (dataViewColumnPtr->GetWidth() <= 0)
-      dataViewColumnPtr->SetWidth(wxDVC_DEFAULT_WIDTH);
     wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,dataViewColumnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
-    if (dataViewColumnPtr->IsSortable()) // if the current column is marked sortable this column will become the active sortable column, otherwise don't do anything
-      MacDataViewListCtrlPtr->SetSortProperty(NewPropertyID);
-    if (this->GetColumnCount()-1 == this->GetExpanderColumn()) // if the current column is marked expandable this column will become the active expandable column
-      MacDataViewListCtrlPtr->SetDisclosureColumn(NewPropertyID,true);
 
    // make sure that the data is up-to-date...
-   // if the newly appended column is the first column add the initial data to the control otherwise ask the control to 'update' the data in the newly appended column:
+   // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
+   // otherwise ask the control to 'update' the data in the newly appended column:
     if (this->GetColumnCount() == 1)
+    {
+      this->SetExpanderColumn(dataViewColumnPtr);
       this->AddChildrenLevel(wxDataViewItem());
+    } /* if */
     else
       MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
    // done:
@@ -792,7 +837,153 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
     return false;
 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
 
-wxDataViewItem wxDataViewCtrl::GetSelection(void)
+bool wxDataViewCtrl::ClearColumns(void)
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+  
+  while (this->m_ColumnPointers.begin() != this->m_ColumnPointers.end())
+  {
+    wxCHECK_MSG(MacDataViewListCtrlPtr->RemoveColumnByProperty(this->m_ColumnPointers.begin()->first) == noErr,false,_("Could not remove column."));
+    delete this->m_ColumnPointers.begin()->second;
+    this->m_ColumnPointers.erase(this->m_ColumnPointers.begin());
+  } /* while */
+  return true;
+} /* wxDataViewCtrl::ClearColumns(void) */
+
+bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+  
+  if ((MacDataViewListCtrlPtr->RemoveColumnByProperty(columnPtr->GetPropertyID()) == noErr) && (this->m_ColumnPointers.erase(columnPtr->GetPropertyID()) > 0))
+  {
+    delete columnPtr;
+    return true;
+  } /* if */
+  else
+    return false;
+} /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */
+
+wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
+{
+  DataBrowserPropertyID propertyID;
+  
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+  
+  if (MacDataViewListCtrlPtr->GetPropertyID(pos,&propertyID) == noErr)
+  {
+   // variable definition:
+    ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID));
+    
+    if (Result != this->m_ColumnPointers.end())
+      return Result->second;
+    else
+      return NULL;
+  } /* if */
+  else
+    return NULL;
+} /* wxDataViewCtrl::GetColumn(unsigned int pos) const */
+
+unsigned int wxDataViewCtrl::GetColumnCount(void) const
+{
+  return this->m_ColumnPointers.size();
+} /* wxDataViewCtrl::GetColumnCount(void) const */
+
+int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
+{
+  if (columnPtr != NULL)
+  {
+   // variable definition and initialization:
+    DataBrowserTableViewColumnIndex                Position;
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+    
+    wxCHECK_MSG(MacDataViewListCtrlPtr->GetColumnIndex(columnPtr->GetPropertyID(),&Position) == noErr,-1,_("Could not determine column's position"));
+    return static_cast<int>(Position);
+  } /* if */
+  else
+    return wxNOT_FOUND;
+} /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
+
+void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+
+  MacDataViewListCtrlPtr->CloseContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+} /* wxDataViewCtrl::Collapse(wxDataViewItem const&) */
+
+void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+{
+  if (item.IsOk())
+  {
+   // variable definition and initialization:
+    DataBrowserPropertyID propertyID;
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+    if (columnPtr != NULL)
+      propertyID = columnPtr->GetPropertyID();
+    else
+      propertyID = kDataBrowserNoItem;
+    MacDataViewListCtrlPtr->RevealItem(reinterpret_cast<DataBrowserItemID>(item.GetID()),propertyID,kDataBrowserRevealOnly);
+  } /* if */
+} /* wxDataViewCtrl::EnsureVisible(wxDataViewItem const&, wxDataViewColumn const*) */
+
+void wxDataViewCtrl::Expand(wxDataViewItem const& item)
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  MacDataViewListCtrlPtr->OpenContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+} /* wxDataViewCtrl::Expand(wxDataViewItem const&) */
+
+wxDataViewColumn* wxDataViewCtrl::GetSortingColumn(void) const
+{
+  DataBrowserPropertyID propertyID;
+
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  if (MacDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr)
+    return this->GetColumnPtr(propertyID);
+  else
+    return NULL;
+} /* wxDataViewCtrl::GetSortingColumn(void) const */
+
+unsigned int wxDataViewCtrl::GetCount(void) const
+{
+  ItemCount noOfItems;
+
+
+  wxCHECK_MSG(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer)->GetItemCount(&noOfItems) == noErr,0,_("Could not determine number of items"));
+  return noOfItems;
+} /* wxDataViewCtrl::GetCount(void) const */
+
+wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
+{
+  if (item.IsOk() && (columnPtr != NULL))
+  {
+   // variable definition:
+    Rect                                           MacRectangle;
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+    
+    if (MacDataViewListCtrlPtr->GetPartBounds(reinterpret_cast<DataBrowserItemID>(item.GetID()),columnPtr->GetPropertyID(),kDataBrowserPropertyContentPart,&MacRectangle) == noErr)
+    {
+     // variable definition:
+      wxRect rectangle;
+      
+      ::wxMacNativeToRect(&MacRectangle,&rectangle);
+      return rectangle;
+    } /* if */
+    else
+      return wxRect();
+  } /* if */
+  else
+    return wxRect();
+} /* wxDataViewCtrl::GetItemRect(wxDataViewItem const&, unsigned int) const */
+
+wxDataViewItem wxDataViewCtrl::GetSelection(void) const
 {
   wxArrayDataBrowserItemID itemIDs;
   
@@ -803,51 +994,163 @@ wxDataViewItem wxDataViewCtrl::GetSelection(void)
     return wxDataViewItem(reinterpret_cast<void*>(itemIDs[0]));
   else
     return wxDataViewItem();
-} /* wxDataViewCtrl::GetSelection(void) */
+} /* wxDataViewCtrl::GetSelection(void) const */
 
-bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
+int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
 {
-  if (!wxDataViewCtrlBase::AssociateModel(model))
-    return false;
+  size_t NoOfSelectedItems;
+
+  wxArrayDataBrowserItemID itemIDs;
   
-  this->m_NotifierPtr = new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer));
-  model->AddNotifier(this->m_NotifierPtr);
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  NoOfSelectedItems = MacDataViewListCtrlPtr->GetSelectedItemIDs(itemIDs);
+  sel.Empty();
+  sel.SetCount(NoOfSelectedItems);
+  for (size_t i=0; i<NoOfSelectedItems; ++i)
+    sel[i] = wxDataViewItem(reinterpret_cast<void*>(itemIDs[i]));
+  return static_cast<int>(NoOfSelectedItems);
+} /* wxDataViewCtrl::GetSelections(wxDataViewItemArray&) const */
+
+void wxDataViewCtrl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
+{
+  item = wxDataViewItem();
+  columnPtr = NULL;
+} /* wxDataViewCtrl::HitTest(wxPoint const&, wxDataViewItem&, wxDataViewColumn*&) const */
 
-  return true;
-} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
+bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  return MacDataViewListCtrlPtr->IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+} /* wxDataViewCtrl::IsSelected(wxDataViewItem const&) const */
+
+void wxDataViewCtrl::SelectAll(void)
+{
+  DataBrowserItemID* itemIDPtr;
+
+  Handle handle(::NewHandle(0));
+  
+  size_t NoOfItems;
+  
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  wxCHECK_RET(MacDataViewListCtrlPtr->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
+  NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
+  HLock(handle);
+  itemIDPtr = (DataBrowserItemID*) (*handle);
+  MacDataViewListCtrlPtr->SetSelectedItems(NoOfItems,itemIDPtr,kDataBrowserItemsAssign);
+  HUnlock(handle);
+  DisposeHandle(handle);
+} /* wxDataViewCtrl::SelectAll(void) */
+
+void wxDataViewCtrl::Select(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+  {
+   // variable definition and initialization:
+    DataBrowserItemID                              itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+    MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
+  } /* if */
+} /* wxDataViewCtrl::Select(wxDataViewItem const&) */
+
+void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
+{
+  size_t const NoOfSelections = sel.GetCount();
+
+  DataBrowserItemID* itemIDs;
+
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  itemIDs = new DataBrowserItemID[NoOfSelections];
+  for (size_t i=0; i<NoOfSelections; ++i)
+    itemIDs[i] = reinterpret_cast<DataBrowserItemID>(sel[i].GetID());
+  MacDataViewListCtrlPtr->SetSelectedItems(NoOfSelections,itemIDs,kDataBrowserItemsAssign);
+  delete[] itemIDs;
+} /* wxDataViewCtrl::SetSelections(wxDataViewItemArray const&) */
+
+void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+  {
+   // variable definition and initialization:
+    DataBrowserItemID                              itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+    MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
+  } /* if */
+} /* wxDataViewCtrl::Unselect(wxDataViewItem const&) */
+
+void wxDataViewCtrl::UnselectAll(void)
+{
+  DataBrowserItemID* itemIDPtr;
+  
+  Handle handle(::NewHandle(0));
+  
+  size_t NoOfItems;
+  
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  
+  
+  wxCHECK_RET(MacDataViewListCtrlPtr->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
+  NoOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
+  HLock(handle);
+  itemIDPtr = (DataBrowserItemID*) (*handle);
+  MacDataViewListCtrlPtr->SetSelectedItems(NoOfItems,itemIDPtr,kDataBrowserItemsRemove);
+  HUnlock(handle);
+  DisposeHandle(handle);
+} /* wxDataViewCtrl::UnselectAll(void) */
 
 // data handling:
 void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem)
 {
-  wxDataViewItem item;
+  int NoOfChildren;
+
+  wxDataViewItemArray items;
   
   
   wxCHECK_RET(this->GetModel() != NULL,_("Model pointer not initialized."));
-  item = this->GetModel()->GetFirstChild(parentItem);
-  while (item.IsOk())
-  {
-    (void) this->GetModel()->ItemAdded(parentItem,item);
-    item = this->GetModel()->GetNextSibling(item);
-  } /* while */
+  NoOfChildren = this->GetModel()->GetChildren(parentItem,items);
+  for (int i=0; i<NoOfChildren; ++i)
+    (void) this->GetModel()->ItemAdded(parentItem,items[i]);
 } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
 
+wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID propertyID) const
+{
+ // variable definition:
+  ColumnPointerHashMapType::const_iterator Result(this->m_ColumnPointers.find(propertyID));
+  
+  if (Result != this->m_ColumnPointers.end())
+    return Result->second;
+  else
+    return NULL;
+} /* wxDataViewCtrl::GetColumnPtr(DataBrowserPropertyID) const */
+
 // inherited methods from wxDataViewCtrlBase
 void wxDataViewCtrl::DoSetExpanderColumn(void)
 {
-  if (this->GetExpanderColumn() < this->GetColumnCount())
+  if (this->GetExpanderColumn() != NULL)
   {
    // variable definition and initialization:
-    DataBrowserPropertyID                          propertyID;
     wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
-    if (MacDataViewListCtrlPtr->GetPropertyID(this->GetExpanderColumn(),&propertyID) == noErr)
-      (void) MacDataViewListCtrlPtr->SetDisclosureColumn(propertyID);
+    (void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID());
   } /* if */
 } /* wxDataViewCtrl::DoSetExpanderColumn(void) */
 
 void wxDataViewCtrl::DoSetIndent(void)
 {
-} /* wxDataViewCtrl::DoSetExpanderColumn(void) */
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));  
+
+
+  (void) MacDataViewListCtrlPtr->SetIndent(static_cast<float>(this->GetIndent()));
+} /* wxDataViewCtrl::DoSetIndent(void) */
 
 // event handling:
 void wxDataViewCtrl::OnSize(wxSizeEvent& event)