]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dataview.cpp
Use IsOk() instead of Ok()
[wxWidgets.git] / src / mac / carbon / dataview.cpp
index 13644c5cee3d55864cc89a7bc67d64bad7665e46..9b4a88fff9040c9c3637753e8faab69c082bced9 100644 (file)
 #include "wx/mac/carbon/databrow.h"
 
 #ifndef WX_PRECOMP
-  #include "wx/timer.h"
+    #include "wx/timer.h"
+    #include "wx/settings.h"
+    #include "wx/dcclient.h"
+    #include "wx/icon.h"
 #endif
 
-#include "wx/icon.h"
 #include "wx/renderer.h"
 
 //-----------------------------------------------------------------------------
@@ -82,7 +84,7 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
         DataViewEvent.SetColumn(columnIndex);
         DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
        // finally sent the equivalent wxWidget event:
-        DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent);
+        DataViewCtrlPtr->HandleWindowEvent(DataViewEvent);
         return ::CallNextEventHandler(handler,EventReference);
       } /* if */
       else
@@ -92,6 +94,86 @@ 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&) */
+
+static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxCFStringRef const& title)
+{
+ // set properties for the column:
+  columnDescription.propertyDesc.propertyID    = columnPropertyID;
+  columnDescription.propertyDesc.propertyType  = columnPtr->GetRenderer()->GetPropertyType();
+  columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
+  if (columnPtr->IsSortable())
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
+#if 0
+  if (columnPtr->IsMovable())
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
+#endif
+  if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
+  if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) ||
+      (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
+      (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType))
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+  columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
+#endif
+ // set header's properties:
+  columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
+  if (columnPtr->IsResizeable())
+  {
+    columnDescription.headerBtnDesc.minimumWidth = 0;
+    columnDescription.headerBtnDesc.maximumWidth = 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
+  } /* if */
+  else
+  {
+    columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth();
+    columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth();
+  } /* if */
+  columnDescription.headerBtnDesc.titleOffset = 0;
+  columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
+  columnDescription.headerBtnDesc.initialOrder       = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
+  columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
+  switch (columnPtr->GetAlignment())
+  {
+    case wxALIGN_CENTER:
+    case wxALIGN_CENTER_HORIZONTAL:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
+      break;
+    case wxALIGN_LEFT:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
+      break;
+    case wxALIGN_RIGHT:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
+      break;
+    default:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
+  } /* switch */
+  columnDescription.headerBtnDesc.btnFontStyle.font  = kControlFontViewSystemFont;
+  columnDescription.headerBtnDesc.btnFontStyle.style = normal;
+  columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
+  if (columnPtr->GetBitmap().Ok())
+    columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef();
+ // done:
+  return true;
+} /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxCFStringRef const&) */
+
 //-----------------------------------------------------------------------------
 // local function pointers
 //-----------------------------------------------------------------------------
@@ -99,245 +181,203 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
 DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler)
 
 // ---------------------------------------------------------
-// wxMacDataViewListModelNotifier
+// wxMacDataViewModelNotifier
 // ---------------------------------------------------------
 #pragma mark -
-class wxMacDataViewListModelNotifier : public wxDataViewListModelNotifier
+class wxMacDataViewModelNotifier : public wxDataViewModelNotifier
 {
 public:
-  wxMacDataViewListModelNotifier(wxMacDataViewDataBrowserListViewControl* initDataViewControlPtr) : m_dataViewControlPtr(initDataViewControlPtr)
+  wxMacDataViewModelNotifier(wxMacDataViewDataBrowserListViewControl* initDataViewControlPtr) : m_dataViewControlPtr(initDataViewControlPtr)
   {
   }
 
-  virtual bool RowAppended(void)
+  virtual bool ItemAdded(const wxDataViewItem &parent, const wxDataViewItem &item)
+  {
+    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+
+
+    wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
+    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 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 newRowID;
+    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
     
     
-    if ((this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr) &&
-         this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,this->GetOwner()->GetRowCount()-1) &&
-        (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr))
+    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_ROW_APPENDED,dataViewCtrlPtr->GetId()); // variable defintion
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
 
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetRow(this->GetOwner()->GetRowCount()-1);
+      dataViewEvent.SetItem(item);
      // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
      // done
       return true;
     } /* if */
     else
       return false;
