]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxDataViewCtrl implementation for OSX/Cocoa (closes #10617: wxDataView for wxOSX...
authorRobert Roebling <robert@roebling.de>
Fri, 8 May 2009 17:07:50 +0000 (17:07 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 8 May 2009 17:07:50 +0000 (17:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60552 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

build/bakefiles/files.bkl
include/wx/dataview.h
include/wx/osx/carbon/dataview.h
include/wx/osx/cocoa/dataview.h [new file with mode: 0644]
include/wx/osx/core/dataview.h [new file with mode: 0644]
include/wx/osx/dataview.h
src/common/datavcmn.cpp
src/osx/carbon/dataview.cpp
src/osx/cocoa/dataview.mm [new file with mode: 0644]
src/osx/dataview_osx.cpp [new file with mode: 0644]

index a8e9f25b307d3fb00770f3e57a61fa17030b257c..d94178962167dbfc1cd132bdcea3432ad887bb2a 100644 (file)
@@ -2175,6 +2175,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/osx/checkbox_osx.cpp
     src/osx/checklst_osx.cpp
     src/osx/choice_osx.cpp
+    src/osx/dataview_osx.cpp
     src/osx/dialog_osx.cpp
     src/osx/fontutil.cpp
     src/osx/gauge_osx.cpp
@@ -2208,6 +2209,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 
     src/osx/core/bitmap.cpp
     src/osx/core/colour.cpp
+    src/osx/core/dataview.cpp
     src/osx/core/dcmemory.cpp
     src/osx/core/display.cpp
     src/osx/core/fontenum.cpp
@@ -2941,6 +2943,7 @@ src/osx/iphone/window.mm
     src/generic/animateg.cpp
     src/osx/carbon/sound.cpp
     src/osx/cocoa/aboutdlg.mm
+    src/osx/cocoa/dataview.mm
     src/osx/cocoa/taskbar.mm
     src/osx/core/hidjoystick.cpp
 </set>
@@ -2952,6 +2955,7 @@ src/osx/iphone/window.mm
     wx/osx/sound.h
     wx/osx/taskbarosx.h
     wx/osx/core/joystick.h
+    wx/osx/cocoa/dataview.h
 </set>
 
 <set var="ADVANCED_COCOA_SRC" hints="files">
index e0c0f307685ca63c45739dd764c0e57b3628435c..b9b1f37218f2717b8e782e827384e594cfa20790 100644 (file)
@@ -27,7 +27,7 @@
 
 class WXDLLIMPEXP_FWD_CORE wxImageList;
 
-#if !(defined(__WXGTK20__) || defined(__WXOSX_CARBON__)) || defined(__WXUNIVERSAL__)
+#if !(defined(__WXGTK20__) || defined(__WXOSX__)) || defined(__WXUNIVERSAL__)
 // #if !(defined(__WXMAC__)) || defined(__WXUNIVERSAL__)
     #define wxHAS_GENERIC_DATAVIEWCTRL
 #endif
@@ -525,8 +525,7 @@ public:
         { m_owner = owner; }
 
     // getters:
-    unsigned int GetModelColumn() const 
-        { return static_cast<unsigned int>(m_model_column); }
+    unsigned int GetModelColumn() const { return static_cast<unsigned int>(m_model_column); }
     wxDataViewCtrl *GetOwner() const        { return m_owner; }
     wxDataViewRenderer* GetRenderer() const { return m_renderer; }
 
@@ -929,7 +928,7 @@ private:
     long    m_min,m_max;
 };
 
-#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXMAC__)
+#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__)
 
 // -------------------------------------
 // wxDataViewChoiceRenderer
index 46d065c37e7f3f85a647c27a9b84d8ff35edae20..14b1e58673c5b097ccf063b6d6ca406527b874e8 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        wx/mac/carbon/dataview.h
-// Purpose:     wxDataViewCtrl native implementation header
+// Name:        wx/osx/carbon/dataview.h
+// Purpose:     wxDataViewCtrl native implementation header for carbon
 // Author:
-// Id:          $Id$
-// Copyright:   (c) 2007
+// Id:          $Id: dataview.h 57374 2009-01-27
+// Copyright:   (c) 2009
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_MACCARBONDATAVIEWCTRL_H_
-#define _WX_MACCARBONDATAVIEWCTRL_H_
+#ifndef _WX_DATAVIEWCTRL_CARBON_H_
+#define _WX_DATAVIEWCTRL_CARBON_H_
 
-// --------------------------------------------------------
-// Type definitions to mask native types
-// --------------------------------------------------------
+#include "wx/defs.h"
 
-typedef void*         WXDataBrowserItemDataRef;
-typedef unsigned long WXDataBrowserPropertyType;
-typedef wxUint32      WXDataBrowserPropertyID;
+#if wxUSE_GUI
 
-// ---------------------------------------------------------
-// wxDataViewRenderer
-// ---------------------------------------------------------
+#include <carbon/carbon.h>
 
-class WXDLLIMPEXP_ADV wxDataViewRenderer : public wxDataViewRendererBase
+#include "wx/osx/core/dataview.h"
+#include "wx/osx/private.h"
+
+// ============================================================================
+// wxDataViewColumnNativeData
+// ============================================================================
+class wxDataViewColumnNativeData
 {
 public:
 //
 // constructors / destructor
 //
-  wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  wxDataViewColumnNativeData(void)
+  {
+  }
+  wxDataViewColumnNativeData(DataBrowserPropertyID initPropertyID)
+                            :m_PropertyID(initPropertyID)
+  {
+  }
 
 //
-// inherited methods from wxDataViewRendererBase
+// data access methods
 //
-  virtual int GetAlignment() const
-  {
-    return this->m_alignment;
-  }
-  virtual wxDataViewCellMode GetMode() const
+  DataBrowserPropertyID GetPropertyID(void) const
   {
-    return this->m_mode;
+    return this->m_PropertyID;
   }
-  virtual bool GetValue(wxVariant& value) const
+  
+  void SetPropertyID(DataBrowserPropertyID newPropertyID)
   {
-    value = this->m_value;
-    return true;
+    this->m_PropertyID = newPropertyID;
   }
 
-  virtual void SetAlignment(int WXUNUSED(align)) // is always identical to the header alignment
+protected:
+private:
+//
+// variables
+//
+  DataBrowserPropertyID m_PropertyID; // each column is identified by its unique property ID (NOT by the column's index)
+};
+
+// ============================================================================
+// wxDataViewRendererNativeData
+// ============================================================================
+class wxDataViewRendererNativeData
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewRendererNativeData(void)
   {
   }
-  virtual void SetMode(wxDataViewCellMode mode);
-  virtual bool SetValue(wxVariant const& newValue)
+  wxDataViewRendererNativeData(DataBrowserPropertyType initPropertyType, DataBrowserItemDataRef initItemDataRef=NULL)
+                              :m_ItemDataRef(initItemDataRef), m_PropertyType(initPropertyType)
   {
-    this->m_value = newValue;
-    return true;
   }
 
 //
-// implementation
+// data access methods
 //
-  WXDataBrowserItemDataRef GetDataReference() const
+  DataBrowserItemDataRef GetItemDataRef(void) const
   {
-    return this->m_dataReference;
+    return this->m_ItemDataRef;
   }
-  wxVariant const& GetValue() const
+  DataBrowserPropertyType GetPropertyType(void) const
   {
-    return this->m_value;
+    return this->m_PropertyType;
   }
 
-  virtual WXDataBrowserPropertyType GetPropertyType() const = 0;
-
-  virtual bool Render() = 0; // a call to the appropriate data browser function filling the data reference with the stored datum;
-                                 // returns 'true' if the data value could be rendered, 'false' otherwise
-
-  void SetDataReference(WXDataBrowserItemDataRef const& newDataReference)
+  void SetItemDataRef(DataBrowserItemDataRef newItemDataRef)
   {
-    this->m_dataReference = newDataReference;
+    this->m_ItemDataRef = newItemDataRef;
+  }
+  void SetPropertyType(DataBrowserPropertyType newPropertyType)
+  {
+    this->m_PropertyType = newPropertyType;
   }
 
+protected:
 private:
 //
 // variables
 //
-  WXDataBrowserItemDataRef m_dataReference; // data reference of the data browser; the data will be assigned to this reference during rendering
+  DataBrowserItemDataRef m_ItemDataRef;
 
-  int m_alignment; // contains the alignment flags
-
-  wxDataViewCellMode m_mode; // storing the mode that determines how the cell is going to be shown
-
-  wxVariant m_value; // value that is going to be rendered
+  DataBrowserPropertyType m_PropertyType;
+};
 
+// ============================================================================
+// wxMacDataBrowserTableViewControl
+// ============================================================================
 //
-// wxWidget internal stuff
+// This is a wrapper class for the Mac OS X data browser environment.
+// It covers all data brower functionality for the native browser's list
+// and column style.
 //
-  DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer)
-};
 
-// ---------------------------------------------------------
-// wxDataViewCustomRenderer
-// ---------------------------------------------------------
+// data browser's property IDs have a reserved ID range from 0 - 1023
+// therefore, the first usable property ID is 'kMinPropertyID'
+DataBrowserPropertyID const kMinPropertyID = 1024;
+
+// array of data browser item IDs
+WX_DEFINE_ARRAY_SIZE_T(size_t,wxArrayDataBrowserItemID);
 
-class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewRenderer
+class wxMacDataBrowserTableViewControl : public wxMacControl
 {
 public:
 //
 // constructors / destructor
 //
-  wxDataViewCustomRenderer(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
-
-  virtual ~wxDataViewCustomRenderer();
-
-  void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state );
-
-//
-// methods handling render space
-//
-  virtual wxSize GetSize() const = 0;
+  wxMacDataBrowserTableViewControl(wxWindow* peer, const wxPoint& pos, const wxSize& size, long style);
+  wxMacDataBrowserTableViewControl(void)
+  {
+  }
 
 //
-// methods handling user actions
+// callback handling
 //
-  virtual bool Render(wxRect cell, wxDC* dc, int state) = 0;
-
-  virtual bool Activate( wxRect WXUNUSED(cell),
-                         wxDataViewModel *WXUNUSED(model),
-                         const wxDataViewItem & WXUNUSED(item),
-                         unsigned int WXUNUSED(col) )
-                         { return false; }
-
-  virtual bool LeftClick( wxPoint WXUNUSED(cursor),
-                          wxRect WXUNUSED(cell),
-                          wxDataViewModel *WXUNUSED(model),
-                          const wxDataViewItem & WXUNUSED(item),
-                          unsigned int WXUNUSED(col) )
-                          { return false; }
-
-  virtual bool StartDrag( wxPoint WXUNUSED(cursor),
-                          wxRect WXUNUSED(cell),
-                          wxDataViewModel *WXUNUSED(model),
-                          const wxDataViewItem & WXUNUSED(item),
-                          unsigned int WXUNUSED(col) )
-                          { return false; }
+  OSStatus SetCallbacks      (DataBrowserCallbacks const*       callbacks);
+  OSStatus SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks);
 
 //
-// device context handling
+// DnD handling
 //
-  virtual wxDC* GetDC(); // creates a device context and keeps it
+  OSStatus EnableAutomaticDragTracking(bool enable=true);
 
 //
-// implementation
+// header handling
 //
-  virtual bool Render(); // declared in wxDataViewRenderer but will not be used here, therefore calling this function will
-                             // return 'true' without having done anything
-
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
+  OSStatus GetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc) const;
 
-  void SetDC(wxDC* newDCPtr); // this method takes ownership of the pointer
+  OSStatus SetHeaderDesc(DataBrowserPropertyID property, DataBrowserListViewHeaderDesc* desc);
 
-protected:
-private:
 //
-// variables
+// layout handling
 //
-  wxControl* m_editorCtrlPtr; // pointer to an in-place editor control
+  OSStatus AutoSizeColumns();
 
-  wxDC* m_DCPtr;
+  OSStatus EnableCellSizeModification(bool enableHeight=true, bool enableWidth=true); // enables or disables the column width and row height modification (default: false)
 
-//
-// wxWidget internal stuff
-//
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer)
-};
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+  OSStatus GetAttributes        (OptionBits* attributes);
+#endif
+  OSStatus GetColumnWidth       (DataBrowserPropertyID column, UInt16 *width ) const; // returns the column width in pixels
+  OSStatus GetDefaultColumnWidth(UInt16 *width ) const; // returns the default column width in pixels
+  OSStatus GetDefaultRowHeight  (UInt16 * height ) const;
+  OSStatus GetHeaderButtonHeight(UInt16 *height );
+  OSStatus GetPartBounds        (DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect* bounds);
+  OSStatus GetRowHeight         (DataBrowserItemID item , UInt16 *height) const;
+  OSStatus GetScrollPosition    (UInt32* top, UInt32 *left) const;
 
-// ---------------------------------------------------------
-// wxDataViewTextRenderer
-// ---------------------------------------------------------
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+  OSStatus SetAttributes (OptionBits attributes);
+#endif
+  OSStatus SetColumnWidth(DataBrowserPropertyID column, UInt16 width); // sets the column width in pixels
+  OSStatus SetDefaultColumnWidth( UInt16 width );
+  OSStatus SetDefaultRowHeight( UInt16 height );
+  OSStatus SetHasScrollBars( bool horiz, bool vert );
+  OSStatus SetHeaderButtonHeight( UInt16 height );
+  OSStatus SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle);
+  OSStatus SetIndent(float Indent);
+  OSStatus SetItemRowHeight( DataBrowserItemID item , UInt16 height);
+  OSStatus SetScrollPosition( UInt32 top , UInt32 left );
 
-class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer
-{
-public:
 //
-// constructors / destructor
+// column handling
 //
-    wxDataViewTextRenderer(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  OSStatus GetColumnCount   (UInt32* numColumns) const;
+  OSStatus GetColumnIndex   (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const; // returns for the passed property the corresponding column index
+  OSStatus GetFreePropertyID(DataBrowserPropertyID* propertyID) const; // this method returns a property id that is valid and currently not used; if it cannot be found 'errDataBrowerPropertyNotSupported' is returned
+  OSStatus GetPropertyFlags (DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags ) const;
+  OSStatus GetPropertyID    (DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID) const; // returns for the passed item data reference the corresponding property ID
+  OSStatus GetPropertyID    (DataBrowserTableViewColumnIndex index, DataBrowserPropertyID* propertyID) const; // returns for the passed column index the corresponding property ID
+  
+  OSStatus IsUsedPropertyID(DataBrowserPropertyID propertyID) const; // checks if passed property id is used by the control; no error is returned if the id exists
 
-//
-// inherited functions from wxDataViewRenderer
-//
-  virtual bool Render();
+  OSStatus RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID);
+  OSStatus RemoveColumnByIndex   (DataBrowserTableViewColumnIndex index);
+
+  OSStatus SetColumnIndex     (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index);
+  OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=false);
+  OSStatus SetPropertyFlags   (DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags);
 
 //
-// implementation
+// item handling
 //
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
+  OSStatus AddItem(DataBrowserItemID container, DataBrowserItemID const* itemID) // adds a single item
+  {
+    return this->AddItems(container,1,itemID,kDataBrowserItemNoProperty);
+  }
+  OSStatus AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty); // adds items to the data browser
 
-protected:
-private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
-};
+  OSStatus GetFreeItemID(DataBrowserItemID* id) const; // this method returns an item id that is valid and currently not used; if it cannot be found 'errDataBrowserItemNotAdded' is returned
+  OSStatus GetItemCount (ItemCount* numItems) const
+  {
+    return this->GetItemCount(kDataBrowserNoItem,true,kDataBrowserItemAnyState,numItems);
+  }
+  OSStatus GetItemCount (DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const;
+  OSStatus GetItemID    (DataBrowserTableViewRowIndex row, DataBrowserItemID* item) const;
+  OSStatus GetItems     (DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const;
+  OSStatus GetItemRow   (DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const;
+  OSStatus GetItemState (DataBrowserItemID item, DataBrowserItemState* state) const;
 
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
+  OSStatus IsUsedItemID(DataBrowserItemID itemID) const; // checks if the passed id is in use
 
-class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer
-{
-public:
-//
-// constructors / destructor
-//
-    wxDataViewTextRendererAttr(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  OSStatus RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const;
 
-private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr)
-};
+  OSStatus RemoveItem(DataBrowserItemID container, DataBrowserItemID const* itemID) // removes a single item
+  {
+    return this->RemoveItems(container,1,itemID,kDataBrowserItemNoProperty);
+  }
+  OSStatus RemoveItems(void) // removes all items
+  {
+    return this->RemoveItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty);
+  }
+  OSStatus RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty);
 
-// ---------------------------------------------------------
-// wxDataViewBitmapRenderer
-// ---------------------------------------------------------
+  OSStatus UpdateItem(DataBrowserItemID container, DataBrowserItemID const* item) // updates all columns of the passed item
+  {
+    return this->UpdateItems(container,1,item,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty);
+  }
+  OSStatus UpdateItems(void) // updates all items
+  {
+    return this->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty);
+  }
+  OSStatus UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty, DataBrowserPropertyID propertyID) const;
 
-class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer
-{
-public:
 //
-// constructors / destructor
+// item selection
 //
-  wxDataViewBitmapRenderer(wxString const& varianttype=wxT("wxBitmap"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  size_t   GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const; // returns the number of selected item and the item IDs in the array
+  OSStatus GetSelectionAnchor(DataBrowserItemID *first, DataBrowserItemID *last) const;
+  OSStatus GetSelectionFlags (DataBrowserSelectionFlags* flags) const;
 
-//
-// inherited functions from wxDataViewRenderer
-//
-  virtual bool Render();
+  bool IsItemSelected(DataBrowserItemID item) const;
+
+  OSStatus SetSelectionFlags(DataBrowserSelectionFlags flags);
+  OSStatus SetSelectedItems (UInt32 numItems, DataBrowserItemID const* itemIDs, DataBrowserSetOption operation);
 
 //
-// implementation
+// item sorting
 //
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
-
-protected:
-private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer)
-};
+  OSStatus GetSortOrder   (DataBrowserSortOrder* order) const;
+  OSStatus GetSortProperty(DataBrowserPropertyID* propertyID) const;
 
-// ---------------------------------------------------------
-// wxDataViewToggleRenderer
-// ---------------------------------------------------------
+  OSStatus Resort(DataBrowserItemID container=kDataBrowserNoItem, Boolean sortChildren=true);
 
-class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewRenderer
-{
-public:
-  wxDataViewIconTextRenderer(wxString const& varianttype = wxT("wxDataViewIconText"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  OSStatus SetSortOrder   (DataBrowserSortOrder  order);
+  OSStatus SetSortProperty(DataBrowserPropertyID propertyID);
 
 //
-// inherited functions from wxDataViewRenderer
+// container handling
 //
-  virtual bool Render();
+  OSStatus CloseContainer(DataBrowserItemID containerID);
+  
+  OSStatus OpenContainer(DataBrowserItemID containerID);
 
+protected :
 //
-// implementation
+// standard callback functions
 //
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
-
-protected:
-private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer)
-};
-
-// ---------------------------------------------------------
-// wxDataViewToggleRenderer
-// ---------------------------------------------------------
+  static pascal Boolean  DataBrowserCompareProc          (ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
+  static pascal void     DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
+  static pascal OSStatus DataBrowserGetSetItemDataProc   (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue);
+  static pascal void     DataBrowserItemNotificationProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
 
-class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer
-{
-public:
-  wxDataViewToggleRenderer(wxString const& varianttype = wxT("bool"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  virtual Boolean  DataBrowserCompareProc          (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) = 0;
+  virtual void     DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection) = 0;
+  virtual OSStatus DataBrowserGetSetItemDataProc   (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue) = 0;
+  virtual void     DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) = 0;
 
 //
-// inherited functions from wxDataViewRenderer
+// callback functions for customized types
 //
-  virtual bool Render();
+  static pascal void                      DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
+  static pascal Boolean                   DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
+  static pascal Boolean                   DataBrowserHitTestProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
+  static pascal DataBrowserTrackingResult DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
 
-//
-// implementation
-//
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
-
-protected:
-private:
-  DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer)
-};
+  virtual void                      DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice) = 0;
+  virtual Boolean                   DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit) = 0;
+  virtual Boolean                   DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect) = 0;
+  virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers) = 0;
 
-// ---------------------------------------------------------
-// wxDataViewProgressRenderer
-// ---------------------------------------------------------
+//
+// callback functions for drag & drop
+///
+  static pascal Boolean DataBrowserAcceptDragProc (ControlRef browser, DragReference dragRef, DataBrowserItemID itemID);
+  static pascal Boolean DataBrowserAddDragItemProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef);
+  static pascal Boolean DataBrowserReceiveDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID);
 
-class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewRenderer
-{
-public:
-  wxDataViewProgressRenderer(wxString const& label = wxEmptyString, wxString const& varianttype=wxT("long"),
-                             wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  virtual Boolean DataBrowserAcceptDragProc (DragReference dragRef, DataBrowserItemID itemID)                         = 0;
+  virtual Boolean DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef) = 0;
+  virtual Boolean DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID)                         = 0;
 
+private:
 //
-// inherited functions from wxDataViewRenderer
+// wxWidget internal stuff
 //
-  virtual bool Render();
+    DECLARE_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl)
+};
 
+// ============================================================================
+// wxMacDataBrowserListViewControl
+// ============================================================================
 //
-// implementation
+// This class is a wrapper for the native browser's list view style. It expands
+// the inherited functionality of the table view control class.
+// The term list view is in this case Mac OS X specific and is not related
+// to any wxWidget naming conventions.
 //
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
-
-protected:
-private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer)
-};
-
-// ---------------------------------------------------------
-// wxDataViewDateRenderer
-// ---------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxDataViewDateRenderer: public wxDataViewRenderer
+class wxMacDataBrowserListViewControl : public wxMacDataBrowserTableViewControl
 {
 public:
-  wxDataViewDateRenderer(wxString const& varianttype=wxT("datetime"), wxDataViewCellMode mode=wxDATAVIEW_CELL_ACTIVATABLE, int align=wxDVR_DEFAULT_ALIGNMENT);
-
 //
-// inherited functions from wxDataViewRenderer
+// constructors / destructor
 //
-  virtual bool Render();
+  wxMacDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style) : wxMacDataBrowserTableViewControl(peer,pos,size,style)
+  {
+  }
 
 //
-// implementation
+// column handling
 //
-  virtual WXDataBrowserPropertyType GetPropertyType() const;
+  OSStatus AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position);
 
 protected:
 private:
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer)
 };
 
-// ---------------------------------------------------------
-// wxDataViewColumn
-// ---------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxDataViewColumn: public wxDataViewColumnBase
-{
-public:
-    // constructors / destructor
-    wxDataViewColumn(const wxString& title,
-                     wxDataViewRenderer* renderer,
-                     unsigned int model_column,
-                     int width = wxDVC_DEFAULT_WIDTH,
-                     wxAlignment align = wxALIGN_CENTER,
-                     int flags = wxDATAVIEW_COL_RESIZABLE)
-        : wxDataViewColumnBase(renderer, model_column),
-          m_title(title)
-    {
-        Init(width, align, flags);
-    }
-
-    wxDataViewColumn(const wxBitmap& bitmap,
-                     wxDataViewRenderer* renderer,
-                     unsigned int model_column,
-                     int width = wxDVC_DEFAULT_WIDTH,
-                     wxAlignment align = wxALIGN_CENTER,
-                     int flags = wxDATAVIEW_COL_RESIZABLE)
-        : wxDataViewColumnBase(bitmap, renderer, model_column)
-    {
-        Init(width, align, flags);
-    }
-
-    // implement wxHeaderColumnBase pure virtual methods
-    virtual wxAlignment GetAlignment() const { return m_alignment; }
-    virtual int GetFlags() const { return m_flags; }
-    virtual int GetMaxWidth() const { return m_maxWidth; }
-    virtual int GetMinWidth() const { return m_minWidth; }
-    virtual wxString GetTitle() const { return m_title; }
-    virtual int GetWidth() const { return m_width; }
-    virtual bool IsHidden() const { return false; } // TODO
-    virtual bool IsSortOrderAscending() const { return m_ascending; }
-    virtual bool IsSortKey() const;
-
-    virtual void SetAlignment(wxAlignment align);
-    virtual void SetBitmap   (wxBitmap const& bitmap);
-    virtual void SetFlags    (int flags) { SetIndividualFlags(flags); }
-    virtual void SetHidden(bool WXUNUSED(hidden)) { } // TODO
-    virtual void SetMaxWidth   (int maxWidth);
-    virtual void SetMinWidth   (int minWidth);
-    virtual void SetReorderable(bool reorderable);
-    virtual void SetResizeable (bool resizeable);
-    virtual void SetSortable   (bool sortable);
-    virtual void SetSortOrder  (bool ascending);
-    virtual void SetTitle      (wxString const& title);
-    virtual void SetWidth      (int  width);
-    virtual void SetAsSortKey(bool sort = true);
-
-    // implementation only
-    WXDataBrowserPropertyID GetPropertyID() const
-    {
-        return m_propertyID;
-    }
-
-    void SetPropertyID(WXDataBrowserPropertyID newID)
-    {
-        m_propertyID = newID;
-    }
-    void SetWidthVariable(int NewWidth)
-    {
-        m_width = NewWidth;
-    }
-
-private:
-    // common part of all ctors
-    void Init(int width, wxAlignment align, int flags)
-    {
-        m_ascending = true;
-        m_flags = flags & ~wxDATAVIEW_COL_HIDDEN; // TODO
-        m_maxWidth = 30000;
-        m_minWidth = 0;
-        m_width = width >= 0 ? width : wxDVC_DEFAULT_WIDTH;
-        m_alignment = align;
-    }
-
-    bool m_ascending; // sorting order
-
-    // each column is identified by its unique property ID (NOT by the column
-    // index)
-    WXDataBrowserPropertyID m_propertyID;
-
-    int m_flags;    // flags for the column
-    int m_maxWidth; // maximum width for the column
-    int m_minWidth; // minimum width for the column
-    int m_width;    // column width
-
-    wxAlignment m_alignment; // column header alignment
-
-    wxString m_title; // column title
-};
 
-// ---------------------------------------------------------
-// wxDataViewCtrl
-// ---------------------------------------------------------
-class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase
+// ============================================================================
+// wxMacDataViewDataBrowserListViewControl
+// ============================================================================
+//
+// This is the internal interface class between wxDataViewCtrl (wxWidget) and
+// the native data browser (Mac OS X carbon).
+//
+class wxMacDataViewDataBrowserListViewControl : public wxMacDataBrowserListViewControl, public wxDataViewWidgetImpl
 {
 public:
- // Constructors / destructor:
-  wxDataViewCtrl()
-  {
-    this->Init();
-  }
-  wxDataViewCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0,
-                 const wxValidator& validator = wxDefaultValidator)
-  {
-    this->Init();
-    this->Create(parent, id, pos, size, style, validator );
-  }
-
-  ~wxDataViewCtrl();
-
- // explicit control creation
-  bool Create(wxWindow *parent, wxWindowID id, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=0,
-              const wxValidator& validator=wxDefaultValidator);
-
-  virtual wxControl* GetMainWindow() // should disappear as it is not of any use for the native implementation
-  {
-    return this;
-  }
-
- // inherited methods from 'wxDataViewCtrlBase':
-  virtual bool AssociateModel(wxDataViewModel* model);
-
-  virtual bool AppendColumn(wxDataViewColumn* columnPtr);
-  virtual bool PrependColumn(wxDataViewColumn* columnPtr);
-  virtual bool InsertColumn(unsigned int pos, wxDataViewColumn *col);
-
-  virtual bool ClearColumns();
-  virtual bool DeleteColumn(wxDataViewColumn* columnPtr);
-  virtual wxDataViewColumn* GetColumn(unsigned int pos) const;
-  virtual unsigned int GetColumnCount() const;
-  virtual int GetColumnPosition(const wxDataViewColumn* columnPtr) const;
-
-  virtual void Collapse( const wxDataViewItem& item);
-  virtual void EnsureVisible(const wxDataViewItem& item, const wxDataViewColumn* columnPtr=NULL);
-  virtual void Expand(const wxDataViewItem& item);
-  virtual bool IsExpanded(const wxDataViewItem & item) const;
-
-  virtual wxDataViewColumn* GetSortingColumn() const;
-
-  virtual unsigned int GetCount() const;
-  virtual wxRect GetItemRect(const wxDataViewItem& item, const wxDataViewColumn* columnPtr) const;
-  virtual wxDataViewItem GetSelection() const;
-  virtual int GetSelections(wxDataViewItemArray& sel) const;
-
-  virtual void HitTest(const wxPoint& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
-
-  virtual bool IsSelected(const wxDataViewItem& item) const;
-
-  virtual void SelectAll();
-  virtual void Select(const wxDataViewItem& item);
-  virtual void SetSelections(const wxDataViewItemArray& sel);
-
-  virtual void Unselect(const wxDataViewItem& item);
-  virtual void UnselectAll();
-
 //
-// implementation
+// constructors / destructor
 //
+  wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style);
+
+ //
+ // column related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual bool              ClearColumns       (void);
+  virtual bool              DeleteColumn       (wxDataViewColumn* columnPtr);
+  virtual void              DoSetExpanderColumn(wxDataViewColumn const* columnPtr);
+  virtual wxDataViewColumn* GetColumn          (unsigned int pos) const;
+  virtual int               GetColumnPosition  (wxDataViewColumn const* columnPtr) const;
+  virtual bool              InsertColumn       (unsigned int pos, wxDataViewColumn* columnPtr);
+
+ //
+ // item related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItemArray const& items);
+  virtual void         Collapse     (wxDataViewItem const& item);
+  virtual void         EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
+  virtual void         Expand       (wxDataViewItem const& item);
+  virtual unsigned int GetCount     (void) const;
+  virtual wxRect       GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
+  virtual bool         IsExpanded   (wxDataViewItem const& item) const;
+  virtual bool         Reload       (void);
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItemArray const& item);
+  virtual bool         Update       (wxDataViewColumn const* columnPtr);
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItemArray const& items);
+
+ //
+ // model related methods
+ //
+  virtual bool AssociateModel(wxDataViewModel* model);
 
-  virtual wxSize DoGetBestSize() const;
-
- // adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added:
-  void AddChildrenLevel(wxDataViewItem const& parentItem);
-
- // finishes editing of custom items; if no custom item is currently edited the method does nothing
-  void FinishCustomItemEditing();
-
- // returns a pointer to a column;
- // in case the pointer cannot be found NULL is returned:
-  wxDataViewColumn* GetColumnPtr(WXDataBrowserPropertyID propertyID) const;
- // returns the current being rendered item of the customized renderer (this item is only valid during editing)
-  wxDataViewItem const& GetCustomRendererItem() const
-  {
-    return this->m_CustomRendererItem;
-  }
- // returns a pointer to a customized renderer (this pointer is only valid during editing)
-  wxDataViewCustomRenderer* GetCustomRendererPtr() const
-  {
-    return this->m_CustomRendererPtr;
-  }
-
- // checks if currently a delete process is running:
-  bool IsDeleting() const
-  {
-    return this->m_Deleting;
-  }
-
- // with CG, we need to get the context from an kEventControlDraw event
- // unfortunately, the DataBrowser callbacks don't provide the context
- // and we need it, so we need to set/remove it before and after draw
- // events so we can access it in the callbacks.
-  void MacSetDrawingContext(void* context)
-  {
-    this->m_cgContext = context;
-  }
-  void* MacGetDrawingContext() const
-  {
-    return this->m_cgContext;
-  }
-
- // sets the currently being edited item of the custom renderer
-  void SetCustomRendererItem(wxDataViewItem const& NewItem)
-  {
-    this->m_CustomRendererItem = NewItem;
-  }
- // sets the custom renderer
-  void SetCustomRendererPtr(wxDataViewCustomRenderer* NewCustomRendererPtr)
-  {
-    this->m_CustomRendererPtr = NewCustomRendererPtr;
-  }
- // sets the flag indicating a deletion process:
-  void SetDeleting(bool deleting)
-  {
-    this->m_Deleting = deleting;
-  }
-
-  virtual wxVisualAttributes GetDefaultAttributes() const
+ //
+ // selection related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual int  GetSelections(wxDataViewItemArray& sel)   const;
+  virtual bool IsSelected   (wxDataViewItem const& item) const;
+  virtual void Select       (wxDataViewItem const& item);
+  virtual void SelectAll    (void);
+  virtual void Unselect     (wxDataViewItem const& item);
+  virtual void UnselectAll  (void);
+
+ //
+ // sorting related methods
+ //
+  virtual wxDataViewColumn* GetSortingColumn (void) const;
+  virtual void              Resort           (void);
+
+ //
+ // other methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual void DoSetIndent (int indent);
+  virtual void HitTest     (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
+  virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height);
+  virtual void OnSize      (void);
+
+ //
+ // other methods
+ //
+  wxDataViewCtrl* GetDataViewCtrl(void) const
   {
-      return GetClassDefaultAttributes(GetWindowVariant());
+    return dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
   }
 
-  static wxVisualAttributes
-  GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
-
 protected:
- // inherited methods from wxDataViewCtrlBase:
-  virtual void DoSetExpanderColumn();
-  virtual void DoSetIndent();
-
- // event handling:
-  void OnSize(wxSizeEvent &event);
-  void OnMouse(wxMouseEvent &event);
-
-private:
- // type definitions:
-  WX_DECLARE_HASH_MAP(WXDataBrowserPropertyID,wxDataViewColumn*,wxIntegerHash,wxIntegerEqual,ColumnPointerHashMapType);
-
- // initializing of local variables:
-  void Init();
-
-///
-// variables
 //
+// standard callback functions (inherited from wxMacDataBrowserTableViewControl)
+//
+  virtual Boolean  DataBrowserCompareProc          (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
+  virtual void     DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
+  virtual void     DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
+  virtual OSStatus DataBrowserGetSetItemDataProc   (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue);
 
-  bool m_Deleting; // flag indicating if a delete process is running; this flag is necessary because the notifier indicating an item deletion in the model may be called
-                   // after the actual deletion of the item; then, the callback function "wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc" may
-                   // try to update data into variables that are already deleted; this flag will ignore all variable update requests during item deletion
-
-  void* m_cgContext; // pointer to core graphics context
+//
+// callback functions for customized types (inherited from wxMacDataBrowserTableViewControl)
+//
+  virtual void                      DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
+  virtual Boolean                   DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
+  virtual Boolean                   DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
+  virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
 
-  wxDataViewCustomRenderer* m_CustomRendererPtr; // pointer to a valid custom renderer while editing; this class does NOT own the pointer
+//
+// callback functions for drag & drop (inherited from wxMacDataBrowserTableViewControl)
+//
+  virtual Boolean DataBrowserAcceptDragProc (DragReference dragRef, DataBrowserItemID itemID);
+  virtual Boolean DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef);
+  virtual Boolean DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID);
 
-  wxDataViewItem m_CustomRendererItem; // currently edited item by the customerenderer; it is invalid while not editing
+//
+// drag & drop helper methods
+//
+  wxDataFormat           GetDnDDataFormat(wxDataObjectComposite* dataObjects);
+  wxDataObjectComposite* GetDnDDataObjects(DragReference dragRef, ItemReference itemRef) const; // create the data objects from the native dragged object
 
-  ColumnPointerHashMapType m_ColumnPointers; // all column pointers are stored in a hash map with the property ID as a key
+//
+// other methods
+//
+  wxDataViewColumn* GetColumnPtr(DataBrowserPropertyID propertyID) const; // returns for the passed property the corresponding pointer to a column; NULL is returned if not found
 
- // wxWidget internal stuff:
-  DECLARE_DYNAMIC_CLASS(wxDataViewCtrl)
-  wxDECLARE_NO_COPY_CLASS(wxDataViewCtrl);
-  DECLARE_EVENT_TABLE()
+private:
 };
 
