]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/databrow.cpp
1945421 applied
[wxWidgets.git] / src / mac / carbon / databrow.cpp
index bde0284cbf4c35fc6071e0371d7c7308e342c9ae..e9fd7f3a816dd144ba64396fb86d7ada3b887972 100644 (file)
@@ -9,51 +9,38 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef wxUSE_GENERICDATAVIEWCTRL
-
-#include <ctype.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
 #include "wx/wxprec.h"
 
-#include "wx/utils.h"
+#if wxUSE_DATAVIEWCTRL
+#ifndef wxUSE_GENERICDATAVIEWCTRL
 
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/toplevel.h"
     #include "wx/font.h"
+    #include "wx/settings.h"
+    #include "wx/utils.h"
 #endif
 
-#include "wx/apptrait.h"
-
-#include "wx/mac/uma.h"
-
-
-#ifdef __DARWIN__
-    #include <Carbon/Carbon.h>
-#else
-    #include <ATSUnicode.h>
-    #include <TextCommon.h>
-    #include <TextEncodingConverter.h>
-#endif
-
+#include "wx/dataview.h"
+#include "wx/mac/carbon/databrow.h"
 #include "wx/mac/private.h"
-
-#if defined(__MWERKS__) && wxUSE_UNICODE
-#if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
-    #include <wtime.h>
-#endif
-#endif
+#include "wx/mac/uma.h"
 
 #include <limits>
 
-#include "wx/mac/carbon/databrow.h"
+// ============================================================================
+// Variables used globally in databrow.cpp
+// ============================================================================
+DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP = NULL;
+DataBrowserItemCompareUPP       gDataBrowserTableViewItemCompareUPP       = NULL;
+DataBrowserItemDataUPP          gDataBrowserTableViewItemDataUPP          = NULL;
+DataBrowserItemNotificationUPP  gDataBrowserTableViewItemNotificationUPP  = NULL;
 
-#include "wx/dataview.h"
+DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP = NULL;
+DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP = NULL;
+DataBrowserHitTestUPP  gDataBrowserTableViewHitTestUPP  = NULL;
+DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP = NULL;
 
 // ============================================================================
 // wxMacDataBrowserTableViewControl
@@ -70,22 +57,22 @@ pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlR
     return errDataBrowserPropertyNotSupported;
 } /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
 
-pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
+pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection)
 {
   wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
 
   if (ControlPtr != NULL)
-    ControlPtr->DataBrowserDrawItemProc(itemID,property,state,rectangle,bitDepth,colorDevice);
-} /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
+    ControlPtr->DataBrowserGetContextualMenuProc(menu,helpType,helpItemString,selection);
+} /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
 
-pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue)
+pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
 {
   wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
 
   if (ControlPtr != NULL)
-    return ControlPtr->DataBrowserGetSetItemDataProc(itemID,property,itemData,getValue);
+    return ControlPtr->DataBrowserGetSetItemDataProc(itemID,propertyID,itemData,getValue);
   else
     return errDataBrowserPropertyNotSupported;
 } /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
@@ -99,10 +86,41 @@ pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(Co
     ControlPtr->DataBrowserItemNotificationProc(itemID,message,itemData);
 } /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
 
