]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/dataview_osx.cpp
Add wxTimer::StartOnce().
[wxWidgets.git] / src / osx / dataview_osx.cpp
index f2d16e61a0c08279c896126f983e38b75c11813e..d840376145b0f297e0c6ec9b61fd2dbea26e3e62 100644 (file)
@@ -20,6 +20,9 @@
     #include "wx/dcclient.h"
     #include "wx/icon.h"
 #endif
     #include "wx/dcclient.h"
     #include "wx/icon.h"
 #endif
+#if wxOSX_USE_CARBON
+#include "wx/osx/carbon/dataview.h"
+#endif
 
 #include "wx/osx/core/dataview.h"
 #include "wx/osx/private.h"
 
 #include "wx/osx/core/dataview.h"
 #include "wx/osx/private.h"
@@ -76,6 +79,8 @@ protected:
   void AdjustRowHeight(wxDataViewItem const& item);
  // ... and the same method for a couple of items:
   void AdjustRowHeights(wxDataViewItemArray const& items);
   void AdjustRowHeight(wxDataViewItem const& item);
  // ... and the same method for a couple of items:
   void AdjustRowHeights(wxDataViewItemArray const& items);
+ // adjust wxCOL_WIDTH_AUTOSIZE columns to fit the data
+  void AdjustAutosizedColumns();
 
 private:
   wxDataViewCtrl* m_DataViewCtrlPtr;
 
 private:
   wxDataViewCtrl* m_DataViewCtrlPtr;
@@ -88,7 +93,7 @@ wxOSXDataViewModelNotifier::wxOSXDataViewModelNotifier(wxDataViewCtrl* initDataV
                            :m_DataViewCtrlPtr(initDataViewCtrlPtr)
 {
   if (initDataViewCtrlPtr == NULL)
                            :m_DataViewCtrlPtr(initDataViewCtrlPtr)
 {
   if (initDataViewCtrlPtr == NULL)
-    wxFAIL_MSG(_("Pointer to dataview control must not be NULL"));
+    wxFAIL_MSG("Pointer to dataview control must not be NULL");
 }
 
 bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataViewItem const& item)
 }
 
 bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataViewItem const& item)
@@ -96,7 +101,7 @@ bool wxOSXDataViewModelNotifier::ItemAdded(wxDataViewItem const& parent, wxDataV
   bool noFailureFlag;
 
 
   bool noFailureFlag;
 
 
-  wxCHECK_MSG(item.IsOk(),false,_("Added item is invalid."));
+  wxCHECK_MSG(item.IsOk(),false,"Added item is invalid.");
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,item);
   AdjustRowHeight(item);
   return noFailureFlag;
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Add(parent,item);
   AdjustRowHeight(item);
   return noFailureFlag;