+typedef wxMacDataViewDataBrowserListViewControl* wxMacDataViewDataBrowserListViewControlPointer;
 
+#endif // WX_GUI
 #endif // _WX_MACCARBONDATAVIEWCTRL_H_
diff --git a/include/wx/osx/cocoa/dataview.h b/include/wx/osx/cocoa/dataview.h
new file mode 100644 (file)
index 0000000..25a60f3
--- /dev/null
@@ -0,0 +1,494 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/osx/carbon/dataview.h
+// Purpose:     wxDataViewCtrl native implementation header for carbon
+// Author:
+// Id:          $Id: dataview.h 57374 2009-01-27
+// Copyright:   (c) 2009
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DATAVIEWCTRL_COCOOA_H_
+#define _WX_DATAVIEWCTRL_COCOOA_H_
+
+#include "wx/defs.h"
+
+#if wxUSE_GUI
+
+#ifdef __OBJC__
+  #import <Cocoa/Cocoa.h>
+#endif
+
+#include "wx/osx/core/dataview.h"
+#include "wx/osx/private.h"
+
+// Forward declaration
+class wxCocoaDataViewControl;
+
+// ============================================================================
+// wxPointerObject
+// ============================================================================
+//
+// This is a helper class to store a pointer in an object. This object just
+// stores the pointer but does not take any ownership.
+// To pointer objects are equal if the containing pointers are equal. This
+// means also that the hash value of a pointer object depends only on the
+// stored pointer.
+//
+@interface wxPointerObject : NSObject
+{
+  void* pointer;
+}
+
+ //
+ // object initialization
+ //
+  -(id) initWithPointer:(void*)initPointer;
+
+ //
+ // access to pointer
+ //
+  -(void*) pointer;
+  -(void)  setPointer:(void*)newPointer;
+
+@end
+
+// ============================================================================
+// wxSortDescriptorObject
+// ============================================================================
+//
+// This is a helper class to use native sorting facilities.
+//
+@interface wxSortDescriptorObject : NSSortDescriptor<NSCopying>
+{
+  wxDataViewColumn* columnPtr; // pointer to the sorting column
+
+  wxDataViewModel* modelPtr; // pointer to model
+}
+
+ //
+ // initialization
+ //
+  -(id) initWithModelPtr:(wxDataViewModel*)initModelPtr sortingColumnPtr:(wxDataViewColumn*)initColumnPtr ascending:(BOOL)sortAscending;
+
+ //
+ // access to variables
+ //
+  -(wxDataViewColumn*) columnPtr;
+  -(wxDataViewModel*) modelPtr;
+
+  -(void) setColumnPtr:(wxDataViewColumn*)newColumnPtr;
+  -(void) setModelPtr:(wxDataViewModel*)newModelPtr;
+
+@end
+
+// ============================================================================
+// wxDataViewColumnNativeData
+// ============================================================================
+class wxDataViewColumnNativeData
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewColumnNativeData(void) : m_NativeColumnPtr(NULL)
+  {
+  }
+  wxDataViewColumnNativeData(NSTableColumn* initNativeColumnPtr) : m_NativeColumnPtr(initNativeColumnPtr)
+  {
+  }
+
+//
+// data access methods
+//
+  NSTableColumn* GetNativeColumnPtr(void) const
+  {
+    return this->m_NativeColumnPtr;
+  }
+  
+  void SetNativeColumnPtr(NSTableColumn* newNativeColumnPtr)
+  {
+    this->m_NativeColumnPtr = newNativeColumnPtr;
+  }
+
+protected:
+private:
+//
+// variables
+//
+  NSTableColumn* m_NativeColumnPtr; // this class does not take over ownership of the pointer nor retains it
+};
+
+// ============================================================================
+// wxDataViewRendererNativeData
+// ============================================================================
+class wxDataViewRendererNativeData
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewRendererNativeData(void) : m_Object(NULL), m_ColumnCell(NULL)
+  {
+  }
+  wxDataViewRendererNativeData(NSCell* initColumnCell) : m_Object(NULL), m_ColumnCell([initColumnCell retain])
+  {
+  }
+  wxDataViewRendererNativeData(NSCell* initColumnCell, id initObject) : m_Object([initObject retain]), m_ColumnCell([initColumnCell retain])
+  {
+  }
+  ~wxDataViewRendererNativeData(void)
+  {
+    [this->m_ColumnCell release];
+    [this->m_Object     release];
+  }
+
+ //
+ // data access methods
+ //
+  NSCell* GetColumnCell(void) const
+  {
+    return this->m_ColumnCell;
+  }
+  NSTableColumn* GetColumnPtr(void) const
+  {
+    return this->m_TableColumnPtr;
+  }
+  id GetItem(void) const
+  {
+    return this->m_Item;
+  }
+  NSCell* GetItemCell(void) const
+  {
+    return this->m_ItemCell;
+  }
+  id GetObject(void) const
+  {
+    return this->m_Object;
+  }
+
+  void SetColumnCell(NSCell* newCell)
+  {
+    [newCell retain];
+    [this->m_ColumnCell release];
+    this->m_ColumnCell = newCell;
+  }
+  void SetColumnPtr(NSTableColumn* newColumnPtr)
+  {
+    this->m_TableColumnPtr = newColumnPtr;
+  }
+  void SetItem(id newItem)
+  {
+    this->m_Item = newItem;
+  }
+  void SetItemCell(NSCell* newCell)
+  {
+    this->m_ItemCell = newCell;
+  }
+  void SetObject(id newObject)
+  {
+    [newObject retain];
+    [this->m_Object release];
+    this->m_Object = newObject;
+  }
+
+protected:
+private:
+//
+// variables
+//
+  id m_Item;   // item NOT owned by renderer
+  id m_Object; // object that can be used by renderer for storing special data (owned by renderer)
+
+  NSCell* m_ColumnCell; // column's cell is owned by renderer
+  NSCell* m_ItemCell;   // item's cell is NOT owned by renderer
+
+  NSTableColumn* m_TableColumnPtr; // column NOT owned by renderer
+};
+
+// ============================================================================
+// wxCocoaOutlineDataSource
+// ============================================================================
+//
+// This class implements the data source delegate for the outline view.
+// As only an informal protocol exists this class inherits from NSObject only.
+//
+// As mentioned in the documentation for NSOutlineView the native control does
+// not own any data. Therefore, it has to be done by the data source.
+// Unfortunately, wxWidget's data source is a C++ data source but
+// NSOutlineDataSource requires objects as data. Therefore, the data (or better
+// the native item objects) have to be stored additionally in the native data
+// source.
+// NSOutlineView requires quick access to the item objects and quick linear
+// access to an item's children. This requires normally a hash type of storage
+// for the item object itself and an array structure for each item's children.
+// This means that basically two times the whole structure of wxWidget's model
+// class has to be stored.
+// This implementation is using a compromise: all items that are in use by the
+// control are stored in a set (from there they can be easily retrieved) and
+// owned by the set. Furthermore, children of the last parent are stored
+// in a linear list.
+//
+@interface wxCocoaOutlineDataSource : NSObject
+{
+  NSArray* sortDescriptors; // descriptors specifying the sorting (currently the array only holds one object only)
+
+  NSMutableArray* children; // buffered children
+
+  NSMutableSet* items; // stores all items that are in use by the control
+  
+  wxCocoaDataViewControl* implementation;
+  
+  wxDataViewModel* model;
+  
+  wxPointerObject* currentParentItem; // parent of the buffered children; the object is owned
+}
+
+ //
+ // methods of informal protocol:
+ //
+  -(BOOL)            outlineView:(NSOutlineView*)outlineView acceptDrop:(id<NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index;
+  -(id)              outlineView:(NSOutlineView*)outlineView child:(NSInteger)index ofItem:(id)item;
+  -(id)              outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;
+  -(BOOL)            outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item;
+  -(NSInteger)       outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item;
+  -(NSDragOperation) outlineView:(NSOutlineView*)outlineView validateDrop:(id<NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index;
+  -(BOOL)            outlineView:(NSOutlineView*)outlineView writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pasteboard;
+
+ //
+ // buffer for items handling
+ //
+  -(void)             addToBuffer:(wxPointerObject*)item;
+  -(void)             clearBuffer;
+  -(wxPointerObject*) getDataViewItemFromBuffer:(wxDataViewItem const&)item;  // returns the item in the buffer that has got the same pointer as "item",
+  -(wxPointerObject*) getItemFromBuffer:(wxPointerObject*)item;               // if such an item does not exist nil is returned
+  -(BOOL)             isInBuffer:(wxPointerObject*)item;
+  -(void)             removeFromBuffer:(wxPointerObject*)item;
+
+ //
+ // buffered children handling
+ //
+  -(void)             appendChild:(wxPointerObject*)item;
+  -(void)             clearChildren;
+  -(wxPointerObject*) getChild:(NSUInteger)index;
+  -(NSUInteger)       getChildCount;
+  -(void)             removeChild:(NSUInteger)index;
+
+ //
+ // buffer handling
+ //
+  -(void) clearBuffers;
+
+ //
+ // sorting
+ //
+  -(NSArray*) sortDescriptors;
+  -(void)     setSortDescriptors:(NSArray*)newSortDescriptors;
+
+ //
+ // access to wxWidget's variables
+ //
+  -(wxPointerObject*)        currentParentItem;
+  -(wxCocoaDataViewControl*) implementation;
+  -(wxDataViewModel*)        model;
+  -(void)                    setCurrentParentItem:(wxPointerObject*)newCurrentParentItem;
+  -(void)                    setImplementation:(wxCocoaDataViewControl*)newImplementation;
+  -(void)                    setModel:(wxDataViewModel*)newModel;
+
+ //
+ // other methods
+ //
+  -(void) bufferItem:(wxPointerObject*)parentItem withChildren:(wxDataViewItemArray*)dataViewChildrenPtr;
+
+@end
+
+// ============================================================================
+// wxCustomCell
+// ============================================================================
+//
+// This is a cell that is used for custom renderers.
+//
+@interface wxCustomCell : NSTextFieldCell
+{
+}
+
+ //
+ // other methods
+ //
+  -(NSSize) cellSize;
+
+@end
+
+// ============================================================================
+// wxImageTextCell
+// ============================================================================
+//
+// As the native cocoa environment does not have a cell displaying an icon/
+// image and text at the same time, it has to be implemented by the user.
+// This implementation follows the implementation of Chuck Pisula in Apple's
+// DragNDropOutline sample application.
+// Although in wxDataViewCtrl icons are used on OSX icons do not exist for
+// display. Therefore, the cell is also called wxImageTextCell.
+// Instead of displaying images of any size (which is possible) this cell uses
+// a fixed size for displaying the image. Larger images are scaled to fit
+// into their reserved space. Smaller or not existing images use the fixed
+// reserved size and are scaled if necessary.
+//
+@interface wxImageTextCell : NSTextFieldCell
+{
+@private
+  CGFloat xImageShift;    // shift for the image in x-direction from border
+  CGFloat spaceImageText; // space between image and text ("belongs" to the image)
+  
+  NSImage* image; // the image itself
+  
+  NSSize imageSize; // largest size of the image; default size is (16, 16)
+  
+  NSTextAlignment cellAlignment; // the text alignment is used to align the whole
+                                 // cell (image and text)
+}
+
+ //
+ // alignment
+ //
+  -(NSTextAlignment) alignment;
+  -(void) setAlignment:(NSTextAlignment)newAlignment;
+
+ //
+ // image access
+ //
+  -(NSImage*) image;
+  -(void) setImage:(NSImage*)newImage;
+
+ //
+ // size access
+ //
+  -(NSSize) imageSize;
+  -(void) setImageSize:(NSSize) newImageSize;
+
+ //
+ // other methods
+ //
+  -(NSSize) cellSize;
+
+@end
+
+// ============================================================================
+// wxCocoaOutlineView
+// ============================================================================
+@interface wxCocoaOutlineView : NSOutlineView
+{
+@private
+  BOOL isEditingCell; // flag indicating if a cell is currently being edited
+
+  wxCocoaDataViewControl* implementation;
+}
+
+ //
+ // access to wxWidget's implementation
+ //
+  -(wxCocoaDataViewControl*) implementation;
+  -(void)                    setImplementation:(wxCocoaDataViewControl*) newImplementation;
+
+@end
+
+// ============================================================================
+// wxCocoaDataViewControl
+// ============================================================================
+//
+// This is the internal interface class between wxDataViewCtrl (wxWidget) and
+// the native source view (Mac OS X cocoa).
+//
+class wxCocoaDataViewControl : public wxWidgetCocoaImpl, public wxDataViewWidgetImpl
+{
+public:
+ //
+ // constructors / destructor
+ //
+  wxCocoaDataViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style);
+  ~wxCocoaDataViewControl(void);
+
+ //
+ // column related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual bool              ClearColumns       (void);
+  virtual bool              DeleteColumn       (wxDataViewColumn* columnPtr);
+  virtual void              DoSetExpanderColumn(wxDataViewColumn const* columnPtr);
+  virtual wxDataViewColumn* GetColumn          (unsigned int pos) const;
+  virtual int               GetColumnPosition  (wxDataViewColumn const* columnPtr) const;
+  virtual bool              InsertColumn       (unsigned int pos, wxDataViewColumn* columnPtr);
+
+ //
+ // item related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItemArray const& items);
+  virtual void         Collapse     (wxDataViewItem const& item);
+  virtual void         EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
+  virtual void         Expand       (wxDataViewItem const& item);
+  virtual unsigned int GetCount     (void) const;
+  virtual wxRect       GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr);
+  virtual bool         IsExpanded   (wxDataViewItem const& item) const;
+  virtual bool         Reload       (void);
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItemArray const& item);
+  virtual bool         Update       (wxDataViewColumn const* columnPtr);
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItemArray const& items);
+
+ //
+ // model related methods
+ //
+  virtual bool AssociateModel(wxDataViewModel* model); // informs the native control that a model is present
+
+ //
+ // selection related methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual int  GetSelections(wxDataViewItemArray& sel)   const;
+  virtual bool IsSelected   (wxDataViewItem const& item) const;
+  virtual void Select       (wxDataViewItem const& item);
+  virtual void SelectAll    (void);
+  virtual void Unselect     (wxDataViewItem const& item);
+  virtual void UnselectAll  (void);
+
+ //
+ // sorting related methods
+ //
+  virtual wxDataViewColumn* GetSortingColumn (void) const;
+  virtual void              Resort           (void);
+
+ //
+ // other methods (inherited from wxDataViewWidgetImpl)
+ //
+  virtual void DoSetIndent (int indent);
+  virtual void HitTest     (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
+  virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height);
+  virtual void OnSize      (void);
+
+ //
+ // other methods
+ //
+  wxDataViewCtrl* GetDataViewCtrl(void) const
+  {
+    return dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  }
+
+//
+// drag & drop helper methods
+//
+  wxDataFormat           GetDnDDataFormat(wxDataObjectComposite* dataObjects);
+  wxDataObjectComposite* GetDnDDataObjects(NSData* dataObject) const; // create the data objects from the native dragged object
+protected:
+private:
+//
+// variables
+//
+  wxCocoaOutlineDataSource* m_DataSource;
+
+  wxCocoaOutlineView* m_OutlineView;
+};
+
+typedef wxCocoaDataViewControl* wxCocoaDataViewControlPointer;
+
+
+#endif // wxUSE_GUI
+#endif // _WX_DATAVIEWCTRL_COCOOA_H_
diff --git a/include/wx/osx/core/dataview.h b/include/wx/osx/core/dataview.h
new file mode 100644 (file)
index 0000000..e5d4be4
--- /dev/null
@@ -0,0 +1,110 @@
+
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/osx/core/dataview.h
+// Purpose:     wxDataViewCtrl native implementation header for OSX
+// Author:
+// Id:          $Id: dataview.h 57374 2009-01-27
+// Copyright:   (c) 2009
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DATAVIEWCTRL_CORE_H_
+#define _WX_DATAVIEWCTRL_CORE_H_
+
+#include "wx/dataview.h"
+
+#if wxOSX_USE_CARBON
+typedef wxMacControl wxWidgetImplType;
+#else
+typedef wxWidgetImpl wxWidgetImplType;
+#endif
+
+// ---------------------------------------------------------
+// Helper functions for dataview implementation on OSX
+// ---------------------------------------------------------
+wxWidgetImplType* CreateDataView(wxWindowMac* wxpeer, wxWindowMac* parent,  wxWindowID id, 
+                                 wxPoint const& pos, wxSize const& size,
+                                 long style, long extraStyle);
+wxString ConcatenateDataViewItemValues(wxDataViewCtrl const* dataViewCtrlPtr, wxDataViewItem const& dataViewItem); // concatenates all data of the visible columns of the passed control
+                                                                                                                   // and item TAB separated into a string and returns it
+
+// ---------------------------------------------------------
+// wxDataViewWidgetImpl
+// Common interface of the native dataview implementation
+// for the carbon and cocoa environment.
+// ATTENTION
+//  All methods assume that the passed column pointers are
+//  valid (unless a NULL pointer is explicitely allowed
+//  to be passed)!
+// ATTENTION
+// ---------------------------------------------------------
+class WXDLLIMPEXP_CORE wxDataViewWidgetImpl
+{
+public:
+ //
+ // constructors / destructor
+ //
+  virtual ~wxDataViewWidgetImpl(void)
+  {
+  }
+
+ //
+ // column related methods
+ //
+  virtual bool              ClearColumns       (void)                                          = 0; // deletes all columns in the native control
+  virtual bool              DeleteColumn       (wxDataViewColumn* columnPtr)                   = 0; // deletes the column in the native control
+  virtual void              DoSetExpanderColumn(wxDataViewColumn const* columnPtr)             = 0; // sets the disclosure column in the native control
+  virtual wxDataViewColumn* GetColumn          (unsigned int pos) const                        = 0; // returns the column belonging to 'pos' in the native control
+  virtual int               GetColumnPosition  (wxDataViewColumn const* columnPtr) const       = 0; // returns the position of the passed column in the native control
+  virtual bool              InsertColumn       (unsigned int pos, wxDataViewColumn* columnPtr) = 0; // inserts a column at pos in the native control;
+                                                                                                    // the method can assume that the column's owner is already set
+
+ //
+ // item related methods
+ //
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItem const& item)       = 0; // adds an item to the native control
+  virtual bool         Add          (wxDataViewItem const& parent, wxDataViewItemArray const& itesm) = 0; // adds a items to the native control
+  virtual void         Collapse     (wxDataViewItem const& item)                                     = 0; // collapses the passed item in the native control
+  virtual void         EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)  = 0; // ensures that the passed item's value in the passed column is visible (column pointer can be NULL)
+  virtual void         Expand       (wxDataViewItem const& item)                                     = 0; // expands the passed item in the native control
+  virtual unsigned int GetCount     (void) const                                                     = 0; // returns the number of items in the native control
+  virtual wxRect       GetRectangle (wxDataViewItem const& item, wxDataViewColumn const* columnPtr)  = 0; // returns the rectangle that is used by the passed item and column in the native control
+  virtual bool         IsExpanded   (wxDataViewItem const& item) const                               = 0; // checks if the passed item is expanded in the native control
+  virtual bool         Reload       (void)                                                           = 0; // clears the native control and reloads all data
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItem const& item)       = 0; // removes an item from the native control
+  virtual bool         Remove       (wxDataViewItem const& parent, wxDataViewItemArray const& item)  = 0; // removes items from the native control
+  virtual bool         Update       (wxDataViewColumn const* columnPtr)                              = 0; // updates the items in the passed column of the native control
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItem const& item)       = 0; // updates the passed item in the native control
+  virtual bool         Update       (wxDataViewItem const& parent, wxDataViewItemArray const& items) = 0; // updates the passed items in the native control
+
+ //
+ // model related methods
+ //
+  virtual bool AssociateModel(wxDataViewModel* model) = 0; // informs the native control that a model is present
+
+ //
+ // selection related methods
+ //
+  virtual int  GetSelections(wxDataViewItemArray& sel)   const = 0; // returns all selected items in the native control
+  virtual bool IsSelected   (wxDataViewItem const& item) const = 0; // checks if the passed item is selected in the native control
+  virtual void Select       (wxDataViewItem const& item)       = 0; // selects the passed item in the native control
+  virtual void SelectAll    (void)                             = 0; // selects all items in the native control
+  virtual void Unselect     (wxDataViewItem const& item)       = 0; // unselects the passed item in the native control
+  virtual void UnselectAll  (void)                             = 0; // unselects all items in the native control
+
+ //
+ // sorting related methods
+ //
+  virtual wxDataViewColumn* GetSortingColumn (void) const = 0; // returns the column that is primarily responsible for sorting in the native control
+  virtual void              Resort           (void)       = 0; // asks the native control to start a resorting process
+
+ //
+ // other methods
+ //
+  virtual void DoSetIndent (int indent)                                                                     = 0; // sets the indention in the native control
+  virtual void HitTest     (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const = 0; // return the item and column pointer that contains with the passed point
+  virtual void SetRowHeight(wxDataViewItem const& item, unsigned int height)                                = 0; // sets the height of the row containg the passed item in the native control
+  virtual void OnSize      (void)                                                                           = 0; // updates the layout of the native control after a size event
+};
+
+#endif // _WX_DATAVIEWCTRL_CORE_H_
index 8c7fbf5410b686da10090156260f6d8671d65df8..861844963599935bde3a910169595da42112d8fe 100644 (file)
@@ -1,5 +1,612 @@
+
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/osx/dataview.h
+// Purpose:     wxDataViewCtrl native implementation header for OSX
+// Author:
+// Id:          $Id$
+// Copyright:   (c) 2009
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DATAVIEWCTRL_OSX_H_
+#define _WX_DATAVIEWCTRL_OSX_H_
+
 #ifdef __WXMAC_CLASSIC__
 #  error "Native wxDataViewCtrl for classic environment not defined. Please use generic control."
-#else
-#  include "wx/osx/carbon/dataview.h"
 #endif
+
+// --------------------------------------------------------
+// Class declarations to mask native types
+// --------------------------------------------------------
+class wxDataViewColumnNativeData;   // class storing environment dependent data for the native implementation
+class wxDataViewRendererNativeData; // class storing environment dependent data for the native renderer
+class wxDataViewWidgetImpl;         // class used as a common interface for carbon and cocoa implementation
+
+// ---------------------------------------------------------
+// wxDataViewRenderer
+// ---------------------------------------------------------
+class WXDLLIMPEXP_ADV wxDataViewRenderer : public wxDataViewRendererBase
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+  
+  virtual ~wxDataViewRenderer(void);
+
+//
+// inherited methods from wxDataViewRendererBase
+//
+  virtual int GetAlignment() const
+  {
+    return this->m_alignment;
+  }
+  virtual wxDataViewCellMode GetMode() const
+  {
+    return this->m_mode;
+  }
+  virtual bool GetValue(wxVariant& value) const
+  {
+    value = this->m_value;
+    return true;
+  }
+
+  virtual void SetAlignment(int align); // carbon: is always identical to the header alignment;
+                                        // cocoa: cell alignment is independent from header alignment
+  virtual void SetMode(wxDataViewCellMode mode);
+  virtual bool SetValue(wxVariant const& newValue)
+  {
+    this->m_value = newValue;
+    return true;
+  }
+
+//
+// implementation
+//
+  wxVariant const& GetValue() const
+  {
+    return this->m_value;
+  }
+
+  wxDataViewRendererNativeData* GetNativeData() const
+  {
+    return this->m_NativeDataPtr;
+  }
+
+  virtual bool Render() = 0; // a call to the native data browser function to render the data;
+                             // returns true if the data value could be rendered, false otherwise
+
+  void SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr);
+
+private:
+//
+// variables
+//
+  int m_alignment; // contains the alignment flags
+
+  wxDataViewCellMode m_mode; // storing the mode that determines how the cell is going to be shown
+
+  wxDataViewRendererNativeData* m_NativeDataPtr; // data used by implementation of the native renderer
+
+  wxVariant m_value; // value that is going to be rendered
+
+//
+// wxWidget internal stuff
+//
+  DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewCustomRenderer
+// ---------------------------------------------------------
+class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewRenderer
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewCustomRenderer(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+  virtual ~wxDataViewCustomRenderer();
+
+  void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state );
+
+//
+// methods handling render space
+//
+  virtual wxSize GetSize() const = 0;
+
+//
+// methods handling user actions
+//
+  virtual bool Render(wxRect cell, wxDC* dc, int state) = 0;
+
+  virtual bool Activate( wxRect WXUNUSED(cell),
+                         wxDataViewModel *WXUNUSED(model),
+                         const wxDataViewItem & WXUNUSED(item),
+                         unsigned int WXUNUSED(col) )
+                         { return false; }
+
+  virtual bool LeftClick( wxPoint WXUNUSED(cursor),
+                          wxRect WXUNUSED(cell),
+                          wxDataViewModel *WXUNUSED(model),
+                          const wxDataViewItem & WXUNUSED(item),
+                          unsigned int WXUNUSED(col) )
+                          { return false; }
+
+  virtual bool StartDrag( wxPoint WXUNUSED(cursor),
+                          wxRect WXUNUSED(cell),
+                          wxDataViewModel *WXUNUSED(model),
+                          const wxDataViewItem & WXUNUSED(item),
+                          unsigned int WXUNUSED(col) )
+                          { return false; }
+
+//
+// device context handling
+//
+  virtual wxDC* GetDC(); // creates a device context and keeps it
+
+//
+// implementation
+//
+  virtual bool Render();
+
+  void SetDC(wxDC* newDCPtr); // this method takes ownership of the pointer
+
+protected:
+private:
+//
+// variables
+//
+  wxControl* m_editorCtrlPtr; // pointer to an in-place editor control
+
+  wxDC* m_DCPtr;
+
+//
+// wxWidget internal stuff
+//
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewTextRenderer
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewRenderer
+{
+public:
+//
+// constructors / destructor
+//
+    wxDataViewTextRenderer(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewTextRendererAttr
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer
+{
+public:
+//
+// constructors / destructor
+//
+    wxDataViewTextRendererAttr(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr)
+};
+
+// ---------------------------------------------------------
+// wxDataViewBitmapRenderer
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewRenderer
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewBitmapRenderer(wxString const& varianttype=wxT("wxBitmap"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer)
+};
+
+#if !defined(wxUSE_GENERICDATAVIEWCTRL) && defined(__WXOSX_COCOA__)
+
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewRenderer
+{
+public:
+//
+// constructors / destructor
+//
+  wxDataViewChoiceRenderer(wxArrayString const& choices,
+                           wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
+                           int alignment = wxDVR_DEFAULT_ALIGNMENT );
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+//
+// implementation
+//
+  wxString GetChoice(size_t index) const
+  {
+    return this->m_Choices[index];
+  }
+  wxArrayString const& GetChoices(void) const
+  {
+    return this->m_Choices;
+  }
+
+private:
+//
+// variables
+//
+  wxArrayString m_Choices;
+
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewChoiceRenderer)
+};
+
+#endif
+
+// ---------------------------------------------------------
+// wxDataViewIconTextRenderer
+// ---------------------------------------------------------
+class WXDLLIMPEXP_ADV wxDataViewIconTextRenderer: public wxDataViewRenderer
+{
+public:
+  wxDataViewIconTextRenderer(wxString const& varianttype = wxT("wxDataViewIconText"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewIconTextRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewToggleRenderer
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewRenderer
+{
+public:
+  wxDataViewToggleRenderer(wxString const& varianttype = wxT("bool"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+  DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewProgressRenderer
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewRenderer
+{
+public:
+  wxDataViewProgressRenderer(wxString const& label = wxEmptyString, wxString const& varianttype=wxT("long"),
+                             wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewDateRenderer
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewDateRenderer: public wxDataViewRenderer
+{
+public:
+  wxDataViewDateRenderer(wxString const& varianttype=wxT("datetime"), wxDataViewCellMode mode=wxDATAVIEW_CELL_ACTIVATABLE, int align=wxDVR_DEFAULT_ALIGNMENT);
+
+//
+// inherited functions from wxDataViewRenderer
+//
+  virtual bool Render();
+
+protected:
+private:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer)
+};
+
+// ---------------------------------------------------------
+// wxDataViewColumn
+// ---------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewColumn: public wxDataViewColumnBase
+{
+public:
+    // constructors / destructor
+    wxDataViewColumn(const wxString& title,
+                     wxDataViewRenderer* renderer,
+                     unsigned int model_column,
+                     int width = wxDVC_DEFAULT_WIDTH,
+                     wxAlignment align = wxALIGN_CENTER,
+                     int flags = wxDATAVIEW_COL_RESIZABLE);
+    wxDataViewColumn(const wxBitmap& bitmap,
+                     wxDataViewRenderer* renderer,
+                     unsigned int model_column,
+                     int width = wxDVC_DEFAULT_WIDTH,
+                     wxAlignment align = wxALIGN_CENTER,
+                     int flags = wxDATAVIEW_COL_RESIZABLE);
+    virtual ~wxDataViewColumn(void);
+
+    // implement wxHeaderColumnBase pure virtual methods
+    virtual wxAlignment GetAlignment() const { return m_alignment; }
+    virtual int GetFlags() const { return m_flags; }
+    virtual int GetMaxWidth() const { return m_maxWidth; }
+    virtual int GetMinWidth() const { return m_minWidth; }
+    virtual wxString GetTitle() const { return m_title; }
+    virtual int GetWidth() const { return m_width; }
+    virtual bool IsHidden() const { return false; } // TODO
+    virtual bool IsSortOrderAscending() const { return m_ascending; }
+    virtual bool IsSortKey() const;
+
+    virtual void SetAlignment  (wxAlignment align);
+    virtual void SetBitmap     (wxBitmap const& bitmap);
+    virtual void SetFlags      (int flags) { SetIndividualFlags(flags); }
+    virtual void SetHidden     (bool WXUNUSED(hidden)) { } // TODO
+    virtual void SetMaxWidth   (int maxWidth);
+    virtual void SetMinWidth   (int minWidth);
+    virtual void SetReorderable(bool reorderable);
+    virtual void SetResizeable (bool resizeable);
+    virtual void SetSortable   (bool sortable);
+    virtual void SetSortOrder  (bool ascending);
+    virtual void SetTitle      (wxString const& title);
+    virtual void SetWidth      (int  width);
+    virtual void SetAsSortKey  (bool sort = true);
+
+   // implementation only
+    wxDataViewColumnNativeData* GetNativeData(void) const
+    {
+      return this->m_NativeDataPtr;
+    }
+    
+    void SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr); // class takes ownership of pointer
+    void SetWidthVariable(int NewWidth)
+    {
+        m_width = NewWidth;
+    }
+
+private:
+    // common part of all ctors
+    void InitCommon(int width, wxAlignment align, int flags)
+    {
+        m_ascending = true;
+        m_flags = flags & ~wxDATAVIEW_COL_HIDDEN; // TODO
+        m_maxWidth = 30000;
+        m_minWidth = 0;
+        m_width = width >= 0 ? width : wxDVC_DEFAULT_WIDTH;
+        m_alignment = align;
+    }
+
+    bool m_ascending; // sorting order
+
+    int m_flags;    // flags for the column
+    int m_maxWidth; // maximum width for the column
+    int m_minWidth; // minimum width for the column
+    int m_width;    // column width
+
+    wxAlignment m_alignment; // column header alignment
+
+    wxDataViewColumnNativeData* m_NativeDataPtr; // storing environment dependent data for the native implementation
+
+    wxString m_title; // column title
+};
+
+//
+// type definitions related to wxDataViewColumn
+//
+WX_DEFINE_ARRAY(wxDataViewColumn*,wxDataViewColumnPtrArrayType);
+
+// ---------------------------------------------------------
+// wxDataViewCtrl
+// ---------------------------------------------------------
+class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase
+{
+public:
+ // Constructors / destructor:
+  wxDataViewCtrl()
+  {
+    this->Init();
+  }
+  wxDataViewCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0,
+                 const wxValidator& validator = wxDefaultValidator)
+  {
+    this->Init();
+    this->Create(parent, id, pos, size, style, validator );
+  }
+
+  ~wxDataViewCtrl();
+
+ // explicit control creation
+  bool Create(wxWindow *parent, wxWindowID id, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=0,
+              const wxValidator& validator=wxDefaultValidator);
+
+  virtual wxControl* GetMainWindow() // not used for the native implementation
+  {
+    return this;
+  }
+
+ // inherited methods from wxDataViewCtrlBase:
+  virtual bool AssociateModel(wxDataViewModel* model);
+
+  virtual bool              AppendColumn     (wxDataViewColumn* columnPtr);
+  virtual bool              ClearColumns     (void);
+  virtual bool              DeleteColumn     (wxDataViewColumn* columnPtr);
+  virtual wxDataViewColumn* GetColumn        (unsigned int pos) const;
+  virtual unsigned int      GetColumnCount   (void) const;
+  virtual int               GetColumnPosition(const wxDataViewColumn* columnPtr) const;
+  virtual wxDataViewColumn* GetSortingColumn (void) const;
+  virtual bool              InsertColumn     (unsigned int pos, wxDataViewColumn *col);
+  virtual bool              PrependColumn    (wxDataViewColumn* columnPtr);
+
+  virtual void Collapse( const wxDataViewItem& item);
+  virtual void EnsureVisible(const wxDataViewItem& item, const wxDataViewColumn* columnPtr=NULL);
+  virtual void Expand(const wxDataViewItem& item);
+  virtual bool IsExpanded(const wxDataViewItem & item) const;
+
+
+  virtual unsigned int GetCount() const;
+  virtual wxRect GetItemRect(const wxDataViewItem& item, const wxDataViewColumn* columnPtr) const;
+  virtual wxDataViewItem GetSelection() const;
+  virtual int GetSelections(wxDataViewItemArray& sel) const;
+
+  virtual void HitTest(const wxPoint& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const;
+
+  virtual bool IsSelected(const wxDataViewItem& item) const;
+
+  virtual void SelectAll();
+  virtual void Select(const wxDataViewItem& item);
+  virtual void SetSelections(const wxDataViewItemArray& sel);
+
+  virtual void Unselect(const wxDataViewItem& item);
+  virtual void UnselectAll();
+
+//
+// implementation
+//
+ // returns a pointer to the native implementation
+  wxDataViewWidgetImpl* GetDataViewPeer(void) const;
+
+ // adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added:
+  void AddChildren(wxDataViewItem const& parentItem);
+
+ // finishes editing of custom items; if no custom item is currently edited the method does nothing
+  void FinishCustomItemEditing(void);
+
+ // returns the n-th pointer to a column;
+ // this method is different from GetColumn(unsigned int pos) because here 'n' is not a position in the control but the n-th
+ // position in the internal list/array of column pointers
+  wxDataViewColumn* GetColumnPtr(size_t n) const
+  {
+    return this->m_ColumnPtrs[n];
+  }
+ // returns the current being rendered item of the customized renderer (this item is only valid during editing)
+  wxDataViewItem const& GetCustomRendererItem() const
+  {
+    return this->m_CustomRendererItem;
+  }
+ // returns a pointer to a customized renderer (this pointer is only valid during editing)
+  wxDataViewCustomRenderer* GetCustomRendererPtr() const
+  {
+    return this->m_CustomRendererPtr;
+  }
+
+ // checks if currently a delete process is running
+  bool IsDeleting() const
+  {
+    return this->m_Deleting;
+  }
+
+ // with CG, we need to get the context from an kEventControlDraw event
+ // unfortunately, the DataBrowser callbacks don't provide the context
+ // and we need it, so we need to set/remove it before and after draw
+ // events so we can access it in the callbacks.
+  void MacSetDrawingContext(void* context)
+  {
+    this->m_cgContext = context;
+  }
+  void* MacGetDrawingContext() const
+  {
+    return this->m_cgContext;
+  }
+
+ // sets the currently being edited item of the custom renderer
+  void SetCustomRendererItem(wxDataViewItem const& NewItem)
+  {
+    this->m_CustomRendererItem = NewItem;
+  }
+ // sets the custom renderer
+  void SetCustomRendererPtr(wxDataViewCustomRenderer* NewCustomRendererPtr)
+  {
+    this->m_CustomRendererPtr = NewCustomRendererPtr;
+  }
+ // sets the flag indicating a deletion process:
+  void SetDeleting(bool deleting)
+  {
+    this->m_Deleting = deleting;
+  }
+
+  virtual wxVisualAttributes GetDefaultAttributes() const
+  {
+      return GetClassDefaultAttributes(GetWindowVariant());
+  }
+
+  static wxVisualAttributes
+  GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
+
+protected:
+ // inherited methods from wxDataViewCtrlBase
+  virtual void DoSetExpanderColumn();
+  virtual void DoSetIndent();
+
+ // event handling
+  void OnSize(wxSizeEvent &event);
+
+private:
+ // initializing of local variables:
+  void Init();
+
+ //
+ // variables
+ //
+  bool m_Deleting; // flag indicating if a delete process is running; this flag is necessary because the notifier indicating an item deletion in the model may be called
+                   // after the actual deletion of the item; then, native callback functions/delegates may try to update data of variables that are already deleted;
+                   // if this flag is set all native variable update requests will be ignored
+
+  void* m_cgContext; // pointer to core graphics context
+
+  wxDataViewCustomRenderer* m_CustomRendererPtr; // pointer to a valid custom renderer while editing; this class does NOT own the pointer
+
+  wxDataViewItem m_CustomRendererItem; // currently edited item by the customrenderer; it is invalid while not editing a custom item
+
+  wxDataViewColumnPtrArrayType m_ColumnPtrs; // all column pointers are stored in an array
+
+ // wxWidget internal stuff:
+  DECLARE_DYNAMIC_CLASS(wxDataViewCtrl)
+  DECLARE_NO_COPY_CLASS(wxDataViewCtrl)
+  DECLARE_EVENT_TABLE()
+};
+
+#endif // _WX_DATAVIEWCTRL_OSX_H_
+
index 57c2aaecd0c41b73cc3b0db8b118a1e0e4fc212c..8aa0657ce583851d122e50e994b89e2480b10831 100644 (file)
@@ -1298,7 +1298,7 @@ bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const
 // wxDataViewChoiceRenderer
 // -------------------------------------
 
-#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXMAC__)
+#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__)
 
 wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString& choices, wxDataViewCellMode mode, int alignment ) :
    wxDataViewCustomRenderer(wxT("string"), mode, alignment )
index 997d24de1ef3fe7dc56f3e4c87d5eac11dc29530..c92f3f1ec3e3866536c5baae700110ebb7194e02 100644 (file)
@@ -1,50 +1,72 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/osx/carbon/datavgen.cpp
-// Purpose:     wxDataViewCtrl native mac implementation
+// Name:        src/osx/carbon/dataview.cpp
+// Purpose:     wxDataViewCtrl native carbon implementation
 // Author:
-// Id:          $Id$
-// Copyright:   (c) 2007
+// Id:          $Id: dataview.cpp 58317 2009-01-23
+// Copyright:   (c) 2009
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#if wxUSE_DATAVIEWCTRL
-
-#include "wx/dataview.h"
-
-#if !defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0)
-
-#include <limits>
-
-#include "wx/osx/carbon/databrow.h"
+#if (wxUSE_DATAVIEWCTRL == 1) && !defined(wxUSE_GENERICDATAVIEWCTRL)
 
 #ifndef WX_PRECOMP
-    #include "wx/timer.h"
+    #include "wx/app.h"
+    #include "wx/toplevel.h"
+    #include "wx/font.h"
     #include "wx/settings.h"
-    #include "wx/dcclient.h"
-    #include "wx/icon.h"
+    #include "wx/utils.h"
 #endif
 
+#include "wx/osx/carbon/dataview.h"
+#include "wx/osx/private.h"
+#include "wx/osx/uma.h"
 #include "wx/renderer.h"
 
-//-----------------------------------------------------------------------------
-// local constants
-//-----------------------------------------------------------------------------
+#include <limits>
 
-// a list of all catchable events:
-static EventTypeSpec const eventList[] =
+// ============================================================================
+// Variables used locally in dataview.cpp
+// ============================================================================
+static DataBrowserGetContextualMenuUPP gDataBrowserTableViewGetContextualMenuUPP = NULL;
+static DataBrowserItemCompareUPP       gDataBrowserTableViewItemCompareUPP       = NULL;
+static DataBrowserItemDataUPP          gDataBrowserTableViewItemDataUPP          = NULL;
+static DataBrowserItemNotificationUPP  gDataBrowserTableViewItemNotificationUPP  = NULL;
+
+static DataBrowserAcceptDragUPP  gDataBrowserTableViewAcceptDragUPP  = NULL;
+static DataBrowserAddDragItemUPP gDataBrowserTableViewAddDragItemUPP = NULL;
+static DataBrowserReceiveDragUPP gDataBrowserTableViewReceiveDragUPP = NULL;
+
+static DataBrowserDrawItemUPP gDataBrowserTableViewDrawItemUPP = NULL;
+static DataBrowserEditItemUPP gDataBrowserTableViewEditItemUPP = NULL;
+static DataBrowserHitTestUPP  gDataBrowserTableViewHitTestUPP  = NULL;
+static DataBrowserTrackingUPP gDataBrowserTableViewTrackingUPP = NULL;
+
+// ============================================================================
+// Functions used locally in dataview.cpp
+// ============================================================================
+static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDataViewItemArray const& items) // returns a newly allocated pointer to valid data browser item IDs
 {
-  {kEventClassControl, kEventControlDraw},
-  {kEventClassControl, kEventControlHit}
-};
+  size_t const noOfItems = items.GetCount();
 
-//-----------------------------------------------------------------------------
-// local functions
-//-----------------------------------------------------------------------------
+  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;
+    }
+ // done:
+  return itemIDs;
+}
 
-static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler, EventRef EventReference, void* Data)
+static pascal OSStatus DataBrowserCtrlEventHandler(EventHandlerCallRef handler, EventRef EventReference, void* Data)
 {
   wxDataViewCtrl* DataViewCtrlPtr((wxDataViewCtrl*) Data); // the 'Data' variable always contains a pointer to the data view control that installed the handler
 
@@ -90,34 +112,14 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
       else
         return eventNotHandledErr;
   }
-
   return eventNotHandledErr;
 }
 
-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;
-    }
- // done:
-  return itemIDs;
-}
-
-static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxCFStringRef const& title)
+static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, wxCFStringRef const& title)
 {
  // set properties for the column:
-  columnDescription.propertyDesc.propertyID    = columnPropertyID;
-  columnDescription.propertyDesc.propertyType  = columnPtr->GetRenderer()->GetPropertyType();
+  columnDescription.propertyDesc.propertyID    = columnPtr->GetNativeData()->GetPropertyID();
+  columnDescription.propertyDesc.propertyType  = columnPtr->GetRenderer()->GetNativeData()->GetPropertyType();
   columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
   if (columnPtr->IsReorderable())
     columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
@@ -133,8 +135,7 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes
   }
   if (columnPtr->IsSortable())
     columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