-DataBrowserDrawItemUPP         gDataBrowserTableViewDrawItemUPP         = NULL;
-DataBrowserItemCompareUPP      gDataBrowserTableViewItemCompareUPP      = NULL;
-DataBrowserItemDataUPP         gDataBrowserTableViewItemDataUPP         = NULL;
-DataBrowserItemNotificationUPP gDataBrowserTableViewItemNotificationUPP = NULL;
+pascal void wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+
+
+  if (ControlPtr != NULL)
+    ControlPtr->DataBrowserDrawItemProc(itemID,propertyID,state,rectangle,bitDepth,colorDevice);
+} /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
+
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+
+
+  return ((ControlPtr != NULL) && ControlPtr->DataBrowserEditItemProc(itemID,propertyID,theString,maxEditTextRect,shrinkToFit));
+} /* wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
+
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+
+
+  return ((ControlPtr != NULL) && ControlPtr->DataBrowserHitTestProc(itemID,propertyID,theRect,mouseRect));
+} /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
+
+pascal DataBrowserTrackingResult wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+
+
+  if (ControlPtr != NULL)
+    return ControlPtr->DataBrowserTrackingProc(itemID,propertyID,theRect,startPt,modifiers);
+  else
+    return kDataBrowserNothingHit; 
+} /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
 
 wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
                                  :wxMacControl(peer)
@@ -113,9 +131,10 @@ wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* pee
 
   SetReferenceInNativeControl();
   verify_noerr(err);
-  if (gDataBrowserTableViewDrawItemUPP         == NULL) gDataBrowserTableViewDrawItemUPP    = NewDataBrowserDrawItemUPP   (DataBrowserDrawItemProc);
-  if (gDataBrowserTableViewItemCompareUPP      == NULL) gDataBrowserTableViewItemCompareUPP = NewDataBrowserItemCompareUPP(wxMacDataBrowserTableViewControl::DataBrowserCompareProc);
-  if (gDataBrowserTableViewItemDataUPP         == NULL) gDataBrowserTableViewItemDataUPP    = NewDataBrowserItemDataUPP   (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc);
+ // setup standard callbacks:
+  if (gDataBrowserTableViewGetContextualMenuUPP == NULL) gDataBrowserTableViewGetContextualMenuUPP = NewDataBrowserGetContextualMenuUPP(wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc);
+  if (gDataBrowserTableViewItemCompareUPP       == NULL) gDataBrowserTableViewItemCompareUPP       = NewDataBrowserItemCompareUPP      (wxMacDataBrowserTableViewControl::DataBrowserCompareProc);
+  if (gDataBrowserTableViewItemDataUPP          == NULL) gDataBrowserTableViewItemDataUPP          = NewDataBrowserItemDataUPP         (wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc);
   if (gDataBrowserTableViewItemNotificationUPP == NULL)
   {
     gDataBrowserTableViewItemNotificationUPP =
@@ -125,19 +144,28 @@ wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* pee
       NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
 #endif
   }
+  DataBrowserCallbacks callbacks; // variable definition
 
-  DataBrowserCallbacks       callbacks;
-  DataBrowserCustomCallbacks customCallbacks;
+  InitializeDataBrowserCallbacks(&callbacks,kDataBrowserLatestCallbacks);
+  callbacks.u.v1.getContextualMenuCallback = gDataBrowserTableViewGetContextualMenuUPP;
+  callbacks.u.v1.itemDataCallback          = gDataBrowserTableViewItemDataUPP;
+  callbacks.u.v1.itemCompareCallback       = gDataBrowserTableViewItemCompareUPP;
+  callbacks.u.v1.itemNotificationCallback  = gDataBrowserTableViewItemNotificationUPP;
+  this->SetCallbacks(&callbacks);
 
-  InitializeDataBrowserCallbacks      (&callbacks,      kDataBrowserLatestCallbacks);
-  InitializeDataBrowserCustomCallbacks(&customCallbacks,kDataBrowserLatestCallbacks);
+ // setup callbacks for customized items:
+  if (gDataBrowserTableViewDrawItemUPP == NULL) gDataBrowserTableViewDrawItemUPP = NewDataBrowserDrawItemUPP(wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc);
+  if (gDataBrowserTableViewEditItemUPP == NULL) gDataBrowserTableViewEditItemUPP = NewDataBrowserEditItemUPP(wxMacDataBrowserTableViewControl::DataBrowserEditItemProc);
+  if (gDataBrowserTableViewHitTestUPP  == NULL) gDataBrowserTableViewHitTestUPP  = NewDataBrowserHitTestUPP (wxMacDataBrowserTableViewControl::DataBrowserHitTestProc);
+  if (gDataBrowserTableViewTrackingUPP == NULL) gDataBrowserTableViewTrackingUPP = NewDataBrowserTrackingUPP(wxMacDataBrowserTableViewControl::DataBrowserTrackingProc);
 
-  callbacks.u.v1.itemDataCallback         = gDataBrowserTableViewItemDataUPP;
-  callbacks.u.v1.itemCompareCallback      = gDataBrowserTableViewItemCompareUPP;
-  callbacks.u.v1.itemNotificationCallback = gDataBrowserTableViewItemNotificationUPP;
-  this->SetCallbacks(&callbacks);
+  DataBrowserCustomCallbacks customCallbacks; // variable definition
 
+  InitializeDataBrowserCustomCallbacks(&customCallbacks,kDataBrowserLatestCallbacks);
   customCallbacks.u.v1.drawItemCallback = gDataBrowserTableViewDrawItemUPP;
+  customCallbacks.u.v1.editTextCallback = gDataBrowserTableViewEditItemUPP;
+  customCallbacks.u.v1.hitTestCallback  = gDataBrowserTableViewHitTestUPP;
+  customCallbacks.u.v1.trackingCallback = gDataBrowserTableViewTrackingUPP;
   this->SetCustomCallbacks(&customCallbacks);
 
  // style setting:
@@ -153,7 +181,7 @@ wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* pee
       flags |= kDataBrowserSelectOnlyOne;
     (void) this->SetSelectionFlags(flags);
   } /* if */
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+
   OptionBits attributes; // variable definition
   
   if (this->GetAttributes(&attributes) == noErr) // get default settings
@@ -162,9 +190,13 @@ wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* pee
       attributes |= kDataBrowserAttributeListViewDrawColumnDividers;
     else
       attributes &= ~kDataBrowserAttributeListViewDrawColumnDividers;
+    if ((style & wxDV_ROW_LINES) != 0)
+      attributes |= kDataBrowserAttributeListViewAlternatingRowColors;
+    else
+      attributes &= ~kDataBrowserAttributeListViewAlternatingRowColors;
     (void) this->SetAttributes(attributes);
   } /* if */
-#endif
+
   if ((style & wxDV_NO_HEADER) != 0)
     this->SetHeaderButtonHeight(0);
 } /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
@@ -185,15 +217,15 @@ OSStatus wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomC
 //
 // header handling
 //
-OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc) const
+OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc) const
 {
   desc->version = kDataBrowserListViewLatestHeaderDesc; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
-  return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,property,desc);
+  return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
 }
 
-OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc)
+OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc)
 {
-  return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,property,desc);
+  return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
 }
 
 //
@@ -209,18 +241,21 @@ OSStatus wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enabl
   return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth,enableHeight);
 } /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
 
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
 OSStatus wxMacDataBrowserTableViewControl::GetAttributes(OptionBits* attributes)
 {
   return ::DataBrowserGetAttributes(this->GetControlRef(),attributes);
 } /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
-#endif
 
 OSStatus wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID, UInt16* width) const
 {
   return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
 }
 
+OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
+{
+    return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
+}
+
 OSStatus wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16* height) const
 {
   return ::GetDataBrowserTableViewRowHeight(this->m_controlRef,height);
@@ -231,27 +266,25 @@ OSStatus wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16 *height)
   return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
 }
 
-OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
+OSStatus wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserPropertyPart part, Rect* bounds)
 {
-    return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
-}
+  return ::GetDataBrowserItemPartBounds(this->m_controlRef,item,propertyID,part,bounds);
+} /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
 
-OSStatus wxMacDataBrowserTableViewControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
+OSStatus wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item, UInt16* height) const
 {
-    return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
-}
+  return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
+} /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
 
 OSStatus wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
 {
     return GetDataBrowserScrollPosition(this->m_controlRef, top , left );
 }
 
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
 OSStatus wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes)
 {
   return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes,~attributes);
 } /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
-#endif
 
 OSStatus wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID, UInt16 width)
 {
@@ -268,20 +301,25 @@ OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
   return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
 }
 
-OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars( bool horiz, bool vert )
+OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
 {
-    return SetDataBrowserHasScrollBars(this->m_controlRef, horiz, vert );
-}
+  return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
+} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
 {
-    return SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef, height );
-}
+  return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
+} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
 
-OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
+OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
 {
-    return SetDataBrowserTableViewHiliteStyle(this->m_controlRef, hiliteStyle );
-}
+  return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
+} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle)  */
+
+OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
+{
+  return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
+} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetRowHeight(DataBrowserItemID item, UInt16 height)
 {
@@ -319,6 +357,11 @@ OSStatus wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyI
   return ::GetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
 }
 
+OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID)
+{
+  return ::GetDataBrowserItemDataProperty(itemData,propertyID);
+} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
+
 OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index, DataBrowserTableViewColumnID* propertyID)
 {
   return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef,index,propertyID);
@@ -334,14 +377,19 @@ OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyI
   return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
 } /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
 
-OSStatus wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex index)
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
+{
+  return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
+
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
 {
   DataBrowserTableViewColumnID propertyID;
 
 
   this->GetPropertyID(index,&propertyID);
   return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
-} /* wxMacDataBrowserTableViewControl::RemoveColumn(DataBrowserTableViewColumnIndex) */
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
 
 OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
 {
@@ -369,9 +417,12 @@ OSStatus wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container,
 OSStatus wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID* id) const
 {
   ItemCount NoOfItems;
+  OSStatus status;
   
   
-  verify_noerr(this->GetItemCount(&NoOfItems));
+  status = this->GetItemCount(&NoOfItems);
+  wxCHECK_MSG(status == noErr,status,_("Could not retrieve number of items"));
   if (NoOfItems == 0)
   {
     *id = 1;
@@ -491,25 +542,43 @@ OSStatus wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems, Dat
   return ::SetDataBrowserSelectedItems(this->m_controlRef, numItems, items, operation );
 } /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
 
+OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
+{
+  return ::GetDataBrowserSortOrder(this->m_controlRef,order);
+}
+
 OSStatus wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID* propertyID) const
 {
   return ::GetDataBrowserSortProperty(this->m_controlRef,propertyID);
 }
 
+OSStatus wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container, Boolean sortChildren)
+{
+  return ::SortDataBrowserContainer(this->m_controlRef,container,sortChildren);
+} /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
+
+OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
+{
+  return ::SetDataBrowserSortOrder(this->m_controlRef,order);
+}
+
 OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID)
 {
   return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
 }
 
-OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
+//
+// container handling
+//
+OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
 {
-  return ::GetDataBrowserSortOrder(this->m_controlRef,order);
-}
+  return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
 
-OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
+OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
 {
-  return ::SetDataBrowserSortOrder(this->m_controlRef,order);
-}
+  return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
 
 IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
 
@@ -542,6 +611,10 @@ wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl
 //
 Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
 {
+  DataBrowserSortOrder sortOrder;
+
+  DataBrowserTableViewColumnIndex modelColumnIndex;
+  
   wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
   
 
@@ -549,167 +622,198 @@ Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrow
   wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
   if (sortProperty >= kMinPropertyID)
   {
-   // variable definition:
-    DataBrowserTableViewColumnIndex columnIndex;
+   // variable definition and initialization:
+    wxDataViewColumn* ColumnPtr(dataViewCtrlPtr->GetColumnPtr(sortProperty));
     
-    wxCHECK_MSG(this->GetColumnIndex(sortProperty,&columnIndex) == noErr,false,_("Could not determine column index."));
-    dataViewCtrlPtr->GetModel()->SetSortingColumn(columnIndex);
+    wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
+    modelColumnIndex = ColumnPtr->GetModelColumn();
   } /* if */
-  return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID))) < 0);
+  else
+    modelColumnIndex = 0;
+  this->GetSortOrder(&sortOrder);
+  return static_cast<Boolean>(dataViewCtrlPtr->GetModel()->Compare(wxDataViewItem(reinterpret_cast<void*>(itemOneID)),wxDataViewItem(reinterpret_cast<void*>(itemTwoID)),
+                              modelColumnIndex,sortOrder != kDataBrowserOrderDecreasing) < 0);
 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
 