-  }
-  virtual bool RowChanged(unsigned int row)
+  } /* ItemChanged(wxDataViewItem const&) */
+
+  virtual bool ItemsChanged(wxDataViewItemArray const& items)
   {
-    DataBrowserItemID itemID;
+    bool noFailureFlag;
+
+    DataBrowserItemID* itemIDs;
     
+    size_t noOfEntries;
     
-    if (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr)
+
+   // 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()));
       
-     // sent the equivalent wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
+     // send for all changed items a wxWidget event:
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
 
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetRow(row);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-     // done
-      return true;
+      for (size_t i=0; i<noOfEntries; ++i)
+      {
+        dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
+        dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+      } /* for */
     } /* if */
-    else
-      return false;
-  }
-  virtual bool RowDeleted(unsigned int row)
-  {
-    DataBrowserItemID itemID;
-
+   // release allocated array space:
+    delete[] itemIDs;
+   // done:
+    return noFailureFlag;
+  } /* ItemsChanged(wxDataViewItem const&) */
 
-    if (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr)
+  virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
+  {
+    if (item.IsOk())
     {
-     // variable definition:
-      unsigned long rowIndex;
+     // variable definition and initialization:
+      DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+      OSStatus          errorStatus;
+      wxDataViewCtrl*   dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
       
-      wxCHECK_MSG(this->m_dataViewControlPtr->GetRowIndex(rowIndex,itemID) && this->m_dataViewControlPtr->DeleteItemIDRowPair(itemID),false,_("Unable to delete row data."));
-      this->m_dataViewControlPtr->RenumberItemIDRowIndicesDeletion(rowIndex);
-      if (this->m_dataViewControlPtr->RemoveItem(kDataBrowserNoItem,&itemID) == noErr)
-      {
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-        
-       // sent the equivalent wxWidget event:
-        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED,dataViewCtrlPtr->GetId()); // variable defintion
-
-        dataViewEvent.SetEventObject(dataViewCtrlPtr);
-        dataViewEvent.SetRow(row);
-       // sent the equivalent wxWidget event:
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-       // done
-        return true;
-      } /* if */
-      else
-        return false;
+     // 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);
+      errorStatus = this->m_dataViewControlPtr->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID);
+     // enable automatic updating again:
+      dataViewCtrlPtr->SetDeleting(false);
+      return (errorStatus == noErr);
     } /* if */
     else
       return false;
-  }
-  virtual bool RowInserted(unsigned int before)
+  } /* ItemDeleted(wxDataViewItem const&, wxDataViewItem const&) */
+
+  virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
   {
-    DataBrowserItemID newRowID;
+    bool noFailureFlag;
 
+    DataBrowserItemID* itemIDs;
+    
+    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
 
-    if (this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr)
-    {
-      this->m_dataViewControlPtr->RenumberItemIDRowIndicesInsertion(before);
-      if (this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,before) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr))
-      {
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-        
-       // sent the equivalent wxWidget event:
-        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED,dataViewCtrlPtr->GetId()); // variable defintion
-
-        dataViewEvent.SetEventObject(dataViewCtrlPtr);
-        dataViewEvent.SetRow(before);
-       // sent the equivalent wxWidget event:
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-       // done
-        return true;
-      } /* if */
-      else
-        return false;
-    } /* if */
-    else
-      return false;
-  }
-  virtual bool RowPrepended(void)
-  {
-    DataBrowserItemID newRowID;
+    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&) */
 