@@ -117,12 +122,12 @@ bool wxOSXDataViewModelNotifier::ItemsAdded(wxDataViewItem const& parent, wxData
 
 bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
 {
 
 bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
 {
-  wxCHECK_MSG(item.IsOk(),             false,_("Changed item is invalid."));
-  wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
+  wxCHECK_MSG(item.IsOk(),             false,"Changed item is invalid.");
+  wxCHECK_MSG(GetOwner() != NULL,false,"Owner not initialized.");
   if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
   {
    // sent the equivalent wxWidget event:
   if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
   {
    // sent the equivalent wxWidget event:
-    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
+    wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
 
     dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
     dataViewEvent.SetItem(item);
 
     dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
     dataViewEvent.SetItem(item);
@@ -130,6 +135,7 @@ bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
     m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
    // row height may have to be adjusted:
     AdjustRowHeight(item);
     m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
    // row height may have to be adjusted:
     AdjustRowHeight(item);
+    AdjustAutosizedColumns();
    // done
     return true;
   }
    // done
     return true;
   }
@@ -141,7 +147,7 @@ bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
 {
   size_t const noOfItems = items.GetCount();
 
 {
   size_t const noOfItems = items.GetCount();
 
-  wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
+  wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
 
 
   dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
 
 
   dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
@@ -156,6 +162,7 @@ bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
       return false;
  // if this location is reached all items have been updated:
   AdjustRowHeights(items);
       return false;
  // if this location is reached all items have been updated:
   AdjustRowHeights(items);
+  AdjustAutosizedColumns();
  // done:
   return true;
 }
  // done:
   return true;
 }
@@ -165,7 +172,7 @@ bool wxOSXDataViewModelNotifier::ItemDeleted(wxDataViewItem const& parent, wxDat
   bool noFailureFlag;
 
 
   bool noFailureFlag;
 
 
-  wxCHECK_MSG(item.IsOk(),false,_("To be deleted item is invalid."));
+  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
  // 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
@@ -174,6 +181,8 @@ bool wxOSXDataViewModelNotifier::ItemDeleted(wxDataViewItem const& parent, wxDat
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,item);
  // enable automatic updating again:
   m_DataViewCtrlPtr->SetDeleting(false);
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,item);
  // enable automatic updating again:
   m_DataViewCtrlPtr->SetDeleting(false);
+
+  AdjustAutosizedColumns();
  // done:
   return noFailureFlag;
 }
  // done:
   return noFailureFlag;
 }
@@ -192,23 +201,27 @@ bool wxOSXDataViewModelNotifier::ItemsDeleted(wxDataViewItem const& parent, wxDa
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
  // enable automatic updating again:
   m_DataViewCtrlPtr->SetDeleting(false);
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
  // enable automatic updating again:
   m_DataViewCtrlPtr->SetDeleting(false);
+
+  AdjustAutosizedColumns();
  // done:
   return noFailureFlag;
 }
 
 bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsigned int col)
 {
  // done:
   return noFailureFlag;
 }
 
 bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsigned int col)
 {
-  wxCHECK_MSG(item.IsOk(),             false,_("Passed item is invalid."));
-  wxCHECK_MSG(GetOwner() != NULL,false,_("Owner not initialized."));
+  wxCHECK_MSG(item.IsOk(),             false,"Passed item is invalid.");
+  wxCHECK_MSG(GetOwner() != NULL,false,"Owner not initialized.");
   if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
   {
   if (m_DataViewCtrlPtr->GetDataViewPeer()->Update(GetOwner()->GetParent(item),item))
   {
-    wxDataViewEvent dataViewEvent(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
+    wxDataViewEvent dataViewEvent(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,m_DataViewCtrlPtr->GetId());
 
     dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
     dataViewEvent.SetColumn(col);
     dataViewEvent.SetItem(item);
    // send the equivalent wxWidget event:
     m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
 
     dataViewEvent.SetEventObject(m_DataViewCtrlPtr);
     dataViewEvent.SetColumn(col);
     dataViewEvent.SetItem(item);
    // send the equivalent wxWidget event:
     m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
+
+    AdjustAutosizedColumns();
    // done
     return true;
   }
    // done
     return true;
   }
@@ -292,6 +305,18 @@ void wxOSXDataViewModelNotifier::AdjustRowHeights(wxDataViewItemArray const& ite
   }
 }
 
   }
 }
 
+void wxOSXDataViewModelNotifier::AdjustAutosizedColumns()
+{
+  unsigned count = m_DataViewCtrlPtr->GetColumnCount();
+  for ( unsigned col = 0; col < count; col++ )
+  {
+      wxDataViewColumn *column = m_DataViewCtrlPtr->GetColumnPtr(col);
+
+      if ( column->GetWidthVariable() == wxCOL_WIDTH_AUTOSIZE )
+        m_DataViewCtrlPtr->GetDataViewPeer()->FitColumnWidthToContent(col);
+  }
+}
+
 // ---------------------------------------------------------
 // wxDataViewCustomRenderer
 // The constructor, the implementation macro and environment
 // ---------------------------------------------------------
 // wxDataViewCustomRenderer
 // The constructor, the implementation macro and environment
