]> git.saurik.com Git - wxWidgets.git/commitdiff
Patch from Hartwig for wxMac implementation
authorRobert Roebling <robert@roebling.de>
Thu, 30 Aug 2007 13:09:20 +0000 (13:09 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 30 Aug 2007 13:09:20 +0000 (13:09 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48459 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mac/carbon/databrow.h
include/wx/mac/carbon/dataview.h
src/mac/carbon/databrow.cpp
src/mac/carbon/dataview.cpp

index ea75a0755d75acb04fbce5e8e9235facbe7a2f55..1477b5f1262e8376f5224193504b97f1f12e0e64 100644 (file)
@@ -120,6 +120,7 @@ public:
   OSStatus SetHasScrollBars( bool horiz, bool vert );
   OSStatus SetHeaderButtonHeight( UInt16 height );
   OSStatus SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle );
+  OSStatus SetIndent(float Indent);
   OSStatus SetRowHeight( DataBrowserItemID item , UInt16 height);
   OSStatus SetScrollPosition( UInt32 top , UInt32 left );
 
@@ -135,7 +136,8 @@ public:
   
   OSStatus IsUsedPropertyID(DataBrowserPropertyID propertyID) const; // checks if passed property id is used by the control; no error is returned if the id exists
 
-  OSStatus RemoveColumn(DataBrowserTableViewColumnIndex index);
+  OSStatus RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID);
+  OSStatus RemoveColumnByIndex   (DataBrowserTableViewColumnIndex index);
 
   OSStatus SetColumnIndex     (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index);
   OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=true);
@@ -207,6 +209,13 @@ public:
   OSStatus SetSortOrder   (DataBrowserSortOrder  order);
   OSStatus SetSortProperty(DataBrowserPropertyID propertyID);
 
+//
+// container handling
+//
+  OSStatus CloseContainer(DataBrowserItemID containerID);
+  
+  OSStatus OpenContainer(DataBrowserItemID containerID);
+
 protected :
 //
 // callback functions
index df2d9f08417b989705a16d590fcc14a883b3575a..09a1ce8743eb6ac09a7521357e3eaebef8c79bf5 100644 (file)
@@ -193,7 +193,7 @@ public:
 // implementation
 //
   virtual bool Render(void); // declared in wxDataViewRenderer but will not be used here, therefore calling this function will
-                             // return 'false' without having done anything
+                             // return 'true' without having done anything
 
   virtual DataBrowserPropertyType GetPropertyType(void) const
   {
@@ -281,6 +281,33 @@ private:
 // wxDataViewToggleRenderer
 // ---------------------------------------------------------
 
+class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewRenderer
+{
+public:
+  wxDataViewIconTextRenderer(wxString const& varianttype = wxT("wxDataViewIconText"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render(void);
+  
+//
+// implementation
+//
+  virtual DataBrowserPropertyType GetPropertyType(void) const
+  {
+    return kDataBrowserIconAndTextType;
+  }
+  
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewToggleRenderer
+// ---------------------------------------------------------
+
 class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer
 {
 public:
@@ -490,17 +517,23 @@ public:
   bool Create(wxWindow *parent, wxWindowID id, wxPoint const& pos=wxDefaultPosition, wxSize const& size=wxDefaultSize, long style=0,
               wxValidator const& validator=wxDefaultValidator);
 
- // inherited methods from 'wxDataViewCtrlBase':
-  virtual bool AppendColumn(wxDataViewColumn* columnPtr);
-
-  virtual bool AssociateModel(wxDataViewModel* model);
-
   virtual wxControl* GetMainWindow(void) // should disappear as it is not of any use for the native implementation
   {
     return this;
   }
   
+ // inherited methods from 'wxDataViewCtrlBase':
+  virtual bool AssociateModel(wxDataViewModel* model);
+
+  virtual bool AppendColumn(wxDataViewColumn* columnPtr);
+  virtual bool ClearColumns(void);
+  virtual bool DeleteColumn(wxDataViewColumn* columnPtr);
+  virtual wxDataViewColumn* GetColumn(unsigned int pos) const;
+  virtual unsigned int GetColumnCount(void) const;
+
+  virtual void Collapse(wxDataViewItem const& item);
   virtual void EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr=NULL);
+  virtual void Expand(wxDataViewItem const& item);
   
   virtual wxRect GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const;
   virtual wxDataViewItem GetSelection(void) const;
@@ -516,8 +549,7 @@ public:
 
   virtual void Unselect(wxDataViewItem const& item);
   virtual void UnselectAll(void);
-  
-  
+
 //
 // implementation
 //
@@ -525,6 +557,10 @@ public:
  // adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added:
   void AddChildrenLevel(wxDataViewItem const& parentItem);
 
+ // returns a pointer to a column;
+ // in case the pointer cannot be found NULL is returned:
+  wxDataViewColumn* GetColumnPtr(DataBrowserPropertyID propertyID) const;
+
  // checks if currently a delete process is running:
   bool IsDeleting(void) const
   {
@@ -559,6 +595,9 @@ protected:
   void OnSize(wxSizeEvent &event);
 
 private:
+ // type definitions:
+  WX_DECLARE_HASH_MAP(DataBrowserPropertyID,wxDataViewColumn*,wxIntegerHash,wxIntegerEqual,ColumnPointerHashMapType);
+
  // initializing of local variables:
   void Init(void);
 
@@ -572,7 +611,7 @@ private:
 
   void* m_cgContext; // pointer to core graphics context
   
-  wxDataViewModelNotifier* m_NotifierPtr; // the notifier is NOT owned by this class but by the associated model
+  ColumnPointerHashMapType m_ColumnPointers; // all column pointers are stored in a hash map with the property ID as a key
 
  // wxWidget internal stuff:
   DECLARE_DYNAMIC_CLASS(wxDataViewCtrl)
index 9e8236b740eb7e5d337a9b5d9a7d013d428e68ad..fa3d7556f012c481ff7c04036be433cad5a90ed3 100644 (file)
@@ -273,20 +273,25 @@ OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
   return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
 }
 
-OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars( bool horiz, bool vert )
+OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
 {
-    return SetDataBrowserHasScrollBars(this->m_controlRef, horiz, vert );
-}
+  return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
+} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
 {
-    return SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef, height );
-}
+  return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
+} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
 
-OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
+OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
 {
-    return SetDataBrowserTableViewHiliteStyle(this->m_controlRef, hiliteStyle );
-}
+  return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
+} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle)  */
+
+OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
+{
+  return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
+} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item, UInt16 height)
 {
@@ -344,14 +349,19 @@ OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyI
   return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
 } /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
 