-    if (this->m_dataViewControlPtr->GetFreeItemID(&newRowID) == noErr)
-    {
-      this->m_dataViewControlPtr->RenumberItemIDRowIndicesInsertion(0);
-      if (this->m_dataViewControlPtr->InsertItemIDRowPair(newRowID,0) && (this->m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&newRowID) == noErr))
-      {
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-        
-       // sent the equivalent wxWidget event:
-        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED,dataViewCtrlPtr->GetId()); // variable defintion
-
-        dataViewEvent.SetEventObject(dataViewCtrlPtr);
-        dataViewEvent.SetRow(0);
-       // sent the equivalent wxWidget event:
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-       // done
-        return true;
-      } /* if */
-      else
-        return false;
-    } /* if */
-    else
-      return false;
-  }
-  virtual bool ValueChanged(unsigned int col, unsigned int row)
+  virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col)
   {
-    DataBrowserItemID itemID;
+    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+    DataBrowserItemID parentID;
     
     DataBrowserPropertyID propertyID;
 
-    
-    wxDataViewCtrl*  dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-    
-    if ((dataViewCtrlPtr != NULL) && (this->m_dataViewControlPtr->GetItemID(row,&itemID) == noErr) && (this->m_dataViewControlPtr->GetColumnID(col,&propertyID) == noErr) &&
-        (this->m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr))
+    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
+
+
+    wxCHECK_MSG(item.IsOk(),             false,_("Passed item is invalid."));
+    wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized."));
+    wxCHECK_MSG(dataViewCtrlPtr != NULL, false,_("Control is wrongly initialized."));
+    parentID = reinterpret_cast<DataBrowserItemID>(this->GetOwner()->GetParent(item).GetID());
+    if ((this->m_dataViewControlPtr->GetPropertyID(col,&propertyID) == noErr) &&
+        (this->m_dataViewControlPtr->UpdateItems(parentID,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr))
     {
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-      
-     // sent the equivalent wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED,dataViewCtrlPtr->GetId()); // variable defintion
+     // variable definition and initialization:
+      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
 
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
       dataViewEvent.SetColumn(col);
-      dataViewEvent.SetRow(row);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      dataViewEvent.SetItem(item);
+     // send the equivalent wxWidget event:
+      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
      // done
       return true;
     } /* if */
     else
       return false;
-  }
-  virtual bool RowsReordered(unsigned int* new_order)
-  {
-    DataBrowserPropertyID propertyId;
+  } /* ValueChanged(wxDataViewItem const&, unsigned int) */
 
-        
-    if ((new_order != NULL) && (this->m_dataViewControlPtr->GetSortProperty(&propertyId) == noErr) && (propertyId >= kMinPropertyID))
-    {
-      DataBrowserSortOrder sortOrder;
-      unsigned long        column;
-          
-      if ((this->m_dataViewControlPtr->GetSortOrder(&sortOrder) == noErr) && (this->m_dataViewControlPtr->GetPropertyColumn(propertyId,&column) == noErr))
-      {
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-        
-        if (dataViewCtrlPtr->GetColumn(column)->IsSortOrderAscending())
-          this->m_dataViewControlPtr->RenumberItemIDRowIndices(new_order);
-        else // the sort order of the control is descending but the passed sort order is always ordered top - down
-        {
-          ItemCount itemCount;
-
-          if (this->m_dataViewControlPtr->GetItemCount(&itemCount) != noErr)
-            return false;
-          unsigned int* reversedOrder(new unsigned int[itemCount]);
-          
-          for (ItemCount i=0; i<itemCount; ++i)
-            reversedOrder[i] = itemCount-new_order[i];
-          this->m_dataViewControlPtr->RenumberItemIDRowIndices(reversedOrder);
-          delete[] reversedOrder;
-        } /* if */
-        if (this->m_dataViewControlPtr->UpdateItems())
-        {
-         // sent the equivalent wxWidget event:
-          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED,dataViewCtrlPtr->GetId()); // variable defintion
-
-          dataViewEvent.SetEventObject(dataViewCtrlPtr);
-         // sent the equivalent wxWidget event:
-          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-         // done
-          return true;
-        } /* if */
-        else
-          return false;
-      } /* if */
-      else
-        return false;
-    } /* if */
-    else
-      return false;
-  }
   virtual bool Cleared(void)
   {
-    this->m_dataViewControlPtr->ClearItemIDRowPairs();
-    if (this->m_dataViewControlPtr->RemoveItems() == noErr)
-    {
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->m_dataViewControlPtr->GetPeer()));
-      
-     // sent the equivalent wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED,dataViewCtrlPtr->GetId()); // variable defintion
-
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-     // done
-      return true;
-    } /* if */
-    else
-      return false;
+    bool noFailureFlag = (this->m_dataViewControlPtr->RemoveItems() == noErr);
+    wxDataViewItem item;
+    wxDataViewItemArray array;
+    GetOwner()->GetChildren( item, array );
+    ItemsAdded( item, array );
+    return noFailureFlag;
+  } /* Cleared(void) */
+
+  virtual void Resort(void)
+  {
+    this->m_dataViewControlPtr->Resort();
   }
 
 protected:
