]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxDataViewCtrl::ExpandAncestors() and call it from both EnsureVisible() and Select()
authorRobert Roebling <robert@roebling.de>
Tue, 23 Dec 2008 14:56:07 +0000 (14:56 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 23 Dec 2008 14:56:07 +0000 (14:56 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57511 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
interface/wx/dataview.h
src/common/datavcmn.cpp
src/generic/datavgen.cpp
src/gtk/dataview.cpp
src/osx/carbon/dataview.cpp

index 5718981783391196a8f00ac6d51d685a416fc179..4c09225ef0eb8c95895bd7458b56706335f7df65 100644 (file)
@@ -713,11 +713,12 @@ public:
     virtual void UnselectAll() = 0;
 
     virtual void Expand( const wxDataViewItem & item ) = 0;
+    virtual void ExpandAncestors( const wxDataViewItem & item );
     virtual void Collapse( const wxDataViewItem & item ) = 0;
     virtual bool IsExpanded( const wxDataViewItem & item ) const = 0;
 
     virtual void EnsureVisible( const wxDataViewItem & item,
-                                const wxDataViewColumn *column = NULL );
+                                const wxDataViewColumn *column = NULL ) = 0;
     virtual void HitTest( const wxPoint & point, wxDataViewItem &item, wxDataViewColumn* &column ) const = 0;
     virtual wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn *column = NULL ) const = 0;
 
index 9e3f259f5fcd226c5a623f29aac182d7d09f90fb..69c97072919b8b2a23b06a88844465afe8f02223 100644 (file)
@@ -887,6 +887,13 @@ public:
     */
     virtual void Expand(const wxDataViewItem& item);
 
