]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dataview.cpp
cleanup
[wxWidgets.git] / src / mac / carbon / dataview.cpp
index e72f73334594d35121f0d800febe30f4b0d0e24a..b05a81b318acae33609454969685e7d7b5cd4498 100644 (file)
@@ -22,6 +22,8 @@
 
 #ifndef WX_PRECOMP
   #include "wx/timer.h"
+  #include "wx/settings.h"
+  #include "wx/dcclient.h"
 #endif
 
 #include "wx/icon.h"
@@ -92,6 +94,25 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
   return eventNotHandledErr;
 } /* wxMacDataViewCtrlEventHandler(EventHandlerCallRef, EventRef, void*) */
 
+static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDataViewItemArray const& items) // returns a newly allocated pointer to valid data browser item IDs
+{
+  size_t const noOfItems = items.GetCount();
+
+  DataBrowserItemID* itemIDs(new DataBrowserItemID[noOfItems]);
+
+ // convert all valid data view items to data browser items
+  noOfEntries = 0;
+  for (size_t i=0; i<noOfItems; ++i)
+    if (items[i].IsOk())
+    {
+      itemIDs[noOfEntries] = reinterpret_cast<DataBrowserItemID>(items[i].GetID());
+      ++noOfEntries;
+    } /* if */
+ // done:
+  return itemIDs;
+} /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
+
 //-----------------------------------------------------------------------------
 // local function pointers
 //-----------------------------------------------------------------------------
@@ -119,19 +140,39 @@ public:
             parent.IsOk()  && (this->m_dataViewControlPtr->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr));
   } /* ItemAdded(wxDataViewItem const&, wxDataViewItem const&) */
 
