]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dataview.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / mac / carbon / dataview.cpp
index b05a81b318acae33609454969685e7d7b5cd4498..845c0dd9b029ff749ac781a494d26b452d508a8f 100644 (file)
 #include "wx/mac/carbon/databrow.h"
 
 #ifndef WX_PRECOMP
 #include "wx/mac/carbon/databrow.h"
 
 #ifndef WX_PRECOMP
-  #include "wx/timer.h"
-  #include "wx/settings.h"
-  #include "wx/dcclient.h"
+    #include "wx/timer.h"
+    #include "wx/settings.h"
+    #include "wx/dcclient.h"
+    #include "wx/icon.h"
 #endif
 
 #endif
 
-#include "wx/icon.h"
 #include "wx/renderer.h"
 
 //-----------------------------------------------------------------------------
 #include "wx/renderer.h"
 
 //-----------------------------------------------------------------------------
@@ -84,7 +84,7 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
         DataViewEvent.SetColumn(columnIndex);
         DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
        // finally sent the equivalent wxWidget event:
         DataViewEvent.SetColumn(columnIndex);
         DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
        // finally sent the equivalent wxWidget event:
-        DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent);
+        DataViewCtrlPtr->HandleWindowEvent(DataViewEvent);
         return ::CallNextEventHandler(handler,EventReference);
       } /* if */
       else
         return ::CallNextEventHandler(handler,EventReference);
       } /* if */
       else
@@ -113,6 +113,67 @@ static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDa
   return itemIDs;
 } /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
 
   return itemIDs;
 } /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
 
+static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxMacCFStringHolder const& title)
+{
+ // set properties for the column:
+  columnDescription.propertyDesc.propertyID    = columnPropertyID;
+  columnDescription.propertyDesc.propertyType  = columnPtr->GetRenderer()->GetPropertyType();
+  columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
+  if (columnPtr->IsSortable())
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
+#if 0
+  if (columnPtr->IsMovable())
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
+#endif
+  if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
+  if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) ||
+      (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
+      (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType))
+    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+  columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
+#endif
+ // set header's properties:
+  columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
+  if (columnPtr->IsResizeable())
+  {
+    columnDescription.headerBtnDesc.minimumWidth = 0;
+    columnDescription.headerBtnDesc.maximumWidth = 30000; // 32767 is the theoretical maximum though but 30000 looks nicer
+  } /* if */
+  else
+  {
+    columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth();
+    columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth();
+  } /* if */
+  columnDescription.headerBtnDesc.titleOffset = 0;
+  columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
+  columnDescription.headerBtnDesc.initialOrder       = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
+  columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
+  switch (columnPtr->GetAlignment())
+  {
+    case wxALIGN_CENTER:
+    case wxALIGN_CENTER_HORIZONTAL:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
+      break;
+    case wxALIGN_LEFT:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
+      break;
+    case wxALIGN_RIGHT:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
+      break;
+    default:
+      columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
+  } /* switch */
+  columnDescription.headerBtnDesc.btnFontStyle.font  = kControlFontViewSystemFont;
+  columnDescription.headerBtnDesc.btnFontStyle.style = normal;
+  columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
+  if (columnPtr->GetBitmap().Ok())
+    columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef();
+ // done:
+  return true;
+} /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxMacCFStringHolder const&) */
+
 //-----------------------------------------------------------------------------
 // local function pointers
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // local function pointers
 //-----------------------------------------------------------------------------
@@ -177,7 +238,7 @@ public:
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
       dataViewEvent.SetItem(item);
      // sent the equivalent wxWidget event:
       dataViewEvent.SetEventObject(dataViewCtrlPtr);
       dataViewEvent.SetItem(item);
      // sent the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
      // done
       return true;
     } /* if */
      // done
       return true;
     } /* if */
@@ -209,7 +270,7 @@ public:
       for (size_t i=0; i<noOfEntries; ++i)
       {
         dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
       for (size_t i=0; i<noOfEntries; ++i)
       {
         dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
-        dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+        dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
       } /* for */
     } /* if */
    // release allocated array space:
       } /* for */
     } /* if */
    // release allocated array space:
@@ -296,7 +357,7 @@ public:
       dataViewEvent.SetColumn(col);
       dataViewEvent.SetItem(item);
      // send the equivalent wxWidget event:
       dataViewEvent.SetColumn(col);
       dataViewEvent.SetItem(item);
      // send the equivalent wxWidget event:
-      dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
+      dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
      // done
       return true;
     } /* if */
      // done
       return true;
     } /* if */