@@ -397,7 +437,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) */
 
@@ -407,20 +447,28 @@ 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) ? *wxWHITE : 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)
   {
     if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL))
       return NULL;
-    this->m_DCPtr = new wxClientDC(this->GetOwner()->GetOwner());
+    this->m_DCPtr = new wxWindowDC(this->GetOwner()->GetOwner());
   } /* if */
   return this->m_DCPtr;
 } /* wxDataViewCustomRenderer::GetDC(void) */
 
 bool wxDataViewCustomRenderer::Render(void)
 {
-  return false;
+  return true;
 } /* wxDataViewCustomRenderer::Render(void) */
 
 void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
@@ -429,6 +477,10 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
   this->m_DCPtr = newDCPtr;
 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
 
+WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserCustomType;
+} /* wxDataViewCustomRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
 
@@ -446,7 +498,7 @@ bool wxDataViewTextRenderer::Render(void)
   if (this->GetValue().GetType() == this->GetVariantType())
   {
    // variable definition:
-    wxMacCFStringHolder cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+    wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
 
     return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
   } /* if */
@@ -454,8 +506,24 @@ bool wxDataViewTextRenderer::Render(void)
     return false;
 } /* wxDataViewTextRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserTextType;
+} /* wxDataViewTextRenderer::GetPropertyType(void) const */
+
 IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
 
+// --------------------------------------------------------- 
+// wxDataViewTextRendererAttr
+// --------------------------------------------------------- 
+#pragma mark -
+wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewTextRenderer(varianttype,mode,align)
+{
+} /* wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const&, wxDataViewCellMode, int) */
+    
+IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
+
 // ---------------------------------------------------------
 // wxDataViewBitmapRenderer
 // ---------------------------------------------------------
@@ -473,16 +541,62 @@ bool wxDataViewBitmapRenderer::Render(void)
     
     bitmap << this->GetValue();
     if (bitmap.Ok())
-      return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
+      return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
     else
-      return false;
+      return true;
   } /* if */
   else
     return false;
 } /* wxDataViewBitmapRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserIconType;
+} /* wxDataViewBitmapRenderer::GetPropertyType(void) const */
+
 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:
+    wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+
+    if (iconText.GetIcon().IsOk())
+    {
+       if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
+          return false;
+    }
+    
+    return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
+  } /* if */
+  else
+    return false;
+} /* wxDataViewIconTextRenderer::Render(void) */
+
+WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserIconAndTextType;
+} /* wxDataViewIconTextRenderer::GetPropertyType(void) const */
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+
+
 // ---------------------------------------------------------
 // wxDataViewToggleRenderer
 // ---------------------------------------------------------
@@ -500,6 +614,11 @@ bool wxDataViewToggleRenderer::Render(void)
     return false;
 } /* wxDataViewToggleRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserCheckboxType;
+} /* wxDataViewToggleRenderer::GetPropertyType(void) const */
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -521,6 +640,11 @@ bool wxDataViewProgressRenderer::Render(void)
     return false;
 } /* wxDataViewProgressRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserProgressBarType;
+} /* wxDataViewProgressRenderer::GetPropertyType(void) const */
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -540,6 +664,11 @@ bool wxDataViewDateRenderer::Render(void)
     return false;
 } /* wxDataViewDateRenderer::Render(void) */
 
+WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType(void) const
+{
+  return kDataBrowserDateTimeType;
+} /* wxDataViewDateRenderer::GetPropertyType(void) const */
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
 
 // ---------------------------------------------------------
@@ -547,14 +676,16 @@ 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_alignment(align), m_ascending(true),
-                  m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_minWidth(0), m_maxWidth(std::numeric_limits<int>::max()), m_width(width), m_title(title)
+                 :wxDataViewColumnBase(title,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
+                  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_alignment(align),
-                  m_flags(flags & (wxDATAVIEW_COL_HIDDEN | wxDATAVIEW_COL_RESIZABLE)), m_minWidth(0), m_maxWidth(std::numeric_limits<int>::max()), m_width(width)
+                 :wxDataViewColumnBase(bitmap,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
+                  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,7 +744,7 @@ void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
 
       wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
       if (this->GetBitmap().Ok())
-        headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef();
+        headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
       else
         headerDescription.btnContentInfo.u.iconRef = NULL;
       wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
@@ -731,6 +862,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) */
@@ -750,7 +882,7 @@ void wxDataViewColumn::SetTitle(wxString const& title)
     {
      // variable definition and initialization:
       DataBrowserListViewHeaderDesc headerDescription;
-      wxMacCFStringHolder           cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+      wxCFStringRef           cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
       
       wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
       headerDescription.titleString = cfTitle;
@@ -786,8 +918,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) */
 
@@ -802,292 +934,460 @@ 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);
 