@@ -323,14 +348,19 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
 wxDataViewCtrl::~wxDataViewCtrl()
 {
   ClearColumns();
 wxDataViewCtrl::~wxDataViewCtrl()
 {
   ClearColumns();
+
+  // Ensure that the already destructed controls is not notified about changes
+  // in the model any more.
+  if (m_ModelNotifier != NULL)
+    m_ModelNotifier->GetOwner()->RemoveNotifier(m_ModelNotifier);
 }
 
 void wxDataViewCtrl::Init()
 {
   m_CustomRendererPtr = NULL;
   m_Deleting          = false;
 }
 
 void wxDataViewCtrl::Init()
 {
   m_CustomRendererPtr = NULL;
   m_Deleting          = false;
-  m_macIsUserPane     = false;
   m_cgContext         = NULL;
   m_cgContext         = NULL;
+  m_ModelNotifier     = NULL;
 }
 
 bool wxDataViewCtrl::Create(wxWindow *parent,
 }
 
 bool wxDataViewCtrl::Create(wxWindow *parent,
@@ -341,9 +371,10 @@ bool wxDataViewCtrl::Create(wxWindow *parent,
                             const wxValidator& validator,
                             const wxString& name)
 {
                             const wxValidator& validator,
                             const wxString& name)
 {
+  DontCreatePeer();
   if (!(wxControl::Create(parent,id,pos,size,style,validator,name)))
     return false;
   if (!(wxControl::Create(parent,id,pos,size,style,validator,name)))
     return false;
-  m_peer = ::CreateDataView(this,parent,id,pos,size,style,GetExtraStyle());
+  SetPeer(::CreateDataView(this,parent,id,pos,size,style,GetExtraStyle()));
 
   MacPostControlCreate(pos,size);
 
 
   MacPostControlCreate(pos,size);
 
@@ -355,11 +386,20 @@ bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
   wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
 
 
   wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
 
 
-  wxCHECK_MSG(dataViewWidgetPtr != NULL,false,_("Pointer to native control must not be NULL."));
+  wxCHECK_MSG(dataViewWidgetPtr != NULL,false,"Pointer to native control must not be NULL.");
+
+  // We could have been associated with another model previously, break the
+  // association in this case.
+  if ( m_ModelNotifier )
+      m_ModelNotifier->GetOwner()->RemoveNotifier(m_ModelNotifier);
+
   if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model))
   {
     if (model != NULL)
   if (wxDataViewCtrlBase::AssociateModel(model) && dataViewWidgetPtr->AssociateModel(model))
   {
     if (model != NULL)
-      model->AddNotifier(new wxOSXDataViewModelNotifier(this));
+    {
+      m_ModelNotifier = new wxOSXDataViewModelNotifier(this);
+      model->AddNotifier(m_ModelNotifier);
+    }
     return true;
   }
   else
     return true;
   }
   else
@@ -381,12 +421,11 @@ bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
   wxDataViewWidgetImpl* dataViewWidgetPtr(GetDataViewPeer());
 
  // first, some error checking:
   wxDataViewWidgetImpl* dataViewWidgetPtr(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(GetModel() != NULL,                                          false,_("No model associated with control."));
-  wxCHECK_MSG((columnPtr->GetModelColumn() >= 0) &&
-              (columnPtr->GetModelColumn() < GetModel()->GetColumnCount()),false,_("Column's model column has no equivalent in the associated model."));
+  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(GetModel() != NULL,                                          false,"No model associated with control.");
+  wxCHECK_MSG(columnPtr->GetModelColumn() < GetModel()->GetColumnCount(),false,"Column's model column has no equivalent in the associated model.");
 
  // add column to wxWidget's internal structure:
   if (wxDataViewCtrlBase::InsertColumn(pos,columnPtr))
 
  // add column to wxWidget's internal structure:
   if (wxDataViewCtrlBase::InsertColumn(pos,columnPtr))
@@ -409,7 +448,7 @@ bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
       m_ColumnPtrs.Remove(columnPtr);
       delete columnPtr;
      // and send a message in debug mode:
       m_ColumnPtrs.Remove(columnPtr);
       delete columnPtr;
      // and send a message in debug mode:
-      wxFAIL_MSG(_("Column could not be added to native control."));
+      wxFAIL_MSG("Column could not be added to native control.");
      // failed:
       return false;
     }
      // failed:
       return false;
     }