@@ -384,9 +445,7 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
 void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
 {
     wxDataViewCtrl *view = GetOwner()->GetOwner();
 void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
 {
     wxDataViewCtrl *view = GetOwner()->GetOwner();
-    wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ?
-                        wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) :
-                        view->GetForegroundColour();
+    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));
 }
     dc->SetTextForeground(col);
     dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
 }
@@ -397,7 +456,7 @@ wxDC* wxDataViewCustomRenderer::GetDC(void)
   {
     if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL))
       return NULL;
   {
     if ((GetOwner() == NULL) || (GetOwner()->GetOwner() == NULL))
       return NULL;
-    this->m_DCPtr = new wxClientDC(this->GetOwner()->GetOwner());
+    this->m_DCPtr = new wxWindowDC(this->GetOwner()->GetOwner());
   } /* if */
   return this->m_DCPtr;
 } /* wxDataViewCustomRenderer::GetDC(void) */
   } /* if */
   return this->m_DCPtr;
 } /* wxDataViewCustomRenderer::GetDC(void) */
@@ -413,10 +472,10 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
   this->m_DCPtr = newDCPtr;
 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
 
   this->m_DCPtr = newDCPtr;
 } /* wxDataViewCustomRenderer::SetDC(wxDC*) */
 
-WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewCustomRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserCustomType;
-}
+  return kDataBrowserCustomType;
+} /* wxDataViewCustomRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
 
@@ -442,13 +501,24 @@ bool wxDataViewTextRenderer::Render(void)
     return false;
 } /* wxDataViewTextRenderer::Render(void) */
 
     return false;
 } /* wxDataViewTextRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserTextType;
-}
+  return kDataBrowserTextType;
+} /* wxDataViewTextRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_CLASS(wxDataViewTextRenderer,wxDataViewRenderer)
 
+// --------------------------------------------------------- 
+// wxDataViewTextRendererAttr
+// --------------------------------------------------------- 
+#pragma mark -
+wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align)
+                           :wxDataViewTextRenderer(varianttype,mode,align)
+{
+} /* wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const&, wxDataViewCellMode, int) */
+    
+IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer)
+
 // ---------------------------------------------------------
 // wxDataViewBitmapRenderer
 // ---------------------------------------------------------
 // ---------------------------------------------------------
 // wxDataViewBitmapRenderer
 // ---------------------------------------------------------
@@ -466,7 +536,7 @@ bool wxDataViewBitmapRenderer::Render(void)
     
     bitmap << this->GetValue();
     if (bitmap.Ok())
     
     bitmap << this->GetValue();
     if (bitmap.Ok())
-      return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
+      return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
     else
       return true;
   } /* if */
     else
       return true;
   } /* if */
@@ -474,10 +544,10 @@ bool wxDataViewBitmapRenderer::Render(void)
     return false;
 } /* wxDataViewBitmapRenderer::Render(void) */
 
     return false;
 } /* wxDataViewBitmapRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserIconType;
-}
+  return kDataBrowserIconType;
+} /* wxDataViewBitmapRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_CLASS(wxDataViewBitmapRenderer,wxDataViewRenderer)
 
@@ -501,18 +571,23 @@ bool wxDataViewIconTextRenderer::Render(void)
 
    // variable definition:
     wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
 
    // variable definition:
     wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
+
+    if (iconText.GetIcon().IsOk())
+    {
+       if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
+          return false;
+    }
     
     
-    return ((::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) == noErr) &&
-            (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr));
+    return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
   } /* if */
   else
     return false;
 } /* wxDataViewIconTextRenderer::Render(void) */
 
   } /* if */
   else
     return false;
 } /* wxDataViewIconTextRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserIconAndTextType;
-}
+  return kDataBrowserIconAndTextType;
+} /* wxDataViewIconTextRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewIconTextRenderer,wxDataViewRenderer)
 
@@ -534,10 +609,10 @@ bool wxDataViewToggleRenderer::Render(void)
     return false;
 } /* wxDataViewToggleRenderer::Render(void) */
 
     return false;
 } /* wxDataViewToggleRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserCheckboxType;
-}
+  return kDataBrowserCheckboxType;
+} /* wxDataViewToggleRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer,wxDataViewRenderer)
 
@@ -560,10 +635,10 @@ bool wxDataViewProgressRenderer::Render(void)
     return false;
 } /* wxDataViewProgressRenderer::Render(void) */
 
     return false;
 } /* wxDataViewProgressRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserProgressBarType;
-}
+  return kDataBrowserProgressBarType;
+} /* wxDataViewProgressRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer,wxDataViewRenderer)
 
@@ -584,10 +659,10 @@ bool wxDataViewDateRenderer::Render(void)
     return false;
 } /* wxDataViewDateRenderer::Render(void) */
 
     return false;
 } /* wxDataViewDateRenderer::Render(void) */
 
-WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType() const
+WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType(void) const
 {
 {
-    return kDataBrowserDateTimeType;
-}
+  return kDataBrowserDateTimeType;
+} /* wxDataViewDateRenderer::GetPropertyType(void) const */
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
 
@@ -664,7 +739,7 @@ void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
 
       wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
       if (this->GetBitmap().Ok())
 
       wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
       if (this->GetBitmap().Ok())
-        headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef();
+        headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
       else
         headerDescription.btnContentInfo.u.iconRef = NULL;
       wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
       else
         headerDescription.btnContentInfo.u.iconRef = NULL;
       wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
@@ -858,6 +933,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
 
   InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL);
 
 
   InstallControlEventHandler(this->m_peer->GetControlRef(),GetwxMacDataViewCtrlEventHandlerUPP(),GetEventTypeCount(eventList),eventList,this,NULL);
 
+  ::SetDataBrowserTableViewHiliteStyle( this->m_peer->GetControlRef(), kDataBrowserTableViewFillHilite );
+
   return true;
 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
 
   return true;
 } /* wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) */
 
@@ -871,108 +948,51 @@ bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
   return true;
 } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
 
   return true;
 } /* wxDataViewCtrl::AssociateModel(wxDataViewModel*) */
 
-bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* dataViewColumnPtr)
+bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
 {
 {
+  DataBrowserListViewColumnDesc columnDescription;
+
   DataBrowserPropertyID NewPropertyID;
 
   wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
   DataBrowserPropertyID NewPropertyID;
 
   wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 
+  wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
+
 
  // first, some error checking:
 
  // first, some error checking:
-  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                            false,_("m_peer is not or incorrectly initialized"));
-  wxCHECK_MSG(dataViewColumnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
-  wxCHECK_MSG(dataViewColumnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
-  wxCHECK_MSG(this->GetModel() != NULL,                                                  false,_("No model associated with control."));
-  wxCHECK_MSG((dataViewColumnPtr->GetModelColumn() >= 0) &&
-              (dataViewColumnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
-  if ((MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr) && this->wxDataViewCtrlBase::AppendColumn(dataViewColumnPtr))
+  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                    false,_("m_peer is not or incorrectly initialized"));
+  wxCHECK_MSG(columnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
+  wxCHECK_MSG(columnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
+  wxCHECK_MSG(this->GetModel() != NULL,                                          false,_("No model associated with control."));
+  wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
+              (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
+
+ // try to get new ID for the column:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
+ // full column variable initialization:
+  columnPtr->SetPropertyID(NewPropertyID);
+ // add column to wxWidget's internal structure:
+  wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
+              this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
+ // create a column description and add column to the native control:
+  wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),                 false,_("Column description could not be initialized."));
+  wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added."));
+
+ // final adjustments for the layout:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
+
+ // make sure that the data is up-to-date...
+ // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
+ // otherwise ask the control to 'update' the data in the newly appended column:
+  if (this->GetColumnCount() == 1)
   {
   {
-   // insert column into hash map:
-    this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,dataViewColumnPtr));
-
-   // variable definitions:
-    DataBrowserListViewColumnDesc columnDescription;
-    wxMacCFStringHolder           cfTitle(dataViewColumnPtr->GetTitle(),(this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding()));
-
-   // initialize column description:
-    dataViewColumnPtr->SetPropertyID(NewPropertyID);
-    columnDescription.propertyDesc.propertyID = NewPropertyID;
-    columnDescription.propertyDesc.propertyType = DataBrowserPropertyType(dataViewColumnPtr->GetRenderer()->GetPropertyType());
-    columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
-    if (dataViewColumnPtr->IsSortable())
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
-#if 0
-    if (dataViewColumnPtr->IsMovable())
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
-#endif
-    if (dataViewColumnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
-#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
-    if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) ||
-        (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
-        (columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType))
-      columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
-#endif
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-    columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
-#endif
-    columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
-    if (dataViewColumnPtr->IsResizeable())
-    {
-      columnDescription.headerBtnDesc.minimumWidth = 0;
-      columnDescription.headerBtnDesc.maximumWidth = 30000;
-    } /* if */
-    else
-    {
-      columnDescription.headerBtnDesc.minimumWidth = dataViewColumnPtr->GetWidth();
-      columnDescription.headerBtnDesc.maximumWidth = dataViewColumnPtr->GetWidth();
-    } /* if */
-    columnDescription.headerBtnDesc.titleOffset = 0;
-    columnDescription.headerBtnDesc.titleString = cfTitle; // we cannot directly use the wxMacCFStringHolder constructor call because then the CFStringRef is released
-                                                           // having called 'AddColumn' where the title (CFStringRef) is going to be used
-    columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing;
-    columnDescription.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask;
-    switch (dataViewColumnPtr->GetAlignment())
-    {
-      case wxALIGN_CENTER:
-      case wxALIGN_CENTER_HORIZONTAL:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teCenter;
-        break;
-      case wxALIGN_LEFT:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushLeft;
-        break;
-      case wxALIGN_RIGHT:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushRight;
-        break;
-      default:
-        columnDescription.headerBtnDesc.btnFontStyle.just = teFlushDefault;
-    } /* switch */
-    columnDescription.headerBtnDesc.btnFontStyle.font  = kControlFontViewSystemFont;
-    columnDescription.headerBtnDesc.btnFontStyle.style = normal;
-    columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
-    if (dataViewColumnPtr->GetBitmap().Ok())
-      columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = dataViewColumnPtr->GetBitmap().GetBitmapData()->GetIconRef();
-   // add column:
-    wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,kDataBrowserListViewAppendColumn) == noErr,false,_("Column could not be added."));
-
-   // final adjustments for the layout:
-    wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,dataViewColumnPtr->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(dataViewColumnPtr);
-      this->AddChildrenLevel(wxDataViewItem());
-    } /* if */
-    else
-      MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
-   // done:
-    return true;
+    this->SetExpanderColumn(columnPtr);
+    this->AddChildrenLevel(wxDataViewItem());
   } /* if */
   else
   } /* if */
   else