+  ::SetDataBrowserTableViewHiliteStyle( this->m_peer->GetControlRef(), kDataBrowserTableViewFillHilite );
+
   return true;
 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
 
-void wxDataViewCtrl::OnSize(wxSizeEvent& event)
-{
-  unsigned int const NoOfColumns = this->GetColumnCount();
-
-
-  for (unsigned int i=0; i<NoOfColumns; ++i)
-  {
-   // variable definition and initialization:
-    wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i));
-    
-    if (dataViewColumnPtr != NULL)
-    {
-     // variable definition and initialization:
-      wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
-    
-      if (dataViewCustomRendererPtr != NULL)
-        dataViewCustomRendererPtr->SetDC(NULL); // reset DC because DC has changed
-    } /* if */
-  } /* for */
-  event.Skip();
-} /* wxDataViewCtrl::OnSize(wxSizeEvent&) */
-
-bool wxDataViewCtrl::AssociateModel(wxDataViewListModel *model)
+bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
 {
   if (!wxDataViewCtrlBase::AssociateModel(model))
     return false;
   
-  this->m_NotifierPtr = new wxMacDataViewListModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer));
-  model->AddNotifier(this->m_NotifierPtr);
+  model->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(this->m_peer)));
 
   return true;
-}
+} /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
 
-bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
+bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
 {
-  wxCHECK_MSG(dataViewColumnPtr != NULL,               false,_("Column pointer must not be NULL."));
-  wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,false,_("Column does not have a renderer."));
-  if (this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr))
+  DataBrowserListViewColumnDesc columnDescription;
+
+  DataBrowserPropertyID NewPropertyID;
+
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+  wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
+
+
+ // first, some error checking:
+  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                    false,_("m_peer is not or incorrectly initialized"));
+  wxCHECK_MSG(columnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
+  wxCHECK_MSG(columnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
+  wxCHECK_MSG(this->GetModel() != NULL,                                          false,_("No model associated with control."));
+  wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
+              (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
+
+ // try to get new ID for the column:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
+ // full column variable initialization:
+  columnPtr->SetPropertyID(NewPropertyID);
+ // add column to wxWidget's internal structure:
+  wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
+              this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
+ // create a column description and add column to the native control:
+  wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),                 false,_("Column description could not be initialized."));
+  wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added."));
+
+ // final adjustments for the layout:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
+
+ // 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 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)
   {
-   // variable definition:
-    DataBrowserPropertyID                          FreeID;
-    DataBrowserListViewColumnDesc                  columnDescription;
-    wxMacCFStringHolder                            cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()));
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+    this->SetExpanderColumn(columnPtr);
+    this->AddChildrenLevel(wxDataViewItem());
+  } /* if */
+  else
+    MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
+ // done:
+  return true;
+} /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
 