@@ -418,7 +457,7 @@ bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
   {
    // clean-up:
     delete columnPtr;
   {
    // clean-up:
     delete columnPtr;
-    wxFAIL_MSG(_("Could not add column to internal structures."));
+    wxFAIL_MSG("Could not add column to internal structures.");
    // failed:
     return false;
   }
    // failed:
     return false;
   }
@@ -506,6 +545,11 @@ void wxDataViewCtrl::DoSetCurrentItem(const wxDataViewItem& item)
     GetDataViewPeer()->SetCurrentItem(item);
 }
 
     GetDataViewPeer()->SetCurrentItem(item);
 }
 
+wxDataViewColumn *wxDataViewCtrl::GetCurrentColumn() const
+{
+    return GetDataViewPeer()->GetCurrentColumn();
+}
+
 wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
 {
   if (item.IsOk() && (columnPtr != NULL))
 wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn const* columnPtr) const
 {
   if (item.IsOk() && (columnPtr != NULL))
@@ -514,15 +558,9 @@ wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn
     return wxRect();
 }
 
     return wxRect();
 }
 
-wxDataViewItem wxDataViewCtrl::GetSelection() const
+int wxDataViewCtrl::GetSelectedItemsCount() const
 {
 {
-  wxDataViewItemArray itemIDs;
-
-
-  if (GetDataViewPeer()->GetSelections(itemIDs) > 0)
-    return itemIDs[0];
-  else
-    return wxDataViewItem();
+  return GetDataViewPeer()->GetSelectedItemsCount();
 }
 
 int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
 }
 
 int wxDataViewCtrl::GetSelections(wxDataViewItemArray& sel) const
@@ -607,11 +645,16 @@ void wxDataViewCtrl::AddChildren(wxDataViewItem const& parentItem)
   wxDataViewItemArray items;
 
 
   wxDataViewItemArray items;
 
 
-  wxCHECK_RET(GetModel() != NULL,_("Model pointer not initialized."));
+  wxCHECK_RET(GetModel() != NULL,"Model pointer not initialized.");
   noOfChildren = GetModel()->GetChildren(parentItem,items);
   (void) GetModel()->ItemsAdded(parentItem,items);
 }
 
   noOfChildren = GetModel()->GetChildren(parentItem,items);
   (void) GetModel()->ItemsAdded(parentItem,items);
 }
 
+void wxDataViewCtrl::EditItem(const wxDataViewItem& item, const wxDataViewColumn *column)
+{
+    GetDataViewPeer()->StartEditor(item, GetColumnPosition(column));
+}
+
 void wxDataViewCtrl::FinishCustomItemEditing()
 {
   if (GetCustomRendererItem().IsOk())
 void wxDataViewCtrl::FinishCustomItemEditing()
 {
   if (GetCustomRendererItem().IsOk())
@@ -686,12 +729,11 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
 {
     event.Skip();
 
 {
     event.Skip();
 
+#if wxOSX_USE_CARBON
     if (GetModel() == NULL)
         return;
 
     if (GetModel() == NULL)
         return;
 
-#if 0
-    // Doesn't compile anymore
-    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(GetPeer()));
 
     int NoOfChildren;
     wxDataViewItemArray items;
 
     int NoOfChildren;
     wxDataViewItemArray items;
@@ -716,7 +758,7 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
 
            Rect itemrect;
            ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr->GetControlRef(),
 
            Rect itemrect;
            ::GetDataBrowserItemPartBounds( MacDataViewListCtrlPtr->GetControlRef(),
-              reinterpret_cast<DataBrowserItemID>(firstChild.GetID()), column->GetPropertyID(),
+              reinterpret_cast<DataBrowserItemID>(firstChild.GetID()), column->GetNativeData()->GetPropertyID(),
               kDataBrowserPropertyEnclosingPart, &itemrect );
 
            if (abs( event.GetX() - itemrect.right) < 3)
               kDataBrowserPropertyEnclosingPart, &itemrect );
 
            if (abs( event.GetX() - itemrect.right) < 3)
@@ -730,7 +772,6 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
        }
 
     }
        }
 
     }
-
     SetCursor( *wxSTANDARD_CURSOR );
 #endif
 }
     SetCursor( *wxSTANDARD_CURSOR );
 #endif
 }