-  if ((columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE) || 
-      (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE))
+  if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
     columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
   if ((columnDescription.propertyDesc.propertyType == kDataBrowserCustomType) ||
       (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType) ||
@@ -145,9 +146,9 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes
   columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
 #endif
  // set header's properties:
-  columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
-  columnDescription.headerBtnDesc.titleOffset = 0;
-  columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
+  columnDescription.headerBtnDesc.version            = kDataBrowserListViewLatestHeaderDesc;
+  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())
@@ -184,1382 +185,2450 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes
   return true;
 }
 
-//-----------------------------------------------------------------------------
-// local function pointers
-//-----------------------------------------------------------------------------
+// ============================================================================
+// Type definitions of locally used function pointers
+// ============================================================================
+DEFINE_ONE_SHOT_HANDLER_GETTER(DataBrowserCtrlEventHandler)
 
-DEFINE_ONE_SHOT_HANDLER_GETTER(wxMacDataViewCtrlEventHandler)
-
-// ---------------------------------------------------------
-// wxMacDataViewModelNotifier
-// ---------------------------------------------------------
-class wxMacDataViewModelNotifier : public wxDataViewModelNotifier
+// ============================================================================
+// Helper functions for dataview implementation on OSX
+// ============================================================================
+wxWidgetImplType* CreateDataView(wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent),  wxWindowID WXUNUSED(id), wxPoint const& pos, wxSize const& size,
+                                 long style, long WXUNUSED(extraStyle))
 {
-public:
-  wxMacDataViewModelNotifier(wxMacDataViewDataBrowserListViewControl* initDataViewControlPtr) : m_dataViewControlPtr(initDataViewControlPtr)
-  {
-  }
-
-  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."));
-    bool noFailureFlag = (!(parent.IsOk()) && (m_dataViewControlPtr->AddItem(kDataBrowserNoItem,&itemID) == noErr) ||
-                  parent.IsOk()  && (m_dataViewControlPtr->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr));
-
-    wxDataViewCtrl *dvc = (wxDataViewCtrl*) m_dataViewControlPtr->GetWXPeer();
-    if (dvc->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT)
-    {
-        wxDataViewModel *model = GetOwner();
+  return new wxMacDataViewDataBrowserListViewControl(wxpeer,pos,size,style);
+}
 
-        int height = 20; // TODO find out standard height
-        unsigned int num = dvc->GetColumnCount();
-        unsigned int col;
-        for (col = 0; col < num; col++)
-        {
-            wxDataViewColumn *column = dvc->GetColumn( col );
-            if (column->IsHidden())
-                continue;
+// ============================================================================
+// wxMacDataBrowserTableViewControl
+// ============================================================================
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
-            wxDataViewCustomRenderer *renderer = wxDynamicCast( column->GetRenderer(), wxDataViewCustomRenderer );
-            if (renderer)
-            {
-                wxVariant value;
-                model->GetValue( value, item, column->GetModelColumn() );
-                renderer->SetValue( value );
-                height = wxMax( height, renderer->GetSize().y );
-            }
 
-        }
+  if (ControlPtr != NULL)
+    return ControlPtr->DataBrowserCompareProc(itemOneID,itemTwoID,sortProperty);
+  else
+    return errDataBrowserPropertyNotSupported;
+} /* wxMacDataBrowserTableViewControl::DataBrowserCompareProc(ControlRef, DataBrowserItemID, DataBrowserItemID, DataBrowserPropertyID) */
 
-        if (height > 20)
-            m_dataViewControlPtr->SetRowHeight( itemID, height );
-    }
+pascal void wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
-    return noFailureFlag;
-  }
 
-  virtual bool ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
-  {
-    bool noFailureFlag;
+  if (ControlPtr != NULL)
+    ControlPtr->DataBrowserGetContextualMenuProc(menu,helpType,helpItemString,selection);
+} /* wxMacDataBrowserTableViewControl::DataBrowserGetContextualMenuProc(ControlRef, MenuRef*, UInt32*, CFStringRef*, AEDesc*) */
 
-    DataBrowserItemID* itemIDs;
+pascal OSStatus wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
-    size_t noOfEntries;
 
+  if (ControlPtr != NULL)
+    return ControlPtr->DataBrowserGetSetItemDataProc(itemID,propertyID,itemData,getValue);
+  else
+    return errDataBrowserPropertyNotSupported;
+} /* wxMacDataBrowserTableViewControl::DataBrowserGetSetItemDataProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
 
-   // 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()) && (m_dataViewControlPtr->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
-                     parent.IsOk() && (m_dataViewControlPtr->AddItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
-   // give allocated array space free again:
-    delete[] itemIDs;
+pascal void wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
-    wxDataViewCtrl *dvc = (wxDataViewCtrl*) m_dataViewControlPtr->GetWXPeer();
-    if (dvc->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT)
-    {
-        wxDataViewModel *model = GetOwner();
-        unsigned int colnum = dvc->GetColumnCount();
 
-        size_t i;
-        size_t count = items.GetCount();
-        for (i = 0; i < count; i++)
-        {
-            wxDataViewItem item = items[i];
-            DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+  if (ControlPtr != NULL)
+    ControlPtr->DataBrowserItemNotificationProc(itemID,message,itemData);
+} /* wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc(ControlRef, DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
 
-            int height = 20; // TODO find out standard height
-            unsigned int col;
-            for (col = 0; col < colnum; col++)
-            {
-                wxDataViewColumn *column = dvc->GetColumn( col );
-                if (column->IsHidden())
-                    continue;      // skip it!
+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 ((col != 0) && model->IsContainer(item) && !model->HasContainerColumns(item))
-                    continue;      // skip it!
 
-                wxDataViewCustomRenderer *renderer = wxDynamicCast( column->GetRenderer(), wxDataViewCustomRenderer );
-                if (renderer)
-                {
-                    wxVariant value;
-                    model->GetValue( value, item, column->GetModelColumn() );
-                    renderer->SetValue( value );
-                    height = wxMax( height, renderer->GetSize().y );
-                }
-            }
+  if (ControlPtr != NULL)
+    ControlPtr->DataBrowserDrawItemProc(itemID,propertyID,state,rectangle,bitDepth,colorDevice);
+} /* wxMacDataBrowserTableViewControl::DataBrowserDrawItemProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemState, Rect const*, SInt16, Boolean) */
 
-            if (height > 20)
-                m_dataViewControlPtr->SetRowHeight( itemID, height );
-        }
-   }
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
+{
+  wxMacDataBrowserTableViewControl* ControlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
 
-   // done:
-    return noFailureFlag;
-  }
 
-  virtual bool ItemChanged(wxDataViewItem const& item)
-  {
-    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+  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)));
 
-    wxCHECK_MSG(item.IsOk(),false,_("Changed item is invalid."));
-    if (m_dataViewControlPtr->UpdateItems(&itemID) == noErr)
-    {
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(m_dataViewControlPtr->GetWXPeer()));
 
-     // sent the equivalent wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
+  return ((ControlPtr != NULL) && ControlPtr->DataBrowserHitTestProc(itemID,propertyID,theRect,mouseRect));
+} /* wxMacDataBrowserTableViewControl::DataBrowserHitTestProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Rect const*) */
 
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetItem(item);
-     // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
-     // done
-      return true;
-    }
-    else
-      return false;
-  }
+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)));
 
-  virtual bool ItemsChanged(wxDataViewItemArray const& items)
-  {
-    bool noFailureFlag;
 
-    DataBrowserItemID* itemIDs;
+  if (ControlPtr != NULL)
+    return ControlPtr->DataBrowserTrackingProc(itemID,propertyID,theRect,startPt,modifiers);
+  else
+    return kDataBrowserNothingHit; 
+} /* wxMacDataBrowserTableViewControl::DataBrowserTrackingProc(ControlRef, DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
 
-    size_t noOfEntries;
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID)
+{
+  wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+  
+  
+  return ((controlPtr != NULL) && controlPtr->DataBrowserAcceptDragProc(dragRef,itemID));
+} /* wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc(ControlRef, DragReference, DataBrowserItemID) */
 
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef)
+{
+  wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+  
+  
+  return ((controlPtr != NULL) && controlPtr->DataBrowserAddDragItemProc(dragRef,itemID,itemRef));
+} /* wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc(ControlRef, DragReference, DataBrowserItemID, ItemReference*) */
 
-   // 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 = (m_dataViewControlPtr->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
-    if (noFailureFlag)
-    {
-      wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(m_dataViewControlPtr->GetWXPeer()));
+pascal Boolean wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef browser, DragReference dragRef, DataBrowserItemID itemID)
+{
+  wxMacDataBrowserTableViewControl* controlPtr(dynamic_cast<wxMacDataBrowserTableViewControl*>(wxMacControl::GetReferenceFromNativeControl(browser)));
+  
+  
+  return ((controlPtr != NULL) && controlPtr->DataBrowserReceiveDragProc(dragRef,itemID));
+} /* wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc(ControlRef, DragReference, DataBrowserItemID) */
 
-     // send for all changed items a wxWidget event:
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
+wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
+                                 :wxMacControl(peer)
+{
+  Rect bounds = wxMacGetBoundsForControl(peer,pos,size);
+  OSStatus err = ::CreateDataBrowserControl(MAC_WXHWND(peer->MacGetTopLevelWindowRef()),&bounds,kDataBrowserListView,&(this->m_controlRef));
 
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      for (size_t i=0; i<noOfEntries; ++i)
-      {
-        dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
-        dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
-      }
-    }
-   // release allocated array space:
-    delete[] itemIDs;
-   // done:
-    return noFailureFlag;
-  }
 
-  virtual bool ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
+  SetReferenceInNativeControl();
+  verify_noerr(err);
+ // 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)
   {
-    if (item.IsOk())
-    {
-      DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-      OSStatus          errorStatus;
-      wxDataViewCtrl*   dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(m_dataViewControlPtr->GetWXPeer()));
-
-     // 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 = m_dataViewControlPtr->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID);
-     // enable automatic updating again:
-      dataViewCtrlPtr->SetDeleting(false);
-      return (errorStatus == noErr);
-    }
-    else
-      return false;
+    gDataBrowserTableViewItemNotificationUPP =
+#if TARGET_API_MAC_OSX
+      (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
+#else
+      NewDataBrowserItemNotificationUPP(wxMacDataBrowserTableViewControl::DataBrowserItemNotificationProc);
+#endif
   }
-
-  virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+ // setup drag and drop callbacks:
+  if (gDataBrowserTableViewAcceptDragUPP  == NULL) gDataBrowserTableViewAcceptDragUPP  = NewDataBrowserAcceptDragUPP (wxMacDataBrowserTableViewControl::DataBrowserAcceptDragProc);
+  if (gDataBrowserTableViewAddDragItemUPP == NULL) gDataBrowserTableViewAddDragItemUPP = NewDataBrowserAddDragItemUPP(wxMacDataBrowserTableViewControl::DataBrowserAddDragItemProc);
+  if (gDataBrowserTableViewReceiveDragUPP == NULL) gDataBrowserTableViewReceiveDragUPP = NewDataBrowserReceiveDragUPP(wxMacDataBrowserTableViewControl::DataBrowserReceiveDragProc);
+
+  DataBrowserCallbacks callbacks; // variable definition
+
+  InitializeDataBrowserCallbacks(&callbacks,kDataBrowserLatestCallbacks);
+  callbacks.u.v1.getContextualMenuCallback = gDataBrowserTableViewGetContextualMenuUPP;
+  callbacks.u.v1.itemDataCallback          = gDataBrowserTableViewItemDataUPP;
+  callbacks.u.v1.itemCompareCallback       = gDataBrowserTableViewItemCompareUPP;
+  callbacks.u.v1.itemNotificationCallback  = gDataBrowserTableViewItemNotificationUPP;
+       callbacks.u.v1.acceptDragCallback        = gDataBrowserTableViewAcceptDragUPP;
+       callbacks.u.v1.addDragItemCallback       = gDataBrowserTableViewAddDragItemUPP;
+       callbacks.u.v1.receiveDragCallback       = gDataBrowserTableViewReceiveDragUPP;
+  this->SetCallbacks(&callbacks);
+
+ // 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);
+
+  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:
+  this->EnableCellSizeModification( ((style & wxDV_VARIABLE_LINE_HEIGHT) != 0), true );
+
+  DataBrowserSelectionFlags flags; // variable definition
+
+  if (this->GetSelectionFlags(&flags) == noErr) // get default settings
   {
-    bool noFailureFlag;
-
-    DataBrowserItemID* itemIDs;
-
-    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(m_dataViewControlPtr->GetWXPeer()));
-
-    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()) && (m_dataViewControlPtr->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
-                     parent.IsOk() && (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;
+    if ((style & wxDV_MULTIPLE) != 0)
+      flags &= ~kDataBrowserSelectOnlyOne;
+    else
+      flags |= kDataBrowserSelectOnlyOne;
+    (void) this->SetSelectionFlags(flags);
   }
 
-  virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col)
+  OptionBits attributes; // variable definition
+  
+  if (this->GetAttributes(&attributes) == noErr) // get default settings
   {
-    DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-    DataBrowserItemID parentID;
-
-    DataBrowserPropertyID propertyID;
-
-    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(m_dataViewControlPtr->GetWXPeer()));
-
-
-    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 ((m_dataViewControlPtr->GetPropertyID(col,&propertyID) == noErr) &&
-        (m_dataViewControlPtr->UpdateItems(parentID,1,&itemID,dataViewCtrlPtr->GetColumn(col)->GetPropertyID(),propertyID) == noErr))
-    {
-      wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,dataViewCtrlPtr->GetId());
-
-      dataViewEvent.SetEventObject(dataViewCtrlPtr);
-      dataViewEvent.SetColumn(col);
-      dataViewEvent.SetItem(item);
-     // send the equivalent wxWidget event:
-      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
-     // done
-      return true;
-    }
+    if ((style & wxDV_VERT_RULES) != 0)
+      attributes |= kDataBrowserAttributeListViewDrawColumnDividers;
     else
-      return false;
+      attributes &= ~kDataBrowserAttributeListViewDrawColumnDividers;
+    if ((style & wxDV_ROW_LINES) != 0)
+      attributes |= kDataBrowserAttributeListViewAlternatingRowColors;
+    else
+      attributes &= ~kDataBrowserAttributeListViewAlternatingRowColors;
+    (void) this->SetAttributes(attributes);
   }
 
-  virtual bool Cleared()
-  {
-    bool noFailureFlag = (m_dataViewControlPtr->RemoveItems() == noErr);
-    wxDataViewItem item;
-    wxDataViewItemArray array;
-    GetOwner()->GetChildren( item, array );
-    ItemsAdded( item, array );
-    m_dataViewControlPtr->SetScrollPosition(0, 0);
-    return noFailureFlag;
-  }
+  if ((style & wxDV_NO_HEADER) != 0)
+    this->SetHeaderButtonHeight(0);
+} /* wxMacDataBrowserTableViewControl::wxMacDataBrowserTableViewControl(wxWindow*, wxPoint const&, wxSize const&, long) */
 
-  virtual void Resort()
-  {
-    m_dataViewControlPtr->Resort();
-  }
+//
+// callback handling
+//
+OSStatus wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const* callbacks)
+{
+  return ::SetDataBrowserCallbacks(this->m_controlRef,callbacks);
+} /* wxMacDataBrowserTableViewControl::SetCallbacks(DataBrowserCallbacks const*) */
 
-private:
-  wxMacDataViewDataBrowserListViewControl* m_dataViewControlPtr;
-};
+OSStatus wxMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const* customCallbacks)
+{
+  return ::SetDataBrowserCustomCallbacks(this->m_controlRef,customCallbacks);
+} /* xMacDataBrowserTableViewControl::SetCustomCallbacks(DataBrowserCustomCallbacks const*) */
 
-// ---------------------------------------------------------
-// wxDataViewRenderer
-// ---------------------------------------------------------
-wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                   :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode)
+//
+// DnD handling
+//
+OSStatus wxMacDataBrowserTableViewControl::EnableAutomaticDragTracking(bool enable)
 {
+  return ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(this->m_controlRef),enable);
 }
 
-void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
+//
+// header handling
+//
+OSStatus wxMacDataBrowserTableViewControl::GetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc) const
 {
-  wxDataViewColumn* dataViewColumnPtr;
+  desc->version = kDataBrowserListViewLatestHeaderDesc; // if this statement is missing the next call will fail (NOT DOCUMENTED!!)
+  return ::GetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
+}
 
+OSStatus wxMacDataBrowserTableViewControl::SetHeaderDesc(DataBrowserPropertyID propertyID, DataBrowserListViewHeaderDesc* desc)
+{
+  return ::SetDataBrowserListViewHeaderDesc(this->m_controlRef,propertyID,desc);
+}
 
-  m_mode = mode;
-  dataViewColumnPtr = this->GetOwner();
-  if (dataViewColumnPtr != NULL)
-  {
-    wxDataViewCtrl* dataViewCtrlPtr(dataViewColumnPtr->GetOwner());
+//
+// layout handling
+//
+OSStatus wxMacDataBrowserTableViewControl::AutoSizeColumns()
+{
+  return AutoSizeDataBrowserListViewColumns(this->m_controlRef);
+}
 
-    if (dataViewCtrlPtr != NULL)
-    {
-      wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+OSStatus wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool enableHeight, bool enableWidth)
+{
+  return ::SetDataBrowserTableViewGeometry(this->GetControlRef(),enableWidth,enableHeight);
+} /* wxMacDataBrowserTableViewControl::EnableCellSizeModification(bool, bool) */
 
-      if (macDataViewListCtrlPtr != NULL)
-      {
-        DataBrowserPropertyFlags flags;
+OSStatus wxMacDataBrowserTableViewControl::GetAttributes(OptionBits* attributes)
+{
+  return ::DataBrowserGetAttributes(this->GetControlRef(),attributes);
+} /* wxMacDataBrowserTableViewControl::GetAttributes(OptionBits*) */
 
-        verify_noerr(macDataViewListCtrlPtr->GetPropertyFlags(dataViewColumnPtr->GetPropertyID(),&flags));
-        if ((mode == wxDATAVIEW_CELL_EDITABLE) || (mode == wxDATAVIEW_CELL_ACTIVATABLE))
-          flags |= kDataBrowserPropertyIsEditable;
-        else
-          flags &= ~kDataBrowserPropertyIsEditable;
-        verify_noerr(macDataViewListCtrlPtr->SetPropertyFlags(dataViewColumnPtr->GetPropertyID(),flags));
-      }
-    }
-  }
+OSStatus wxMacDataBrowserTableViewControl::GetColumnWidth(DataBrowserPropertyID propertyID, UInt16* width) const
+{
+  return ::GetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
-
-// ---------------------------------------------------------
-// wxDataViewCustomRenderer
-// ---------------------------------------------------------
-wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                         :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
+OSStatus wxMacDataBrowserTableViewControl::GetDefaultColumnWidth( UInt16 *width ) const
 {
+    return GetDataBrowserTableViewColumnWidth(this->m_controlRef, width );
 }
 
-wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
+OSStatus wxMacDataBrowserTableViewControl::GetDefaultRowHeight(UInt16* height) const
 {
-    delete m_DCPtr;
+  return ::GetDataBrowserTableViewRowHeight(this->m_controlRef,height);
 }
 
-void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
+OSStatus wxMacDataBrowserTableViewControl::GetHeaderButtonHeight(UInt16 *height)
 {
-    wxDataViewCtrl *view = GetOwner()->GetOwner();
-//    wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : view->GetForegroundColour();
-    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));
+  return ::GetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
 }
 
-wxDC* wxDataViewCustomRenderer::GetDC()
+OSStatus wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserPropertyPart part, Rect* bounds)
 {
-  if (m_DCPtr == NULL)
-  {
-    if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL))
-      return NULL;
-    m_DCPtr = new wxWindowDC(this->GetOwner()->GetOwner());
-  }
-  return m_DCPtr;
-}
+  return ::GetDataBrowserItemPartBounds(this->m_controlRef,item,propertyID,part,bounds);
+} /* wxMacDataBrowserTableViewControl::GetPartBounds(DataBrowserItemID, DataBrowswerPropertyID, DataBrowserPropertyPart, Rect*) */
 
-bool wxDataViewCustomRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID item, UInt16* height) const
 {
-  return true;
-}
+  return ::GetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
+} /* wxMacDataBrowserTableViewControl::GetRowHeight(DataBrowserItemID, UInt16*) const */
 
-void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
+OSStatus wxMacDataBrowserTableViewControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
 {
-  delete m_DCPtr;
-  m_DCPtr = newDCPtr;
+    return GetDataBrowserScrollPosition(this->m_controlRef, top , left );
 }
 
-WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::SetAttributes(OptionBits attributes)
+{
+  return ::DataBrowserChangeAttributes(this->GetControlRef(),attributes,~attributes);
+} /* wxMacDataBrowserTableViewControl::SetAttributes(OptionBits) */
+
+OSStatus wxMacDataBrowserTableViewControl::SetColumnWidth(DataBrowserPropertyID propertyID, UInt16 width)
 {
-  return kDataBrowserCustomType;
+  return ::SetDataBrowserTableViewNamedColumnWidth(this->m_controlRef,propertyID,width);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
+OSStatus wxMacDataBrowserTableViewControl::SetDefaultColumnWidth(UInt16 width)
+{
+  return ::SetDataBrowserTableViewColumnWidth(this->m_controlRef,width);
+}
 
-// ---------------------------------------------------------
-// wxDataViewTextRenderer
-// ---------------------------------------------------------
-wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                       :wxDataViewRenderer(varianttype,mode,align)
+OSStatus wxMacDataBrowserTableViewControl::SetDefaultRowHeight(UInt16 height)
 {
+  return ::SetDataBrowserTableViewRowHeight(this->m_controlRef,height);
 }
 
-bool wxDataViewTextRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::SetHasScrollBars(bool horiz, bool vert)
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
+  return ::SetDataBrowserHasScrollBars(this->m_controlRef,horiz,vert);
+} /* wxMacDataBrowserTableViewControl::SetHasScrollBars(bool, bool) */
 
-  wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
-  return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
-}
+OSStatus wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16 height)
+{
+  return ::SetDataBrowserListViewHeaderBtnHeight(this->m_controlRef,height);
+} /* wxMacDataBrowserTableViewControl::SetHeaderButtonHeight(UInt16) */
 
-WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle hiliteStyle)
 {
-  return kDataBrowserTextType;
-}
+  return ::SetDataBrowserTableViewHiliteStyle(this->m_controlRef,hiliteStyle);
+} /*wxMacDataBrowserTableViewControl::SetHiliteStyle(DataBrowserTableViewHiliteStyle)  */
 
-IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
+OSStatus wxMacDataBrowserTableViewControl::SetIndent(float Indent)
+{
+  return ::DataBrowserSetMetric(this->m_controlRef,kDataBrowserMetricDisclosureColumnPerDepthGap,true,Indent);
+} /* wxMacDataBrowserTableViewControl::SetIndent(float* Indent) */
 
-// ---------------------------------------------------------
-// wxDataViewTextRendererAttr
-// ---------------------------------------------------------
-wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                           :wxDataViewTextRenderer(varianttype,mode,align)
+OSStatus wxMacDataBrowserTableViewControl::SetItemRowHeight(DataBrowserItemID item, UInt16 height)
 {
+  return ::SetDataBrowserTableViewItemRowHeight(this->m_controlRef,item,height);
 }
 
-IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
+OSStatus wxMacDataBrowserTableViewControl::SetScrollPosition(UInt32 top, UInt32 left)
+{
+  return ::SetDataBrowserScrollPosition(this->m_controlRef,top,left);
+}
 
-// ---------------------------------------------------------
-// wxDataViewBitmapRenderer
-// ---------------------------------------------------------
-wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                         :wxDataViewRenderer(varianttype,mode,align)
+//
+// column handling
+//
+OSStatus wxMacDataBrowserTableViewControl::GetColumnCount(UInt32* numColumns) const
 {
+  return ::GetDataBrowserTableViewColumnCount(this->m_controlRef,numColumns);
 }
 
-bool wxDataViewBitmapRenderer::Render()
- // This method returns 'true' if
- //  - the passed bitmap is valid and it could be assigned to the native data browser;
- //  - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
- // In all other cases the method returns 'false'.
+OSStatus wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex* index) const
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
+  return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
+} /* wxMacDataBrowserTableViewControl::GetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex*) const */
 
-  wxBitmap bitmap;
+OSStatus wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID* propertyID) const
+{
+  for (*propertyID=kMinPropertyID; *propertyID<std::numeric_limits<DataBrowserPropertyID>::max(); ++(*propertyID))
+    if (this->IsUsedPropertyID(*propertyID) == errDataBrowserPropertyNotFound)
+      return noErr;
+  return errDataBrowserPropertyNotSupported;
+} /* wxMacDataBrowserTableViewControl::GetFreePropertyID(DataBrowserPropertyID*) const */
 
-  bitmap << this->GetValue();
-  if (bitmap.Ok())
-    return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
-  else
-    return true;
+OSStatus wxMacDataBrowserTableViewControl::GetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags *flags) const
+{
+  return ::GetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
 }
 
-WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef itemData, DataBrowserPropertyID* propertyID) const
 {
-  return kDataBrowserIconType;
-}
+  return ::GetDataBrowserItemDataProperty(itemData,propertyID);
+} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserItemDataRef, DataBrowserPropertyID*) */
 
-IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
+OSStatus wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex index, DataBrowserTableViewColumnID* propertyID) const
+{
+  return ::GetDataBrowserTableViewColumnProperty(this->m_controlRef,index,propertyID);
+} /* wxMacDataBrowserTableViewControl::GetPropertyID(DataBrowserTableViewColumnIndex, DataBrowserTableViewColumnID*) */
 
-// ---------------------------------------------------------
-// wxDataViewIconTextRenderer
-// ---------------------------------------------------------
-wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int WXUNUSED(align))
-                           :wxDataViewRenderer(varianttype,mode)
+OSStatus wxMacDataBrowserTableViewControl::IsUsedPropertyID(DataBrowserPropertyID propertyID) const
 {
-}
+ // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
+ // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
+ // the column position for the property id:
+  DataBrowserTableViewColumnIndex index;
+  
+  return ::GetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,&index);
+} /* wxMacDataBrowserTableViewControl::IsUsedPropertyId(DataBrowserPropertyID) const */
 
-bool wxDataViewIconTextRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID propertyID)
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
+  return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByProperty(DataBrowserTableViewColumnID) */
 
-  wxDataViewIconText iconText;
+OSStatus wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex index)
+{
+  DataBrowserTableViewColumnID propertyID;
 
-  iconText << this->GetValue();
 
-  wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+  this->GetPropertyID(index,&propertyID);
+  return ::RemoveDataBrowserTableViewColumn(this->m_controlRef,propertyID);
+} /* wxMacDataBrowserTableViewControl::RemoveColumnByIndex(DataBrowserTableViewColumnIndex) */
 
-  if (iconText.GetIcon().IsOk())
-    if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
-      return false;
-  return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
-}
+OSStatus wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index)
+{
+  return ::SetDataBrowserTableViewColumnPosition(this->m_controlRef,propertyID,index);
+} /* wxMacDataBrowserTableViewControl::SetColumnIndex(DataBrowserPropertyID, DataBrowserTableViewColumnIndex) */
 
-WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows)
 {
-  return kDataBrowserIconAndTextType;
+  return ::SetDataBrowserListViewDisclosureColumn(this->m_controlRef,propertyID,expandableRows);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+OSStatus wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags)
+{
+  return ::SetDataBrowserPropertyFlags(this->m_controlRef,propertyID,flags);
+} /* wxMacDataBrowserTableViewControl::SetPropertyFlags(DataBrowserPropertyID, DataBrowserPropertyFlags) */
 
+//
+// item handling
+//
+OSStatus wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
+{
+  return ::AddDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
+} /* wxMacDataBrowserTableViewControl::AddItems(DataBrowserItemID, UInt32, DataBrowserItemID const*, DataBrowserPropertyID) */
 
-// ---------------------------------------------------------
-// wxDataViewToggleRenderer
-// ---------------------------------------------------------
-wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int WXUNUSED(align))
-                         :wxDataViewRenderer(varianttype,mode)
+OSStatus wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID* id) const
 {
-}
+  ItemCount noOfItems;
+  OSStatus status;
+  
+  
+  status = this->GetItemCount(&noOfItems);
+  wxCHECK_MSG(status == noErr,status,_("Could not retrieve number of items"));
+  if (noOfItems == 0)
+  {
+    *id = 1;
+    return noErr;
+  }
+  else
+  {
+   // as there might be a lot of items in the data browser and mostly the data is added item by item the largest used ID number is roughly in the order of magnitude
+   // as the number of items; therefore, start from the number of items to look for a new ID:
+    for (*id=noOfItems; *id<std::numeric_limits<DataBrowserItemID>::max(); ++(*id))
+      if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
+        return noErr;
+   // as the first approach was not successful, try from the beginning:
+    for (*id=0; *id<noOfItems; ++(*id))
+      if (this->IsUsedItemID(*id) == errDataBrowserItemNotFound)
+        return noErr;
+   // sorry, data browser is full:
+    return errDataBrowserItemNotAdded;
+  }
+} /* wxMacDataBrowserTableViewControl::GetFreeItemID(DataBrowserItemID*) const */
 