-OSStatus wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex index)
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
+{
+  return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
+
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
 {
   DataBrowserTableViewColumnID propertyID;
 
 
   this->GetPropertyID(index,&propertyID);
   return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
-} /* wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex) */
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
 {
@@ -526,6 +536,19 @@ OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID
   return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
 }
 
+//
+// container handling
+//
+OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
+{
+  return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
+
+OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
+{
+  return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
+
 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
 
 // ============================================================================
@@ -714,27 +737,27 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
     if (propertyID >= kMinPropertyID) // in case data columns set the data
     {
      // variable definitions:
-      DataBrowserTableViewColumnIndex columnIndex;
-      OSStatus                        errorStatus;
-      wxVariant                       variant;
-      wxDataViewColumn*               dataViewColumnPtr;
-      wxDataViewCtrl*                 dataViewCtrlPtr;
+      wxVariant         variant;
+      wxDataViewColumn* dataViewColumnPtr;
+      wxDataViewCtrl*   dataViewCtrlPtr;
       
       dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
       wxCHECK_MSG(dataViewCtrlPtr             != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
       wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
-      errorStatus = this->GetColumnIndex(propertyID,&columnIndex);
-      wxCHECK_MSG(errorStatus == noErr,errorStatus,_("Column index does not exist."));
-      dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
+      dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
       wxCHECK_MSG(dataViewColumnPtr                != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
       wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
       dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
-      dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
-      dataViewColumnPtr->GetRenderer()->SetValue(variant);
-      wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
+      if (!(variant.IsNull()))
+      {
+        dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
+        dataViewColumnPtr->GetRenderer()->SetValue(variant);
+        wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
+      } /* if */
       return noErr;
     } /* if */
     else // react on special system requests
+    {
       switch (propertyID)
       {
         case kDataBrowserContainerIsClosableProperty:
@@ -753,7 +776,6 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
            // opening the container is allowed if not vetoed:
             return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
           } /* block */
-          return noErr;
         case kDataBrowserContainerIsOpenableProperty:
           {
            // variable definitions:
@@ -782,11 +804,12 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
         case kDataBrowserItemIsEditableProperty:
           return ::SetDataBrowserItemDataBooleanValue(itemData,true);
       } /* switch */
+    } /* if */
   } /* if */
   return errDataBrowserPropertyNotSupported;
 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
 
-void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef WXUNUSED(itemData))
+void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
 {
   switch (message)
   {
@@ -823,6 +846,60 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da
         dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
       } /* block */
       break;
+    case kDataBrowserEditStarted:
+      {
+       // variable definitions:
+        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+        
+        if (dataViewCtrlPtr != NULL)
+        {
+         // initialize wxWidget event:
+          DataBrowserPropertyID propertyID;  
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+          if (this->GetPropertyID(itemData,&propertyID) == noErr)
+          {
+           // variable definition and initialization:
+            DataBrowserTableViewColumnIndex columnIndex;
+            
+            wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+            dataViewEvent.SetColumn(columnIndex);
+            dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));          
+          } /* if */
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* if */
+      } /* block */
+      break;
+    case kDataBrowserEditStopped:
+    {
+     // variable definitions:
+      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+      
+      if (dataViewCtrlPtr != NULL)
+      {
+       // initialize wxWidget event:
+        DataBrowserPropertyID propertyID;  
+        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
+        
+        dataViewEvent.SetEventObject(dataViewCtrlPtr);
+        dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+        if (this->GetPropertyID(itemData,&propertyID) == noErr)
+        {
+         // variable definition and initialization:
+          DataBrowserTableViewColumnIndex columnIndex;
+
+          wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+          dataViewEvent.SetColumn(columnIndex);
+          dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));          
+        } /* if */
+       // finally send the equivalent wxWidget event:
+        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      } /* if */
+    } /* block */
+      break;
     case kDataBrowserItemAdded:
       {
        // variable definitions:
@@ -838,6 +915,23 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da
         dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
       } /* block */
       break;
+    case kDataBrowserItemDeselected:
+      {
+       // variable definitions:
+        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+        
+        if (dataViewCtrlPtr != NULL) // can become NULL if an item is still selected while removing the data browser
+        {
+         // initialize wxWidget event:
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DESELECTED,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* if */
+      } /* block */
+      break;
     case kDataBrowserItemDoubleClicked:
       {
        // variable definitions:
@@ -885,6 +979,8 @@ void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(Da
         dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
       } /* block */
       break;
+    case kDataBrowserSelectionSetChanged:
+      break;
     case kDataBrowserUserStateChanged:
       {
         DataBrowserPropertyID propertyID;
index df0e175ccf92342fd6e502625571b06287d6bc0e..97c0fe9b9d0b35a2e2e6a1e052539906da49ee5f 100644 (file)
@@ -277,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) */
 
@@ -300,7 +300,7 @@ wxDC* wxDataViewCustomRenderer::GetDC(void)
 
 bool wxDataViewCustomRenderer::Render(void)
 {
-  return false;
+  return true;
 } /* wxDataViewCustomRenderer::Render(void) */
 
 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
@@ -363,6 +363,38 @@ 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)
+{
+  wxLogMessage(wxString(_("Types: ")) << this->GetValue().GetType() << wxT(' ') << this->GetVariantType());
+  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
 // ---------------------------------------------------------
@@ -670,7 +702,6 @@ void wxDataViewCtrl::Init(void)
 {
   this->m_Deleting      = false;
   this->m_macIsUserPane = false;
-  this->m_NotifierPtr   = NULL;
   this->m_cgContext     = NULL;
 } /* wxDataViewCtrl::Init(void) */
 
@@ -692,25 +723,40 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
   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))
   {
+   // insert column into hash map:
+    this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,dataViewColumnPtr));
+
    // variable definitions:
