]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/dataview_osx.cpp
notify the event loop that synthesized events are on the queue, wait for them to...
[wxWidgets.git] / src / osx / dataview_osx.cpp
index 1dabd9f4bc194b9bb6c3a7ab0f58066939ad2412..d840376145b0f297e0c6ec9b61fd2dbea26e3e62 100644 (file)
@@ -20,6 +20,9 @@
     #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"
@@ -76,6 +79,8 @@ protected:
   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;
@@ -122,7 +127,7 @@ bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
   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);
@@ -130,6 +135,7 @@ bool wxOSXDataViewModelNotifier::ItemChanged(wxDataViewItem const& item)
     m_DataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
    // row height may have to be adjusted:
     AdjustRowHeight(item);
+    AdjustAutosizedColumns();
    // done
     return true;
   }
@@ -141,7 +147,7 @@ bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
 {
   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);
@@ -156,6 +162,7 @@ bool wxOSXDataViewModelNotifier::ItemsChanged(wxDataViewItemArray const& items)
       return false;
  // if this location is reached all items have been updated:
   AdjustRowHeights(items);
+  AdjustAutosizedColumns();
  // done:
   return true;
 }
@@ -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);
+
+  AdjustAutosizedColumns();
  // done:
   return noFailureFlag;
 }
@@ -192,6 +201,8 @@ bool wxOSXDataViewModelNotifier::ItemsDeleted(wxDataViewItem const& parent, wxDa
   noFailureFlag = m_DataViewCtrlPtr->GetDataViewPeer()->Remove(parent,items);
  // enable automatic updating again:
   m_DataViewCtrlPtr->SetDeleting(false);
+
+  AdjustAutosizedColumns();
  // done:
   return noFailureFlag;
 }
@@ -202,13 +213,15 @@ bool wxOSXDataViewModelNotifier::ValueChanged(wxDataViewItem const& item, unsign
   wxCHECK_MSG(GetOwner() != NULL,false,"Owner not initialized.");
   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);
+
+    AdjustAutosizedColumns();
    // 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
@@ -323,14 +348,19 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr)
 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;
-  m_macIsUserPane     = false;
   m_cgContext         = NULL;
+  m_ModelNotifier     = NULL;
 }
 
 bool wxDataViewCtrl::Create(wxWindow *parent,
@@ -341,9 +371,10 @@ bool wxDataViewCtrl::Create(wxWindow *parent,
                             const wxValidator& validator,
                             const wxString& name)
 {
+  DontCreatePeer();
   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);
 
@@ -356,10 +387,19 @@ bool wxDataViewCtrl::AssociateModel(wxDataViewModel* model)
 
 
   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)
-      model->AddNotifier(new wxOSXDataViewModelNotifier(this));
+    {
+      m_ModelNotifier = new wxOSXDataViewModelNotifier(this);
+      model->AddNotifier(m_ModelNotifier);
+    }
     return true;
   }
   else
@@ -385,8 +425,7 @@ bool wxDataViewCtrl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
   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(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))
@@ -506,6 +545,11 @@ void wxDataViewCtrl::DoSetCurrentItem(const wxDataViewItem& 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))
@@ -514,15 +558,9 @@ wxRect wxDataViewCtrl::GetItemRect(wxDataViewItem const& item, wxDataViewColumn
     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
@@ -612,6 +650,11 @@ void wxDataViewCtrl::AddChildren(wxDataViewItem const& parentItem)
   (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())
@@ -686,12 +729,11 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
 {
     event.Skip();
 
+#if wxOSX_USE_CARBON
     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;
@@ -716,7 +758,7 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
 
            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)
@@ -730,7 +772,6 @@ void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
        }
 
     }
-
     SetCursor( *wxSTANDARD_CURSOR );
 #endif
 }