-bool wxDataViewToggleRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, ItemCount* numItems) const
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
-  return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr);
-}
+  return GetDataBrowserItemCount(this->m_controlRef,container,recurse,state,numItems);
+} /* wxMacDataBrowserTableViewControl::GetItemCount(DataBrowserItemID, Boolean, DataBrowserItemState, ItemCount*) const */
 
-WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
 {
-  return kDataBrowserCheckboxType;
+  return GetDataBrowserTableViewItemID(this->m_controlRef,row,item);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
-
-// ---------------------------------------------------------
-// wxDataViewProgressRenderer
-// ---------------------------------------------------------
-wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& WXUNUSED(label), wxString const& varianttype, wxDataViewCellMode mode, int align)
-                           :wxDataViewRenderer(varianttype,mode,align)
+OSStatus wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, Handle items) const
 {
-}
+  return GetDataBrowserItems(this->m_controlRef,container,recurse,state,items);
+} /* wxMacDataBrowserTableViewControl::GetItems(DataBrowserItemID, Boolean, DataBrowserItemState, Handle) const */
 
-bool wxDataViewProgressRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::GetItemRow(DataBrowserItemID item, DataBrowserTableViewRowIndex* row) const
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
-  return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(),  0)                        == noErr) &&
-          (::SetDataBrowserItemDataMaximum(this->GetDataReference(),100)                        == noErr) &&
-          (::SetDataBrowserItemDataValue  (this->GetDataReference(),this->GetValue().GetLong()) == noErr));
+  return GetDataBrowserTableViewItemRow(this->m_controlRef,item,row);
 }
 
-WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::GetItemState(DataBrowserItemID item, DataBrowserItemState* state) const
 {
-  return kDataBrowserProgressBarType;
+  return ::GetDataBrowserItemState(this->m_controlRef,item,state);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
+OSStatus wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID itemID) const
+{
+ // as the Mac interface does not provide a function that checks if the property id is in use or not a function is chosen that should not
+ // lead to a large overhead for the call but returns an error code if the property id does not exist, here we use the function that returns
+ // the column position for the property id:
+  DataBrowserTableViewColumnIndex index;
+  
+  return ::GetDataBrowserTableViewItemRow(this->m_controlRef,itemID,&index);
+} /* wxMacDataBrowserTableViewControl::IsUsedItemID(DataBrowserItemID) const */
 
-// ---------------------------------------------------------
-// wxDataViewDateRenderer
-// ---------------------------------------------------------
-wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
-                       :wxDataViewRenderer(varianttype,mode,align)
+OSStatus wxMacDataBrowserTableViewControl::RemoveItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty)
 {
+  return ::RemoveDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty);
 }
 
-bool wxDataViewDateRenderer::Render()
+OSStatus wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const
 {
-  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
-  return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
-}
+  return ::RevealDataBrowserItem(this->m_controlRef,item,propertyID,options);
+} /* wxMacDataBrowserTableViewControl::RevealItem(DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options) const */
 
-WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType() const
+OSStatus wxMacDataBrowserTableViewControl::UpdateItems(DataBrowserItemID container, UInt32 numItems, DataBrowserItemID const* items, DataBrowserPropertyID preSortProperty,
+                                                       DataBrowserPropertyID propertyID) const
 {
-  return kDataBrowserDateTimeType;
+  return UpdateDataBrowserItems(this->m_controlRef,container,numItems,items,preSortProperty,propertyID);
 }
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
-
-// ---------------------------------------------------------
-// wxDataViewColumn
-// ---------------------------------------------------------
-
-void wxDataViewColumn::SetAlignment(wxAlignment align)
+//
+// item selection
+//
+size_t wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID& itemIDs) const
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  DataBrowserItemID* itemIDPtr;
+  Handle handle(::NewHandle(0));
+  
+  size_t noOfItems;
 
 
-  m_alignment = align;
-  if (dataViewCtrlPtr != NULL)
+  wxCHECK_MSG(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemIsSelected,handle) == noErr,0,_("Could not get selected items."));
+  noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
+  itemIDs.Empty();
+  itemIDs.Alloc(noOfItems);
+  HLock(handle);
+  itemIDPtr = (DataBrowserItemID*) (*handle);
+  for (size_t i=0; i<noOfItems; ++i)
   {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+    itemIDs.Add(*itemIDPtr);
+    ++itemIDPtr;
+  }
+  HUnlock(handle);
+  DisposeHandle(handle);
+  return noOfItems;
+} /* wxMacDataBrowserTableViewControl::GetSelectedItemIDs(wxArrayDataBrowserItemID&) const*/
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
+OSStatus wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID* first, DataBrowserItemID* last) const
+{
+  return ::GetDataBrowserSelectionAnchor(this->m_controlRef,first,last);
+} /* wxMacDataBrowserTableViewControl::GetSelectionAnchor(DataBrowserItemID*, DataBrowserItemID*) const */
 
-      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
-      switch (align)
-      {
-        case wxALIGN_CENTER:
-        case wxALIGN_CENTER_HORIZONTAL:
-          headerDescription.btnFontStyle.just = teCenter;
-          break;
-        case wxALIGN_LEFT:
-          headerDescription.btnFontStyle.just = teFlushLeft;
-          break;
-        case wxALIGN_RIGHT:
-          headerDescription.btnFontStyle.just = teFlushRight;
-          break;
-        default:
-          headerDescription.btnFontStyle.just = teFlushDefault;
-      }
-      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
-    }
-  }
-}
+OSStatus wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags* flags) const
+{
+  return ::GetDataBrowserSelectionFlags(this->m_controlRef,flags);
+} /* wxMacDataBrowserTableViewControl::GetSelectionFlags(DataBrowserSelectionFlags*) const */
 
-void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
+bool wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID item) const
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  return ::IsDataBrowserItemSelected(this->m_controlRef,item);
+} /* wxMacDataBrowserTableViewControl::IsItemSelected(DataBrowserItemID) const */
 
+OSStatus wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags flags)
+{
+  return ::SetDataBrowserSelectionFlags(this->m_controlRef,flags);
+} /* wxMacDataBrowserTableViewControl::SetSelectionFlags(DataBrowserSelectionFlags) */
 
-  wxDataViewColumnBase::SetBitmap(bitmap);
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+OSStatus wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32 numItems, DataBrowserItemID const* items, DataBrowserSetOption operation)
+{
+  return ::SetDataBrowserSelectedItems(this->m_controlRef, numItems, items, operation );
+} /* wxMacDataBrowserTableViewControl::SetSelectedItems(UInt32, DataBrowserItemID const*, DataBrowserSetOption) */
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
+OSStatus wxMacDataBrowserTableViewControl::GetSortOrder(DataBrowserSortOrder* order) const
+{
+  return ::GetDataBrowserSortOrder(this->m_controlRef,order);
+}
 
-      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
-      if (this->GetBitmap().Ok())
-        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."));
-    }
-  }
+OSStatus wxMacDataBrowserTableViewControl::GetSortProperty(DataBrowserPropertyID* propertyID) const
+{
+  return ::GetDataBrowserSortProperty(this->m_controlRef,propertyID);
 }
 
-void wxDataViewColumn::SetMaxWidth(int maxWidth)
+OSStatus wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID container, Boolean sortChildren)
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  return ::SortDataBrowserContainer(this->m_controlRef,container,sortChildren);
+} /* wxMacDataBrowserTableViewControl::Resort(DataBrowserItemID, Boolean) */
 
+OSStatus wxMacDataBrowserTableViewControl::SetSortOrder(DataBrowserSortOrder order)
+{
+  return ::SetDataBrowserSortOrder(this->m_controlRef,order);
+}
 
-  m_maxWidth = maxWidth;
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+OSStatus wxMacDataBrowserTableViewControl::SetSortProperty(DataBrowserPropertyID propertyID)
+{
+  return ::SetDataBrowserSortProperty(this->m_controlRef,propertyID);
+}
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
+//
+// container handling
+//
+OSStatus wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID containerID)
+{
+  return ::CloseDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::CloseContainer(DataBrowserItemID) */
 
-      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
-      headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
-      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
-    }
-  }
-}
+OSStatus wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID containerID)
+{
+  return ::OpenDataBrowserContainer(this->m_controlRef,containerID);
+} /* wxMacDataBrowserTableViewControl::OpenContainer(DataBrowserItemID) */
 
-void wxDataViewColumn::SetMinWidth(int minWidth)
+IMPLEMENT_ABSTRACT_CLASS(wxMacDataBrowserTableViewControl,wxMacControl)
+
+// ============================================================================
+// wxMacDataBrowserListViewControl
+// ============================================================================
+#pragma mark -
+//
+// column handling
+//
+OSStatus wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position)
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  return AddDataBrowserListViewColumn(this->m_controlRef,columnDesc,position);
+} /* wxMacDataBrowserListViewControl::AddColumn(DataBrowserListViewColumnDesc*, DataBrowserTableViewColumnIndex) */
 
+// ============================================================================
+// wxMacDataViewDataBrowserListViewControl
+// ============================================================================
+#pragma mark -
+//
+// constructors / destructor
+//
+wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
+                                        :wxMacDataBrowserListViewControl(peer,pos,size,style)
+{
+  if ((style & wxBORDER_NONE) != 0)
+    this->SetData(kControlNoPart,kControlDataBrowserIncludesFrameAndFocusTag,(Boolean) false);
+  (void) this->EnableAutomaticDragTracking();
+  (void) this->SetHiliteStyle(kDataBrowserTableViewFillHilite);
+} /* wxMacDataViewDataBrowserListViewControl::wxMacDataViewDataBrowserListViewControl(wxWindow* , const wxPoint&, const wxSize&, long) */
 
-  m_minWidth = minWidth;
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+//
+// column related methods (inherited from wxDataViewWidgetImpl)
+//
+bool wxMacDataViewDataBrowserListViewControl::ClearColumns(void)
+{
+  UInt32 noOfColumns;
+  
+  
+  wxCHECK_MSG(this->GetColumnCount(&noOfColumns) == noErr,false,_("Could not determine number of columns."));
+  for (UInt32 i=0; i<noOfColumns; ++i)
+    wxCHECK_MSG(this->RemoveColumnByIndex(0) == noErr,false,_("Could not remove column."));
+  return true;
+}
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
+bool wxMacDataViewDataBrowserListViewControl::DeleteColumn(wxDataViewColumn* columnPtr)
+{
+  return (this->RemoveColumnByProperty(columnPtr->GetNativeData()->GetPropertyID()) == noErr);
+}
 
-      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
-      headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
-      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
-    }
-  }
+void wxMacDataViewDataBrowserListViewControl::DoSetExpanderColumn(wxDataViewColumn const* columnPtr)
+{
+  this->SetDisclosureColumn(columnPtr->GetNativeData()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
 }
 
-void wxDataViewColumn::SetReorderable(bool reorderable)
+wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetColumn(unsigned int pos) const
 {
- // first set the internal flag of the column:
-  if (reorderable)
-    m_flags |= wxDATAVIEW_COL_REORDERABLE;
+  DataBrowserPropertyID propertyID;
+
+
+  if (this->GetPropertyID(pos,&propertyID) == noErr)
+    return this->GetColumnPtr(propertyID);
   else
-    m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
- // if the column is associated with a control change also immediately the flags of the control:
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+    return NULL;
+}
 
-  if (dataViewCtrlPtr != NULL)
+int wxMacDataViewDataBrowserListViewControl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
+{
+  if (columnPtr != NULL)
   {
-    DataBrowserPropertyFlags                       flags;
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+    DataBrowserTableViewColumnIndex Position;
 
-    wxCHECK_RET(macDataViewListCtrlPtr != NULL,                                                 _("Valid pointer to native data view control does not exist"));
-    wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
-    if (reorderable)
-      flags |= kDataBrowserListViewMovableColumn;
-    else
-      flags &= ~kDataBrowserListViewMovableColumn;
-    wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
+    wxCHECK_MSG(this->GetColumnIndex(columnPtr->GetNativeData()->GetPropertyID(),&Position) == noErr,wxNOT_FOUND,_("Could not determine column's position"));
+    return static_cast<int>(Position);
   }
+  else
+    return wxNOT_FOUND;
 }
 
-void wxDataViewColumn::SetResizeable(bool resizeable)
+bool wxMacDataViewDataBrowserListViewControl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
 {
- // first set the internal flag of the column:
-  if (resizeable)
-    m_flags |= wxDATAVIEW_COL_RESIZABLE;
-  else
-    m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
- // if the column is associated with a control change also immediately the flags of the control:
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  DataBrowserListViewColumnDesc columnDescription;
 
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+  DataBrowserPropertyID newPropertyID;
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
+  UInt32 noOfColumns;
 
-      verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription));
-      if (resizeable) {
-        headerDescription.minimumWidth = 0;
-        headerDescription.maximumWidth = 30000;
-      }
-      else {
-        headerDescription.minimumWidth = m_width;
-        headerDescription.maximumWidth = m_width;
-      }
-      verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription));
-      macDataViewListCtrlPtr->SetSortProperty(this->GetPropertyID());
-    }
-  }
-}
+  wxCFStringRef title(columnPtr->GetTitle(),m_font.Ok() ? dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer())->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
 
-void wxDataViewColumn::SetSortable(bool sortable)
-{
- // first set the internal flag of the column:
-  if (sortable)
-    m_flags |= wxDATAVIEW_COL_SORTABLE;
-  else
-    m_flags &= ~wxDATAVIEW_COL_SORTABLE;
- // if the column is associated with a control change also immediately the flags of the control:
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
 
-  if (dataViewCtrlPtr != NULL)
+ // try to get new ID for the column:
+  wxCHECK_MSG(this->GetFreePropertyID(&newPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
+ // set native data:
+  columnPtr->GetNativeData()->SetPropertyID(newPropertyID);
+ // create a column description, add column to the native control and do some final layout adjustments:
+  wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,title),  false,_("Column description could not be initialized."));
+  wxCHECK_MSG(this->AddColumn(&columnDescription,pos) == noErr,                  false,_("Column could not be added."));
+  wxCHECK_MSG(this->SetColumnWidth(newPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
+  wxCHECK_MSG(this->GetColumnCount(&noOfColumns) == noErr,                       false,_("Number of columns could not be determined."));
+  if (noOfColumns == 1)
   {
-    DataBrowserPropertyFlags                       flags;
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
-
-    wxCHECK_RET(macDataViewListCtrlPtr != NULL,                                                 _("Valid pointer to native data view control does not exist"));
-    wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
-    if (sortable)
-      flags |= kDataBrowserListViewSortableColumn;
-    else
-      flags &= ~kDataBrowserListViewSortableColumn;
-    wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
+    wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
+    
+    wxCHECK_MSG(dataViewCtrlPtr != NULL,false,_("wxWidget's control not initialized."));
+    dataViewCtrlPtr->AddChildren(wxDataViewItem());
+    return true;
   }
+  else
+    return this->Update(columnPtr);
 }
 
-void wxDataViewColumn::SetSortOrder(bool ascending)
+//
+// item related methods (inherited from wxDataViewWidgetImpl)
+//
+bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem const& parent, wxDataViewItem const& item)
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
-
-
-  m_ascending = ascending;
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+  DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
 
-      verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription));
-      if (ascending)
-        headerDescription.initialOrder = kDataBrowserOrderIncreasing;
-      else
-        headerDescription.initialOrder = kDataBrowserOrderDecreasing;
-      verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription));
-      macDataViewListCtrlPtr->SetSortProperty(this->GetPropertyID());
-    }
-  }
+  return ((  parent.IsOk()  && this->AddItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr) ||
+          (!(parent.IsOk()) && this->AddItem(kDataBrowserNoItem,&itemID) == noErr));
 }
 
-void wxDataViewColumn::SetTitle(wxString const& title)
+bool wxMacDataViewDataBrowserListViewControl::Add(wxDataViewItem const& parent, wxDataViewItemArray const& items)
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  bool noFailureFlag;
 
+  DataBrowserItemID* itemIDs;
 
-  m_title = title;
-  if (dataViewCtrlPtr != NULL)
-  {
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+  size_t noOfEntries;
 
-    if (macDataViewListCtrlPtr != NULL)
-    {
-      DataBrowserListViewHeaderDesc headerDescription;
-      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;
-      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
-    }
-  }
+ // 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->AddItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
+                   parent.IsOk() && (this->AddItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
+ // give allocated array space free again:
+  delete[] itemIDs;
+ // done:
+  return noFailureFlag;
 }
 
-void wxDataViewColumn::SetWidth(int width)
+void wxMacDataViewDataBrowserListViewControl::Collapse(wxDataViewItem const& item)
 {
-  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+  this->CloseContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+}
 
+void wxMacDataViewDataBrowserListViewControl::EnsureVisible(wxDataViewItem const& item, const wxDataViewColumn* columnPtr)
+{
+  DataBrowserPropertyID propertyID;
 
-  if ((width >= m_minWidth) && (width <= m_maxWidth))
-  {
-    m_width = width;
-    if (dataViewCtrlPtr != NULL)
-    {
-      wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
 
-      if (macDataViewListCtrlPtr != NULL)
-        wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(this->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
-    }
-  }
+  if (columnPtr != NULL)
+    propertyID = columnPtr->GetNativeData()->GetPropertyID();
+  else
+    propertyID = kDataBrowserNoItem;
+  this->RevealItem(reinterpret_cast<DataBrowserItemID>(item.GetID()),propertyID,kDataBrowserRevealOnly);
 }
 
-void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
+void wxMacDataViewDataBrowserListViewControl::Expand(wxDataViewItem const& item)
 {
-    // see wxGTK native wxDataViewColumn implementation
-    wxFAIL_MSG( "not implemented" );
+  this->OpenContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 }
 
-bool wxDataViewColumn::IsSortKey() const
+unsigned int wxMacDataViewDataBrowserListViewControl::GetCount(void) const
 {
-    wxDataViewCtrl * const dataViewCtrlPtr(GetOwner());
-    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(
-        dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(
-            dataViewCtrlPtr->GetPeer()));
+  ItemCount noOfItems;
 
-    DataBrowserPropertyID propertyID;
-    return macDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr &&
-            propertyID == m_propertyID;
+
+  wxCHECK_MSG(this->GetItemCount(&noOfItems) == noErr,0,_("Could not determine number of items"));
+  return noOfItems;
 }
 
-//-----------------------------------------------------------------------------
-// wxDataViewCtrl
-//-----------------------------------------------------------------------------
+wxRect wxMacDataViewDataBrowserListViewControl::GetRectangle(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+{
+  Rect MacRectangle;
+
 
+  if (this->GetPartBounds(reinterpret_cast<DataBrowserItemID>(item.GetID()),columnPtr->GetNativeData()->GetPropertyID(),kDataBrowserPropertyContentPart,&MacRectangle) == noErr)
+  {
+    wxRect rectangle;
 
-wxDataViewCtrl::~wxDataViewCtrl()
-{
-   ClearColumns();
+    ::wxMacNativeToRect(&MacRectangle,&rectangle);
+    return rectangle;
+  }
+  else
+    return wxRect();
 }
 
-void wxDataViewCtrl::Init()
+bool wxMacDataViewDataBrowserListViewControl::IsExpanded(wxDataViewItem const& item) const
 {
-  m_CustomRendererPtr = NULL;
-  m_Deleting          = false;
-  m_macIsUserPane     = false;
-  m_cgContext         = NULL;
+  DataBrowserItemState state;
+
+
+  return ((this->GetItemState(reinterpret_cast<DataBrowserItemID>(item.GetID()),&state) == noErr) &&
+          (state & kDataBrowserContainerIsOpen != 0));
 }
 
-bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
+bool wxMacDataViewDataBrowserListViewControl::Reload(void)
 {
-  if (!(this->wxControl::Create(parent,id,pos,size,style & ~(wxHSCROLL | wxVSCROLL),validator)))
-    return false;
+  bool noFailureFlag;
 
-#ifdef __WXMAC__
-  MacSetClipChildren(true) ;
-#endif
+  wxDataViewItemArray dataViewChildren;
 
-  m_peer = new wxMacDataViewDataBrowserListViewControl(this,pos,size,style);
 
-  if ( style & wxBORDER_NONE )
-    m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false ) ;
+  noFailureFlag = (this->RemoveItems() == noErr);
+  this->SetScrollPosition(0,0); // even after having removed all items the scrollbars may remain at their old position -> reset them
+  this->GetDataViewCtrl()->GetModel()->GetChildren(wxDataViewItem(),dataViewChildren);
+  this->GetDataViewCtrl()->GetModel()->ItemsAdded(wxDataViewItem(),dataViewChildren);
 
-  this->MacPostControlCreate(pos,size);
-  ::SetAutomaticControlDragTrackingEnabledForWindow(::GetControlOwner(m_peer->GetControlRef()),true);
+  return noFailureFlag;
+}
 
-  InstallControlEventHandler(m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL);
+bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem const& parent, wxDataViewItem const& item)
+{
+  DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 
-  ::SetDataBrowserTableViewHiliteStyle( m_peer->GetControlRef(), kDataBrowserTableViewFillHilite );
 
-  return true;
+  return (this->RemoveItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr);
 }
 
-wxSize wxDataViewCtrl::DoGetBestSize() const
+bool wxMacDataViewDataBrowserListViewControl::Remove(wxDataViewItem const& parent, wxDataViewItemArray const& items)
 {
-    wxSize best = wxControl::DoGetBestSize();
-    best.y = 80;
-    
-    return best;
-}
-
-/*static*/
-wxVisualAttributes wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
-{
-    wxVisualAttributes attr;
+  bool noFailureFlag;
 
-    attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
-    attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
-    //attr.font.CreateSystemFont(wxOSX_SYSTEM_FONT_VIEWS);
+  DataBrowserItemID* itemIDs;
 
-    return attr;
-}
-
-bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
-{
-  if (!wxDataViewCtrlBase::AssociateModel(model))
-    return false;
+  size_t noOfEntries;
 
-  model->AddNotifier(new wxMacDataViewModelNotifier(dynamic_cast<wxMacDataViewDataBrowserListViewControl*>(m_peer)));
 
-  return true;
+ // 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->RemoveItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr) ||
+                   parent.IsOk() && (this->RemoveItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty) == noErr));
+ // give allocated array space free again:
+  delete[] itemIDs;
+ // done:
+  return noFailureFlag;
 }
 
-bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
+bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewColumn const* columnPtr)
 {
-   return wxDataViewCtrl::InsertColumn( GetColumnCount(), columnPtr );
+  return (this->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,columnPtr->GetNativeData()->GetPropertyID()) == noErr);
 }
 
-bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
+bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem const& parent, wxDataViewItem const& item)
 {
-   return wxDataViewCtrl::InsertColumn( 0, columnPtr );
-}
+  DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 
-bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
-{
-  DataBrowserListViewColumnDesc columnDescription;
 
-  DataBrowserPropertyID NewPropertyID;
+  if (parent.IsOk())
+    return (this->UpdateItem(reinterpret_cast<DataBrowserItemID>(parent.GetID()),&itemID) == noErr);
+  else
+    return (this->UpdateItem(kDataBrowserNoItem,&itemID) == noErr);
+}
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+bool wxMacDataViewDataBrowserListViewControl::Update(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+{
+  bool noFailureFlag;
 
-  wxCFStringRef title(columnPtr->GetTitle(),m_font.Ok() ? this->GetFont().GetEncoding() : wxLocale::GetSystemEncoding());
+  DataBrowserItemID* itemIDs;
 
+  size_t noOfEntries;
 
- // 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::InsertColumn(pos,columnPtr) &&
-              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,pos) == 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());
-  }
+ // convert all valid data view items to data browser items:
+  itemIDs = ::CreateDataBrowserItemIDArray(noOfEntries,items);
+  if (parent.IsOk())
+    noFailureFlag = (this->UpdateItems(reinterpret_cast<DataBrowserItemID>(parent.GetID()),noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
   else
-    MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
+    noFailureFlag = (this->UpdateItems(kDataBrowserNoItem,noOfEntries,itemIDs,kDataBrowserItemNoProperty,kDataBrowserItemNoProperty) == noErr);
+ // release allocated array space:
+  delete[] itemIDs;
  // done:
-  return true;
+  return noFailureFlag;
 }
 
-bool wxDataViewCtrl::ClearColumns()
+//
+// model related methods
+//
+bool wxMacDataViewDataBrowserListViewControl::AssociateModel(wxDataViewModel* WXUNUSED(model))
 {
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
-
-  while (m_ColumnPointers.begin() != m_ColumnPointers.end())
-  {
-    wxCHECK_MSG(MacDataViewListCtrlPtr->RemoveColumnByProperty(m_ColumnPointers.begin()->first) == noErr,false,_("Could not remove column."));
-    delete m_ColumnPointers.begin()->second;
-    m_ColumnPointers.erase(m_ColumnPointers.begin());
-  }
   return true;
 }
 
-bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
-{
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
-
-  if ((MacDataViewListCtrlPtr->RemoveColumnByProperty(columnPtr->GetPropertyID()) == noErr) && (m_ColumnPointers.erase(columnPtr->GetPropertyID()) > 0))
-  {
-    delete columnPtr;
-    return true;
-  }
-  else
-    return false;
-}
-
-wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
+//
+// selection related methods (inherited from wxDataViewWidgetImpl)
+//
+int wxMacDataViewDataBrowserListViewControl::GetSelections(wxDataViewItemArray& sel) const
 {
-  DataBrowserPropertyID propertyID;
-
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  size_t noOfSelectedItems;
 
+  wxArrayDataBrowserItemID itemIDs;
 
-  if (MacDataViewListCtrlPtr->GetPropertyID(pos,&propertyID) == noErr)
-  {
-    ColumnPointerHashMapType::const_iterator Result(m_ColumnPointers.find(propertyID));
 
-    if (Result != m_ColumnPointers.end())
-      return Result->second;
-    else
-      return NULL;
-  }
-  else
-    return NULL;
+  noOfSelectedItems = this->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);
 }
 
-unsigned int wxDataViewCtrl::GetColumnCount() const
+bool wxMacDataViewDataBrowserListViewControl::IsSelected(wxDataViewItem const& item) const
 {
-  return m_ColumnPointers.size();
+  return this->IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 }
 
-int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
+void wxMacDataViewDataBrowserListViewControl::Select(wxDataViewItem const& item)
 {
-  if (columnPtr != NULL)
-  {
-    DataBrowserTableViewColumnIndex                Position;
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 
-    wxCHECK_MSG(MacDataViewListCtrlPtr->GetColumnIndex(columnPtr->GetPropertyID(),&Position) == noErr,-1,_("Could not determine column's position"));
-    return static_cast<int>(Position);
-  }
-  else
-    return wxNOT_FOUND;
+
+  this->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
 }
 
-void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
+void wxMacDataViewDataBrowserListViewControl::SelectAll(void)
 {
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  DataBrowserItemID* itemIDPtr;
+
+  Handle handle(::NewHandle(0));
 
+  size_t noOfItems;
 
-  MacDataViewListCtrlPtr->CloseContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
+
+  wxCHECK_RET(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
+  noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
+  ::HLock(handle);
+  itemIDPtr = (DataBrowserItemID*) (*handle);
+  this->SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsAssign);
+  ::HUnlock(handle);
+  ::DisposeHandle(handle);
 }
 
-void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+void wxMacDataViewDataBrowserListViewControl::Unselect(wxDataViewItem const& item)
 {
-  ExpandAncestors(item);
+  DataBrowserItemID itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
 
-  if (item.IsOk())
-  {
-    DataBrowserPropertyID propertyID;
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
 
-    if (columnPtr != NULL)
-      propertyID = columnPtr->GetPropertyID();
-    else
-      propertyID = kDataBrowserNoItem;
-    MacDataViewListCtrlPtr->RevealItem(reinterpret_cast<DataBrowserItemID>(item.GetID()),propertyID,kDataBrowserRevealOnly);
-  }
+  this->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
 }
 
-void wxDataViewCtrl::Expand(wxDataViewItem const& item)
+void wxMacDataViewDataBrowserListViewControl::UnselectAll(void)
 {
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  DataBrowserItemID* itemIDPtr;
 
+  Handle handle(::NewHandle(0));
 
-  MacDataViewListCtrlPtr->OpenContainer(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-}
+  size_t noOfItems;
 
-bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
-{
-  if (item.IsOk())
-  {
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
-    DataBrowserItemState state = 0;
-    OSStatus err = ::GetDataBrowserItemState( 
-       MacDataViewListCtrlPtr->GetControlRef(), 
-       reinterpret_cast<DataBrowserItemID>(item.GetID()),
-       &state );
-    if ((err == 0) && (state & kDataBrowserContainerIsOpen))
-       return true;
-  }
-  return false;
+
+  wxCHECK_RET(this->GetItems(kDataBrowserNoItem,true,kDataBrowserItemAnyState,handle) == noErr,_("Could not get items."));
+  noOfItems = static_cast<size_t>(::GetHandleSize(handle)/sizeof(DataBrowserItemID));
+  ::HLock(handle);
+  itemIDPtr = (DataBrowserItemID*) (*handle);
+  this->SetSelectedItems(noOfItems,itemIDPtr,kDataBrowserItemsRemove);
+  ::HUnlock(handle);
+  ::DisposeHandle(handle);
 }
 
-wxDataViewColumn* wxDataViewCtrl::GetSortingColumn() const
+//
+// sorting related methods
+//
+wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetSortingColumn(void) const
 {
   DataBrowserPropertyID propertyID;
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
 
-  if (MacDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr)
+  if (this->GetSortProperty(&propertyID) == noErr)
     return this->GetColumnPtr(propertyID);
   else
     return NULL;
 }
 
-unsigned int wxDataViewCtrl::GetCount() const
+void wxMacDataViewDataBrowserListViewControl::Resort(void)
 {
-  ItemCount noOfItems;
-
-
-  wxCHECK_MSG(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer)->GetItemCount(&noOfItems) == noErr,0,_("Could not determine number of items"));
-  return noOfItems;
+  (void) this->Resort();
 }
 
-wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
+//
+// other methods (inherited from wxDataViewWidgetImpl)
+//
+void wxMacDataViewDataBrowserListViewControl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
 {
-  if (item.IsOk() && (columnPtr != NULL))
-  {
-    Rect                                           MacRectangle;
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
-    if (MacDataViewListCtrlPtr->GetPartBounds(reinterpret_cast<DataBrowserItemID>(item.GetID()),columnPtr->GetPropertyID(),kDataBrowserPropertyContentPart,&MacRectangle) == noErr)
-    {
-      wxRect rectangle;
-
-      ::wxMacNativeToRect(&MacRectangle,&rectangle);
-      return rectangle;
-    }
-    else
-      return wxRect();
-  }
-  else
-    return wxRect();
+ // not yet implemented:
+  item = wxDataViewItem();
+  columnPtr = NULL;
 }
 
-wxDataViewItem wxDataViewCtrl::GetSelection() const
+void wxMacDataViewDataBrowserListViewControl::DoSetIndent(int indent)
 {
-  wxArrayDataBrowserItemID itemIDs;
-
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-
-
-  if (MacDataViewListCtrlPtr->GetSelectedItemIDs(itemIDs) > 0)
-    return wxDataViewItem(reinterpret_cast<void*>(itemIDs[0]));
-  else
-    return wxDataViewItem();
+  this->SetIndent(static_cast<float>(indent));
 }
 
-int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
+void wxMacDataViewDataBrowserListViewControl::SetRowHeight(wxDataViewItem const& item, unsigned int height)
 {
-  size_t NoOfSelectedItems;
-
-  wxArrayDataBrowserItemID itemIDs;
-
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(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);
+  this->SetItemRowHeight(reinterpret_cast<DataBrowserItemID>(item.GetID()),static_cast<UInt16>(height));
 }
 
-void wxDataViewCtrl::HitTest(wxPoint const& WXUNUSED(point), wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
+void wxMacDataViewDataBrowserListViewControl::OnSize(void)
 {
-  item = wxDataViewItem();
-  columnPtr = NULL;
+  UInt32 noOfColumns;
+  
+  
+  this->GetColumnCount(&noOfColumns);
+  if (noOfColumns <= 1) // no horizontal scroll bar and the only column expands to the width of the whole control
+  {
+    this->SetHasScrollBars(false,true);
+    this->AutoSizeColumns();
+  }
+  else // otherwise keep the current column size and have scrollbars in both directions
+    this->SetHasScrollBars(true,true);
 }
 
-bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
+//
+// callback functions (inherited from wxMacDataBrowserTableViewControl)
+//
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserCompareProc(DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty)
 {
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  DataBrowserSortOrder sortOrder;
 
+  DataBrowserTableViewColumnIndex modelColumnIndex;
+  
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
+  
 
-  return MacDataViewListCtrlPtr->IsItemSelected(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-}
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+  if (sortProperty >= kMinPropertyID)
+  {
+   // variable definition and initialization:
+    wxDataViewColumn* ColumnPtr(this->GetColumnPtr(sortProperty));
+    
+    wxCHECK_MSG(ColumnPtr != NULL,false,_("Could not determine column index."));
+    modelColumnIndex = ColumnPtr->GetModelColumn();
+  }
+  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 wxDataViewCtrl::SelectAll()
+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.
 {
-  DataBrowserItemID* itemIDPtr;
-
-  Handle handle(::NewHandle(0));
+  wxArrayDataBrowserItemID itemIDs;
 
-  size_t NoOfItems;
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
 
+  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());
 
-  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);
-}
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  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*) */
 
-void wxDataViewCtrl::Select(wxDataViewItem const& item)
+OSStatus wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue)
 {
-  if (item.IsOk())
+  if (getValue)
   {
-    ExpandAncestors(item);
-  
-    DataBrowserItemID                              itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+   // variable definitions:
+    wxDataViewCtrl* dataViewCtrlPtr;
+    
+    dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+    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
+    {
+     // variable definitions:
+      OSStatus          errorStatus;
+      wxDataViewColumn* dataViewColumnPtr;
+      
+      wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,errDataBrowserNotConfigured,_("Pointer to model not set correctly."));
+      dataViewColumnPtr = this->GetColumnPtr(propertyID);
+      wxCHECK_MSG((dataViewColumnPtr != NULL) && (dataViewColumnPtr->GetRenderer() != NULL),errDataBrowserNotConfigured,_("There is no column or renderer for the specified column index."));
+
+      wxDataViewItem dvItem(reinterpret_cast<void*>(itemID));
+      unsigned int   col = dataViewColumnPtr->GetModelColumn();
+            
+      switch (dataViewColumnPtr->GetRenderer()->GetNativeData()->GetPropertyType())
+      {
+        case kDataBrowserCheckboxType:
+          {
+           // variable definition:
+            ThemeButtonValue buttonValue;
 
-    MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsAdd);
+            errorStatus = ::GetDataBrowserItemDataButtonValue(itemData,&buttonValue);
+            if (errorStatus == noErr)
+            {
+              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;
+              }
+              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;
+              }
+              else
+                return errDataBrowserInvalidPropertyData;
+            }
+            else
+              return errorStatus;
+          } /* block */
+        case kDataBrowserTextType:
+          {
+           // variable definitions:
+            CFStringRef stringReference;
+
+            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;
+            }
+            else
+              return errorStatus;
+          } /* block */
+        default:
+          return errDataBrowserPropertyNotSupported;
+      }
+    }
   }