-    return false;
+    MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
+ // done:
+  return true;
 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
 
 bool wxDataViewCtrl::ClearColumns(void)
 } /* wxDataViewCtrl::AppendColumn(wxDataViewColumn*) */
 
 bool wxDataViewCtrl::ClearColumns(void)
@@ -1044,6 +1064,53 @@ int wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const* columnPtr) const
     return wxNOT_FOUND;
 } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
 
     return wxNOT_FOUND;
 } /* wxDataViewCtrl::GetColumnPosition(wxDataViewColumn const*) const */
 
+bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
+{
+  DataBrowserListViewColumnDesc columnDescription;
+
+  DataBrowserPropertyID NewPropertyID;
+
+  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
+
+  wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
+
+
+ // first, some error checking:
+  wxCHECK_MSG(MacDataViewListCtrlPtr != NULL,                                    false,_("m_peer is not or incorrectly initialized"));
+  wxCHECK_MSG(columnPtr != NULL,                                                 false,_("Column pointer must not be NULL."));
+  wxCHECK_MSG(columnPtr->GetRenderer() != NULL,                                  false,_("Column does not have a renderer."));
+  wxCHECK_MSG(this->GetModel() != NULL,                                          false,_("No model associated with control."));
+  wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
+              (columnPtr->GetModelColumn() < this->GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
+
+ // try to get new ID for the column:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->GetFreePropertyID(&NewPropertyID) == noErr,false,_("Cannot create new column's ID. Probably max. number of columns reached."));
+ // full column variable initialization:
+  columnPtr->SetPropertyID(NewPropertyID);
+ // add column to wxWidget's internal structure:
+  wxCHECK_MSG(this->wxDataViewCtrlBase::AppendColumn(columnPtr) &&
+              this->m_ColumnPointers.insert(ColumnPointerHashMapType::value_type(NewPropertyID,columnPtr)).second,false,_("Could not add column to internal structures."));
+ // create a column description and add column to the native control:
+  wxCHECK_MSG(::InitializeColumnDescription(columnDescription,columnPtr,NewPropertyID,title),false,_("Column description could not be initialized."));
+  wxCHECK_MSG(MacDataViewListCtrlPtr->AddColumn(&columnDescription,0) == noErr,              false,_("Column could not be added."));
+
+ // final adjustments for the layout:
+  wxCHECK_MSG(MacDataViewListCtrlPtr->SetColumnWidth(NewPropertyID,columnPtr->GetWidth()) == noErr,false,_("Column width could not be set."));
+
+ // make sure that the data is up-to-date...
+ // if the newly appended column is the first column add the initial data to the control and mark the column as an expander column,
+ // otherwise ask the control to 'update' the data in the newly appended column:
+  if (this->GetColumnCount() == 1)
+  {
+    this->SetExpanderColumn(columnPtr);
+    this->AddChildrenLevel(wxDataViewItem());
+  } /* if */
+  else
+    MacDataViewListCtrlPtr->UpdateItems(kDataBrowserNoItem,0,NULL,kDataBrowserItemNoProperty,NewPropertyID);
+ // done:
+  return true;
+} /* wxDataViewCtrl::PrependColumn(wxDataViewColumn*) */
+
 void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
 {
   wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
 void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
 {
   wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));