-   // initialize column description:
-    wxCHECK_MSG (MacDataViewListCtrlPtr != NULL,false,_("m_peer is not or incorrectly initialized"));
-    verify_noerr(MacDataViewListCtrlPtr->GetFreePropertyID(&FreeID));
-    dataViewColumnPtr->SetPropertyID(FreeID);
-    columnDescription.propertyDesc.propertyID = FreeID;
-    columnDescription.propertyDesc.propertyType = dataViewColumnPtr->GetRenderer()->GetPropertyType();
-    columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn;
-    if (dataViewColumnPtr->IsSortable())
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
-    if (dataViewColumnPtr->IsResizeable())
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
-    if (dataViewColumnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
-#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
-    if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) ||
-        (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
-        (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType))
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
-#endif
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
-#endif
-    columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
-    columnDescription.headerBtnDesc.minimumWidth = 0;
-    columnDescription.headerBtnDesc.maximumWidth = 30000;
-    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
-    columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing;
-    columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
-    switch (dataViewColumnPtr->GetAlignment())
-    {
-      case wxALIGN_CENTER:
-      case wxALIGN_CENTER_HORIZONTAL:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
-        break;
-      case wxALIGN_LEFT:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
-        break;
-      case wxALIGN_RIGHT:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
-        break;
-      default:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
-    } /* switch */
-    columnDescription.headerBtnDesc.btnFontStyle.font  = kControlFontViewSystemFont;
-    columnDescription.headerBtnDesc.btnFontStyle.style = normal;
-    columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
-    if (dataViewColumnPtr->GetBitmap().Ok())
-      columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = dataViewColumnPtr->GetBitmap().GetBitmapData()->GetIconRef();
-   // add column:
-    verify_noerr(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn));
-   // final adjustments for the layout:
-    if (dataViewColumnPtr->GetWidth() <= 0)
-    {
-     // variable definition:
-      UInt16 defaultColumnWidth;
-      
-      MacDataViewListCtrlPtr->GetDefaultColumnWidth(&defaultColumnWidth);
-      dataViewColumnPtr->SetWidth(defaultColumnWidth);
-    } /* if */
-    verify_noerr(MacDataViewListCtrlPtr->SetColumnWidth(dataViewColumnPtr->GetPropertyID(),dataViewColumnPtr->GetWidth()));
-    if (dataViewColumnPtr->IsSortable()) // if the current column is sortable and there is no active sortable column yet, the new column will become active
-    {
-     // variable definition:
-      DataBrowserPropertyID sortedProperty;
+bool wxDataViewCtrl::ClearColumns(void)
+{
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
-      if ((MacDataViewListCtrlPtr->GetSortProperty(&sortedProperty) == noErr) && (sortedProperty < kMinPropertyID))
-        MacDataViewListCtrlPtr->SetSortProperty(dataViewColumnPtr->GetPropertyID());
-    } /* if */
+  
+  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) */
 
-   // now, make sure that data is shown in the newly appended column:
-    if ((this->GetModel() != NULL) && (this->m_NotifierPtr != NULL) && (dataViewColumnPtr->GetModelColumn() >= 0) && (dataViewColumnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()))
-      if (this->GetColumnCount() == 1) // the newly appended column is the only one and this means that no data has been inserted yet, so do it now:
-      {
-       // variable definition:
-        DataBrowserItemID newID;
-        
-        for (size_t i=0; i<this->GetModel()->GetRowCount(); ++i)
-          if (!((MacDataViewListCtrlPtr->GetFreeItemID(&newID) == noErr) && MacDataViewListCtrlPtr->InsertItemIDRowPair(newID,i) && (MacDataViewListCtrlPtr->AddItem(kDataBrowserNoItem,&newID) == noErr)))
-            return false;
-      } /* if */
-      else
-        for (size_t i=0; i<this->GetModel()->GetRowCount(); ++i)
-          (void) this->m_NotifierPtr->ValueChanged(dataViewColumnPtr->GetModelColumn(),i);
-   // done:
+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::AppendColumn(wxDataViewColumn*) */
+} /* wxDataViewCtrl::DeleteColumn(wxDataViewColumn*) */
 
-int wxDataViewCtrl::GetSelection(void) const
+wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
 {
-  wxArrayInt selectedRows;
+  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 */
 
-  if (this->GetSelections(selectedRows) > 0)
-    return selectedRows[0];
+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::GetSelection(void) const */
+} /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
 
-int wxDataViewCtrl::GetSelections(wxArrayInt& selectedRows) const
+bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
 {
-  size_t NoOfSelections;
-  wxArrayDataBrowserItemID itemIDs;
+  DataBrowserListViewColumnDesc columnDescription;
+
+  DataBrowserPropertyID NewPropertyID;
 
-  wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
+  wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
 
-  if (dataViewListCtrlPtr == NULL)
-    NoOfSelections = 0;
+
+ // first, some error checking:
+  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                    false,_("m_peer is not or incorrectly initialized"));
+  wxCHECK_MSG(columnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
+  wxCHECK_MSG(columnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
+  wxCHECK_MSG(this->GetModel() != NULL,                                          false,_("No model associated with control."));
+  wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
+              (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
+
+ // try to get new ID for the column:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
+ // full column variable initialization:
+  columnPtr->SetPropertyID(NewPropertyID);
+ // add column to wxWidget's internal structure:
+  wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
+              this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
+ // create a column description and add column to the native control:
+  wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),false,_("Column description could not be initialized."));
+  wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,0) == noErr,              false,_("Column could not be added."));
+
+ // final adjustments for the layout:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
+
+ // 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 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(columnPtr);
+    this->AddChildrenLevel(wxDataViewItem());
+  } /* if */
   else