-}
+  else
+  {
+    if (propertyID >= kMinPropertyID) // in case data columns set the data
+    {
+     // variable definitions:
+      wxVariant         variant;
+      wxDataViewColumn* dataViewColumnPtr;
+      wxDataViewCtrl*   dataViewCtrlPtr;
+      
+      dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+      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."));
+      dataViewColumnPtr = this->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());
+      if (!(variant.IsNull()))
+      {
+        dataViewColumnPtr->GetRenderer()->GetNativeData()->SetItemDataRef(itemData);
+        dataViewColumnPtr->GetRenderer()->SetValue(variant);
+        wxCHECK_MSG(dataViewColumnPtr->GetRenderer()->Render(),errDataBrowserNotConfigured,_("Rendering failed."));
+      }
+      return noErr;
+    }
+    else // react on special system requests
+    {
+      switch (propertyID)
+      {
+        case kDataBrowserContainerIsClosableProperty:
+          {
+           // variable definitions:
+            wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
+            
+            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->GetWXPeer()));
+            
+            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:
+            wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
+            
+            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."));
+            return ::SetDataBrowserItemDataBooleanValue(itemData,dataViewCtrlPtr->GetModel()->IsContainer(wxDataViewItem(reinterpret_cast<void*>(itemID))));
+          } /* block */
+        case kDataBrowserItemIsEditableProperty:
+          return ::SetDataBrowserItemDataBooleanValue(itemData,true);
+      }
+    }
+  }
+  return errDataBrowserPropertyNotSupported;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserGetSetItemDataProc(DataBrowserItemID, DataBrowserPropertyID, DataBrowserItemDataRef, Boolean) */
 
-void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
+void wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
 {
-    size_t const NoOfSelections = sel.GetCount();
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
 
-    wxDataViewItem last_parent;
 
-    size_t i;
-    for (i = 0; i < NoOfSelections; i++)
+ // 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)
     {
-        wxDataViewItem item = sel[i];
-        wxDataViewItem parent = GetModel()->GetParent( item );
-        if (parent)
+      case kDataBrowserContainerClosed:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
         {
-            if (parent != last_parent)
-                ExpandAncestors(item);
-        }
-        last_parent = parent;
+         // 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->AddChildren(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+        } /* block */
+        break;
+      case kDataBrowserEditStarted:
+        dataViewCtrlPtr->FinishCustomItemEditing(); // stop editing of a custom item first (if necessary)
+        {
+         // initialize wxWidget event:
+          DataBrowserPropertyID propertyID;  
+          wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
+          
+          dataViewEvent.SetEventObject(dataViewCtrlPtr);
+          dataViewEvent.SetItem(wxDataViewItem(reinterpret_cast<void*>(itemID)));
+          if (this->GetPropertyID(itemData,&propertyID) == noErr)
+          {
+           // variable definition and initialization:
+            DataBrowserTableViewColumnIndex columnIndex;
+            
+            wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+            dataViewEvent.SetColumn(columnIndex);
+            dataViewEvent.SetDataViewColumn(this->GetColumnPtr(propertyID));          
+          }
+         // 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;
+
+            wxCHECK_RET(this->GetColumnIndex(propertyID,&columnIndex),_("Column index not found."));
+            dataViewEvent.SetColumn(columnIndex);
+            dataViewEvent.SetDataViewColumn(this->GetColumnPtr(propertyID));          
+          }
+         // 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->GetColumnPtr(i);
+           // variable definition:
+            UInt16 columnWidth;
+            
+            wxCHECK_RET(this->GetColumnWidth(columnPtr->GetNativeData()->GetPropertyID(),&columnWidth) == noErr,_("Column width could not be determined"));
+            columnPtr->SetWidthVariable(columnWidth);
+          }
+         // 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))
+            {
+             // 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);
+              }
+            }
+          }
+        } /* block */
+        break;
     }
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserItemNotificationProc(DataBrowserItemID, DataBrowserItemNotification, DataBrowserItemDataRef) */
 
-    DataBrowserItemID* itemIDs;
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+void wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice)
+{
+  DataBrowserTableViewColumnIndex columnIndex;
 
-    itemIDs = new DataBrowserItemID[NoOfSelections];
-    for (i=0; i<NoOfSelections; ++i)
-      itemIDs[i] = reinterpret_cast<DataBrowserItemID>(sel[i].GetID());
-    MacDataViewListCtrlPtr->SetSelectedItems(NoOfSelections,itemIDs,kDataBrowserItemsAssign);
-    delete[] itemIDs;
-}
+  wxDataViewColumn* dataViewColumnPtr;
 
-void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
-{
-  if (item.IsOk())
+  wxDataViewCtrl* dataViewCtrlPtr;
+  
+  wxDataViewCustomRenderer* dataViewCustomRendererPtr;
+
+  wxVariant dataToRender;
+
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  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 = this->GetColumnPtr(propertyID);
+  wxCHECK_RET(dataViewColumnPtr != NULL,_("No column for the specified column 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,dataViewColumnPtr->GetModelColumn());
+  dataViewCustomRendererPtr->SetValue(dataToRender);
+
+ // try to determine the content's size (drawable part):
+  Rect      content;
+  RgnHandle rgn(NewRgn());
+  UInt16    headerHeight;
+
+  if (GetControlRegion(m_controlRef,kControlContentMetaPart,rgn) == noErr)
+    GetRegionBounds(rgn,&content);
+  else
+    GetControlBounds(m_controlRef, &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),
+                   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)
   {
-    DataBrowserItemID                              itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+      
+      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 );
+  }
 
-    MacDataViewListCtrlPtr->SetSelectedItems(1,&itemID,kDataBrowserItemsRemove);
+  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) */
 
-void wxDataViewCtrl::UnselectAll()
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit)
 {
-  DataBrowserItemID* itemIDPtr;
+  return false;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserEditItemProc(DataBrowserItemID, DataBrowserPropertyID, CFStringRef, Rect*, Boolean*) */
 
-  Handle handle(::NewHandle(0));
+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*) */
 
-  size_t NoOfItems;
+DataBrowserTrackingResult wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point WXUNUSED(startPt), EventModifiers WXUNUSED(modifiers))
+{
+  wxDataViewColumn* dataViewColumnPtr;
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  wxDataViewCtrl* dataViewCtrlPtr;
+  
+  wxDataViewCustomRenderer* dataViewCustomRendererPtr;
+  
+  wxDataViewItem dataViewCustomRendererItem;
+
+
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+  dataViewCustomRendererItem = reinterpret_cast<void*>(itemID);
+  wxCHECK_MSG(dataViewCustomRendererItem.IsOk(),kDataBrowserNothingHit,_("Invalid data view item"));
+  dataViewColumnPtr = this->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);
+  }
+ // 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);
+  }
+  return kDataBrowserContentHit;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserTrackingProc(DataBrowserItemID, DataBrowserPropertyID, Rect const*, Point, EventModifiers) */
 
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference dragRef, DataBrowserItemID itemID)
+{
+  bool acceptDrag;
 
-  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);
-}
+  UInt16 noOfDraggedItems;
 
-// data handling:
-void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem)
-{
-  int NoOfChildren;
+  wxDataViewCtrl* dataViewCtrlPtr;
 
-  wxDataViewItemArray items;
 
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
 
-  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
-}
+ // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
+  ::CountDragItems(dragRef,&noOfDraggedItems);
+  for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
+  {
+   // collect native information:
+    ItemReference          itemRef;
+    wxDataObjectComposite* dataObjects;
+    wxMemoryBuffer         buffer;
+    
+    ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
+    dataObjects = this->GetDnDDataObjects(dragRef,itemRef);
+   // create wxWidget's event:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE,dataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
+                                                            // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
+    dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+    dataViewEvent.SetDataObject(dataObjects);
+    dataViewEvent.SetDataFormat(this->GetDnDDataFormat(dataObjects));
+    if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
+    {
+      dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
+      dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
+      buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
+      dataViewEvent.SetDataBuffer(buffer.GetData());
+    }
 
-void wxDataViewCtrl::FinishCustomItemEditing()
+   // send event:
+    acceptDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
+    delete dataObjects;
+    if (!acceptDrag)
+      return false;
+  }
+  return true;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserAcceptDragProc(DragReference, DataBrowserItemID) */
+
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference dragRef, DataBrowserItemID itemID, ItemReference* itemRef)
 {
-  if (this->GetCustomRendererItem().IsOk())
+  Boolean addDragItem;
+
+  wxDataViewCtrl* dataViewCtrlPtr;
+  
+  wxDataViewItem dataViewItem;
+
+
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+  dataViewItem = reinterpret_cast<void*>(itemID);
+  wxCHECK_MSG(dataViewItem.IsOk(),false,_("Invalid data view item"));
+
+ // send a begin drag event and proceed with dragging unless the event is vetoed:
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG,dataViewCtrlPtr->GetId());
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem(dataViewItem);
+  dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+ // the dataview event object is also initialized with a default set of data; as it is a set of data and the user should be able to easily complete
+ // the object a wxDataObjectComposite object is used;
+ // currently, the composite object only contains a TAB concatenated string of all data:
+  wxDataObjectComposite* dataObject(new wxDataObjectComposite());
+  
+  dataObject->Add(new wxTextDataObject(::ConcatenateDataViewItemValues(dataViewCtrlPtr,dataViewItem)));
+  dataViewEvent.SetDataObject(dataObject);
+ // check if event has not been vetoed:
+  addDragItem = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
+  if (addDragItem)
   {
-    this->GetCustomRendererPtr()->FinishEditing();
-    this->SetCustomRendererItem(wxDataViewItem());
-    this->SetCustomRendererPtr (NULL);
+   // for the internal drag & drop functions create two flavors:
+   //  - the data browser's item id;
+   //  - the data contained the dataview event object (if available).
+   // Definition: a flavor is the type dependent representation of identical data.
+   // Example: a number can be represented by its value and by its value converted to a string. In this case the flavor
+   //          of the number's internal representation is typeSInt32 while its string representation has got the flavor 'TEXT'.
+   // Item id is one of the flavors:
+    wxCHECK_MSG(::AddDragItemFlavor(dragRef,*itemRef,typeUInt32,&itemID,sizeof(itemID),0) == noErr,false,_("Unable to handle native drag&drop data"));
+   // if the dataview event object contains data it is used for additional flavors; all natively known flavors are supported:
+    if (dataViewEvent.GetDataObject() != NULL)
+    {
+     // constant definition for abbreviational purposes:
+      size_t const noOfFormats = dataViewEvent.GetDataObject()->GetFormatCount();
+      
+      if (noOfFormats > 0)
+      {
+       // variable definition:
+        wxDataFormat* dataFormats;
+        
+        dataFormats = new wxDataFormat[noOfFormats];
+        dataViewEvent.GetDataObject()->GetAllFormats(dataFormats,wxDataObject::Get);
+        for (size_t i=0; i<noOfFormats; ++i)
+          switch (dataFormats[i].GetType())
+          {
+            case wxDF_INVALID:
+              wxFAIL_MSG(_("Data object has invalid data format"));
+              break;
+            case wxDF_TEXT:
+              {
+               // constant definition for abbreviational purposes:
+                size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
+               // variable definition and initialization:
+                wxMemoryBuffer dataObject(dataSize);
+                
+                dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
+                dataObject.UngetWriteBuf(dataSize);
+                if (::AddDragItemFlavor(dragRef,*itemRef,'TEXT',dataObject.GetData(),dataSize,0) != noErr)
+                  wxFAIL_MSG(_("Adding flavor TEXT failed"));
+              } /* block */
+              break;
+            case wxDF_UNICODETEXT:
+              {
+               // constant definition for abbreviational purposes:
+                size_t const dataSize = dataViewEvent.GetDataObject()->GetDataSize(wxDF_TEXT);
+               // as there is no direct access to the data copy it to a memory buffer:
+                wxMemoryBuffer dataObject(dataSize);
+                
+                dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataObject.GetWriteBuf(dataSize));
+                dataObject.UngetWriteBuf(dataSize);
+               // if the data is stored in unicode format the internal representation is utf-8 (not mentioned in the documentation but in the source code);
+               // DnD uses fixed utf-16 representation -> use the OSX functions for a conversion:
+                CFDataRef   osxData  (::CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,reinterpret_cast<UInt8*>(dataObject.GetData()),dataSize,kCFAllocatorNull));
+                CFStringRef osxString(::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,osxData,kCFStringEncodingUTF8));
+                
+               // the osxString contains now the data and therefore the previously occupied memory can be released and re-used:
+                ::CFRelease(osxData);
+                osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF16,32);
+                if (::AddDragItemFlavor(dragRef,*itemRef,'utxt',::CFDataGetBytePtr(osxData),::CFDataGetLength(osxData),0) != noErr)
+                  wxFAIL_MSG(_("Adding flavor utxt failed"));
+               // clean up:
+                ::CFRelease(osxData);
+                ::CFRelease(osxString);
+              } /* block */
+              break;
+            case wxDF_BITMAP:
+            case wxDF_METAFILE:
+            case wxDF_SYLK:
+            case wxDF_DIF:
+            case wxDF_TIFF:
+            case wxDF_OEMTEXT:
+            case wxDF_DIB:
+            case wxDF_PALETTE:
+            case wxDF_PENDATA:
+            case wxDF_RIFF:
+            case wxDF_WAVE:
+            case wxDF_ENHMETAFILE:
+            case wxDF_FILENAME:
+            case wxDF_LOCALE:
+            case wxDF_PRIVATE:
+            case wxDF_HTML:
+              break; // not (yet) supported data formats
+            default:
+              wxFAIL_MSG(_("Unknown data format"));
+          }
+        delete[] dataFormats;
+      }
+    }
   }
-}
+ // clean-up and return result:
+  delete dataObject;
+  return addDragItem;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserAddDragItemProc(DragReference, DataBrowserItemID, ItemReference*) */
 
-wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID) const
+Boolean wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference dragRef, DataBrowserItemID itemID)
 {
-  ColumnPointerHashMapType::const_iterator Result(m_ColumnPointers.find(propertyID));
+  UInt16 noOfDraggedItems;
 
-  if (Result != m_ColumnPointers.end())
-    return Result->second;
-  else
-    return NULL;
-}
+  wxDataViewCtrl* dataViewCtrlPtr;
 
-// inherited methods from wxDataViewCtrlBase
-void wxDataViewCtrl::DoSetExpanderColumn()
-{
-  if (this->GetExpanderColumn() != NULL)
+
+  dataViewCtrlPtr = dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer());
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+
+ // send a drag possible event for each available and item und proceed with it unless the event is vetoed:
+  ::CountDragItems(dragRef,&noOfDraggedItems);
+  for (UInt16 indexDraggedItem=1; indexDraggedItem<=noOfDraggedItems; ++indexDraggedItem)
   {
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+    bool                   receiveDrag;
+    ItemReference          itemRef;
+    wxDataObjectComposite* dataObjects;
+    wxMemoryBuffer         buffer;
+    
+   // collect native information:
+    ::GetDragItemReferenceNumber(dragRef,indexDraggedItem,&itemRef); // the index begins with 1!
+    dataObjects = this->GetDnDDataObjects(dragRef,itemRef);
+  // create wxWidget's event:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP,dataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetItem(reinterpret_cast<void*>(itemID)); // this is the item that receives the event
+                                                            // (can be an invalid item ID, this is especially useful if the dataview does not contain any items)
+    dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+    dataViewEvent.SetDataObject(dataObjects);
+    dataViewEvent.SetDataFormat(this->GetDnDDataFormat(dataObjects));
+    if (dataViewEvent.GetDataFormat().GetType() != wxDF_INVALID)
+    {
+      dataViewEvent.SetDataSize(dataObjects->GetDataSize(dataViewEvent.GetDataFormat().GetType()));
+      dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
+      buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
+      dataViewEvent.SetDataBuffer(buffer.GetData());
+    }
 
-    (void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
+   // send event:
+    receiveDrag = dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed();
+    delete dataObjects;
+    if (!receiveDrag)
+      return false;
   }
-}
+  return true;
+} /* wxMacDataViewDataBrowserListViewControl::DataBrowserReceiveDragProc(DragReference, DataBrowserItemID) */
 
-void wxDataViewCtrl::DoSetIndent()
+//
+// drag & drop helper methods
+//
+wxDataFormat wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite* dataObjects)
 {
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  wxDataFormat resultFormat;
 
-  (void) MacDataViewListCtrlPtr->SetIndent(static_cast<float>(this->GetIndent()));
-}
-
-// event handling:
-void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
-{
-    event.Skip();
-    
-    if (GetModel() == NULL)
-        return;
 
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+  if (dataObjects != NULL)
+  {
+    bool compatible(true);
 
-    int NoOfChildren;
-    wxDataViewItemArray items;
-    NoOfChildren = GetModel()->GetChildren( wxDataViewItem(), items);
-    if (NoOfChildren == 0)
-       return;
-    wxDataViewItem firstChild = items[0];
+    size_t const noOfFormats = dataObjects->GetFormatCount();
+    size_t       indexFormat;
 
-    UInt16 headerHeight = 0;
-    MacDataViewListCtrlPtr->GetHeaderButtonHeight(&headerHeight);
-  
+    wxDataFormat* formats;
     
-    if (event.GetY() < headerHeight)
+   // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
+   // wxDF_INVALID is returned;
+   // currently compatible types (ordered by priority are):
+   //  - wxDF_UNICODETEXT - wxDF_TEXT
+    formats = new wxDataFormat[noOfFormats];
+    dataObjects->GetAllFormats(formats);
+    indexFormat = 0;
+    while ((indexFormat < noOfFormats) && compatible)
     {
-       unsigned int col_count = GetColumnCount();
-       unsigned int col;
-       for (col = 0; col < col_count; col++)
-       {
-           wxDataViewColumn *column = GetColumn( col );
-           if (column->IsHidden())
-              continue;
-           
-           Rect itemrect;
-           ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr->GetControlRef(), 
-              reinterpret_cast<DataBrowserItemID>(firstChild.GetID()), column->GetPropertyID(),
-              kDataBrowserPropertyEnclosingPart, &itemrect );
-           
-           if (abs( event.GetX() - itemrect.right) < 3)
-           {
-               if (column->GetFlags() & wxDATAVIEW_COL_RESIZABLE)
-                  SetCursor( wxCursor( wxCURSOR_SIZEWE ) );
-               else
-                  SetCursor( *wxSTANDARD_CURSOR );
-               return;
-           }
-       }
-       
-    }
-    
-    SetCursor( *wxSTANDARD_CURSOR );
-}
+      switch (resultFormat.GetType())
+      {
+        case wxDF_INVALID:
+          resultFormat.SetType(formats[indexFormat].GetType()); // first format (should only be reached if indexFormat == 0
+          break;
+        case wxDF_TEXT:
+          if (formats[indexFormat].GetType() == wxDF_UNICODETEXT)
+            resultFormat.SetType(wxDF_UNICODETEXT);
+          else // incompatible
+          {
+            resultFormat.SetType(wxDF_INVALID);
+            compatible = false;
+          }
+          break;
+        case wxDF_UNICODETEXT:
+          if (formats[indexFormat].GetType() != wxDF_TEXT)
+          {
+            resultFormat.SetType(wxDF_INVALID);
+            compatible = false;
+          }
+          break;
+        default:
+          resultFormat.SetType(wxDF_INVALID); // not (yet) supported format
+          compatible = false;
+      }
+      ++indexFormat;
+    } /* while */
+   // clean up:
+    delete[] formats;
+  }
+  else
+    resultFormat = wxDF_INVALID;
+  return resultFormat;
+} /* wxMacDataViewDataBrowserListViewControl::GetDnDDataFormat(wxDataObjectComposite*) */
 
-void wxDataViewCtrl::OnSize(wxSizeEvent& event)
+wxDataObjectComposite* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference dragRef, ItemReference itemRef) const
 {
-  unsigned int const NoOfColumns = this->GetColumnCount();
+  UInt16 noOfFlavors;
+
+  wxDataObjectComposite* dataObject;
 
 
-  for (unsigned int i=0; i<NoOfColumns; ++i)
+  ::CountDragItemFlavors(dragRef,itemRef,&noOfFlavors);
+  if (noOfFlavors > 0)
   {
-    wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i));
+   // as the native drag data can be separated into TEXT and UTXT a pointer to a wxTextDataObject is used to track the existence of 'TEXT' and 'utxt' flavors:
+    wxTextDataObject* textDataObject(NULL);
 
-    if (dataViewColumnPtr != NULL)
+    dataObject = new wxDataObjectComposite();
+    for (UInt16 indexFlavor=1; indexFlavor<=noOfFlavors; ++indexFlavor)
     {
-      wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
-
-      if (dataViewCustomRendererPtr != NULL)
-        dataViewCustomRendererPtr->SetDC(NULL); // reset DC because DC has changed
+     // variable definition:
+      FlavorType flavorDataObject;
+      
+      if (::GetFlavorType(dragRef,itemRef,indexFlavor,&flavorDataObject) == noErr) // GetFlavorType uses a 1 based index!
+        switch (flavorDataObject)
+        {
+          case 'TEXT':
+            if (textDataObject == NULL) // otherwise a 'utxt' flavor has already been found that gets priority compared to the 'TEXT' flavor
+            {
+             // variable definitions:
+              Size           nativeDataSize;
+              wxMemoryBuffer nativeData;
+              
+              if ((::GetFlavorDataSize(dragRef,itemRef,'TEXT',&nativeDataSize) == noErr) &&
+                  (::GetFlavorData(dragRef,itemRef,'TEXT',nativeData.GetWriteBuf(nativeDataSize),&nativeDataSize,0) == noErr))
+              {
+                nativeData.UngetWriteBuf(nativeDataSize);
+                textDataObject = new wxTextDataObject();
+                if (textDataObject->SetData(nativeData.GetDataLen(),nativeData.GetData()))
+                  dataObject->Add(textDataObject);
+                else
+                {
+                  delete textDataObject;
+                  textDataObject = NULL;
+                }
+              }
+            } /* block */
+            break;
+          case 'utxt':
+            {
+             // variable definition:
+              Size nativeDataSize;
+              
+              if (::GetFlavorDataSize(dragRef,itemRef,'utxt',&nativeDataSize) == noErr)
+              {
+                CFMutableDataRef draggedData;
+                
+                draggedData = ::CFDataCreateMutable(kCFAllocatorDefault,nativeDataSize);
+                ::CFDataSetLength(draggedData,nativeDataSize);
+                if (::GetFlavorData(dragRef,itemRef,'utxt',::CFDataGetMutableBytePtr(draggedData),&nativeDataSize,0) == noErr)
+                {
+                 // convert internally used UTF-16 representation to a UTF-8 representation:
+                  CFDataRef   osxData;
+                  CFStringRef osxString;
+                  
+                  osxString = ::CFStringCreateFromExternalRepresentation(kCFAllocatorDefault,draggedData,kCFStringEncodingUTF16); // BOM character is handled by this function automatically
+                  osxData   = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,osxString,kCFStringEncodingUTF8,32);
+                  if (textDataObject == NULL)
+                  {
+                    textDataObject = new wxTextDataObject();
+                    if (textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData)))
+                      dataObject->Add(textDataObject);
+                    else
+                    {
+                      delete textDataObject;
+                      textDataObject = NULL;
+                    }
+                  }
+                  else // overwrite data because the 'utxt' flavor has priority over the 'TEXT' flavor
+                    (void) textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData));
+                 // clean up:
+                  ::CFRelease(osxData);
+                  ::CFRelease(osxString);
+                }
+               // clean up:
+                ::CFRelease(draggedData);
+              }
+            } /* block */
+            break;
+        }
     }
   }
+  else
+    dataObject = NULL;
+  return dataObject;
+} /* wxMacDataViewDataBrowserListViewControl::GetDnDDataObjects(DragReference, ItemReference) const */
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
-  ControlRef ref = MacDataViewListCtrlPtr->GetControlRef();
-  if (NoOfColumns == 1)
-  {
-     ::SetDataBrowserHasScrollBars( ref, false, true );
-     ::AutoSizeDataBrowserListViewColumns( ref );
-  }
-  if (NoOfColumns > 1)
+//
+// other methods
+//
+wxDataViewColumn* wxMacDataViewDataBrowserListViewControl::GetColumnPtr(DataBrowserPropertyID propertyID) const
+{
+  wxDataViewCtrl* dataViewCtrlPtr(dynamic_cast<wxDataViewCtrl*>(this->GetWXPeer()));
+  
+  if (dataViewCtrlPtr != NULL)
   {
-     ::SetDataBrowserHasScrollBars( ref, true, true );
+    size_t const noOfColumns = dataViewCtrlPtr->GetColumnCount();
+    
+    for (size_t i=0; i<noOfColumns; ++i)
+      if (dataViewCtrlPtr->GetColumnPtr(i)->GetNativeData()->GetPropertyID() == propertyID)
+        return dataViewCtrlPtr->GetColumnPtr(i);
   }
-
-  event.Skip();
+  return NULL;
 }
 
-IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)
-
-BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
-  EVT_SIZE(wxDataViewCtrl::OnSize)
-  EVT_MOTION(wxDataViewCtrl::OnMouse)
-END_EVENT_TABLE()
+// ---------------------------------------------------------
+// wxDataViewRenderer
+// ---------------------------------------------------------
+wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                   :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode), m_NativeDataPtr(NULL)
+{
+}
+
+wxDataViewRenderer::~wxDataViewRenderer(void)
+{
+  delete this->m_NativeDataPtr;
+}
+
+void wxDataViewRenderer::SetAlignment(int align)
+{
+  this->m_alignment = align;
+}
+
+void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
+{
+  wxDataViewColumn* dataViewColumnPtr;
+
+
+  m_mode = mode;
+  dataViewColumnPtr = this->GetOwner();
+  if (dataViewColumnPtr != NULL)
+  {
+    wxDataViewCtrl* dataViewCtrlPtr(dataViewColumnPtr->GetOwner());
+
+    if (dataViewCtrlPtr != NULL)
+    {
+      wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+      if (macDataViewListCtrlPtr != NULL)
+      {
+        DataBrowserPropertyFlags flags;
+
+        verify_noerr(macDataViewListCtrlPtr->GetPropertyFlags(dataViewColumnPtr->GetNativeData()->GetPropertyID(),&flags));
+        if (mode == wxDATAVIEW_CELL_EDITABLE)
+          flags |= kDataBrowserPropertyIsEditable;
+        else
+          flags &= ~kDataBrowserPropertyIsEditable;
+        verify_noerr(macDataViewListCtrlPtr->SetPropertyFlags(dataViewColumnPtr->GetNativeData()->GetPropertyID(),flags));
+      }
+    }
+  }
+}
+
+void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr)
+{
+  delete this->m_NativeDataPtr;
+  this->m_NativeDataPtr = newNativeDataPtr;
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
+
+// ---------------------------------------------------------
+// wxDataViewCustomRenderer
+// ---------------------------------------------------------
+wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCustomType));
+}
+
+bool wxDataViewCustomRenderer::Render()
+{
+  return true;
+}
 
-#endif // !wxUSE_GENERICDATAVIEWCTRL
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewTextRenderer
+// ---------------------------------------------------------
+wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                       :wxDataViewRenderer(varianttype,mode,align)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserTextType));
+}
 