+    /**
+       Expands all ancestors of the @a item. This method also
+       ensures that the item itself as well as all ancestor
+       items have been read from the model by the control.
+    */
+    virtual void ExpandAncestors( const wxDataViewItem & item );
+    
     /**
         Returns pointer to the column. @a pos refers to the position in the
         control which may change after reordering columns by the user.
index 850772322cc5fa7d314c36ba7d20ddc34bcd99cb..949ffa233fb3844ef035f4e45297e40665af6d00 100644 (file)
@@ -896,10 +896,11 @@ const wxDataViewModel* wxDataViewCtrlBase::GetModel() const
     return m_model;
 }
 
-void wxDataViewCtrlBase::EnsureVisible( const wxDataViewItem & item,
-                                        const wxDataViewColumn *WXUNUSED(column) )
+void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem & item )
 {
     if (!m_model) return;
+    
+    if (!item.IsOk()) return;
 
     wxVector<wxDataViewItem> parentChain;
     
@@ -919,7 +920,6 @@ void wxDataViewCtrlBase::EnsureVisible( const wxDataViewItem & item,
     }
 }
 
-
 wxDataViewColumn *
 wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column,
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
index 8a3cdb48745c0f4265d48e158285961fb77c14cd..388cd1b52ff26b154decd61de44674e9b2ac6eee 100644 (file)
@@ -3524,18 +3524,33 @@ int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
 void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 {
     wxDataViewSelection selection(wxDataViewSelectionCmp);
+
+    wxDataViewItem last_parent;
+
     int len = sel.GetCount();
     for( int i = 0; i < len; i ++ )
     {
-        int row = m_clientArea->GetRowByItem( sel[i] );
+        wxDataViewItem item = sel[i];
+        wxDataViewItem parent = GetModel()->GetParent( item );
+        if (parent)
+        {
+            if (parent != last_parent)
+                ExpandAncestors(item);
+        }
+        
+        last_parent = parent;
+        int row = m_clientArea->GetRowByItem( item );
         if( row >= 0 )
             selection.Add( static_cast<unsigned int>(row) );
     }
+    
     m_clientArea->SetSelections( selection );
 }
 
 void wxDataViewCtrl::Select( const wxDataViewItem & item )
 {
+    ExpandAncestors( item );
+    
     int row = m_clientArea->GetRowByItem( item );
     if( row >= 0 )
     {
@@ -3659,7 +3674,7 @@ void wxDataViewCtrl::EnsureVisible( int row, int column )
 
 void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataViewColumn * column )
 {
-    wxDataViewCtrlBase::EnsureVisible( item, column );
+    ExpandAncestors( item );
   
     m_clientArea->RecalculateDisplay();
 
index 32bdc03dc4f838d915905af5485ba2581c397885..297f4968014afb9e3f4248fcaf151a3d7fc51731 100644 (file)
@@ -4113,12 +4113,23 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 
     gtk_tree_selection_unselect_all( selection );
 
+    wxDataViewItem last_parent;
+
     size_t i;
     for (i = 0; i < sel.GetCount(); i++)
     {
+        wxDataViewItem item = sel[i];
+        wxDataViewItem parent = GetModel()->GetParent( item );
+        if (parent)
+        {
+            if (parent != last_parent)
+                ExpandAncestors(item);
+        }
+        last_parent = parent;
+
         GtkTreeIter iter;
         iter.stamp = m_internal->GetGtkModel()->stamp;
-        iter.user_data = (gpointer) sel[i].GetID();
+        iter.user_data = (gpointer) item.GetID();
         gtk_tree_selection_select_iter( selection, &iter );
     }
 
@@ -4127,6 +4138,8 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel )
 
 void wxDataViewCtrl::Select( const wxDataViewItem & item )
 {
+    ExpandAncestors(item);
+
     GtkDisableSelectionEvents();
 
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
@@ -4187,9 +4200,9 @@ void wxDataViewCtrl::UnselectAll()
 }
 
 void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item,
-                                   const wxDataViewColumn *column)
+                                   const wxDataViewColumn *WXUNUSED(column))
 {
-    wxDataViewCtrlBase::EnsureVisible(item,column);
+    ExpandAncestors(item);
 
     GtkTreeIter iter;
     iter.user_data = (gpointer) item.GetID();
index bf7479c4cff5157138007d0e37ef5f63e7e22115..dd3cebff16042060f4c128ac85773d36d14efb00 100644 (file)
@@ -1183,7 +1183,7 @@ void wxDataViewCtrl::Collapse(wxDataViewItem const& item)
 
 void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn const* columnPtr)
 {
-  wxDataViewCtrlBase::EnsureVisible(item,columnPtr);
+  ExpandAncestors(item);
 
   if (item.IsOk())
   {
@@ -1334,6 +1334,8 @@ void wxDataViewCtrl::Select(wxDataViewItem const& item)
 {
   if (item.IsOk())
   {
+    ExpandAncestors(item);
+  
     DataBrowserItemID                              itemID(reinterpret_cast<DataBrowserItemID>(item.GetID()));
     wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
 
@@ -1343,18 +1345,31 @@ void wxDataViewCtrl::Select(wxDataViewItem const& item)
 
 void wxDataViewCtrl::SetSelections(wxDataViewItemArray const& sel)
 {
-  size_t const NoOfSelections = sel.GetCount();
+    size_t const NoOfSelections = sel.GetCount();
 
-  DataBrowserItemID* itemIDs;
+    wxDataViewItem last_parent;
 
-  wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
+    size_t i;
+    for (i = 0; i < NoOfSelections; i++)
+    {
+        wxDataViewItem item = sel[i];
+        wxDataViewItem parent = GetModel()->GetParent( item );
+        if (parent)
+        {
+            if (parent != last_parent)
+                ExpandAncestors(item);
+        }
+        last_parent = parent;
+    }
 
+    DataBrowserItemID* itemIDs;
+    wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(m_peer));
 
-  itemIDs = new DataBrowserItemID[NoOfSelections];
-  for (size_t i=0; i<NoOfSelections; ++i)
-    itemIDs[i] = reinterpret_cast<DataBrowserItemID>(sel[i].GetID());
-  MacDataViewListCtrlPtr->SetSelectedItems(NoOfSelections,itemIDs,kDataBrowserItemsAssign);
-  delete[] itemIDs;
+    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;
 }
 
 void wxDataViewCtrl::Unselect(wxDataViewItem const& item)