-    NoOfSelections = dataViewListCtrlPtr->GetSelectedItemIDs(itemIDs);
-  selectedRows.Empty();
-  selectedRows.Alloc(NoOfSelections);
-  for (size_t i=0; i<NoOfSelections; ++i)
+    MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
+ // done:
+  return true;
+} /* wxDataViewCtrl::PrependColumn(wxDataViewColumn*) */
+
+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:
-    DataBrowserTableViewRowIndex rowIndex;
+    Rect                                           MacRectangle;
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
     
-    wxCHECK_MSG(dataViewListCtrlPtr->GetRowIndex(rowIndex,itemIDs[i]),0,_("Could not determine row index."));
-    selectedRows[i] = static_cast<int>(rowIndex);
-  } /* for */
-  return static_cast<int>(NoOfSelections);
-} /* wxDataViewCtrl::GetSelections(wxArrayInt&) const */
+    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 */
 
-bool wxDataViewCtrl::IsSelected(unsigned int row) const
+wxDataViewItem wxDataViewCtrl::GetSelection(void) const
 {
-  DataBrowserItemID itemID;
+  wxArrayDataBrowserItemID itemIDs;
   
-  wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
   
-  return ((dataViewListCtrlPtr != NULL) && (dataViewListCtrlPtr->GetItemID(row,&itemID) == noErr) && dataViewListCtrlPtr->IsItemSelected(itemID));
-} /* wxDataViewCtrl::IsSelected(unsigned int row) const */
+  if (MacDataViewListCtrlPtr->GetSelectedItemIDs(itemIDs) > 0)
+    return wxDataViewItem(reinterpret_cast<void*>(itemIDs[0]));
+  else
+    return wxDataViewItem();
+} /* wxDataViewCtrl::GetSelection(void) const */
 
-void wxDataViewCtrl::SetSelection(int row)
+int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
 {
-  wxArrayDataBrowserItemID selectedItemIDs;
+  size_t NoOfSelectedItems;
+
+  wxArrayDataBrowserItemID itemIDs;
+  
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
   
-  size_t NoOfSelections;
   
-  wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(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 */
 
+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 */
 
-  wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized."));  
-  if (row == -1) // unselect all selected items
+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())
   {
-    NoOfSelections = dataViewListCtrlPtr->GetSelectedItemIDs(selectedItemIDs);
-    for (size_t i=0; i<NoOfSelections; ++i)
-      (void) dataViewListCtrlPtr->SetSelectedItems(1,&(selectedItemIDs[i]),kDataBrowserItemsRemove);
+   // 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 */
-  else if (row >= 0) // select specified item
+} /* 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:
-    DataBrowserItemID itemID;
-    
-    verify_noerr(dataViewListCtrlPtr->GetItemID(row,&itemID));
-    verify_noerr(dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd)); // should also deselect automatically all other items
+   // 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::SetSelection(int) */
+} /* wxDataViewCtrl::Unselect(wxDataViewItem const&) */
 
-void wxDataViewCtrl::SetSelectionRange(unsigned int from, unsigned int to)
+void wxDataViewCtrl::UnselectAll(void)
 {
-  wxCHECK_RET(from <= to,_("Invalid specified range ('from' has to be smaller or equal to 'to')."));
+  DataBrowserItemID* itemIDPtr;
+  
+  Handle handle(::NewHandle(0));
+  
+  size_t NoOfItems;
+  
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
   
- // variable definition:
-  wxArrayInt selectedRows;
   
-  selectedRows.Alloc(to-from+1);
-  for (unsigned int i=from; i<=to; ++i)
-    selectedRows.Add(i);
-  this->SetSelections(selectedRows);
-} /* wxDataViewCtrl::SetSelectionRange(unsigned int, unsigned int) */
+  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)
+{
+  int NoOfChildren;
+
+  wxDataViewItemArray items;
+  
+  
+  wxCHECK_RET(this->GetModel() != NULL,_("Model pointer not initialized."));
+  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&) */
 