-#endif // wxUSE_DATAVIEWCTRL
+bool wxDataViewTextRenderer::Render()
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
+
+  wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+  return (::SetDataBrowserItemDataText(this->GetNativeData()->GetItemDataRef(),cfString) == noErr);
+}
+
+IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewBitmapRenderer
+// ---------------------------------------------------------
+wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode,align)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconType));
+}
+
+bool wxDataViewBitmapRenderer::Render()
+ // This method returns 'true' if
+ //  - the passed bitmap is valid and it could be assigned to the native data browser;
+ //  - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
+ // In all other cases the method returns 'false'.
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
+
+  wxBitmap bitmap;
+
+  bitmap << this->GetValue();
+  return (!(bitmap.Ok()) || (::SetDataBrowserItemDataIcon(this->GetNativeData()->GetItemDataRef(),bitmap.GetIconRef()) == noErr));
+}
+
+IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewIconTextRenderer
+// ---------------------------------------------------------
+wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewRenderer(varianttype,mode)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserIconAndTextType));
+}
+
+bool wxDataViewIconTextRenderer::Render()
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
+
+  wxDataViewIconText iconText;
+
+  iconText << this->GetValue();
+
+  wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+
+  if (iconText.GetIcon().IsOk())
+    if (::SetDataBrowserItemDataIcon(this->GetNativeData()->GetItemDataRef(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
+      return false;
+  return (::SetDataBrowserItemDataText(this->GetNativeData()->GetItemDataRef(),cfString) == noErr);
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+
+
+// ---------------------------------------------------------
+// wxDataViewToggleRenderer
+// ---------------------------------------------------------
+wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserCheckboxType));
+}
+
+bool wxDataViewToggleRenderer::Render()
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
+  return (::SetDataBrowserItemDataButtonValue(this->GetNativeData()->GetItemDataRef(),this->GetValue().GetBool()) == noErr);
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewProgressRenderer
+// ---------------------------------------------------------
+wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewRenderer(varianttype,mode,align)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserProgressBarType));
+}
+
+bool wxDataViewProgressRenderer::Render()
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
+  return ((::SetDataBrowserItemDataMinimum(this->GetNativeData()->GetItemDataRef(),  0)                        == noErr) &&
+          (::SetDataBrowserItemDataMaximum(this->GetNativeData()->GetItemDataRef(),100)                        == noErr) &&
+          (::SetDataBrowserItemDataValue  (this->GetNativeData()->GetItemDataRef(),this->GetValue().GetLong()) == noErr));
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewDateRenderer
+// ---------------------------------------------------------
+wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                       :wxDataViewRenderer(varianttype,mode,align)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData(kDataBrowserDateTimeType));
+}
+
+bool wxDataViewDateRenderer::Render()
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
+  return (::SetDataBrowserItemDataDateTime(this->GetNativeData()->GetItemDataRef(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewColumn
+// ---------------------------------------------------------
+wxDataViewColumn::wxDataViewColumn(const wxString& title, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
+                 :wxDataViewColumnBase(renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title)
+{
+  this->InitCommon(width, align, flags);
+  if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
+    renderer->SetAlignment(align);
+}
+
+wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
+                 :wxDataViewColumnBase(bitmap, renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData())
+{
+  this->InitCommon(width, align, flags);
+  if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
+    renderer->SetAlignment(align);
+}
+
+wxDataViewColumn::~wxDataViewColumn(void)
+{
+  delete this->m_NativeDataPtr;
+}
+
+bool wxDataViewColumn::IsSortKey() const
+{
+    wxDataViewCtrl * const dataViewCtrlPtr(GetOwner());
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(
+        dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(
+            dataViewCtrlPtr->GetPeer()));
+
+    DataBrowserPropertyID propertyID;
+    return (macDataViewListCtrlPtr->GetSortProperty(&propertyID) == noErr) &&
+           (propertyID == this->GetNativeData()->GetPropertyID());
+}
+
+void wxDataViewColumn::SetAlignment(wxAlignment align)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  m_alignment = align;
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
+      switch (align)
+      {
+        case wxALIGN_CENTER:
+        case wxALIGN_CENTER_HORIZONTAL:
+          headerDescription.btnFontStyle.just = teCenter;
+          break;
+        case wxALIGN_LEFT:
+          headerDescription.btnFontStyle.just = teFlushLeft;
+          break;
+        case wxALIGN_RIGHT:
+          headerDescription.btnFontStyle.just = teFlushRight;
+          break;
+        default:
+          headerDescription.btnFontStyle.just = teFlushDefault;
+      }
+      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set alignment."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  wxDataViewColumnBase::SetBitmap(bitmap);
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
+      if (this->GetBitmap().Ok())
+        headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
+      else
+        headerDescription.btnContentInfo.u.iconRef = NULL;
+      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetMaxWidth(int maxWidth)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  m_maxWidth = maxWidth;
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
+      headerDescription.maximumWidth = static_cast<UInt16>(maxWidth);
+      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set maximum width."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetMinWidth(int minWidth)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  m_minWidth = minWidth;
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
+      headerDescription.minimumWidth = static_cast<UInt16>(minWidth);
+      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set minimum width."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetReorderable(bool reorderable)
+{
+ // first set the internal flag of the column:
+  if (reorderable)
+    m_flags |= wxDATAVIEW_COL_REORDERABLE;
+  else
+    m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
+ // if the column is associated with a control change also immediately the flags of the control:
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+  if (dataViewCtrlPtr != NULL)
+  {
+    DataBrowserPropertyFlags                       flags;
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    wxCHECK_RET(macDataViewListCtrlPtr != NULL,                                                                  _("Valid pointer to native data view control does not exist"));
+    wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
+    if (reorderable)
+      flags |= kDataBrowserListViewMovableColumn;
+    else
+      flags &= ~kDataBrowserListViewMovableColumn;
+    wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
+  }
+}
+
+void wxDataViewColumn::SetResizeable(bool resizeable)
+{
+ // first set the internal flag of the column:
+  if (resizeable)
+    m_flags |= wxDATAVIEW_COL_RESIZABLE;
+  else
+    m_flags &= ~wxDATAVIEW_COL_RESIZABLE;
+ // if the column is associated with a control change also immediately the flags of the control:
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
+      if (resizeable)
+      {
+        if (this->GetMinWidth() >= this->GetMaxWidth())
+        {
+          this->m_minWidth = 0;
+          this->m_maxWidth = 30000;
+        }
+        headerDescription.minimumWidth = this->m_minWidth;
+        headerDescription.maximumWidth = this->m_maxWidth;
+      }
+      else
+      {
+        headerDescription.minimumWidth = this->m_width;
+        headerDescription.maximumWidth = this->m_width;
+      }
+      verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
+      macDataViewListCtrlPtr->SetSortProperty(this->GetNativeData()->GetPropertyID());
+    }
+  }
+}
+
+void wxDataViewColumn::SetSortable(bool sortable)
+{
+ // first set the internal flag of the column:
+  if (sortable)
+    m_flags |= wxDATAVIEW_COL_SORTABLE;
+  else
+    m_flags &= ~wxDATAVIEW_COL_SORTABLE;
+ // if the column is associated with a control change also immediately the flags of the control:
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+  if (dataViewCtrlPtr != NULL)
+  {
+    DataBrowserPropertyFlags                       flags;
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    wxCHECK_RET(macDataViewListCtrlPtr != NULL,                                                 _("Valid pointer to native data view control does not exist"));
+    wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetNativeData()->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
+    if (sortable)
+      flags |= kDataBrowserListViewSortableColumn;
+    else
+      flags &= ~kDataBrowserListViewSortableColumn;
+    wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetNativeData()->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
+  }
+}
+
+void wxDataViewColumn::SetSortOrder(bool ascending)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  m_ascending = ascending;
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+
+      verify_noerr(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
+      if (ascending)
+        headerDescription.initialOrder = kDataBrowserOrderIncreasing;
+      else
+        headerDescription.initialOrder = kDataBrowserOrderDecreasing;
+      verify_noerr(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription));
+      macDataViewListCtrlPtr->SetSortProperty(this->GetNativeData()->GetPropertyID());
+    }
+  }
+}
+
+void wxDataViewColumn::SetTitle(wxString const& title)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  m_title = title;
+  if (dataViewCtrlPtr != NULL)
+  {
+    wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+    if (macDataViewListCtrlPtr != NULL)
+    {
+      DataBrowserListViewHeaderDesc headerDescription;
+      wxCFStringRef           cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+
+      wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
+      headerDescription.titleString = cfTitle;
+      wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetNativeData()->GetPropertyID(),&headerDescription) == noErr,_("Could not set header description."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetWidth(int width)
+{
+  wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
+
+
+  if ((width >= m_minWidth) && (width <= m_maxWidth))
+  {
+    m_width = width;
+    if (dataViewCtrlPtr != NULL)
+    {
+      wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
+
+      if (macDataViewListCtrlPtr != NULL)
+        wxCHECK_RET(macDataViewListCtrlPtr->SetColumnWidth(this->GetNativeData()->GetPropertyID(),static_cast<UInt16>(width)) == noErr,_("Could not set column width."));
+    }
+  }
+}
+
+void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
+{
+    // see wxGTK native wxDataViewColumn implementation
+    wxFAIL_MSG( "not implemented" );
+}
+
+void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr)
+{
+  delete this->m_NativeDataPtr;
+  this->m_NativeDataPtr = newNativeDataPtr;
+}
 
+#endif // wxUSE_DATAVIEWCTRL && !wxUSE_GENERICDATAVIEWCTRL
diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm
new file mode 100644 (file)
index 0000000..e69d329
--- /dev/null
@@ -0,0 +1,2512 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/dataview.mm
+// Purpose:     wxDataView
+// Author:      
+// Modified by:
+// Created:     2009-01-31
+// RCS-ID:      $Id: dataview.mm$
+// Copyright:   
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if (wxUSE_DATAVIEWCTRL == 1) && !defined(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/osx/cocoa/dataview.h"
+#include "wx/osx/private.h"
+#include "wx/renderer.h"
+
+
+// ============================================================================
+// Constants used locally
+// ============================================================================
+#define DataViewPboardType @"OutlineViewItem"
+
+// ============================================================================
+// Classes used locally in dataview.mm
+// ============================================================================
+@interface wxCustomRendererObject : NSObject <NSCopying>
+{
+@public
+  NSTableColumn* tableColumn; // not owned by the class
+
+  wxDataViewCustomRenderer* customRenderer; // not owned by the class
+  
+  wxPointerObject* item; // not owned by the class
+}
+
+ //
+ // initialization
+ //
+  -(id) init;
+  -(id) initWithRenderer:(wxDataViewCustomRenderer*)initRenderer item:(wxPointerObject*)initItem column:(NSTableColumn*)initTableColumn;
+
+@end
+
+@implementation wxCustomRendererObject
+//
+// initialization
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+  {
+    customRenderer = NULL;
+    item           = NULL;
+    tableColumn    = NULL;
+  }
+  return self;
+}
+
+-(id) initWithRenderer:(wxDataViewCustomRenderer*)initRenderer item:(wxPointerObject*)initItem column:(NSTableColumn*)initTableColumn
+{
+  self = [super init];
+  if (self != nil)
+  {
+    customRenderer = initRenderer;
+    item           = initItem;
+    tableColumn    = initTableColumn;
+  }
+  return self;
+}
+
+-(id) copyWithZone:(NSZone*)zone
+{
+  wxCustomRendererObject* copy;
+  
+  
+  copy = [[[self class] allocWithZone:zone] init];
+  copy->customRenderer = customRenderer;
+  copy->item           = item;
+  copy->tableColumn    = tableColumn;
+
+  return copy;
+}
+
+@end
+
+// ============================================================================
+// Functions used locally in dataview.mm
+// ============================================================================
+static NSInteger CompareItems(id item1, id item2, void* context)
+{
+  NSArray* const sortDescriptors = (NSArray*) context;
+  
+  NSUInteger const noOfDescriptors = [sortDescriptors count];
+
+  NSInteger result(NSOrderedAscending);
+
+
+  for (NSUInteger i=0; i<noOfDescriptors; ++i)
+  {
+   // constant definition for abbreviational purposes:
+    wxSortDescriptorObject* const sortDescriptor = (wxSortDescriptorObject*)[sortDescriptors objectAtIndex:i];
+
+    int wxComparisonResult;
+    
+    wxComparisonResult = [sortDescriptor modelPtr]->Compare(wxDataViewItem([((wxPointerObject*) item1) pointer]),
+                                                            wxDataViewItem([((wxPointerObject*) item2) pointer]),
+                                                            [sortDescriptor columnPtr]->GetModelColumn(),
+                                                            [sortDescriptor ascending] == YES);
+    if (wxComparisonResult < 0)
+    {
+      result = NSOrderedAscending;
+      break;
+    }
+    else if (wxComparisonResult > 0)
+    {
+      result = NSOrderedDescending;
+      break;
+    }
+    else
+      result = NSOrderedSame;
+  }
+  return result;
+}
+
+static NSTextAlignment ConvertToNativeHorizontalTextAlignment(int alignment)
+{
+  if (alignment & wxALIGN_CENTER_HORIZONTAL) // center alignment is chosen also if alignment is equal to -1
+    return NSCenterTextAlignment;
+  else if (alignment & wxALIGN_RIGHT)
+    return NSRightTextAlignment;
+  else
+    return NSLeftTextAlignment;
+}
+
+static NSTableColumn* CreateNativeColumn(wxDataViewColumn const* columnPtr)
+{
+  NSTableColumn* nativeColumn([[NSTableColumn alloc] initWithIdentifier:[[[wxPointerObject alloc] initWithPointer:const_cast<wxDataViewColumn*>(columnPtr)] autorelease]]);
+
+
+ // initialize the native column:
+  if ((nativeColumn != NULL) && (columnPtr->GetRenderer() != NULL))
+  {
+   // setting the size related parameters:
+    if (columnPtr->IsResizeable())
+    {
+      [nativeColumn setResizingMask:NSTableColumnUserResizingMask];
+      [nativeColumn setMinWidth:columnPtr->GetMinWidth()];
+      [nativeColumn setMaxWidth:columnPtr->GetMaxWidth()];
+    }
+    else
+    {
+      [nativeColumn setResizingMask:NSTableColumnNoResizing];
+      [nativeColumn setMinWidth:columnPtr->GetWidth()];
+      [nativeColumn setMaxWidth:columnPtr->GetWidth()];
+    }
+    [nativeColumn setWidth:columnPtr->GetWidth()];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+   // setting the visibility:
+    [nativeColumn setHidden:static_cast<BOOL>(columnPtr->IsHidden())];
+#endif
+   // setting the header:
+    [[nativeColumn headerCell] setAlignment:ConvertToNativeHorizontalTextAlignment(columnPtr->GetAlignment())];
+    [[nativeColumn headerCell] setStringValue:[[wxCFStringRef(columnPtr->GetTitle()).AsNSString() retain] autorelease]];
+   // setting data cell's properties:
+    [[nativeColumn dataCell] setWraps:NO];
+   // setting the default data cell:
+    [nativeColumn setDataCell:columnPtr->GetRenderer()->GetNativeData()->GetColumnCell()];
+   // setting the editablility:
+    bool const dataCellIsEditable = (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE);
+
+     [nativeColumn           setEditable:dataCellIsEditable];
+    [[nativeColumn dataCell] setEditable:dataCellIsEditable];
+  }
+ // done:
+  return nativeColumn;
+}
+
+// ============================================================================
+// Public helper functions for dataview implementation on OSX
+// ============================================================================
+wxWidgetImplType* CreateDataView(wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent),  wxWindowID WXUNUSED(id), wxPoint const& pos, wxSize const& size,
+                                 long style, long WXUNUSED(extraStyle))
+{
+  return new wxCocoaDataViewControl(wxpeer,pos,size,style);
+}
+
+// ============================================================================
+// wxPointerObject
+// ============================================================================
+//
+// This is a helper class to store a pointer in an object.
+//
+@implementation wxPointerObject
+//
+// object initialization
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+    self.pointer = NULL;
+  return self;
+}
+
+-(id) initWithPointer:(void*) initPointer
+{
+  self = [super init];
+  if (self != nil)
+    self.pointer = initPointer;
+  return self;
+}
+
+//
+// inherited methods from NSObject
+//
+-(BOOL) isEqual:(id)object
+{
+  return (object != nil) && ([object isKindOfClass:[wxPointerObject class]]) && (pointer == [((wxPointerObject*) object) pointer]);
+}
+
+-(NSUInteger) hash
+{
+  return (NSUInteger) pointer;
+}
+
+//
+// access to pointer
+//
+-(void*) pointer
+{
+  return pointer;
+}
+
+-(void) setPointer:(void*) newPointer
+{
+  pointer = newPointer;
+}
+
+@end
+
+// ============================================================================
+// wxSortDescriptorObject
+// ============================================================================
+@implementation wxSortDescriptorObject
+//
+// initialization
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+  {
+    columnPtr = NULL;
+    modelPtr  = NULL;
+  }
+  return self;
+}
+
+-(id) initWithModelPtr:(wxDataViewModel*)initModelPtr sortingColumnPtr:(wxDataViewColumn*)initColumnPtr ascending:(BOOL)sortAscending
+{
+  self = [super initWithKey:@"dummy" ascending:sortAscending];
+  if (self != nil)
+  {
+    columnPtr = initColumnPtr;
+    modelPtr  = initModelPtr;
+  }
+  return self;
+}
+
+-(id) copyWithZone:(NSZone*)zone
+{
+  wxSortDescriptorObject* copy;
+  
+  
+  copy = [super copyWithZone:zone];
+  copy->columnPtr = columnPtr;
+  copy->modelPtr  = modelPtr;
+
+  return copy;
+}
+
+//
+// access to model column's index
+//
+-(wxDataViewColumn*) columnPtr
+{
+  return columnPtr;
+}
+
+-(wxDataViewModel*) modelPtr
+{
+  return modelPtr;
+}
+
+-(void) setColumnPtr:(wxDataViewColumn*)newColumnPtr
+{
+  columnPtr = newColumnPtr;
+}
+
+-(void) setModelPtr:(wxDataViewModel*)newModelPtr
+{
+  modelPtr = newModelPtr;
+}
+
+@end
+
+// ============================================================================
+// wxCocoaOutlineDataSource
+// ============================================================================
+@implementation wxCocoaOutlineDataSource
+
+//
+// constructors / destructor
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+  {
+    implementation = NULL;
+    model          = NULL;
+
+    currentParentItem = nil;
+
+    children = [[NSMutableArray alloc] init];
+    items    = [[NSMutableSet   alloc] init];
+  }
+  return self;
+}
+
+-(void) dealloc
+{
+  [currentParentItem release];
+
+  [children release];
+  [items    release];
+  
+  [super dealloc];
+}
+
+//
+// methods of informal protocol:
+//
+-(BOOL) outlineView:(NSOutlineView*)outlineView acceptDrop:(id<NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index
+{
+  bool dragSuccessful;
+
+  NSArray* supportedTypes([NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil]);
+
+  NSPasteboard* pasteboard([info draggingPasteboard]);
+
+  NSString* bestType([pasteboard availableTypeFromArray:supportedTypes]);
+
+  
+  if (bestType != nil)
+  {
+    wxDataViewCtrl* const  dataViewCtrlPtr(implementation->GetDataViewCtrl());
+
+    wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+    wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+  // create wxWidget's event:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP,dataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) item) pointer]));
+    dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+    if ([bestType compare:DataViewPboardType] == NSOrderedSame)
+    {
+      NSArray*   dataArray((NSArray*)[pasteboard propertyListForType:DataViewPboardType]);
+      NSUInteger indexDraggedItem, noOfDraggedItems([dataArray count]);
+      
+      indexDraggedItem = 0;
+      while (indexDraggedItem < noOfDraggedItems)
+      {
+        wxDataObjectComposite* dataObjects(implementation->GetDnDDataObjects((NSData*)[dataArray objectAtIndex:indexDraggedItem]));
+
+        if ((dataObjects != NULL) && (dataObjects->GetFormatCount() > 0))
+        {
+          wxMemoryBuffer buffer;
+
+         // copy data into data object:
+          dataViewEvent.SetDataObject(dataObjects);
+          dataViewEvent.SetDataFormat(implementation->GetDnDDataFormat(dataObjects));
+         // copy data into buffer:
+          dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
+          buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
+          dataViewEvent.SetDataBuffer(buffer.GetData());
+         // finally, send event:
+          if (dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed())
+          {
+            dragSuccessful = true;
+            ++indexDraggedItem;
+          }
+          else
+          {
+            dragSuccessful   = true;
+            indexDraggedItem = noOfDraggedItems; // stop loop
+          }
+        }
+        else
+        {
+          dragSuccessful   = false;
+          indexDraggedItem = noOfDraggedItems; // stop loop
+        }
+       // clean-up:
+        delete dataObjects;
+      }
+    }
+    else
+    {
+      CFDataRef              osxData; // needed to convert internally used UTF-16 representation to a UTF-8 representation
+      wxDataObjectComposite* dataObjects   (new wxDataObjectComposite());
+      wxTextDataObject*      textDataObject(new wxTextDataObject());
+      
+      osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,(CFStringRef)[pasteboard stringForType:NSStringPboardType],kCFStringEncodingUTF8,32);
+      if (textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData)))
+        dataObjects->Add(textDataObject);
+      else
+        delete textDataObject;
+     // send event if data could be copied:
+      if (dataObjects->GetFormatCount() > 0)
+      {
+        dataViewEvent.SetDataObject(dataObjects);
+        dataViewEvent.SetDataFormat(implementation->GetDnDDataFormat(dataObjects));
+        if (dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed())
+          dragSuccessful = true;
+        else
+          dragSuccessful = false;
+      }
+      else
+        dragSuccessful = false;
+     // clean up:
+      ::CFRelease(osxData);
+      delete dataObjects;
+    }
+  }
+  else
+    dragSuccessful = false;
+  return dragSuccessful;
+}
+
+-(id) outlineView:(NSOutlineView*)outlineView child:(NSInteger)index ofItem:(id)item
+{
+  if ((item == currentParentItem) && (index < ((NSInteger) [self getChildCount])))
+    return [self getChild:index];
+  else
+  {
+    wxDataViewItemArray dataViewChildren;
+
+    wxCHECK_MSG(model != NULL,0,_("Valid model in data source does not exist."));
+    (void) model->GetChildren((item == nil) ? wxDataViewItem() : wxDataViewItem([((wxPointerObject*) item) pointer]),dataViewChildren);
+    [self bufferItem:item withChildren:&dataViewChildren];
+    if ([sortDescriptors count] > 0)
+      [children sortUsingFunction:CompareItems context:sortDescriptors];
+    return [self getChild:index];
+  }
+}
+
+-(BOOL) outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item
+{
+  wxCHECK_MSG(model != NULL,0,_("Valid model in data source does not exist."));
+  return model->IsContainer(wxDataViewItem([((wxPointerObject*) item) pointer]));
+}
+
+-(NSInteger) outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(id)item
+{
+  NSInteger noOfChildren;
+
+  wxDataViewItemArray dataViewChildren;
+
+
+  wxCHECK_MSG(model != NULL,0,_("Valid model in data source does not exist."));
+  noOfChildren = model->GetChildren((item == nil) ? wxDataViewItem() : wxDataViewItem([((wxPointerObject*) item) pointer]),dataViewChildren);
+  [self bufferItem:item withChildren:&dataViewChildren];
+  if ([sortDescriptors count] > 0)
+    [children sortUsingFunction:CompareItems context:sortDescriptors];
+  return noOfChildren;
+}
+
+-(id) outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(NSTableColumn*)tableColumn byItem:(id)item
+{
+  wxDataViewColumn* dataViewColumnPtr(reinterpret_cast<wxDataViewColumn*>([[tableColumn identifier] pointer]));
+
+  wxDataViewItem dataViewItem([((wxPointerObject*) item) pointer]);
+
+  wxVariant value;
+
+
+  wxCHECK_MSG(model != NULL,0,_("Valid model in data source does not exist."));
+  model->GetValue(value,dataViewItem,dataViewColumnPtr->GetModelColumn());
+  dataViewColumnPtr->GetRenderer()->SetValue(value);
+  return nil;
+}
+
+-(void) outlineView:(NSOutlineView*)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn*)tableColumn byItem:(id)item
+{
+  wxDataViewColumn* dataViewColumnPtr(reinterpret_cast<wxDataViewColumn*>([[tableColumn identifier] pointer]));
+
+  wxDataViewItem dataViewItem([((wxPointerObject*) item) pointer]);
+
+
+  if (((dynamic_cast<wxDataViewTextRenderer*>(dataViewColumnPtr->GetRenderer()) != NULL) || (dynamic_cast<wxDataViewIconTextRenderer*>(dataViewColumnPtr->GetRenderer()) != NULL)) &&
+      ([object isKindOfClass:[NSString class]] == YES))
+  {
+    model->SetValue(wxVariant(wxCFStringRef([((NSString*) object) retain]).AsString()),dataViewItem,dataViewColumnPtr->GetModelColumn()); // the string has to be retained before being passed to wxCFStringRef
+    model->ValueChanged(dataViewItem,dataViewColumnPtr->GetModelColumn());
+  }
+  else if (dynamic_cast<wxDataViewChoiceRenderer*>(dataViewColumnPtr->GetRenderer()) != NULL)
+  {
+    if ([object isKindOfClass:[NSNumber class]] == YES)
+    {
+      model->SetValue(wxVariant(dynamic_cast<wxDataViewChoiceRenderer*>(dataViewColumnPtr->GetRenderer())->GetChoice([((NSNumber*) object) intValue])),
+                      dataViewItem,dataViewColumnPtr->GetModelColumn());
+      model->ValueChanged(dataViewItem,dataViewColumnPtr->GetModelColumn());
+    }
+    else if ([object isKindOfClass:[NSString class]] == YES) // do not know if this case can occur but initializing using strings works
+    {
+      model->SetValue(wxVariant(wxCFStringRef((NSString*) object).AsString()),dataViewItem,dataViewColumnPtr->GetModelColumn());
+      model->ValueChanged(dataViewItem,dataViewColumnPtr->GetModelColumn());
+    }
+  }
+  else if ((dynamic_cast<wxDataViewDateRenderer*>(dataViewColumnPtr->GetRenderer()) != NULL) && ([object isKindOfClass:[NSDate class]] == YES))
+  {
+    wxDateTime wxDateTimeValue(1,wxDateTime::Jan,1970);
+
+    wxLongLong seconds;
+
+    seconds.Assign([((NSDate*) object) timeIntervalSince1970]); // get the number of seconds since 1970-01-01 UTC and this is
+                                                                // the only way to convert a double to a wxLongLong
+   // the user has entered a date in the local timezone but seconds contains the number of seconds from date in the local timezone since 1970-01-01 UTC;
+   // therefore, the timezone information has to be transferred to wxWidgets, too:
+    wxDateTimeValue.Add(wxTimeSpan(0,0,seconds));
+    wxDateTimeValue.MakeFromTimezone(wxDateTime::UTC);
+    model->SetValue(wxVariant(wxDateTimeValue),dataViewItem,dataViewColumnPtr->GetModelColumn());
+    model->ValueChanged(dataViewItem,dataViewColumnPtr->GetModelColumn());
+  }
+  else if ((dynamic_cast<wxDataViewToggleRenderer*>(dataViewColumnPtr->GetRenderer()) != NULL) && ([object isKindOfClass:[NSNumber class]] == YES))
+  {
+    model->SetValue(wxVariant((bool) [((NSNumber*) object) boolValue]),dataViewItem,dataViewColumnPtr->GetModelColumn());
+    model->ValueChanged(dataViewItem,dataViewColumnPtr->GetModelColumn());
+  }
+}
+
+-(void) outlineView:(NSOutlineView*)outlineView sortDescriptorsDidChange:(NSArray*)oldDescriptors
+ // Warning: the new sort descriptors are guaranteed to be only of type NSSortDescriptor! Therefore, the
+ // sort descriptors for the data source have to be converted.
+{
+  NSArray* newDescriptors;
+
+  NSMutableArray* wxSortDescriptors;
+  
+  NSUInteger noOfDescriptors;
+
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+
+
+ // convert NSSortDescriptors to wxSortDescriptorObjects:
+  newDescriptors    = [outlineView sortDescriptors];
+  noOfDescriptors   = [newDescriptors count];
+  wxSortDescriptors = [NSMutableArray arrayWithCapacity:noOfDescriptors];
+  for (NSUInteger i=0; i<noOfDescriptors; ++i)
+  {
+   // constant definition for abbreviational purposes:
+    NSSortDescriptor* const newDescriptor = [newDescriptors objectAtIndex:i];
+
+    [wxSortDescriptors addObject:[[[wxSortDescriptorObject alloc] initWithModelPtr:model
+                                                                  sortingColumnPtr:dataViewCtrlPtr->GetColumn([[newDescriptor key] intValue])
+                                                                         ascending:[newDescriptor ascending]] autorelease]];
+  }
+  [[outlineView dataSource] setSortDescriptors:wxSortDescriptors];
+
+ // send first the event to wxWidgets that the sorting has changed so that the program can do special actions before
+ // the sorting actually starts:
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED,dataViewCtrlPtr->GetId()); // variable defintion
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  if (noOfDescriptors > 0)
+  {
+   // constant definition for abbreviational purposes:
+    wxDataViewColumn* const dataViewColumnPtr = [[wxSortDescriptors objectAtIndex:0] columnPtr];
+
+    dataViewEvent.SetColumn(dataViewCtrlPtr->GetColumnPosition(dataViewColumnPtr));
+    dataViewEvent.SetDataViewColumn(dataViewColumnPtr);
+  }
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+
+ // start re-ordering the data;
+ // children's buffer must be cleared first because it contains the old order:
+  [self clearChildren];
+ // sorting is done while reloading the data:
+  [outlineView reloadData];
+}
+
+-(NSDragOperation) outlineView:(NSOutlineView*)outlineView validateDrop:(id<NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index
+{
+  NSArray* supportedTypes([NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil]);
+
+  NSDragOperation dragOperation;
+
+  NSPasteboard* pasteboard([info draggingPasteboard]);
+
+  NSString* bestType([pasteboard availableTypeFromArray:supportedTypes]);
+
+  
+  if (bestType != nil)
+  {
+    wxDataViewCtrl* const  dataViewCtrlPtr(implementation->GetDataViewCtrl());
+
+    wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+    wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+  // create wxWidget's event:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE,dataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) item) pointer]));
+    dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+    if ([bestType compare:DataViewPboardType] == NSOrderedSame)
+    {
+      NSArray*               dataArray((NSArray*)[pasteboard propertyListForType:DataViewPboardType]);
+      NSUInteger             indexDraggedItem, noOfDraggedItems([dataArray count]);
+      
+      indexDraggedItem = 0;
+      while (indexDraggedItem < noOfDraggedItems)
+      {
+        wxDataObjectComposite* dataObjects(implementation->GetDnDDataObjects((NSData*)[dataArray objectAtIndex:indexDraggedItem]));
+
+        if ((dataObjects != NULL) && (dataObjects->GetFormatCount() > 0))
+        {
+          wxMemoryBuffer buffer;
+
+         // copy data into data object:
+          dataViewEvent.SetDataObject(dataObjects);
+          dataViewEvent.SetDataFormat(implementation->GetDnDDataFormat(dataObjects));
+         // copy data into buffer:
+          dataObjects->GetDataHere(dataViewEvent.GetDataFormat().GetType(),buffer.GetWriteBuf(dataViewEvent.GetDataSize()));
+          buffer.UngetWriteBuf(dataViewEvent.GetDataSize());
+          dataViewEvent.SetDataBuffer(buffer.GetData());
+         // finally, send event:
+          if (dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed())
+          {
+            dragOperation = NSDragOperationEvery;
+            ++indexDraggedItem;
+          }
+          else
+          {
+            dragOperation    = NSDragOperationNone;
+            indexDraggedItem = noOfDraggedItems; // stop loop
+          }
+        }
+        else
+        {
+          dragOperation    = NSDragOperationNone;
+          indexDraggedItem = noOfDraggedItems; // stop loop
+        }
+       // clean-up:
+        delete dataObjects;
+      }
+    }
+    else
+    {
+      CFDataRef              osxData; // needed to convert internally used UTF-16 representation to a UTF-8 representation
+      wxDataObjectComposite* dataObjects   (new wxDataObjectComposite());
+      wxTextDataObject*      textDataObject(new wxTextDataObject());
+      
+      osxData = ::CFStringCreateExternalRepresentation(kCFAllocatorDefault,(CFStringRef)[pasteboard stringForType:NSStringPboardType],kCFStringEncodingUTF8,32);
+      if (textDataObject->SetData(::CFDataGetLength(osxData),::CFDataGetBytePtr(osxData)))
+        dataObjects->Add(textDataObject);
+      else
+        delete textDataObject;
+     // send event if data could be copied:
+      if (dataObjects->GetFormatCount() > 0)
+      {
+        dataViewEvent.SetDataObject(dataObjects);
+        dataViewEvent.SetDataFormat(implementation->GetDnDDataFormat(dataObjects));
+        if (dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed())
+          dragOperation = NSDragOperationEvery;
+        else
+          dragOperation = NSDragOperationNone;
+      }
+      else
+        dragOperation = NSDragOperationNone;
+     // clean up:
+      ::CFRelease(osxData);
+      delete dataObjects;
+    }
+  }
+  else
+    dragOperation = NSDragOperationNone;
+  return dragOperation;
+}
+
+-(BOOL) outlineView:(NSOutlineView*)outlineView writeItems:(NSArray*)writeItems toPasteboard:(NSPasteboard*)pasteboard
+ // the pasteboard will be filled up with an array containing the data as returned by the events (including the data type)
+ // and a concatenation of text (string) data; the text data will only be put onto the pasteboard if for all items a
+ // string representation exists
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+  
+  wxDataViewItemArray dataViewItems;
+
+
+  wxCHECK_MSG(dataViewCtrlPtr != NULL,            false,_("Pointer to data view control not set correctly."));
+  wxCHECK_MSG(dataViewCtrlPtr->GetModel() != NULL,false,_("Pointer to model not set correctly."));
+
+  if ([writeItems count] > 0)
+  {
+    bool            dataStringAvailable(true); // a flag indicating if for all items a data string is available
+    NSMutableArray* dataArray = [[NSMutableArray arrayWithCapacity:[writeItems count]] retain]; // data of all items
+    wxString        dataString; // contains the string data of all items
+
+   // send a begin drag event for all selected items and proceed with dragging unless the event is vetoed:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG,dataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetModel(dataViewCtrlPtr->GetModel());
+    for (size_t itemCounter=0; itemCounter<[writeItems count]; ++itemCounter)
+    {
+      bool                   itemStringAvailable(false);              // a flag indicating if for the current item a string is available
+      wxDataObjectComposite* itemObject(new wxDataObjectComposite()); // data object for current item
+      wxString               itemString;                              // contains the TAB concatenated data of an item
+
+      dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [writeItems objectAtIndex:itemCounter]) pointer]));
+      itemString = ::ConcatenateDataViewItemValues(dataViewCtrlPtr,dataViewEvent.GetItem());
+      itemObject->Add(new wxTextDataObject(itemString));
+      dataViewEvent.SetDataObject(itemObject);
+     // check if event has not been vetoed:
+      if (dataViewCtrlPtr->HandleWindowEvent(dataViewEvent) && dataViewEvent.IsAllowed() && (dataViewEvent.GetDataObject()->GetFormatCount() > 0))
+      {
+       // constant definition for abbreviational purposes:
+        size_t const noOfFormats = dataViewEvent.GetDataObject()->GetFormatCount();
+       // variable definition and initialization:
+        wxDataFormat* dataFormats(new wxDataFormat[noOfFormats]);
+
+        dataViewEvent.GetDataObject()->GetAllFormats(dataFormats,wxDataObject::Get);
+        for (size_t formatCounter=0; formatCounter<noOfFormats; ++formatCounter)
+        {
+         // constant definitions for abbreviational purposes:
+          wxDataFormatId const idDataFormat = dataFormats[formatCounter].GetType();
+          size_t const dataSize       = dataViewEvent.GetDataObject()->GetDataSize(idDataFormat);
+          size_t const dataBufferSize = sizeof(wxDataFormatId)+dataSize;
+         // variable definitions (used in all case statements):
+          wxMemoryBuffer dataBuffer(dataBufferSize);
+          
+          dataBuffer.AppendData(&idDataFormat,sizeof(wxDataFormatId));
+          switch (idDataFormat)
+          {
+            case wxDF_TEXT:
+              if (!itemStringAvailable) // otherwise wxDF_UNICODETEXT already filled up the string; and the UNICODE representation has priority
+              {
+                dataViewEvent.GetDataObject()->GetDataHere(wxDF_TEXT,dataBuffer.GetAppendBuf(dataSize));
+                dataBuffer.UngetAppendBuf(dataSize);
+                [dataArray addObject:[NSData dataWithBytes:dataBuffer.GetData() length:dataBufferSize]];
+                itemString = wxString(reinterpret_cast<char const*>(dataBuffer.GetData())+sizeof(wxDataFormatId),wxConvLocal);
+                itemStringAvailable = true;
+              }
+              break;
+            case wxDF_UNICODETEXT:
+              {
+                dataViewEvent.GetDataObject()->GetDataHere(wxDF_UNICODETEXT,dataBuffer.GetAppendBuf(dataSize));
+                dataBuffer.UngetAppendBuf(dataSize);
+                if (itemStringAvailable) // does an object already exist as an ASCII text (see wxDF_TEXT case statement)?
+                  [dataArray replaceObjectAtIndex:itemCounter withObject:[NSData dataWithBytes:dataBuffer.GetData() length:dataBufferSize]];
+                else
+                  [dataArray addObject:[NSData dataWithBytes:dataBuffer.GetData() length:dataBufferSize]];
+                itemString = wxString::FromUTF8(reinterpret_cast<char const*>(dataBuffer.GetData())+sizeof(wxDataFormatId),dataSize);
+                itemStringAvailable = true;
+              } /* block */
+              break;
+            default:
+              wxFAIL_MSG(_("Data object has invalid or unsupported data format"));
+              [dataArray release];
+              return NO;
+          }
+        }
+        delete[] dataFormats;
+        delete itemObject;
+        if (dataStringAvailable)
+          if (itemStringAvailable)
+          {
+            if (itemCounter > 0)
+              dataString << wxT('\n');
+            dataString << itemString;
+          }
+          else
+            dataStringAvailable = false;
+      }
+      else
+      {
+        [dataArray release];
+        delete itemObject;
+        return NO; // dragging was vetoed or no data available
+      }
+    }
+    if (dataStringAvailable)
+    {
+      wxCFStringRef osxString(dataString);
+      
+      [pasteboard declareTypes:[NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil] owner:nil];
+      [pasteboard setPropertyList:dataArray forType:DataViewPboardType];
+      [pasteboard setString:osxString.AsNSString() forType:NSStringPboardType];
+    }
+    else
+    {
+      [pasteboard declareTypes:[NSArray arrayWithObject:DataViewPboardType] owner:nil];
+      [pasteboard setPropertyList:dataArray forType:DataViewPboardType];
+    }
+    return YES;
+  }
+  else
+    return NO; // no items to drag (should never occur)
+}
+
+//
+// buffer handling
+//
+-(void) addToBuffer:(wxPointerObject*)item
+{
+  [items addObject:item];
+}
+
+-(void) clearBuffer
+{
+  [items removeAllObjects];
+}
+
+-(wxPointerObject*) getDataViewItemFromBuffer:(wxDataViewItem const&)item
+{
+  return [items member:[[[wxPointerObject alloc] initWithPointer:item.GetID()] autorelease]];
+}
+
+-(wxPointerObject*) getItemFromBuffer:(wxPointerObject*)item
+{
+  return [items member:item];
+}
+
+-(BOOL) isInBuffer:(wxPointerObject*)item
+{
+  return [items containsObject:item];
+}
+
+-(void) removeFromBuffer:(wxPointerObject*)item
+{
+  [items removeObject:item];
+}
+
+//
+// children handling
+//
+-(void) appendChild:(wxPointerObject*)item
+{
+  [children addObject:item];
+}
+
+-(void) clearChildren
+{
+  [children removeAllObjects];
+}
+
+-(wxPointerObject*) getChild:(NSUInteger)index
+{
+  return [children objectAtIndex:index];
+}
+
+-(NSUInteger) getChildCount
+{
+  return [children count];
+}
+
+-(void) removeChild:(NSUInteger)index
+{
+  [children removeObjectAtIndex:index];
+}
+
+//
+// buffer handling
+//
+-(void) clearBuffers
+{
+  [self clearBuffer];
+  [self clearChildren];
+  [self setCurrentParentItem:nil];
+}
+
+//
+// sorting
+//
+-(NSArray*) sortDescriptors
+{
+  return sortDescriptors;
+}
+
+-(void) setSortDescriptors:(NSArray*)newSortDescriptors
+{
+  [newSortDescriptors retain];
+  [sortDescriptors release];
+  sortDescriptors = newSortDescriptors;
+}
+
+//
+// access to wxWidget's implementation
+//
+-(wxPointerObject*) currentParentItem
+{
+  return currentParentItem;
+}
+
+-(wxCocoaDataViewControl*) implementation
+{
+  return implementation;
+}
+
+-(wxDataViewModel*) model
+{
+  return model;
+}
+
+-(void) setCurrentParentItem:(wxPointerObject*)newCurrentParentItem
+{
+  [newCurrentParentItem retain];
+  [currentParentItem release];
+  currentParentItem = newCurrentParentItem;
+}
+
+-(void) setImplementation:(wxCocoaDataViewControl*) newImplementation
+{
+  implementation = newImplementation;
+}
+
+-(void) setModel:(wxDataViewModel*) newModel
+{
+  model = newModel;
+}
+
+//
+// other methods
+//
+-(void) bufferItem:(wxPointerObject*)parentItem withChildren:(wxDataViewItemArray*)dataViewChildrenPtr
+{
+  NSInteger const noOfChildren = (*dataViewChildrenPtr).GetCount();
+
+  [self setCurrentParentItem:parentItem];
+  [self clearChildren];
+  for (NSInteger indexChild=0; indexChild<noOfChildren; ++indexChild)
+  {
+    wxPointerObject* bufferedPointerObject;
+    wxPointerObject* newPointerObject([[wxPointerObject alloc] initWithPointer:(*dataViewChildrenPtr)[indexChild].GetID()]);
+
+   // The next statement and test looks strange but there is unfortunately no workaround:
+   // due to the fact that two pointer objects are identical if their pointers are identical - because the method isEqual
+   // has been overloaded - the set operation will only add a new pointer object if there is not already one in the set
+   // having the same pointer. On the other side the children's array would always add the new pointer object. This means
+   // that different pointer objects are stored in the set and array. This will finally lead to a crash as objects diverge.
+   // To solve this issue it is first tested if the child already exists in the set and if it is the case the sets object
+   // is going to be appended to the array, otheriwse the new pointer object is added to the set and array:
+    bufferedPointerObject = [self getItemFromBuffer:newPointerObject];
+    if (bufferedPointerObject == nil)
+    {
+      [items    addObject:newPointerObject];
+      [children addObject:newPointerObject];
+    }
+    else
+      [children addObject:bufferedPointerObject];
+    [newPointerObject release];
+  }
+}
+
+@end
+
+// ============================================================================
+// wxCustomCell
+// ============================================================================
+@implementation wxCustomCell
+//
+// other methods
+//
+-(NSSize) cellSize
+{
+  wxCustomRendererObject* customRendererObject(((wxCustomRendererObject*)[self objectValue]));
+
+
+  return NSMakeSize(customRendererObject->customRenderer->GetSize().GetWidth(),customRendererObject->customRenderer->GetSize().GetHeight());
+}
+
+//
+// implementations
+//
+-(void) drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
+{
+  wxCustomRendererObject* customRendererObject(((wxCustomRendererObject*)[self objectValue]));
+
+
+ // draw its own background:
+  [[self backgroundColor] set];
+  NSRectFill(cellFrame);
+
+  (void) (customRendererObject->customRenderer->Render(wxFromNSRect(controlView,cellFrame),customRendererObject->customRenderer->GetDC(),0));
+  customRendererObject->customRenderer->SetDC(NULL);
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+-(NSUInteger) hitTestForEvent:(NSEvent*)event inRect:(NSRect)cellFrame ofView:(NSView*)controlView
+{
+  NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
+
+  wxCustomRendererObject* customRendererObject((wxCustomRendererObject*)[self objectValue]);
+
+
+
+  customRendererObject->customRenderer->LeftClick(wxFromNSPoint(controlView,point),wxFromNSRect(controlView,cellFrame),
+                                                  customRendererObject->GetOwner()->GetOwner(),wxDataViewItem([customRendererObject->item pointer]),
+                                                  [this->m_OutlineView columnWithIdentifier:[customRendererObject->GetColumnPtr() identifier]]);
+  return NSCellHitContentArea;
+}
+#endif
+
+-(NSRect) imageRectForBounds:(NSRect)cellFrame
+{
+  return cellFrame;
+}
+
+-(NSRect) titleRectForBounds:(NSRect)cellFrame
+{
+   return cellFrame;
+}
+
+@end
+
+// ============================================================================
+// wxImageTextCell
+// ============================================================================
+@implementation wxImageTextCell
+//
+// initialization
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+  {
+   // initializing the text part:
+    [self setLineBreakMode:NSLineBreakByTruncatingMiddle];
+    [self setSelectable:YES];
+   // initializing the image part:
+    image       = nil;
+    imageSize   = NSMakeSize(16,16);
+    spaceImageText = 5.0;
+    xImageShift    = 5.0;
+  }
+  return self;
+}
+
+-(id) copyWithZone:(NSZone*)zone
+{
+  wxImageTextCell* cell;
+  
+  
+  cell = (wxImageTextCell*) [super copyWithZone:zone];
+  cell->image          = [image retain];
+  cell->imageSize      = imageSize;
+  cell->spaceImageText = spaceImageText;
+  cell->xImageShift    = xImageShift;
+
+  return cell;
+}
+
+-(void) dealloc
+{
+  [image release];
+
+  [super dealloc];
+}
+
+//
+// alignment
+//
+-(NSTextAlignment) alignment
+{
+  return cellAlignment;
+}
+
+-(void) setAlignment:(NSTextAlignment)newAlignment
+{
+  cellAlignment = newAlignment;
+  switch (newAlignment)
+  {
+    case NSCenterTextAlignment:
+    case NSLeftTextAlignment:
+    case NSJustifiedTextAlignment:
+    case NSNaturalTextAlignment:
+      [super setAlignment:NSLeftTextAlignment];
+      break;
+    case NSRightTextAlignment:
+      [super setAlignment:NSRightTextAlignment];
+      break;
+    default:
+      wxFAIL_MSG(_("Unknown alignment type."));
+  }
+}
+
+//
+// image access
+//
+-(NSImage*) image
+{
+  return image;
+}
+
+-(void) setImage:(NSImage*)newImage
+{
+  [newImage retain];
+  [image release];
+  image = newImage;
+}
+
+-(NSSize) imageSize
+{
+  return imageSize;
+}
+
+-(void) setImageSize:(NSSize) newImageSize
+{
+  imageSize = newImageSize;
+}
+
+//
+// other methods
+//
+-(NSSize) cellImageSize
+{
+  return NSMakeSize(imageSize.width+xImageShift+spaceImageText,imageSize.height);
+}
+
+-(NSSize) cellSize
+{
+  NSSize cellSize([super cellSize]);
+
+
+  if (imageSize.height > cellSize.height)
+    cellSize.height = imageSize.height;
+  cellSize.width += imageSize.width+xImageShift+spaceImageText;
+
+  return cellSize;
+}
+
+-(NSSize) cellTextSize
+{
+  return [super cellSize];
+}
+
+//
+// implementations
+//
+-(void) determineCellParts:(NSRect)cellFrame imagePart:(NSRect*)imageFrame textPart:(NSRect*)textFrame
+{
+  switch (cellAlignment)
+  {
+    case NSCenterTextAlignment:
+      {
+        CGFloat const cellSpace = cellFrame.size.width-[self cellSize].width;
+
+        if (cellSpace <= 0) // if the cell's frame is smaller than its contents (at least in x-direction) make sure that the image is visible:
+          NSDivideRect(cellFrame,imageFrame,textFrame,xImageShift+imageSize.width+spaceImageText,NSMinXEdge);
+        else // otherwise center the image and text in the cell's frame
+          NSDivideRect(cellFrame,imageFrame,textFrame,xImageShift+imageSize.width+spaceImageText+0.5*cellSpace,NSMinXEdge);
+      }
+      break;
+    case NSJustifiedTextAlignment:
+    case NSLeftTextAlignment:
+    case NSNaturalTextAlignment: // how to determine the natural writing direction? TODO
+      NSDivideRect(cellFrame,imageFrame,textFrame,xImageShift+imageSize.width+spaceImageText,NSMinXEdge);
+      break;
+    case NSRightTextAlignment:
+      {
+        CGFloat const cellSpace = cellFrame.size.width-[self cellSize].width;
+
+        if (cellSpace <= 0) // if the cell's frame is smaller than its contents (at least in x-direction) make sure that the image is visible:
+          NSDivideRect(cellFrame,imageFrame,textFrame,xImageShift+imageSize.width+spaceImageText,NSMinXEdge);
+        else // otherwise right align the image and text in the cell's frame
+          NSDivideRect(cellFrame,imageFrame,textFrame,xImageShift+imageSize.width+spaceImageText+cellSpace,NSMinXEdge);
+      }
+      break;
+    default:
+      *imageFrame = NSZeroRect;
+      *textFrame  = NSZeroRect;
+      wxFAIL_MSG(_("Unhandled alignment type."));
+  }
+}
+
+-(void) drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
+{
+  NSRect textFrame, imageFrame;
+
+
+  [self determineCellParts:cellFrame imagePart:&imageFrame textPart:&textFrame];
+// draw the image part by ourselves;
+ // check if the cell has to draw its own background (checking is done by the parameter of the textfield's cell):
+  if ([self drawsBackground])
+  {
+    [[self backgroundColor] set];
+    NSRectFill(imageFrame);
+  }
+  if (image != nil)
+  {
+   // the image is slightly shifted (xImageShift) and has a fixed size but the image's frame might be larger and starts
+   // currently on the left side of the cell's frame; therefore, the origin and the image's frame size have to be adjusted:
+    if (imageFrame.size.width >= xImageShift+imageSize.width+spaceImageText)
+    {
+      imageFrame.origin.x += imageFrame.size.width-imageSize.width-spaceImageText;
+      imageFrame.size.width = imageSize.width;
+    }
+    else
+    {
+      imageFrame.origin.x   += xImageShift;
+      imageFrame.size.width -= xImageShift+spaceImageText;
+    }
+   // ...and the image has to be centered in the y-direction:
+    if (imageFrame.size.height > imageSize.height)
+      imageFrame.size.height = imageSize.height;
+    imageFrame.origin.y += ceil(0.5*(cellFrame.size.height-imageFrame.size.height));
+
+   // according to the documentation the coordinate system should be flipped for NSTableViews (y-coordinate goes from top to bottom);
+   // to draw an image correctly the coordinate system has to be transformed to a bottom-top coordinate system, otherwise the image's
+   // content is flipped:
+    NSAffineTransform* coordinateTransform([NSAffineTransform transform]);
+    
+    if ([controlView isFlipped])
+    {
+      [coordinateTransform scaleXBy: 1.0 yBy:-1.0]; // first the coordinate system is brought back to bottom-top orientation
+      [coordinateTransform translateXBy:0.0 yBy:(-2.0)*imageFrame.origin.y-imageFrame.size.height]; // the coordinate system has to be moved to compensate for the
+      [coordinateTransform concat];                                                                 // other orientation and the position of the image's frame
+    }
+    [image drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; // suggested method to draw the image
+                                                                                                    // instead of compositeToPoint:operation:
+   // take back previous transformation (if the view is not flipped the coordinate transformation matrix contains the identity matrix
+   // and the next two operations do not change the content's transformation matrix):
+    [coordinateTransform invert];
+    [coordinateTransform concat];
+  }
+ // let the textfield cell draw the text part:
+  if (textFrame.size.width > [self cellTextSize].width) // for unknown reasons the alignment of the text cell is ignored; therefore change the size so that
+    textFrame.size.width = [self cellTextSize].width;   // alignment does not influence the visualization anymore
+  [super drawWithFrame:textFrame inView:controlView];
+}
+
+-(void) editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent
+{
+  NSRect textFrame, imageFrame;
+
+
+  [self determineCellParts:aRect imagePart:&imageFrame textPart:&textFrame];
+  [super editWithFrame:textFrame inView:controlView editor:textObj delegate:anObject event:theEvent];
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+-(NSUInteger) hitTestForEvent:(NSEvent*)event inRect:(NSRect)cellFrame ofView:(NSView*)controlView
+{
+  NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
+
+  NSRect imageFrame, textFrame;
+
+
+  [self determineCellParts:cellFrame imagePart:&imageFrame textPart:&textFrame];
+  if (image != nil)
+  {
+   // the image is shifted...
+    if (imageFrame.size.width >= xImageShift+imageSize.width+spaceImageText)
+    {
+      imageFrame.origin.x += imageFrame.size.width-imageSize.width-spaceImageText;
+      imageFrame.size.width = imageSize.width;
+    }
+    else
+    {
+      imageFrame.origin.x   += xImageShift;
+      imageFrame.size.width -= xImageShift+spaceImageText;
+    }
+   // ...and centered:
+    if (imageFrame.size.height > imageSize.height)
+      imageFrame.size.height = imageSize.height;
+    imageFrame.origin.y += ceil(0.5*(cellFrame.size.height-imageFrame.size.height));
+    // If the point is in the image rect, then it is a content hit (see documentation for hitTestForEvent:inRect:ofView):
+    if (NSMouseInRect(point, imageFrame, [controlView isFlipped]))
+      return NSCellHitContentArea;
+  }
+ // if the image was not hit let's try the text part:
+  if (textFrame.size.width > [self cellTextSize].width) // for unknown reasons the alignment of the text cell is ignored; therefore change the size so that
+    textFrame.size.width = [self cellTextSize].width;   // alignment does not influence the visualization anymore
+  return [super hitTestForEvent:event inRect:textFrame ofView:controlView];    
+}
+#endif
+
+-(NSRect) imageRectForBounds:(NSRect)cellFrame
+{
+  NSRect textFrame, imageFrame;
+
+
+  [self determineCellParts:cellFrame imagePart:&imageFrame textPart:&textFrame];
+  if (imageFrame.size.width >= xImageShift+imageSize.width+spaceImageText)
+  {
+    imageFrame.origin.x += imageFrame.size.width-imageSize.width-spaceImageText;
+    imageFrame.size.width = imageSize.width;
+  }
+  else
+  {
+    imageFrame.origin.x   += xImageShift;
+    imageFrame.size.width -= xImageShift+spaceImageText;
+  }
+ // ...and centered:
+  if (imageFrame.size.height > imageSize.height)
+    imageFrame.size.height = imageSize.height;
+  imageFrame.origin.y += ceil(0.5*(cellFrame.size.height-imageFrame.size.height));
+  
+  return imageFrame;
+}
+
+-(void) selectWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
+{
+  NSRect textFrame, imageFrame;
+
+
+  [self determineCellParts:aRect imagePart:&imageFrame textPart:&textFrame];
+  [super selectWithFrame:textFrame inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
+}
+
+-(NSRect) titleRectForBounds:(NSRect)cellFrame
+{
+  NSRect textFrame, imageFrame;
+
+
+  [self determineCellParts:cellFrame imagePart:&imageFrame textPart:&textFrame];
+   return textFrame;
+}
+
+@end
+
+// ============================================================================
+// wxCocoaOutlineView
+// ============================================================================
+@implementation wxCocoaOutlineView
+
+//
+// initializers / destructor
+//
+-(id) init
+{
+  self = [super init];
+  if (self != nil)
+  {
+    isEditingCell = NO;
+    [self registerForDraggedTypes:[NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil]];
+    [self setDelegate:self];
+    [self setDoubleAction:@selector(actionDoubleClick:)];
+    [self setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
+    [self setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];
+    [self setTarget:self];
+  }
+  return self;
+}
+
+//
+// access to wxWidget's implementation
+//
+-(wxCocoaDataViewControl*) implementation
+{
+  return implementation;
+}
+
+-(void) setImplementation:(wxCocoaDataViewControl*) newImplementation
+{
+  implementation = newImplementation;
+}
+
+//
+// actions
+//
+-(void) actionDoubleClick:(id)sender
+ // actually the documentation (NSTableView 2007-10-31) for doubleAction: and setDoubleAction: seems to be wrong as this action message is always sent
+ // whether the cell is editable or not
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED,dataViewCtrlPtr->GetId()); // variable definition
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [self itemAtRow:[self clickedRow]]) pointer]));
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+}
+
+
+//
+// contextual menus
+//
+-(NSMenu*) menuForEvent:(NSEvent*)theEvent
+ // this method does not do any special menu event handling but only sends an event message; therefore, the user
+ // has full control if a context menu should be shown or not
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,dataViewCtrlPtr->GetId());
+
+  wxDataViewItemArray selectedItems;
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  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 only the first
+ // item of the array is returned:
+  if (dataViewCtrlPtr->GetSelections(selectedItems) > 0)
+    dataViewEvent.SetItem(selectedItems[0]);
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+ // nothing is done:
+  return nil;
+}
+
+//
+// delegate methods
+//
+-(void) outlineView:(NSOutlineView*)outlineView mouseDownInHeaderOfTableColumn:(NSTableColumn*)tableColumn
+{
+  wxDataViewColumn* const dataViewColumnPtr(reinterpret_cast<wxDataViewColumn*>([[tableColumn identifier] pointer]));
+
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK,dataViewCtrlPtr->GetId());
+
+
+ // first, send an event that the user clicked into a column's header:
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetColumn(dataViewCtrlPtr->GetColumnPosition(dataViewColumnPtr));
+  dataViewEvent.SetDataViewColumn(dataViewColumnPtr);
+  dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+
+ // now, check if the click may have had an influence on sorting, too;
+ // the sorting setup has to be done only if the clicked table column is sortable and has not been used for
+ // sorting before the click; if the column is already responsible for sorting the native control changes
+ // the sorting direction automatically and informs the data source via outlineView:sortDescriptorsDidChange:
+  if (dataViewColumnPtr->IsSortable() && ([tableColumn sortDescriptorPrototype] == nil))
+  {
+   // remove the sort order from the previously sorted column table (it can also be that
+   // no sorted column table exists):
+    UInt32 const noOfColumns = [outlineView numberOfColumns];
+    
+    for (UInt32 i=0; i<noOfColumns; ++i)
+      [[[outlineView tableColumns] objectAtIndex:i] setSortDescriptorPrototype:nil];
+   // make column table sortable:
+    NSArray*          sortDescriptors;
+    NSSortDescriptor* sortDescriptor;
+    
+    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[NSString stringWithFormat:@"%d",[outlineView columnWithIdentifier:[tableColumn identifier]]]
+                                                 ascending:YES];
+    sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
+    [tableColumn setSortDescriptorPrototype:sortDescriptor];
+    [outlineView setSortDescriptors:sortDescriptors];
+    [sortDescriptor release];
+  }
+}
+
+-(BOOL) outlineView:(NSOutlineView*)outlineView shouldCollapseItem:(id)item
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,dataViewCtrlPtr->GetId()); // variable definition
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem       (wxDataViewItem([((wxPointerObject*) item) pointer]));
+  dataViewEvent.SetModel      (dataViewCtrlPtr->GetModel());
+ // finally send the equivalent wxWidget event:
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+ // opening the container is allowed if not vetoed:
+  return dataViewEvent.IsAllowed();
+}
+
+-(BOOL) outlineView:(NSOutlineView*)outlineView shouldExpandItem:(id)item
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,dataViewCtrlPtr->GetId()); // variable definition
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem       (wxDataViewItem([((wxPointerObject*) item) pointer]));
+  dataViewEvent.SetModel      (dataViewCtrlPtr->GetModel());
+ // finally send the equivalent wxWidget event:
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+ // opening the container is allowed if not vetoed:
+  return dataViewEvent.IsAllowed();
+}
+
+-(BOOL) outlineView:(NSOutlineView*)outlineView shouldSelectTableColumn:(NSTableColumn*)tableColumn
+{
+  return NO;
+}
+
+-(void) outlineView:(NSOutlineView*)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn*) tableColumn item:(id)item
+{
+  wxDataViewColumn* dataViewColumnPtr(reinterpret_cast<wxDataViewColumn*>([[tableColumn identifier] pointer]));
+
+
+  dataViewColumnPtr->GetRenderer()->GetNativeData()->SetColumnPtr(tableColumn);
+  dataViewColumnPtr->GetRenderer()->GetNativeData()->SetItem(item);
+  dataViewColumnPtr->GetRenderer()->GetNativeData()->SetItemCell(cell);
+  (void) dataViewColumnPtr->GetRenderer()->Render();
+}
+
+//
+// notifications
+//
+-(void) outlineViewColumnDidMove:(NSNotification*)notification
+{
+  int const newColumnPosition = [[[notification userInfo] objectForKey:@"NSNewColumn"] intValue];
+
+  wxDataViewColumn* const dataViewColumnPtr(reinterpret_cast<wxDataViewColumn*>([[[[self tableColumns] objectAtIndex:newColumnPosition] identifier] pointer]));
+
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+  
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED,dataViewCtrlPtr->GetId());
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetColumn(dataViewCtrlPtr->GetColumnPosition(dataViewColumnPtr));
+  dataViewEvent.SetDataViewColumn(dataViewColumnPtr);
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+}
+
+-(void) outlineViewItemDidCollapse:(NSNotification*)notification
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,dataViewCtrlPtr->GetId());
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [[notification userInfo] objectForKey:@"NSObject"]) pointer]));
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+}
+
+-(void) outlineViewItemDidExpand:(NSNotification*)notification
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+            
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,dataViewCtrlPtr->GetId());
+
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [[notification userInfo] objectForKey:@"NSObject"]) pointer]));
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+}
+
+-(void) outlineViewSelectionDidChange:(NSNotification*)notification
+{
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+
+  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);
+}
+
+-(void) textDidBeginEditing:(NSNotification*)notification
+ // this notification is only sent if the user started modifying the cell (not when the user clicked into the cell
+ // and the cell's editor is called!)
+{
+ // call method of superclass (otherwise editing does not work correctly - the outline data source class is not
+ // informed about a change of data):
+  [super textDidBeginEditing:notification];
+
+  wxDataViewColumn* const dataViewColumnPtr = reinterpret_cast<wxDataViewColumn*>([[[[self tableColumns] objectAtIndex:[self editedColumn]] identifier] pointer]);
+
+  wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+
+
+ // stop editing of a custom item first (if necessary)
+  dataViewCtrlPtr->FinishCustomItemEditing();
+ // set the flag that currently a cell is being edited (see also textDidEndEditing:):
+  isEditingCell = YES;
+
+ // now, send the event:
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED,dataViewCtrlPtr->GetId()); // variable definition
+
+  dataViewEvent.SetEventObject(dataViewCtrlPtr);
+  dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [self itemAtRow:[self editedRow]]) pointer]));
+  dataViewEvent.SetColumn(dataViewCtrlPtr->GetColumnPosition(dataViewColumnPtr));
+  dataViewEvent.SetDataViewColumn(dataViewColumnPtr);
+  dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+}
+
+-(void) textDidEndEditing:(NSNotification*)notification
+{
+ // call method of superclass (otherwise editing does not work correctly - the outline data source class is not
+ // informed about a change of data):
+  [super textDidEndEditing:notification];
+
+ // under OSX an event indicating the end of an editing session can be sent even if no event indicating a start of an
+ // editing session has been sent (see Documentation for NSControl controlTextDidEndEditing:); this is not expected by a user
+ // of the wxWidgets library and therefore an wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE event is only sent if a corresponding
+ // wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED has been sent before; to check if a wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED
+ // has been sent the flag isEditingCell is used:
+  if (isEditingCell == YES)
+  {
+    wxDataViewColumn* const dataViewColumnPtr = reinterpret_cast<wxDataViewColumn*>([[[[self tableColumns] objectAtIndex:[self editedColumn]] identifier] pointer]);
+
+    wxDataViewCtrl* const dataViewCtrlPtr = implementation->GetDataViewCtrl();
+
+   // send event to wxWidgets:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,dataViewCtrlPtr->GetId()); // variable definition
+
+    dataViewEvent.SetEventObject(dataViewCtrlPtr);
+    dataViewEvent.SetItem(wxDataViewItem([((wxPointerObject*) [self itemAtRow:[self editedRow]]) pointer]));
+    dataViewEvent.SetColumn(dataViewCtrlPtr->GetColumnPosition(dataViewColumnPtr));
+    dataViewEvent.SetDataViewColumn(dataViewColumnPtr);
+    dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+   // set flag to the inactive state:
+    isEditingCell = NO;
+  }
+}
+
+@end
+// ============================================================================
+// wxCocoaDataViewControl
+// ============================================================================
+//
+// constructors / destructor
+//
+wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer, wxPoint const& pos, wxSize const& size, long style)
+                       :wxWidgetCocoaImpl(peer,[[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)]),
+                        m_DataSource(NULL), m_OutlineView([[wxCocoaOutlineView alloc] init])
+{
+ // initialize scrollview (the outline view is part of a scrollview):
+  NSScrollView* scrollview = (NSScrollView*) this->GetWXWidget(); // definition for abbreviational purposes
+  
+
+  [scrollview setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+  [scrollview setBorderType:NSNoBorder];
+  [scrollview setHasVerticalScroller:YES];
+  [scrollview setHasHorizontalScroller:YES];
+  [scrollview setAutohidesScrollers:YES];
+  [scrollview setDocumentView:this->m_OutlineView];
+
+ // setting up the native control itself
+  NSUInteger maskGridStyle(NSTableViewGridNone);
+
+  [this->m_OutlineView setImplementation:this];
+  [this->m_OutlineView setColumnAutoresizingStyle:NSTableViewSequentialColumnAutoresizingStyle];
+  [this->m_OutlineView setIndentationPerLevel:this->GetDataViewCtrl()->GetIndent()];
+  if (style & wxDV_HORIZ_RULES)
+    maskGridStyle |= NSTableViewSolidHorizontalGridLineMask;
+  if (style & wxDV_VERT_RULES)
+    maskGridStyle |= NSTableViewSolidVerticalGridLineMask;
+  [this->m_OutlineView setGridStyleMask:maskGridStyle];
+  [this->m_OutlineView setAllowsMultipleSelection:           (style & wxDV_MULTIPLE)  != 0];
+  [this->m_OutlineView setUsesAlternatingRowBackgroundColors:(style & wxDV_ROW_LINES) != 0];
+}
+
+wxCocoaDataViewControl::~wxCocoaDataViewControl(void)
+{
+  [this->m_DataSource  release];
+  [this->m_OutlineView release];
+}
+
+//
+// column related methods (inherited from wxDataViewWidgetImpl)
+//
+bool wxCocoaDataViewControl::ClearColumns(void)
+{
+  bool const bufAllowsMultipleSelection = [this->m_OutlineView allowsMultipleSelection];
+
+
+ // as there is a bug in NSOutlineView version (OSX 10.5.6 #6555162) the columns cannot be deleted if there is an outline column in the view;
+ // therefore, the whole view is deleted and newly constructed:
+  [this->m_OutlineView release];
+  this->m_OutlineView = [[wxCocoaOutlineView alloc] init];
+  [((NSScrollView*) this->GetWXWidget()) setDocumentView:this->m_OutlineView];
+
+ // setting up the native control itself
+  [this->m_OutlineView setImplementation:this];
+  [this->m_OutlineView setColumnAutoresizingStyle:NSTableViewSequentialColumnAutoresizingStyle];
+  [this->m_OutlineView setIndentationPerLevel:this->GetDataViewCtrl()->GetIndent()];
+  if (bufAllowsMultipleSelection)
+    [this->m_OutlineView setAllowsMultipleSelection:YES];
+  [this->m_OutlineView setDataSource:this->m_DataSource];
+ // done:
+  return true;
+}
+
+bool wxCocoaDataViewControl::DeleteColumn(wxDataViewColumn* columnPtr)
+{
+  if ([this->m_OutlineView outlineTableColumn] == columnPtr->GetNativeData()->GetNativeColumnPtr())
+    [this->m_OutlineView setOutlineTableColumn:nil]; // due to a bug this does not work
+  [this->m_OutlineView removeTableColumn:columnPtr->GetNativeData()->GetNativeColumnPtr()]; // due to a confirmed bug #6555162 the deletion does not work for
+                                                                                            // outline table columns (... and there is no workaround)
+  return (([this->m_OutlineView columnWithIdentifier:[[[wxPointerObject alloc] initWithPointer:columnPtr] autorelease]]) == -1);
+}
+
+void wxCocoaDataViewControl::DoSetExpanderColumn(wxDataViewColumn const* columnPtr)
+{
+  [this->m_OutlineView setOutlineTableColumn:columnPtr->GetNativeData()->GetNativeColumnPtr()];
+}
+
+wxDataViewColumn* wxCocoaDataViewControl::GetColumn(unsigned int pos) const
+{
+  return reinterpret_cast<wxDataViewColumn*>([[[[this->m_OutlineView tableColumns] objectAtIndex:pos] identifier] pointer]);
+}
+
+int wxCocoaDataViewControl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
+{
+  return [this->m_OutlineView columnWithIdentifier:[[[wxPointerObject alloc] initWithPointer:const_cast<wxDataViewColumn*>(columnPtr)] autorelease]];
+}
+
+bool wxCocoaDataViewControl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
+{
+  NSTableColumn* nativeColumn;
+
+
+ // create column and set the native data of the dataview column:
+  nativeColumn = ::CreateNativeColumn(columnPtr);
+  columnPtr->GetNativeData()->SetNativeColumnPtr(nativeColumn);
+ // as the native control does not allow the insertion of a column at a specified position the column is first appended and
+ // - if necessary - moved to its final position:
+  [this->m_OutlineView addTableColumn:nativeColumn];
+  if (pos != static_cast<unsigned int>([this->m_OutlineView numberOfColumns]-1))
+    [this->m_OutlineView moveColumn:[this->m_OutlineView numberOfColumns]-1 toColumn:pos];
+ // done:
+  return true;
+}
+
+//
+// item related methods (inherited from wxDataViewWidgetImpl)
+//
+bool wxCocoaDataViewControl::Add(wxDataViewItem const& parent, wxDataViewItem const& WXUNUSED(item))
+{
+  if (parent.IsOk())
+    [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:parent] reloadChildren:YES];
+  else
+    [this->m_OutlineView reloadData];
+  return true;
+}
+
+bool wxCocoaDataViewControl::Add(wxDataViewItem const& parent, wxDataViewItemArray const& WXUNUSED(items))
+{
+  if (parent.IsOk())
+    [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:parent] reloadChildren:YES];
+  else
+    [this->m_OutlineView reloadData];
+  return true;
+}
+
+void wxCocoaDataViewControl::Collapse(wxDataViewItem const& item)
+{
+  [this->m_OutlineView collapseItem:[this->m_DataSource getDataViewItemFromBuffer:item]];
+}
+
+void wxCocoaDataViewControl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+{
+  if (item.IsOk())
+  {
+    [this->m_OutlineView scrollRowToVisible:[this->m_OutlineView rowForItem:[this->m_DataSource getDataViewItemFromBuffer:item]]];
+    if (columnPtr != NULL)
+      [this->m_OutlineView scrollColumnToVisible:this->GetColumnPosition(columnPtr)];
+  }
+}
+
+void wxCocoaDataViewControl::Expand(wxDataViewItem const& item)
+{
+  [this->m_OutlineView expandItem:[this->m_DataSource getDataViewItemFromBuffer:item]];
+}
+
+unsigned int wxCocoaDataViewControl::GetCount(void) const
+{
+  return [this->m_OutlineView numberOfRows];
+}
+
+wxRect wxCocoaDataViewControl::GetRectangle(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+{
+  return wxFromNSRect([m_osxView superview],[this->m_OutlineView frameOfCellAtColumn:this->GetColumnPosition(columnPtr)
+                                             row:[this->m_OutlineView rowForItem:[this->m_DataSource getDataViewItemFromBuffer:item]]]);
+}
+
+bool wxCocoaDataViewControl::IsExpanded(wxDataViewItem const& item) const
+{
+  return [this->m_OutlineView isItemExpanded:[this->m_DataSource getDataViewItemFromBuffer:item]];
+}
+
+bool wxCocoaDataViewControl::Reload(void)
+{
+  [this->m_DataSource clearBuffers];
+  [this->m_OutlineView scrollColumnToVisible:0];
+  [this->m_OutlineView scrollRowToVisible:0];
+  [this->m_OutlineView reloadData];
+  return true;
+}
+
+bool wxCocoaDataViewControl::Remove(wxDataViewItem const& parent, wxDataViewItem const& WXUNUSED(item))
+{
+  if (parent.IsOk())
+    [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:parent] reloadChildren:YES];
+  else
+    [this->m_OutlineView reloadData];
+  return true;
+}
+
+bool wxCocoaDataViewControl::Remove(wxDataViewItem const& parent, wxDataViewItemArray const& WXUNUSED(item))
+{
+  if (parent.IsOk())
+    [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:parent] reloadChildren:YES];
+  else
+    [this->m_OutlineView reloadData];
+  return true;
+}
+
+bool wxCocoaDataViewControl::Update(wxDataViewColumn const* columnPtr)
+{
+  return false;
+}
+
+bool wxCocoaDataViewControl::Update(wxDataViewItem const& WXUNUSED(parent), wxDataViewItem const& item)
+{
+  [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:item]];
+  return true;
+}
+
+bool wxCocoaDataViewControl::Update(wxDataViewItem const& WXUNUSED(parent), wxDataViewItemArray const& items)
+{
+  for (size_t i=0; i<items.GetCount(); ++i)
+    [this->m_OutlineView reloadItem:[this->m_DataSource getDataViewItemFromBuffer:items[i]]];
+  return true;
+}
+
+//
+// model related methods
+//
+bool wxCocoaDataViewControl::AssociateModel(wxDataViewModel* model)
+{
+  [this->m_DataSource release];
+  if (model != NULL)
+  {
+    this->m_DataSource = [[wxCocoaOutlineDataSource alloc] init];
+    [this->m_DataSource setImplementation:this];
+    [this->m_DataSource setModel:model];
+  }
+  else
+    this->m_DataSource = NULL;
+  [this->m_OutlineView setDataSource:this->m_DataSource]; // if there is a data source the data is immediately going to be requested
+  return true;
+}
+
+//
+// selection related methods (inherited from wxDataViewWidgetImpl)
+//
+int wxCocoaDataViewControl::GetSelections(wxDataViewItemArray& sel) const
+{
+  NSIndexSet* selectedRowIndexes([this->m_OutlineView selectedRowIndexes]);
+  
+  NSUInteger indexRow;
+
+  
+  sel.Empty();
+  sel.Alloc([selectedRowIndexes count]);
+  indexRow = [selectedRowIndexes firstIndex];
+  while (indexRow != NSNotFound)
+  {
+    sel.Add(wxDataViewItem([[this->m_OutlineView itemAtRow:indexRow] pointer]));
+    indexRow = [selectedRowIndexes indexGreaterThanIndex:indexRow];
+  }
+  return sel.GetCount();
+}
+
+bool wxCocoaDataViewControl::IsSelected(wxDataViewItem const& item) const
+{
+  return [this->m_OutlineView isRowSelected:[this->m_OutlineView rowForItem:[this->m_DataSource getDataViewItemFromBuffer:item]]];
+}
+
+void wxCocoaDataViewControl::Select(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+    [this->m_OutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:[this->m_OutlineView rowForItem:[this->m_DataSource getDataViewItemFromBuffer:item]]]
+                        byExtendingSelection:NO];
+}
+
+void wxCocoaDataViewControl::SelectAll(void)
+{
+  [this->m_OutlineView selectAll:this->m_OutlineView];
+}
+
+void wxCocoaDataViewControl::Unselect(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+    [this->m_OutlineView deselectRow:[this->m_OutlineView rowForItem:[this->m_DataSource getDataViewItemFromBuffer:item]]];
+}
+
+void wxCocoaDataViewControl::UnselectAll(void)
+{
+  [this->m_OutlineView deselectAll:this->m_OutlineView];
+}
+
+//
+// sorting related methods
+//
+wxDataViewColumn* wxCocoaDataViewControl::GetSortingColumn(void) const
+{
+  NSArray* const columns = [this->m_OutlineView tableColumns];
+
+  UInt32 const noOfColumns = [columns count];
+
+
+  for (UInt32 i=0; i<noOfColumns; ++i)
+    if ([[columns objectAtIndex:i] sortDescriptorPrototype] != nil)
+      return reinterpret_cast<wxDataViewColumn*>([[[columns objectAtIndex:i] identifier] pointer]);
+  return NULL;
+}
+
+void wxCocoaDataViewControl::Resort(void)
+{
+  [this->m_DataSource clearChildren];
+  [this->m_OutlineView reloadData];
+}
+
+//
+// other methods (inherited from wxDataViewWidgetImpl)
+//
+void wxCocoaDataViewControl::DoSetIndent(int indent)
+{
+  [this->m_OutlineView setIndentationPerLevel:static_cast<CGFloat>(indent)];
+}
+
+void wxCocoaDataViewControl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
+{
+  NSPoint const nativePoint = wxToNSPoint((NSScrollView*) this->GetWXWidget(),point);
+
+  int indexColumn;
+  int indexRow;
+
+  
+  indexColumn = [this->m_OutlineView columnAtPoint:nativePoint];
+  indexRow    = [this->m_OutlineView rowAtPoint:   nativePoint];
+  if ((indexColumn >= 0) && (indexRow >= 0))
+  {
+    columnPtr = reinterpret_cast<wxDataViewColumn*>([[[[this->m_OutlineView tableColumns] objectAtIndex:indexColumn] identifier] pointer]);
+    item      = wxDataViewItem([[this->m_OutlineView itemAtRow:indexRow] pointer]);
+  }
+  else
+  {
+    columnPtr = NULL;
+    item      = wxDataViewItem();
+  }
+}
+
+void wxCocoaDataViewControl::SetRowHeight(wxDataViewItem const& WXUNUSED(item), unsigned int WXUNUSED(height))
+ // Not supported by the native control
+{
+}
+
+void wxCocoaDataViewControl::OnSize(void)
+{
+  if ([this->m_OutlineView numberOfColumns] == 1)
+    [this->m_OutlineView sizeLastColumnToFit];
+}
+
+//
+// drag & drop helper methods
+//
+wxDataFormat wxCocoaDataViewControl::GetDnDDataFormat(wxDataObjectComposite* dataObjects)
+{
+  wxDataFormat resultFormat;
+
+
+  if (dataObjects != NULL)
+  {
+    bool compatible(true);
+
+    size_t const noOfFormats = dataObjects->GetFormatCount();
+    size_t       indexFormat;
+
+    wxDataFormat* formats;
+    
+   // get all formats and check afterwards if the formats are compatible; if they are compatible the preferred format is returned otherwise
+   // wxDF_INVALID is returned;
+   // currently compatible types (ordered by priority are):
+   //  - wxDF_UNICODETEXT - wxDF_TEXT
+    formats = new wxDataFormat[noOfFormats];
+    dataObjects->GetAllFormats(formats);
+    indexFormat = 0;
+    while ((indexFormat < noOfFormats) && compatible)
+    {
+      switch (resultFormat.GetType())
+      {
+        case wxDF_INVALID:
+          resultFormat.SetType(formats[indexFormat].GetType()); // first format (should only be reached if indexFormat == 0)
+          break;
+        case wxDF_TEXT:
+          if (formats[indexFormat].GetType() == wxDF_UNICODETEXT)
+            resultFormat.SetType(wxDF_UNICODETEXT);
+          else // incompatible
+          {
+            resultFormat.SetType(wxDF_INVALID);
+            compatible = false;
+          }
+          break;
+        case wxDF_UNICODETEXT:
+          if (formats[indexFormat].GetType() != wxDF_TEXT)
+          {
+            resultFormat.SetType(wxDF_INVALID);
+            compatible = false;
+          }
+          break;
+        default:
+          resultFormat.SetType(wxDF_INVALID); // not (yet) supported format
+          compatible = false;
+      }
+      ++indexFormat;
+    } /* while */
+   // clean up:
+    delete[] formats;
+  }
+  return resultFormat;
+}
+
+wxDataObjectComposite* wxCocoaDataViewControl::GetDnDDataObjects(NSData* dataObject) const
+{
+  wxDataFormatId dataFormatID;
+
+  
+  [dataObject getBytes:&dataFormatID length:sizeof(wxDataFormatId)];
+  switch (dataFormatID)
+  {
+    case wxDF_TEXT:
+    case wxDF_UNICODETEXT:
+      {
+        wxTextDataObject* textDataObject(new wxTextDataObject());
+        
+        if (textDataObject->SetData(wxDataFormat(dataFormatID),[dataObject length]-sizeof(wxDataFormatId),reinterpret_cast<char const*>([dataObject bytes])+sizeof(wxDataFormatId)))
+        {
+          wxDataObjectComposite* dataObjectComposite(new wxDataObjectComposite());
+
+          dataObjectComposite->Add(textDataObject);
+          return dataObjectComposite;
+        }
+        else
+        {
+          delete textDataObject;
+          return NULL;
+        }
+      }
+      break;
+    default:
+      return NULL;
+  }
+}
+
+// ---------------------------------------------------------
+// wxDataViewRenderer
+// ---------------------------------------------------------
+wxDataViewRenderer::wxDataViewRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                   :wxDataViewRendererBase(varianttype,mode,align), m_alignment(align), m_mode(mode), m_NativeDataPtr(NULL)
+{
+}
+
+wxDataViewRenderer::~wxDataViewRenderer(void)
+{
+  delete this->m_NativeDataPtr;
+}
+
+void wxDataViewRenderer::SetAlignment(int align)
+{
+  this->m_alignment = align;
+  [this->GetNativeData()->GetColumnCell() setAlignment:ConvertToNativeHorizontalTextAlignment(align)];
+}
+
+void wxDataViewRenderer::SetMode(wxDataViewCellMode mode)
+{
+  this->m_mode = mode;
+  if (this->GetOwner() != NULL)
+    [this->GetOwner()->GetNativeData()->GetNativeColumnPtr() setEditable:(mode == wxDATAVIEW_CELL_EDITABLE)];
+}
+
+void wxDataViewRenderer::SetNativeData(wxDataViewRendererNativeData* newNativeDataPtr)
+{
+  delete this->m_NativeDataPtr;
+  this->m_NativeDataPtr = newNativeDataPtr;
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
+
+// ---------------------------------------------------------
+// wxDataViewCustomRenderer
+// ---------------------------------------------------------
+wxDataViewCustomRenderer::wxDataViewCustomRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode,align), m_editorCtrlPtr(NULL), m_DCPtr(NULL)
+{
+  this->SetNativeData(new wxDataViewRendererNativeData([[wxCustomCell alloc] init]));
+}
+
+bool wxDataViewCustomRenderer::Render()
+{
+  [this->GetNativeData()->GetItemCell() setObjectValue:[[[wxCustomRendererObject alloc] initWithRenderer:this
+                                                                                                    item:this->GetNativeData()->GetItem()
+                                                                                                  column:this->GetNativeData()->GetColumnPtr()] autorelease]];
+  return true;
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewTextRenderer
+// ---------------------------------------------------------
+wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                       :wxDataViewRenderer(varianttype,mode,align)
+{
+  NSTextFieldCell* cell;
+  
+  
+  cell = [[NSTextFieldCell alloc] init];
+  [cell setAlignment:ConvertToNativeHorizontalTextAlignment(align)];
+  [cell setLineBreakMode:NSLineBreakByTruncatingMiddle];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewTextRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    [this->GetNativeData()->GetItemCell() setObjectValue:wxCFStringRef(this->GetValue().GetString()).AsNSString()];
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Text renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewBitmapRenderer
+// ---------------------------------------------------------
+wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode,align)
+{
+  NSImageCell* cell;
+  
+  
+  cell = [[NSImageCell alloc] init];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewBitmapRenderer::Render()
+ // This method returns 'true' if
+ //  - the passed bitmap is valid and it could be assigned to the native data browser;
+ //  - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
+ // In all other cases the method returns 'false'.
+{
+  wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
+
+  wxBitmap bitmap;
+
+  bitmap << this->GetValue();
+  if (bitmap.IsOk())
+    [this->GetNativeData()->GetItemCell() setObjectValue:[[bitmap.GetNSImage() retain] autorelease]];
+  return true;
+}
+
+IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
+
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+wxDataViewChoiceRenderer::wxDataViewChoiceRenderer(wxArrayString const& choices, wxDataViewCellMode mode, int alignment)
+                         :wxDataViewRenderer(wxT("string"),mode,alignment), m_Choices(choices)
+{
+  NSPopUpButtonCell* cell;
+  
+  
+  cell = [[NSPopUpButtonCell alloc] init];
+  [cell setControlSize:NSMiniControlSize];
+  [cell setFont:[[NSFont fontWithName:[[cell font] fontName] size:[NSFont systemFontSizeForControlSize:NSMiniControlSize]] autorelease]];
+  for (size_t i=0; i<choices.GetCount(); ++i)
+    [cell addItemWithTitle:[[wxCFStringRef(choices[i]).AsNSString() retain] autorelease]];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewChoiceRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    [((NSPopUpButtonCell*) this->GetNativeData()->GetItemCell()) selectItemWithTitle:[[wxCFStringRef(this->GetValue().GetString()).AsNSString() retain] autorelease]];
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Choice renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_CLASS(wxDataViewChoiceRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewDateRenderer
+// ---------------------------------------------------------
+wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                       :wxDataViewRenderer(varianttype,mode,align)
+{
+  NSTextFieldCell* cell;
+
+  NSDateFormatter* dateFormatter;
+
+  
+  dateFormatter = [[NSDateFormatter alloc] init];
+  [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
+  [dateFormatter setDateStyle:NSDateFormatterShortStyle];
+  cell = [[NSTextFieldCell alloc] init];
+  [cell setFormatter:dateFormatter];
+  [cell setLineBreakMode:NSLineBreakByTruncatingMiddle];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell,[NSDate dateWithString:@"2000-12-30 20:00:00 +0000"]));
+  [cell          release];
+  [dateFormatter release];
+}
+
+bool wxDataViewDateRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    if (this->GetValue().GetDateTime().IsValid())
+    {
+     // -- find best fitting style to show the date --
+     // as the style should be identical for all cells a reference date instead of the actual cell's date
+     // value is used for all cells; this reference date is stored in the renderer's native data section
+     // for speed purposes; otherwise, the reference date's string has to be recalculated for each item that
+     // may become timewise long if a lot of rows using dates exist;
+     // the algorithm has the preference to display as much information as possible in the first instance;
+     // but as this is often impossible due to space restrictions the style is shortened per loop; finally,
+     // if the shortest time and date format does not fit into the cell the time part is dropped;
+     // remark: the time part itself is not modified per iteration loop and only uses the short style,
+     //         means that only the hours and minutes are being shown
+      [this->GetNativeData()->GetItemCell() setObjectValue:this->GetNativeData()->GetObject()]; // GetObject() returns a date for testing the size of a date object
+      [[this->GetNativeData()->GetItemCell() formatter] setTimeStyle:NSDateFormatterShortStyle];
+      for (int dateFormatterStyle=4; dateFormatterStyle>0; --dateFormatterStyle)
+      {
+        [[this->GetNativeData()->GetItemCell() formatter] setDateStyle:(NSDateFormatterStyle)dateFormatterStyle];
+        if (dateFormatterStyle == 1)
+        {
+         // if the shortest style for displaying the date and time is too long to be fully visible remove the time part of the date:
+          if ([this->GetNativeData()->GetItemCell() cellSize].width > [this->GetNativeData()->GetColumnPtr() width])
+            [[this->GetNativeData()->GetItemCell() formatter] setTimeStyle:NSDateFormatterNoStyle];
+          break; // basically not necessary as the loop would end anyway but let's save the last comparison
+        }
+        else if ([this->GetNativeData()->GetItemCell() cellSize].width <= [this->GetNativeData()->GetColumnPtr() width])
+          break;
+      }
+     // set data (the style is set by the previous loop);
+     // on OSX the date has to be specified with respect to UTC; in wxWidgets the date is always entered in the local timezone; so, we have to do a conversion
+     // from the local to UTC timezone when adding the seconds to 1970-01-01 UTC:
+      [this->GetNativeData()->GetItemCell() setObjectValue:[NSDate dateWithTimeIntervalSince1970:this->GetValue().GetDateTime().ToUTC().Subtract(wxDateTime(1,wxDateTime::Jan,1970)).GetSeconds().ToDouble()]];
+    }
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Date renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewIconTextRenderer
+// ---------------------------------------------------------
+wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewRenderer(varianttype,mode)
+{
+  wxImageTextCell* cell;
+  
+  
+  cell = [[wxImageTextCell alloc] init];
+  [cell setAlignment:ConvertToNativeHorizontalTextAlignment(align)];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewIconTextRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    wxDataViewIconText iconText;
+    
+    wxImageTextCell* cell;
+
+    cell = (wxImageTextCell*) this->GetNativeData()->GetItemCell();
+    iconText << this->GetValue();
+    if (iconText.GetIcon().IsOk())
+      [cell setImage:[[wxBitmap(iconText.GetIcon()).GetNSImage() retain] autorelease]];
+    [cell setStringValue:[[wxCFStringRef(iconText.GetText()).AsNSString() retain] autorelease]];
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Icon & text renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewToggleRenderer
+// ---------------------------------------------------------
+wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                         :wxDataViewRenderer(varianttype,mode)
+{
+  NSButtonCell* cell;
+  
+  
+  cell = [[NSButtonCell alloc] init];
+  [cell setAlignment:ConvertToNativeHorizontalTextAlignment(align)];
+  [cell setButtonType:NSSwitchButton];
+  [cell setImagePosition:NSImageOnly];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewToggleRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    [this->GetNativeData()->GetItemCell() setIntValue:this->GetValue().GetLong()];
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Toggle renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewProgressRenderer
+// ---------------------------------------------------------
+wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewRenderer(varianttype,mode,align)
+{
+  NSLevelIndicatorCell* cell;
+  
+  
+  cell = [[NSLevelIndicatorCell alloc] initWithLevelIndicatorStyle:NSContinuousCapacityLevelIndicatorStyle];
+  [cell setMinValue:0];
+  [cell setMaxValue:100];
+  this->SetNativeData(new wxDataViewRendererNativeData(cell));
+  [cell release];
+}
+
+bool wxDataViewProgressRenderer::Render()
+{
+  if (this->GetValue().GetType() == this->GetVariantType())
+  {
+    [this->GetNativeData()->GetItemCell() setIntValue:this->GetValue().GetLong()];
+    return true;
+  }
+  else
+  {
+    wxFAIL_MSG(wxString(_("Progress renderer cannot render value because of wrong value type; value type: ")) << this->GetValue().GetType());
+    return false;
+  }
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
+
+// ---------------------------------------------------------
+// wxDataViewColumn
+// ---------------------------------------------------------
+wxDataViewColumn::wxDataViewColumn(const wxString& title, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
+                 :wxDataViewColumnBase(renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData()), m_title(title)
+{
+  this->InitCommon(width, align, flags);
+  if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
+    renderer->SetAlignment(align);
+}
+
+wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, wxDataViewRenderer* renderer, unsigned int model_column, int width, wxAlignment align, int flags)
+                 :wxDataViewColumnBase(bitmap, renderer, model_column), m_NativeDataPtr(new wxDataViewColumnNativeData())
+{
+  this->InitCommon(width, align, flags);
+  if ((renderer != NULL) && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
+    renderer->SetAlignment(align);
+}
+
+wxDataViewColumn::~wxDataViewColumn(void)
+{
+  delete this->m_NativeDataPtr;
+}
+
+bool wxDataViewColumn::IsSortKey() const
+{
+  return ((this->GetNativeData()->GetNativeColumnPtr() != NULL) && ([this->GetNativeData()->GetNativeColumnPtr() sortDescriptorPrototype] != nil));
+}
+
+void wxDataViewColumn::SetAlignment(wxAlignment align)
+{
+  this->m_alignment = align;
+  [[this->m_NativeDataPtr->GetNativeColumnPtr() headerCell] setAlignment:ConvertToNativeHorizontalTextAlignment(align)];
+  if ((this->m_renderer != NULL) && (this->m_renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT))
+    this->m_renderer->SetAlignment(align);
+}
+
+void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
+{
+ // bitmaps and titles cannot exist at the same time - if the bitmap is set the title is removed:
+  this->m_title = wxEmptyString;
+  this->wxDataViewColumnBase::SetBitmap(bitmap);
+  [[this->m_NativeDataPtr->GetNativeColumnPtr() headerCell] setImage:[[bitmap.GetNSImage() retain] autorelease]];
+}
+
+void wxDataViewColumn::SetMaxWidth(int maxWidth)
+{
+  this->m_maxWidth = maxWidth;
+  [this->m_NativeDataPtr->GetNativeColumnPtr() setMaxWidth:maxWidth];
+}
+
+void wxDataViewColumn::SetMinWidth(int minWidth)
+{
+  this->m_minWidth = minWidth;
+  [this->m_NativeDataPtr->GetNativeColumnPtr() setMinWidth:minWidth];
+}
+
+void wxDataViewColumn::SetReorderable(bool reorderable)
+{
+}
+
+void wxDataViewColumn::SetResizeable(bool resizeable)
+{
+  this->wxDataViewColumnBase::SetResizeable(resizeable);
+  if (resizeable)
+    [this->m_NativeDataPtr->GetNativeColumnPtr() setResizingMask:NSTableColumnUserResizingMask];
+  else
+    [this->m_NativeDataPtr->GetNativeColumnPtr() setResizingMask:NSTableColumnNoResizing];
+}
+
+void wxDataViewColumn::SetSortable(bool sortable)
+{
+  this->wxDataViewColumnBase::SetSortable(sortable);
+}
+
+void wxDataViewColumn::SetSortOrder(bool ascending)
+{
+  if (m_ascending != ascending)
+  {
+    m_ascending = ascending;
+    if (this->IsSortKey())
+    {
+     // change sorting order:
+      NSArray*          sortDescriptors;
+      NSSortDescriptor* sortDescriptor;
+      NSTableColumn*    tableColumn;
+      
+      tableColumn     = this->m_NativeDataPtr->GetNativeColumnPtr();
+      sortDescriptor  = [[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending:m_ascending];
+      sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
+      [tableColumn setSortDescriptorPrototype:sortDescriptor];
+      [[tableColumn tableView] setSortDescriptors:sortDescriptors];
+      [sortDescriptor release];
+    }
+  }
+}
+
+void wxDataViewColumn::SetTitle(wxString const& title)
+{
+ // bitmaps and titles cannot exist at the same time - if the title is set the bitmap is removed:
+  this->wxDataViewColumnBase::SetBitmap(wxBitmap());
+  this->m_title = title;
+  [[this->m_NativeDataPtr->GetNativeColumnPtr() headerCell] setStringValue:[[wxCFStringRef(title).AsNSString() retain] autorelease]];
+}
+
+void wxDataViewColumn::SetWidth(int width)
+{
+  [this->m_NativeDataPtr->GetNativeColumnPtr() setWidth:width];
+  this->m_width = width;
+}
+
+void wxDataViewColumn::SetAsSortKey(bool WXUNUSED(sort))
+{
+ // see wxGTK native wxDataViewColumn implementation
+  wxFAIL_MSG(_("not implemented"));
+}
+
+void wxDataViewColumn::SetNativeData(wxDataViewColumnNativeData* newNativeDataPtr)
+{
+  delete this->m_NativeDataPtr;
+  this->m_NativeDataPtr = newNativeDataPtr;
+}
+#endif // (wxUSE_DATAVIEWCTRL == 1) && !defined(wxUSE_GENERICDATAVIEWCTRL)
diff --git a/src/osx/dataview_osx.cpp b/src/osx/dataview_osx.cpp
new file mode 100644 (file)
index 0000000..7fd68d1
--- /dev/null
@@ -0,0 +1,686 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/dataview_osx.cpp
+// Purpose:     wxDataViewCtrl native mac implementation
+// Author:
+// Id:          $Id: dataview_osx.cpp 58317 2009-01-27
+// Copyright:   (c) 2009
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
+
+#include <carbon/carbon.h>
+#include <limits>
+
+#ifndef WX_PRECOMP
+    #include "wx/timer.h"
+    #include "wx/settings.h"
+    #include "wx/dcclient.h"
+    #include "wx/icon.h"
+#endif
+
+#include "wx/osx/core/dataview.h"
+#include "wx/osx/private.h"
+#include "wx/renderer.h"
+
+// ============================================================================
+// Helper functions for dataviewe implementation on OSX
+// ============================================================================
+wxString ConcatenateDataViewItemValues(wxDataViewCtrl const* dataViewCtrlPtr, wxDataViewItem const& dataViewItem)
+{
+  wxString dataString; // contains the TAB concatenated data
+
+
+  for (size_t i=0; i<dataViewCtrlPtr->GetColumnCount(); i++)
+  {
+   // variable definition:
+    wxVariant dataValue;
+    
+    dataViewCtrlPtr->GetModel()->GetValue(dataValue,dataViewItem,dataViewCtrlPtr->GetColumn(i)->GetModelColumn());
+    if (i > 0)
+      dataString << wxT('\t');
+    dataString << dataValue.MakeString();
+  }
+  return dataString;
+}
+
+// ============================================================================
+// wxOSXDataViewModelNotifier
+// ============================================================================
+class wxOSXDataViewModelNotifier : public wxDataViewModelNotifier
+{
+public:
+ //
+ // constructors / destructor
+ //
+  wxOSXDataViewModelNotifier(wxDataViewCtrl* initDataViewCtrlPtr);
+
+ //
+ // inherited methods from wxDataViewModelNotifier
+ //
+  virtual bool ItemAdded   (wxDataViewItem const &parent, wxDataViewItem const &item);
+  virtual bool ItemsAdded  (wxDataViewItem const& parent, wxDataViewItemArray const& items);
+  virtual bool ItemChanged (wxDataViewItem const& item);
+  virtual bool ItemsChanged(wxDataViewItemArray const& items);
+  virtual bool ItemDeleted (wxDataViewItem const& parent, wxDataViewItem const& item);
+  virtual bool ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items);
+  virtual bool ValueChanged(wxDataViewItem const& item, unsigned int col);
+  virtual bool Cleared();
+  virtual void Resort();
+
+protected:
+ // if the dataview control can have a variable row height this method sets the dataview's control row height of
+ // the passed item to the maximum value occupied by the item in all columns
+  void AdjustRowHeight(wxDataViewItem const& item);
+ // ... and the same method for a couple of items:
+  void AdjustRowHeights(wxDataViewItemArray const& items);
+
+private:
+  wxDataViewCtrl* m_DataViewCtrlPtr;
+};
+
+//
+// constructors / destructor
+//
+wxOSXDataViewModelNotifier::wxOSXDataViewModelNotifier(wxDataViewCtrl* initDataViewCtrlPtr)
+                           :m_DataViewCtrlPtr(initDataViewCtrlPtr)
+{
+  if (initDataViewCtrlPtr == NULL)
+    wxFAIL_MSG(_("Pointer to dataview control must not be NULL"));
+}
+
+bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataViewItem const& item)
+{
+  bool noFailureFlag;
+
+
+  wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
+  noFailureFlag = this->m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,item);
+  this->AdjustRowHeight(item);
+  return noFailureFlag;
+}
+
+bool wxOSXDataViewModelNotifier::ItemsAdded(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+{
+  bool noFailureFlag;
+
+
+ // insert all valid items into control:
+  noFailureFlag = this->m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,items);
+ // adjust row heights:
+  this->AdjustRowHeights(items);
+ // done:
+  return noFailureFlag;
+}
+
+bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
+{
+  wxCHECK_MSG(item.IsOk(),             false,_("Changed item is invalid."));
+  wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized."));
+  if (this->m_DataViewCtrlPtr->GetDataViewPeer()->Update(this->GetOwner()->GetParent(item),item))
+  {
+   // sent the equivalent wxWidget event:
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,this->m_DataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(this->m_DataViewCtrlPtr);
+    dataViewEvent.SetItem(item);
+   // sent the equivalent wxWidget event:
+    this->m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+   // row height may have to be adjusted:
+    this->AdjustRowHeight(item);
+   // done
+    return true;
+  }
+  else
+    return false;
+}
+
+bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
+{
+  size_t const noOfItems = items.GetCount();
+
+  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,this->m_DataViewCtrlPtr->GetId());
+
+
+  dataViewEvent.SetEventObject(this->m_DataViewCtrlPtr);
+  for (size_t indexItem=0; indexItem<noOfItems; ++indexItem)
+    if (this->m_DataViewCtrlPtr->GetDataViewPeer()->Update(this->GetOwner()->GetParent(items[indexItem]),items[indexItem]))
+    {
+     // send for all changed items a wxWidget event:
+      dataViewEvent.SetItem(items[indexItem]);
+      this->m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+    }
+    else
+      return false;
+ // if this location is reached all items have been updated:
+  this->AdjustRowHeights(items);
+ // done:
+  return true;
+}
+
+bool wxOSXDataViewModelNotifier::ItemDeleted(wxDataViewItem const& parent, wxDataViewItem const& item)
+{
+  bool noFailureFlag;
+
+
+  wxCHECK_MSG(item.IsOk(),false,_("To be deleted item is invalid."));
+ // 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:
+  this->m_DataViewCtrlPtr->SetDeleting(true);
+  noFailureFlag = this->m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,item);
+ // enable automatic updating again:
+  this->m_DataViewCtrlPtr->SetDeleting(false);
+ // done:
+  return noFailureFlag;
+}
+
+bool wxOSXDataViewModelNotifier::ItemsDeleted(wxDataViewItem const& parent, wxDataViewItemArray const& items)
+{
+  bool noFailureFlag;
+
+
+ // 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:
+  this->m_DataViewCtrlPtr->SetDeleting(true);
+ // delete all specified items:
+  noFailureFlag = this->m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
+ // enable automatic updating again:
+  this->m_DataViewCtrlPtr->SetDeleting(false);
+ // done:
+  return noFailureFlag;
+}
+
+bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsigned int col)
+{
+  wxCHECK_MSG(item.IsOk(),             false,_("Passed item is invalid."));
+  wxCHECK_MSG(this->GetOwner() != NULL,false,_("Owner not initialized."));
+  if (this->m_DataViewCtrlPtr->GetDataViewPeer()->Update(this->GetOwner()->GetParent(item),item))
+  {
+    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,this->m_DataViewCtrlPtr->GetId());
+
+    dataViewEvent.SetEventObject(this->m_DataViewCtrlPtr);
+    dataViewEvent.SetColumn(col);
+    dataViewEvent.SetItem(item);
+   // send the equivalent wxWidget event:
+    this->m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+   // done
+    return true;
+  }
+  else
+    return false;
+}
+
+bool wxOSXDataViewModelNotifier::Cleared()
+{
+  return this->m_DataViewCtrlPtr->GetDataViewPeer()->Reload();
+}
+
+void wxOSXDataViewModelNotifier::Resort()
+{
+  this->m_DataViewCtrlPtr->GetDataViewPeer()->Resort();
+}
+
+void wxOSXDataViewModelNotifier::AdjustRowHeight(wxDataViewItem const& item)
+{
+  if ((this->m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
+  {
+      wxDataViewModel *model = this->GetOwner();
+
+      int height = 20; // TODO find out standard height
+      unsigned int num = this->m_DataViewCtrlPtr->GetColumnCount();
+      unsigned int col;
+      for (col = 0; col < num; col++)
+      {
+          wxDataViewColumn* column(this->m_DataViewCtrlPtr->GetColumnPtr(col));
+          
+          if (!(column->IsHidden()))
+          {
+            wxDataViewCustomRenderer *renderer = dynamic_cast<wxDataViewCustomRenderer*>(column->GetRenderer());
+            if (renderer)
+            {
+                wxVariant value;
+                model->GetValue( value, item, column->GetModelColumn() );
+                renderer->SetValue( value );
+                height = wxMax( height, renderer->GetSize().y );
+            }
+          }
+      }
+      if (height > 20)
+        this->m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(item,height);
+  }
+}
+
+void wxOSXDataViewModelNotifier::AdjustRowHeights(wxDataViewItemArray const& items)
+{
+  if ((this->m_DataViewCtrlPtr->GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) != 0)
+  {
+      size_t const noOfItems = items.GetCount();
+
+      wxDataViewModel *model = this->GetOwner();
+
+      for (size_t itemIndex=0; itemIndex<noOfItems; ++itemIndex)
+      {
+        int height = 20; // TODO find out standard height
+        unsigned int num = this->m_DataViewCtrlPtr->GetColumnCount();
+        unsigned int col;
+
+        for (col = 0; col < num; col++)
+        {
+            wxDataViewColumn* column(this->m_DataViewCtrlPtr->GetColumnPtr(col));
+            
+            if (!(column->IsHidden()))
+            {
+              wxDataViewCustomRenderer *renderer = dynamic_cast<wxDataViewCustomRenderer*>(column->GetRenderer());
+              if (renderer)
+              {
+                  wxVariant value;
+                  model->GetValue( value, items[itemIndex], column->GetModelColumn() );
+                  renderer->SetValue( value );
+                  height = wxMax( height, renderer->GetSize().y );
+              }
+            }
+        }
+        if (height > 20)
+          this->m_DataViewCtrlPtr->GetDataViewPeer()->SetRowHeight(items[itemIndex],height);
+      }
+  }
+}
+
+// ---------------------------------------------------------
+// wxDataViewCustomRenderer
+// The constructor, the implementation macro and environment
+// dependent methods can be found in the environment's
+// source file.
+// ---------------------------------------------------------
+wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
+{
+  delete this->m_DCPtr;
+}
+
+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()
+{
+  if ((this->m_DCPtr == NULL) && (this->GetOwner() != NULL) && (this->GetOwner()->GetOwner() != NULL))
+    this->m_DCPtr = new wxClientDC(this->GetOwner()->GetOwner());
+  return this->m_DCPtr;
+}
+
+void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
+{
+  delete m_DCPtr;
+  m_DCPtr = newDCPtr;
+}
+
+// ---------------------------------------------------------
+// wxDataViewTextRendererAttr
+// ---------------------------------------------------------
+wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewTextRenderer(varianttype,mode,align)
+{
+}
+
+IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
+
+//-----------------------------------------------------------------------------
+// wxDataViewCtrl
+//-----------------------------------------------------------------------------
+
+wxDataViewCtrl::~wxDataViewCtrl()
+{
+  this->ClearColumns();
+}
+
+void wxDataViewCtrl::Init()
+{
+  m_CustomRendererPtr = NULL;
+  m_Deleting          = false;
+  m_macIsUserPane     = false;
+  m_cgContext         = NULL;
+}
+
+bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
+{
+  if (!(this->wxControl::Create(parent,id,pos,size,style & ~(wxHSCROLL | wxVSCROLL),validator)))
+    return false;
+  m_peer = ::CreateDataView(this,parent,id,pos,size,style,this->GetExtraStyle());
+
+  this->MacPostControlCreate(pos,size);
+
+  return true;
+}
+
+bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
+{
+  wxDataViewWidgetImpl* dataViewWidgetPtr(this->GetDataViewPeer());
+
+
+  wxCHECK_MSG(dataViewWidgetPtr != NULL,false,_("Pointer to native control must not be NULL."));
+  if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model))
+  {
+    if (model != NULL)
+      model->AddNotifier(new wxOSXDataViewModelNotifier(this));
+    return true;
+  }
+  else
+    return false;
+}
+
+bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
+{
+   return wxDataViewCtrl::InsertColumn( GetColumnCount(), columnPtr );
+}
+
+bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
+{
+   return wxDataViewCtrl::InsertColumn( 0, columnPtr );
+}
+
+bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
+{
+  wxDataViewWidgetImpl* dataViewWidgetPtr(this->GetDataViewPeer());
+
+ // first, some error checking:
+  wxCHECK_MSG(dataViewWidgetPtr != NULL,                                         false,_("Pointer to native control must not be NULL."));
+  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."));
+
+ // add column to wxWidget's internal structure:
+  if (this->wxDataViewCtrlBase::InsertColumn(pos,columnPtr))
+  {
+    this->m_ColumnPtrs.Add(columnPtr);
+   // if the insertion in the native control is successful the rest can also be initialized:
+    if (dataViewWidgetPtr->InsertColumn(pos,columnPtr))
+    {
+     // 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);
+     // done:
+      return true;
+    }
+    else
+    {
+     // clean-up:
+      this->m_ColumnPtrs.Remove(columnPtr);
+      delete columnPtr;
+     // and send a message in debug mode:
+      wxFAIL_MSG(_("Column could not be added to native control."));
+     // failed:
+      return false;
+    }
+  }
+  else
+  {
+   // clean-up:
+    delete columnPtr;
+    wxFAIL_MSG(_("Could not add column to internal structures."));
+   // failed:
+    return false;
+  }
+}
+
+bool wxDataViewCtrl::ClearColumns()
+{
+  if (this->GetDataViewPeer()->ClearColumns())
+  {
+    WX_CLEAR_ARRAY(this->m_ColumnPtrs);
+    return true;
+  }
+  else
+    return false;
+}
+
+bool wxDataViewCtrl::DeleteColumn(wxDataViewColumn* columnPtr)
+{
+  if (this->GetDataViewPeer()->DeleteColumn(columnPtr))
+  {
+    this->m_ColumnPtrs.Remove(columnPtr);
+    delete columnPtr;
+    return true;
+  }
+  else
+    return false;
+}
+
+wxDataViewColumn* wxDataViewCtrl::GetColumn(unsigned int pos) const
+{
+  return this->GetDataViewPeer()->GetColumn(pos);
+}
+
+unsigned int wxDataViewCtrl::GetColumnCount() const
+{
+  return this->m_ColumnPtrs.GetCount();
+}
+
+int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
+{
+  return this->GetDataViewPeer()->GetColumnPosition(columnPtr);
+}
+
+void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
+{
+  this->GetDataViewPeer()->Collapse(item);
+}
+
+void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
+{
+  if (item.IsOk())
+  {
+    this->ExpandAncestors(item); // make sure that the item exists in the control
+    this->GetDataViewPeer()->EnsureVisible(item,columnPtr);
+  }
+}
+
+void wxDataViewCtrl::Expand(wxDataViewItem const& item)
+{
+  return this->GetDataViewPeer()->Expand(item);
+}
+
+bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
+{
+  return (item.IsOk() && this->GetDataViewPeer()->IsExpanded(item));
+}
+
+wxDataViewColumn* wxDataViewCtrl::GetSortingColumn() const
+{
+  return this->GetDataViewPeer()->GetSortingColumn();
+}
+
+unsigned int wxDataViewCtrl::GetCount() const
+{
+  return this->GetDataViewPeer()->GetCount();
+}
+
+wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
+{
+  if (item.IsOk() && (columnPtr != NULL))
+    return this->GetDataViewPeer()->GetRectangle(item,columnPtr);
+  else
+    return wxRect();
+}
+
+wxDataViewItem wxDataViewCtrl::GetSelection() const
+{
+  wxDataViewItemArray itemIDs;
+
+
+  if (this->GetDataViewPeer()->GetSelections(itemIDs) > 0)
+    return itemIDs[0];
+  else
+    return wxDataViewItem();
+}
+
+int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
+{
+  return this->GetDataViewPeer()->GetSelections(sel);
+}
+
+void wxDataViewCtrl::HitTest(wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const
+{
+  return this->GetDataViewPeer()->HitTest(point,item,columnPtr);
+}
+
+bool wxDataViewCtrl::IsSelected(wxDataViewItem const& item) const
+{
+  return this->GetDataViewPeer()->IsSelected(item);
+}
+
+void wxDataViewCtrl::Select(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+  {
+    this->ExpandAncestors(item); // make sure that the item exists in the control
+    this->GetDataViewPeer()->Select(item);
+  }
+}
+
+void wxDataViewCtrl::SelectAll(void)
+{
+  this->GetDataViewPeer()->SelectAll();
+}
+
+void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
+{
+    size_t const noOfSelections = sel.GetCount();
+
+    size_t i;
+
+    wxDataViewItem last_parent;
+
+
+   // make sure that all to be selected items are visible in the control:
+    for (i = 0; i < noOfSelections; i++)
+    {
+        wxDataViewItem item   = sel[i];
+        wxDataViewItem parent = this->GetModel()->GetParent( item );
+
+        if (parent.IsOk() && (parent != last_parent))
+          this->ExpandAncestors(item);
+        last_parent = parent;
+    }
+
+   // finally select the items:
+    wxDataViewWidgetImpl* dataViewWidgetPtr(this->GetDataViewPeer()); // variable definition for abbreviational purposes
+
+    for (i=0; i<noOfSelections; ++i)
+      dataViewWidgetPtr->Select(sel[i]);
+}
+
+void wxDataViewCtrl::Unselect(wxDataViewItem const& item)
+{
+  if (item.IsOk())
+    this->GetDataViewPeer()->Unselect(item);
+}
+
+void wxDataViewCtrl::UnselectAll(void)
+{
+  this->GetDataViewPeer()->UnselectAll();
+}
+
+//
+// implementation
+//
+wxDataViewWidgetImpl* wxDataViewCtrl::GetDataViewPeer(void) const
+{
+  return dynamic_cast<wxDataViewWidgetImpl*>(this->GetPeer());
+}
+
+void wxDataViewCtrl::AddChildren(wxDataViewItem const& parentItem)
+{
+  int noOfChildren;
+
+  wxDataViewItemArray items;
+
+
+  wxCHECK_RET(this->GetModel() != NULL,_("Model pointer not initialized."));
+  noOfChildren = this->GetModel()->GetChildren(parentItem,items);
+  (void) this->GetModel()->ItemsAdded(parentItem,items);
+}
+
+void wxDataViewCtrl::FinishCustomItemEditing(void)
+{
+  if (this->GetCustomRendererItem().IsOk())
+  {
+    this->GetCustomRendererPtr()->FinishEditing();
+    this->SetCustomRendererItem(wxDataViewItem());
+    this->SetCustomRendererPtr (NULL);
+  }
+}
+
+/*static*/
+wxVisualAttributes wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
+{
+    wxVisualAttributes attr;
+
+    attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
+    attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX );
+    attr.font.MacCreateFromThemeFont(kThemeViewsFont);
+
+    return attr;
+}
+
+// inherited methods from wxDataViewCtrlBase
+void wxDataViewCtrl::DoSetExpanderColumn()
+{
+  if (this->GetExpanderColumn() != NULL)
+    this->GetDataViewPeer()->DoSetExpanderColumn(this->GetExpanderColumn());
+}
+
+void wxDataViewCtrl::DoSetIndent()
+{
+  this->GetDataViewPeer()->DoSetIndent(this->GetIndent());
+}
+
+// event handling:
+void wxDataViewCtrl::OnSize(wxSizeEvent& event)
+{
+  unsigned int const noOfColumns = this->GetColumnCount();
+
+
+ // reset DC of all custom renderers because DC has changed:
+  for (unsigned int i=0; i<noOfColumns; ++i)
+  {
+    wxDataViewColumn* dataViewColumnPtr(this->GetColumn(i));
+
+    if (dataViewColumnPtr != NULL)
+    {
+      wxDataViewCustomRenderer* dataViewCustomRendererPtr(dynamic_cast<wxDataViewCustomRenderer*>(dataViewColumnPtr->GetRenderer()));
+
+      if (dataViewCustomRendererPtr != NULL)
+        dataViewCustomRendererPtr->SetDC(NULL);
+    }
+  }
+
+ // update the layout of the native control after a size event:
+  this->GetDataViewPeer()->OnSize();
+
+  event.Skip();
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase)
+
+BEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
+  EVT_SIZE(wxDataViewCtrl::OnSize)
+END_EVENT_TABLE()
+
+#endif // (wxUSE_DATAVIEWCTRL != 0) && (!defined(wxUSE_GENERICDATAVIEWCTRL) || (wxUSE_GENERICDATAVIEWCTRL == 0))
+