-void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
+void wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* WXUNUSED(selection))
+ // In this method we do not supply a contextual menu handler at all but only send a wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU.
 {
-  DataBrowserTableViewColumnIndex columnIndex;
-
-  wxDataViewColumn* dataViewColumnPtr;
-
-  wxDataViewCtrl* dataViewCtrlPtr;
-  
-  wxDataViewCustomRenderer* dataViewCustomRendererPtr;
-
-  wxVariant dataToRender;
-
-
-  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
-  wxCHECK_RET(dataViewCtrlPtr != NULL,                               _("Pointer to data view control not set correctly."));
-  wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL,                   _("Pointer to model not set correctly."));
-  wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex) == noErr,_("Could not determine column index."));
-  dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
-  wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column index existing."));
-  dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
-  wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
-  dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),columnIndex);
-  dataViewCustomRendererPtr->SetValue(dataToRender);
+  wxArrayDataBrowserItemID itemIDs;
 
- // try to determine the content's size (drawable part):
-  Rect      content;
-  RgnHandle rgn(NewRgn());
-  UInt16    headerHeight;
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
 
-  if (this->GetRegion(kControlContentMetaPart,rgn) == noErr)
-    GetRegionBounds(rgn,&content);
-  else
-    this->GetRect(&content);
-  ::DisposeRgn(rgn);
- // space for the header
-  this->GetHeaderButtonHeight(&headerHeight);
-  content.top += headerHeight;
- // extra space for the frame (todo: do not how to determine the space automatically from the control)
-  content.top    += 5;
-  content.left   += 5;
-  content.right  -= 3;
-  content.bottom -= 3;
- // extra space for the scrollbars: 
-  content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
-  content.right  -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
 