-    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));
+    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);
     if (dataViewColumnPtr->GetWidth() <= 0)
       dataViewColumnPtr->SetWidth(wxDVC_DEFAULT_WIDTH);
@@ -735,7 +781,7 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
     columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
 #endif
     columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
-    if (dataViewColumnPtr->IsResizable())
+    if (dataViewColumnPtr->IsResizeable())
     {
       columnDescription.headerBtnDesc.minimumWidth = 0;
       columnDescription.headerBtnDesc.maximumWidth = 30000;
@@ -775,10 +821,6 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
 
    // final adjustments for the layout:
     wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,dataViewColumnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
-#if 0
-    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);
-#endif
     if (dataViewColumnPtr == this->GetExpanderColumn()) // if the current column is marked expandable this column will become the active expandable column
       MacDataViewListCtrlPtr->SetDisclosureColumn(NewPropertyID,true);
 
@@ -795,16 +837,67 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
     return false;
 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
 
-bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
+bool wxDataViewCtrl::ClearColumns(void)
 {
-  if (!wxDataViewCtrlBase::AssociateModel(model))
+  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;
   
-  this->m_NotifierPtr = new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer));
-  model->AddNotifier(this->m_NotifierPtr);
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
-  return true;
-} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
+  
+  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 */
+
+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)
 {
@@ -822,6 +915,14 @@ void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn
   } /* 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&) */
+
 wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
 {
   if (item.IsOk() && (columnPtr != NULL))
@@ -984,23 +1085,36 @@ void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem)
   } /* while */
 } /* 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)