-void wxDataViewCtrl::SetSelections(wxArrayInt const& selectedRows)
+wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID) const
 {
-  wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+ // 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 */
 
-  wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized."));  
- // unselect all selected items:
-  this->SetSelection(-1);
-  for (size_t i=0; i<selectedRows.GetCount(); ++i)
+// inherited methods from wxDataViewCtrlBase
+void wxDataViewCtrl::DoSetExpanderColumn(void)
+{
+  if (this->GetExpanderColumn() != NULL)
   {
-   // variable definition:
-    DataBrowserItemID itemID;
-    
-    verify_noerr(dataViewListCtrlPtr->GetItemID(selectedRows[i],&itemID));
-    verify_noerr(dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAssign));
+   // variable definition and initialization:
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+    (void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID());
   } /* if */
-} /* wxDataViewCtrl::SetSelections(wxArrayInt const&) */
+} /* wxDataViewCtrl::DoSetExpanderColumn(void) */
 
-void wxDataViewCtrl::Unselect(unsigned int row)
+void wxDataViewCtrl::DoSetIndent(void)
 {
-  DataBrowserItemID itemID;
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));  
 
-  wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
-  wxCHECK_RET( dataViewListCtrlPtr != NULL,                                                                                                                 _("Peer pointer not initialized."));  
-  wxCHECK_RET((dataViewListCtrlPtr->GetItemID(row,&itemID) == noErr) && (dataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove) == noErr),_("Unselection impossible."));
-} /* wxDataViewCtrl::Unselect(unsigned int) */
+  (void) MacDataViewListCtrlPtr->SetIndent(static_cast<float>(this->GetIndent()));
+} /* wxDataViewCtrl::DoSetIndent(void) */
 
-void wxDataViewCtrl::ReverseSorting(DataBrowserPropertyID columnID)
+// event handling:
+void wxDataViewCtrl::OnSize(wxSizeEvent& event)
 {
+  unsigned int const NoOfColumns = this->GetColumnCount();
+
 
-  if (columnID >= kMinPropertyID)
+  for (unsigned int i=0; i<NoOfColumns; ++i)
   {
    // variable definition and initialization:
-    DataBrowserPropertyID                          sortPropertyID;
-    wxMacDataViewDataBrowserListViewControlPointer dataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
-
-    wxCHECK_RET(dataViewListCtrlPtr != NULL,_("Peer pointer not initialized."));
-    wxCHECK_RET(dataViewListCtrlPtr->GetSortProperty(&sortPropertyID) == noErr,_("Determination of sort property impossible."));
-    if (sortPropertyID == columnID)
+    wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i));
+    
+    if (dataViewColumnPtr != NULL)
     {
-     // variable defintion:
-      DataBrowserSortOrder         sortOrderCtrl;
-      DataBrowserTableViewColumnID columnIndex;
-      wxDataViewColumn*            dataViewColumnPtr;
-
-      wxCHECK_RET(dataViewListCtrlPtr->GetPropertyColumn(columnID,&columnIndex) == noErr,_("Determination of column index impossible"));
-      wxCHECK_RET(dataViewListCtrlPtr->GetSortOrder(&sortOrderCtrl)             == noErr,_("Determination of sort order impossible"));
-      dataViewColumnPtr = this->GetColumn(columnIndex);
-      wxCHECK_RET(dataViewColumnPtr != NULL,_("Column could not be obtained."));
-      if ((sortOrderCtrl == kDataBrowserOrderIncreasing) && !(dataViewColumnPtr->IsSortOrderAscending()) ||
-          (sortOrderCtrl == kDataBrowserOrderDecreasing) &&   dataViewColumnPtr->IsSortOrderAscending())
-        dataViewListCtrlPtr->ReverseRowIndexNumbering();
+     // variable definition and initialization:
+      wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
+    
+      if (dataViewCustomRendererPtr != NULL)
+        dataViewCustomRendererPtr->SetDC(NULL); // reset DC because DC has changed
     } /* if */
-  } /* if */
-} /* wxDataViewCtrl::ReverseSorting(DataBrowserPropertyID columnID) */
+  } /* for */
+  event.Skip();
+} /* wxDataViewCtrl::OnSize(wxSizeEvent&) */
 
 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)