- // make sure that 'Render' can draw only in the allowed area:  
-  dataViewCustomRendererPtr->GetDC()->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
-  (void) (dataViewCustomRendererPtr->Render(wxRect(static_cast<int>(rectangle->left),static_cast<int>(rectangle->top),
-                                                   static_cast<int>(1+rectangle->right-rectangle->left),static_cast<int>(1+rectangle->bottom-rectangle->top)),
-                                            dataViewCustomRendererPtr->GetDC(),((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
-  dataViewCustomRendererPtr->GetDC()->DestroyClippingRegion(); // probably not necessary
-} /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
+  wxCHECK_RET(dataViewCtrlPtr != NULL,_("wxWidget control pointer is not a data view pointer"));
+ // initialize parameters so that no context menu will be displayed automatically by the native data browser:
+  *menu           = NULL;
+  *helpType       = kCMHelpItemNoHelp;
+  *helpItemString = NULL;
+ // create information for a context menu event:
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
+  
+  dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+ // get the item information;
+ // theoretically more than one ID can be returned but the event can only handle one item, therefore all item related data is using the data of the first item in the array:
+  if (this->GetSelectedItemIDs(itemIDs) > 0)
+    dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemIDs[0])));
+ // finally send the equivalent wxWidget event:
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetContextualMenuProc(MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
 
 OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
 {
   if (getValue)
   {
    // variable definitions:
-    DataBrowserTableViewColumnIndex columnIndex;
-    OSStatus                        errorStatus;
-    wxDataViewCtrl*                 dataViewCtrlPtr;
-    wxDataViewColumn*               dataViewColumnPtr;
+    wxDataViewCtrl* dataViewCtrlPtr;
     
     dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
-    wxCHECK_MSG(dataViewCtrlPtr != NULL,            errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
-    wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
-    errorStatus = this->GetColumnIndex(propertyID,&columnIndex);
-    wxCHECK_MSG(errorStatus == noErr,errorStatus,_("Could not determine column index"));
-    dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
-    wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
-    switch (dataViewColumnPtr->GetRenderer()->GetPropertyType())
+    wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
+    if (dataViewCtrlPtr->IsDeleting())
+      return noErr; // if a delete process is running the data of editable fields cannot be saved because the associated model variable may already have been deleted
+    else
     {
-      case kDataBrowserCheckboxType:
-        {
-         // variable definition:
-          ThemeButtonValue buttonValue;
+     // variable definitions:
+      OSStatus          errorStatus;
+      wxDataViewColumn* dataViewColumnPtr;
+      
+      wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
+      dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
+      wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
 
-          errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
-          if (errorStatus == noErr)
+      wxDataViewItem      dvItem(reinterpret_cast<void*>(itemID));
+      unsigned int        col = dataViewColumnPtr->GetModelColumn();
+            
+      switch (dataViewColumnPtr->GetRenderer()->GetPropertyType())
+      {
+        case kDataBrowserCheckboxType:
           {
-            if (buttonValue == kThemeButtonOn)
-            {
-             // variable definition and initialization:
-              wxVariant modifiedData(true);
+           // variable definition:
+            ThemeButtonValue buttonValue;
 
-              return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),static_cast<unsigned int>(columnIndex)) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
-            } /* if */
-            else if (buttonValue == kThemeButtonOff)
+            errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
+            if (errorStatus == noErr)
             {
-             // variable definition and initialization:
-              wxVariant modifiedData(false);
-
-              return (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),static_cast<unsigned int>(columnIndex)) ? OSStatus(noErr) : OSStatus(errDataBrowserNotConfigured));
+              if (buttonValue == kThemeButtonOn)
+              {
+               // variable definition and initialization:
+                wxVariant modifiedData(true);
+
+                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
+                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                    return noErr;
+                else
+                    return errDataBrowserInvalidPropertyData;
+              } /* if */
+              else if (buttonValue == kThemeButtonOff)
+              {
+               // variable definition and initialization:
+                wxVariant modifiedData(false);
+
+                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
+                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                    return noErr;
+                else
+                    return errDataBrowserInvalidPropertyData;
+              } /* if */
+              else
+                return errDataBrowserInvalidPropertyData;
             } /* if */
             else
-              return errDataBrowserInvalidPropertyData;
-          } /* if */
-          else
-            return errorStatus;
-        } /* block */
-      case kDataBrowserTextType:
-        {
-         // variable definitions:
-          CFStringRef stringReference;
-
-          errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
-          if (errorStatus == noErr)
+              return errorStatus;
+          } /* block */
+        case kDataBrowserTextType:
           {
-           // variable definitions and initializations:
-            wxMacCFStringHolder modifiedString(stringReference);
-            wxVariant           modifiedData(modifiedString.AsString());
+           // variable definitions:
+            CFStringRef stringReference;
 
-            if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData,wxDataViewItem(reinterpret_cast<void*>(itemID)),static_cast<unsigned int>(columnIndex)))
-              return noErr;
+            errorStatus = ::GetDataBrowserItemDataText(itemData,&stringReference);
+            if (errorStatus == noErr)
+            {
+             // variable definitions and initializations:
+#if wxCHECK_VERSION(2,9,0)
+              wxCFStringRef modifiedString(stringReference);
+#else
+              wxMacCFStringHolder modifiedString(stringReference);
+#endif
+              wxVariant           modifiedData(modifiedString.AsString());
+              
+                if (dataViewCtrlPtr->GetModel()->SetValue(modifiedData, dvItem, col) &&
+                    dataViewCtrlPtr->GetModel()->ValueChanged(dvItem, col))
+                    return noErr;
+                else
+                    return errDataBrowserInvalidPropertyData;
+            } /* if */
             else
-              return errDataBrowserNotConfigured;
-          } /* if */
-          else
-            return errorStatus;
-        } /* block */
-      default:
-        return errDataBrowserPropertyNotSupported;
-    } /* switch */
+              return errorStatus;
+          } /* block */
+        default:
+          return errDataBrowserPropertyNotSupported;
+      } /* switch */
+    } /* if */
   } /* if */
   else
   {
-    if (propertyID >= kMinPropertyID) // in case of data columns set the data
+    if (propertyID >= kMinPropertyID) // in case data columns set the data
     {
      // variable definitions:
-      DataBrowserTableViewColumnIndex columnIndex;
-      OSStatus                        errorStatus;
-      wxVariant                       variant;
-      wxDataViewColumn*               dataViewColumnPtr;
-      wxDataViewCtrl*                 dataViewCtrlPtr;
+      wxVariant         variant;
+      wxDataViewColumn* dataViewColumnPtr;
+      wxDataViewCtrl*   dataViewCtrlPtr;
       
       dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
       wxCHECK_MSG(dataViewCtrlPtr             != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
       wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
-      errorStatus = this->GetColumnIndex(propertyID,&columnIndex);
-      wxCHECK_MSG(errorStatus == noErr,errorStatus,_("Column index does not exist."));
-      dataViewColumnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
+      dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
       wxCHECK_MSG(dataViewColumnPtr                != NULL,errDataBrowserNotConfigured,_("No column for the specified column position existing."));
       wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,errDataBrowserNotConfigured,_("No renderer specified for column."));
       dataViewCtrlPtr->GetModel()->GetValue(variant,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
-      dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
-      dataViewColumnPtr->GetRenderer()->SetValue(variant);
-      wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
+      if (!(variant.IsNull()))
+      {
+        dataViewColumnPtr->GetRenderer()->SetDataReference(itemData);
+        dataViewColumnPtr->GetRenderer()->SetValue(variant);
+        wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
+      } /* if */
+      return noErr;
     } /* if */
     else // react on special system requests
+    {
       switch (propertyID)
       {
+        case kDataBrowserContainerIsClosableProperty:
+          {
+           // variable definitions:
+            wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+            
+            wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
+           // initialize wxWidget event:
+            wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
+            
+            dataViewEvent.SetEventObject(dataViewCtrlPtr);
+            dataViewEvent.SetItem       (wxDataViewItem(reinterpret_cast<void*>(itemID)));
+            dataViewEvent.SetModel      (dataViewCtrlPtr->GetModel());
+           // finally send the equivalent wxWidget event:
+            dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+           // opening the container is allowed if not vetoed:
+            return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
+          } /* block */
+        case kDataBrowserContainerIsOpenableProperty:
+          {
+           // variable definitions:
+            wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+            
+            wxCHECK_MSG(dataViewCtrlPtr != NULL,errDataBrowserNotConfigured,_("Pointer to data view control not set correctly."));
+           // initialize wxWidget event:
+            wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
+
+            dataViewEvent.SetEventObject(dataViewCtrlPtr);
+            dataViewEvent.SetItem       (wxDataViewItem(reinterpret_cast<void*>(itemID)));
+            dataViewEvent.SetModel      (dataViewCtrlPtr->GetModel());
+           // finally send the equivalent wxWidget event:
+            dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+           // opening the container is allowed if not vetoed:
+            return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewEvent.IsAllowed());
+          } /* block */
         case kDataBrowserItemIsContainerProperty:
           {
            // variable definition:
@@ -722,86 +826,319 @@ OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(
         case kDataBrowserItemIsEditableProperty:
           return ::SetDataBrowserItemDataBooleanValue(itemData,true);
       } /* switch */
+    } /* if */
   } /* if */
   return errDataBrowserPropertyNotSupported;
 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
 
-void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef WXUNUSED(itemData))
+void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
 {
-  switch (message)
-  {
-    case kDataBrowserContainerOpened:
-      {
-       // variable definitions:
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
-        
-        wxCHECK_RET(dataViewCtrlPtr != NULL,_("Pointer to data view control not set correctly."));
-        dataViewCtrlPtr->AddChildrenLevel(wxDataViewItem(reinterpret_cast<void*>(itemID)));
-      } /* block */
-      break;
-    case kDataBrowserItemDoubleClicked:
-      {
-       // variable definitions:
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
-        
-        wxCHECK_RET(dataViewCtrlPtr != NULL,_("Pointer to data view control not set correctly."));
-       // initialize wxWidget event:
-        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
-
-        dataViewEvent.SetEventObject(dataViewCtrlPtr);
-        dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
-       // finally sent the equivalent wxWidget event:
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-      } /* block */
-      break;
-    case kDataBrowserItemSelected:
-      {
-       // variable definitions:
-        wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
-        
-        wxCHECK_RET(dataViewCtrlPtr != NULL,_("Pointer to data view control not set correctly."));
-       // initialize wxWidget event:
-        wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED,dataViewCtrlPtr->GetId()); // variable definition
-
-        dataViewEvent.SetEventObject(dataViewCtrlPtr);
-        dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
-       // finally sent the equivalent wxWidget event:
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
-      } /* block */
-      break;
-    case kDataBrowserUserStateChanged:
-      {
-        DataBrowserPropertyID propertyID;
-        
-        if ((this->GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+
+
+ // check if the data view control pointer still exists because this call back function can still be called when the control has already been deleted:
+  if (dataViewCtrlPtr != NULL)
+    switch (message)
+    {
+      case kDataBrowserContainerClosed:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
+        {
+         // initialize wxWidget event:
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* block */
+        break;
+      case kDataBrowserContainerOpened:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
+        {
+         // initialize wxWidget event:
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+         // add children to the expanded container:
+          dataViewCtrlPtr->AddChildrenLevel(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+        } /* block */
+        break;
+      case kDataBrowserEditStarted:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
         {
-          DataBrowserSortOrder            sortOrder;
-          DataBrowserTableViewColumnIndex columnIndex;
+         // initialize wxWidget event:
+          DataBrowserPropertyID propertyID;  
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
           
-          if ((this->GetSortOrder(&sortOrder) == noErr) && (this->GetColumnIndex(propertyID,&columnIndex) == noErr))
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+          if (this->GetPropertyID(itemData,&propertyID) == noErr)
           {
            // variable definition and initialization:
-            wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetPeer()));
+            DataBrowserTableViewColumnIndex columnIndex;
+            
+            wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+            dataViewEvent.SetColumn(columnIndex);
+            dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));          
+          } /* if */
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* block */
+        break;
+      case kDataBrowserEditStopped:
+        {
+         // initialize wxWidget event:
+          DataBrowserPropertyID propertyID;  
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+          if (this->GetPropertyID(itemData,&propertyID) == noErr)
+          {
+           // variable definition and initialization:
+            DataBrowserTableViewColumnIndex columnIndex;
 
-            if (  dataViewCtrlPtr->GetColumn(columnIndex)->IsSortOrderAscending()  && (sortOrder == kDataBrowserOrderDecreasing) ||
-                !(dataViewCtrlPtr->GetColumn(columnIndex)->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
+            wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+            dataViewEvent.SetColumn(columnIndex);
+            dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumnPtr(propertyID));          
+          } /* if */
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* block */
+        break;
+      case kDataBrowserItemAdded:
+        dataViewCtrlPtr->FinishCustomItemEditing();
+        break;
+      case kDataBrowserItemDeselected:
+        dataViewCtrlPtr->FinishCustomItemEditing();
+        break;
+      case kDataBrowserItemDoubleClicked:
+        {
+         // initialize wxWidget event:
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
+
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* block */
+        break;
+      case kDataBrowserItemRemoved:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
+        break;
+      case kDataBrowserItemSelected:
+        break; // not implemented by wxWidgets; see kDataBrowserSelectionSetChanged
+      case kDataBrowserSelectionSetChanged:
+        {
+         // initialize wxWidget event:
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,dataViewCtrlPtr->GetId()); // variable definition
+
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetModel      (dataViewCtrlPtr->GetModel());
+         // finally send the equivalent wxWidget event:
+          dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        } /* block */
+        break;
+      case kDataBrowserTargetChanged: // no idea if this notification is ever sent
+        break;
+      case kDataBrowserUserStateChanged:
+        {
+         // finish custom item editing if necessary:
+          dataViewCtrlPtr->FinishCustomItemEditing();
+         // update column widths:
+          for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); ++i)
+          {
+           // constant definition for abbreviational purposes:
+            wxDataViewColumn* const columnPtr = dataViewCtrlPtr->GetColumn(i);
+           // variable definition:
+            UInt16 columnWidth;
+            
+            wxCHECK_RET(this->GetColumnWidth(columnPtr->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
+            columnPtr->SetWidthVariable(columnWidth);
+          } /* for */
+         // update sorting orders:
+          DataBrowserPropertyID propertyID; // variable definition
+
+          if ((this->GetSortProperty(&propertyID) == noErr) && (propertyID >= kMinPropertyID))
+          {
+            DataBrowserSortOrder            sortOrder;
+            DataBrowserTableViewColumnIndex columnIndex;
+            
+            if ((this->GetSortOrder(&sortOrder) == noErr) && (this->GetColumnIndex(propertyID,&columnIndex) == noErr))
             {
-             // initialize wxWidget event:
-              wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
-
-              dataViewEvent.SetEventObject(dataViewCtrlPtr);
-              dataViewEvent.SetColumn(columnIndex);
-              dataViewEvent.SetDataViewColumn(dataViewCtrlPtr->GetColumn(columnIndex));
-             // finally sent the equivalent wxWidget event:
-              dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+             // variable definition and initialization:
+              wxDataViewColumn* columnPtr;
+              columnPtr = dataViewCtrlPtr->GetColumn(columnIndex);
+             // check if the sort order has changed:
+              if (  columnPtr->IsSortOrderAscending()  && (sortOrder == kDataBrowserOrderDecreasing) ||
+                  !(columnPtr->IsSortOrderAscending()) && (sortOrder == kDataBrowserOrderIncreasing))
+              {
+                columnPtr->SetSortOrder(!(columnPtr->IsSortOrderAscending()));
+               // initialize wxWidget event:
+                wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
+
+                dataViewEvent.SetEventObject(dataViewCtrlPtr);
+                dataViewEvent.SetColumn(columnIndex);
+                dataViewEvent.SetDataViewColumn(columnPtr);
+               // finally send the equivalent wxWidget event:
+                dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+              } /* if */
             } /* if */
           } /* if */
-        } /* if */
-      } /* block */
-      break;
-  } /* switch */
+        } /* block */
+        break;
+    } /* switch */
 } /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
 
+void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
+{
+  DataBrowserTableViewColumnIndex columnIndex;
+
+  wxDataViewColumn* dataViewColumnPtr;
 
-#endif
- // wxUSE_GENERICDATAVIEWCTRL
+  wxDataViewCtrl* dataViewCtrlPtr;
+  
+  wxDataViewCustomRenderer* dataViewCustomRendererPtr;
+
+  wxVariant dataToRender;
+
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
+  wxCHECK_RET(dataViewCtrlPtr != NULL,            _("Pointer to data view control not set correctly."));
+  wxCHECK_RET(dataViewCtrlPtr->GetModel() != NULL,_("Pointer to model not set correctly."));
+  wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex) == noErr,_("Could not determine column index."));
+  dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
+  wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column index existing."));
+  dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
+  wxCHECK_RET(dataViewCustomRendererPtr != NULL,_("No renderer or invalid renderer type specified for custom data column."));
+  dataViewCtrlPtr->GetModel()->GetValue(dataToRender,wxDataViewItem(reinterpret_cast<void*>(itemID)),dataViewColumnPtr->GetModelColumn());
+  dataViewCustomRendererPtr->SetValue(dataToRender);
+
+  wxDataViewItem dataitem( reinterpret_cast<void*>(itemID) );
+  dataViewCtrlPtr->GetModel()->GetValue(dataToRender,dataitem,columnIndex);
+  dataViewCustomRendererPtr->SetValue(dataToRender);
+
+ // try to determine the content's size (drawable part):
+  Rect      content;
+  RgnHandle rgn(NewRgn());
+  UInt16    headerHeight;
+
+  if (this->GetRegion(kControlContentMetaPart,rgn) == noErr)
+    GetRegionBounds(rgn,&content);
+  else
+    this->GetRect(&content);
+  ::DisposeRgn(rgn);
+ // space for the header
+  this->GetHeaderButtonHeight(&headerHeight);
+  content.top += headerHeight;
+ // extra space for the frame (todo: do not how to determine the space automatically from the control)
+  content.top    += 5;
+  content.left   += 5;
+  content.right  -= 3;
+  content.bottom -= 3;
+ // extra space for the scrollbars:
+  content.bottom -= wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
+  content.right  -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
+
+  wxDC *dc = dataViewCustomRendererPtr->GetDC();
+  
+  wxRect cellrect( static_cast<int>(rectangle->left),
+                   static_cast<int>(rectangle->top+2),
+                   static_cast<int>(1+rectangle->right-rectangle->left),
+                   static_cast<int>(rectangle->bottom-rectangle->top) );
+                   
+  bool is_active = IsControlActive( this->m_controlRef );
+  if (state == kDataBrowserItemIsSelected)
+  {
+      
+      wxColour col( wxMacCreateCGColorFromHITheme( (is_active) ? 
+                             kThemeBrushAlternatePrimaryHighlightColor
+                             : kThemeBrushSecondaryHighlightColor ) );
+      
+      wxRect rect = cellrect;
+      Rect itemrect;
+      GetDataBrowserItemPartBounds( this->m_controlRef, itemID, propertyID,
+         kDataBrowserPropertyEnclosingPart, &itemrect );
+      rect.x = itemrect.left;
+      rect.width = itemrect.right-itemrect.left+1;
+      
+      wxBrush selBrush( col );
+      wxPen oldpen( dc->GetPen() );
+      wxBrush oldbrush( dc->GetBrush() );
+      dc->SetPen( *wxTRANSPARENT_PEN );
+      dc->SetBrush( selBrush );
+      dc->DrawRectangle(rect);
+      dc->SetBrush( oldbrush );
+      dc->SetPen( oldpen );
+  }
+
+  wxDataViewModel *model = dataViewCtrlPtr->GetModel();
+  if ((columnIndex == 0) || !model->IsContainer(dataitem) || model->HasContainerColumns(dataitem))
+  {  
+      // make sure that 'Render' can draw only in the allowed area:
+      dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
+      (void) (dataViewCustomRendererPtr->Render( cellrect, dc, 
+                                            ((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
+      dc->DestroyClippingRegion(); // probably not necessary
+  }
+  
+  dataViewCustomRendererPtr->SetDC(NULL);
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
+
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
+{
+  return false;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
+
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID WXUNUSED(itemID), DataBrowserPropertyID WXUNUSED(property), Rect const* WXUNUSED(theRect), Rect const* WXUNUSED(mouseRect))
+{
+  return true;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserHitTestProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
+
+DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
+{
+  wxDataViewColumn* dataViewColumnPtr;
+
+  wxDataViewCtrl* dataViewCtrlPtr;
+  
+  wxDataViewCustomRenderer* dataViewCustomRendererPtr;
+  
+  wxDataViewItem dataViewCustomRendererItem;
+
+
+  dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
+  wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetPeer());
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,kDataBrowserNothingHit,_("Pointer to data view control not set correctly."));
+  dataViewColumnPtr = dataViewCtrlPtr->GetColumnPtr(propertyID);
+  wxCHECK_MSG(dataViewColumnPtr != NULL,kDataBrowserNothingHit,_("No column existing."));
+  dataViewCustomRendererPtr = dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer());
+  wxCHECK_MSG(dataViewCustomRendererPtr != NULL,kDataBrowserNothingHit,_("No renderer or invalid renderer type specified for custom data column."));
+ // if the currently edited item is identical to the to be edited nothing is done (this hit should only be handled in the control itself):
+  if (dataViewCtrlPtr->GetCustomRendererItem() == dataViewCustomRendererItem)
+    return kDataBrowserContentHit;
+ // an(other) item is going to be edited and therefore the current editing - if existing - has to be finished:
+  if (dataViewCtrlPtr->GetCustomRendererPtr() != NULL)
+  {
+    dataViewCtrlPtr->GetCustomRendererPtr()->FinishEditing();
+    dataViewCtrlPtr->SetCustomRendererItem(wxDataViewItem());
+    dataViewCtrlPtr->SetCustomRendererPtr (NULL);
+  } /* if */
+ // check if renderer has got a valid editor control for editing; if this is the case start editing of the new item:
+  if (dataViewCustomRendererPtr->HasEditorCtrl())
+  {
+   // variable definition:
+    wxRect wxRectangle;
+    
+    ::wxMacNativeToRect(theRect,&wxRectangle);
+    dataViewCustomRendererPtr->StartEditing(dataViewCustomRendererItem,wxRectangle);
+    dataViewCtrlPtr->SetCustomRendererItem(dataViewCustomRendererItem);
+    dataViewCtrlPtr->SetCustomRendererPtr (dataViewCustomRendererPtr);
+  } /* if */
+  return kDataBrowserContentHit;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
+
+#endif // wxUSE_GENERICDATAVIEWCTRL
+#endif // wxUSE_DATAVIEWCTRL