+  virtual bool ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+  {
+    bool noFailureFlag;
+
+    DataBrowserItemID* itemIDs;
+    
+    size_t noOfEntries;
+    
+
+   // convert all valid data view items to data browser items:
+    itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
+   // insert all valid items into control:
+    noFailureFlag = ((noOfEntries == 0) ||
+                     !(parent.IsOk()) && (this->m_dataViewControlPtr->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
+                     parent.IsOk() && (this->m_dataViewControlPtr->AddItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
+   // give allocated array space free again:
+    delete[] itemIDs;
+   // done:
+    return noFailureFlag;
+  } /* ItemsAdded(wxDataViewItem const&, wxDataViewItemArray const&) */
+
   virtual bool ItemChanged(wxDataViewItem const& item)
   {
     DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
     
     
-    wxCHECK_MSG(item.IsOk(),             false,_("Changed item is invalid."));
-    wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized."));
+    wxCHECK_MSG(item.IsOk(),false,_("Changed item is invalid."));
     if (this->m_dataViewControlPtr->UpdateItems(&itemID) == noErr)
     {
       wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
       
      // sent the equivalent wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
 
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
       dataViewEvent.SetItem(item);
@@ -144,6 +185,39 @@ public:
       return false;
   } /* ItemChanged(wxDataViewItem const&) */
 
+  virtual bool ItemsChanged(wxDataViewItemArray const& items)
+  {
+    bool noFailureFlag;
+
+    DataBrowserItemID* itemIDs;
+    
+    size_t noOfEntries;
+    
+
+   // convert all valid data view items to data browser items:
+    itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
+   // change items (ATTENTION: ONLY ITEMS OF THE ROOT ARE CHANGED BECAUSE THE PARENT PARAMETER IS MISSING):
+    noFailureFlag = (this->m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
+    if (noFailureFlag)
+    {
+      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
+      
+     // send for all changed items a wxWidget event:
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
+
+      dataViewEvent.SetEventObject(dataViewCtrlPtr);
+      for (size_t i=0; i<noOfEntries; ++i)
+      {
+        dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
+        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      } /* for */
+    } /* if */
+   // release allocated array space:
+    delete[] itemIDs;
+   // done:
+    return noFailureFlag;
+  } /* ItemsChanged(wxDataViewItem const&) */
+
   virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
   {
     if (item.IsOk())
@@ -154,10 +228,12 @@ public:
       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:
+     // not to be identical because the being edited item might be below the passed item in the hierarchy);
+     // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
+     // has been 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);
+     // enable automatic updating again:
       dataViewCtrlPtr->SetDeleting(false);
       return (errorStatus == noErr);
     } /* if */
@@ -165,6 +241,37 @@ public:
       return false;
   } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
 
+  virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+  {
+    bool noFailureFlag;
+
+    DataBrowserItemID* itemIDs;
+    
+    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
+
+    size_t noOfEntries;
+    
+
+    wxCHECK_MSG(dataViewCtrlPtr != NULL,false,_("Data view control is not correctly initialized"));
+   // convert all valid data view items to data browser items:
+    itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
+   // 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);
+   // to prevent the control trying to ask the model to update an already deleted item the control is informed that currently a deleting process
+   // has been started and that variables can currently not be updated even when requested by the system:
+    dataViewCtrlPtr->SetDeleting(true);
+   // insert all valid items into control:
+    noFailureFlag = ((noOfEntries == 0) ||
+                     !(parent.IsOk()) && (this->m_dataViewControlPtr->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
+                     parent.IsOk() && (this->m_dataViewControlPtr->RemoveItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
+   // enable automatic updating again:
+    dataViewCtrlPtr->SetDeleting(false);
+   // give allocated array space free again:
+    delete[] itemIDs;
+   // done:
+    return noFailureFlag;
+  } /* ItemsDeleted(wxDataViewItem const&, wxDataViewItemArray const&) */
+
   virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col)
   {
     DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
@@ -183,7 +290,7 @@ public:
         (this->m_dataViewControlPtr->UpdateItems(parentID,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr))
     {
      // variable definition and initialization:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED,dataViewCtrlPtr->GetId());
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
 
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
       dataViewEvent.SetColumn(col);
@@ -199,20 +306,7 @@ public:
 
   virtual bool Cleared(void)
   {
-    if (this->m_dataViewControlPtr->RemoveItems() == noErr)
-    {
-     // variable definitions and initializations:
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-      wxDataViewEvent dataViewEvent  (wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED,dataViewCtrlPtr->GetId());
-
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-     // send the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-     // done
-      return true;
-    } /* if */
-    else
-      return false;
+    return (this->m_dataViewControlPtr->RemoveItems() == noErr);
   } /* Cleared(void) */
 
   virtual void Resort(void)
@@ -277,7 +371,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) */
 
@@ -287,6 +381,16 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
     delete this->m_DCPtr;
 } /* wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void) */
 
+void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
+{
+    wxDataViewCtrl *view = GetOwner()->GetOwner();
+    wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ?
+                        wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) :
+                        view->GetForegroundColour();
+    dc->SetTextForeground(col);
+    dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
+}
+
 wxDC* wxDataViewCustomRenderer::GetDC(void)
 {
   if (this->m_DCPtr == NULL)
@@ -300,7 +404,7 @@ wxDC* wxDataViewCustomRenderer::GetDC(void)
 
 bool wxDataViewCustomRenderer::Render(void)
 {
-  return false;
+  return true;
 } /* wxDataViewCustomRenderer::Render(void) */
 
 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
@@ -309,6 +413,10 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
   this->m_DCPtr = newDCPtr;
 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
 
+WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType() const
+{
+    return kDataBrowserCustomType;
+}
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
 
@@ -334,6 +442,11 @@ bool wxDataViewTextRenderer::Render(void)
     return false;
 } /* wxDataViewTextRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType() const
+{
+    return kDataBrowserTextType;
+}
+
 IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -355,14 +468,55 @@ bool wxDataViewBitmapRenderer::Render(void)
     if (bitmap.Ok())
       return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
     else
-      return false;
+      return true;
   } /* if */
   else
     return false;
 } /* wxDataViewBitmapRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType() const
+{
+    return kDataBrowserIconType;
+}
+
 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) */
+
+WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType() const
+{
+    return kDataBrowserIconAndTextType;
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+
+
 // ---------------------------------------------------------
 // wxDataViewToggleRenderer
 // ---------------------------------------------------------
@@ -380,6 +534,11 @@ bool wxDataViewToggleRenderer::Render(void)
     return false;
 } /* wxDataViewToggleRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType() const
+{
+    return kDataBrowserCheckboxType;
+}
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -401,6 +560,11 @@ bool wxDataViewProgressRenderer::Render(void)
     return false;
 } /* wxDataViewProgressRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType() const
+{
+    return kDataBrowserProgressBarType;
+}
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -420,6 +584,11 @@ bool wxDataViewDateRenderer::Render(void)
     return false;
 } /* wxDataViewDateRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType() const
+{
+    return kDataBrowserDateTimeType;
+}
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -428,14 +597,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) */
@@ -613,6 +782,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) */
@@ -670,7 +840,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,30 +861,43 @@ 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);
     columnDescription.propertyDesc.propertyID = NewPropertyID;
-    columnDescription.propertyDesc.propertyType = dataViewColumnPtr->GetRenderer()->GetPropertyType();
+    columnDescription.propertyDesc.propertyType = DataBrowserPropertyType(dataViewColumnPtr->GetRenderer()->GetPropertyType());
     columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
     if (dataViewColumnPtr->IsSortable())
       columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
@@ -735,7 +917,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,17 +957,15 @@ 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 (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:
@@ -795,16 +975,82 @@ 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 */
+
+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)
 {
@@ -822,6 +1068,36 @@ 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&) */
+
+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))
@@ -972,35 +1248,51 @@ void 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);
+#if 0
+  for (int i=0; i<NoOfChildren; ++i)
+    (void) this->GetModel()->ItemAdded(parentItem,items[i]);
+#else
+  (void) this->GetModel()->ItemsAdded(parentItem,items);
+#endif
 } /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
 
+wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID 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)