]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxTreeCtrl::SelectChildren() method.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Jan 2010 12:43:39 +0000 (12:43 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Jan 2010 12:43:39 +0000 (12:43 +0000)
Add MSW and generic implementation, documentation and change to the sample
showing it.

Closes #11620.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63277 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/generic/treectlg.h
include/wx/msw/treectrl.h
include/wx/treectrl.h
interface/wx/treectrl.h
samples/treectrl/treetest.cpp
samples/treectrl/treetest.h
src/generic/treectlg.cpp
src/msw/treectrl.cpp

index 5803345543c68dbe520005315dc9053bcde6f8ff..c7193993224f4f732574818c3829557719879775 100644 (file)
@@ -492,6 +492,7 @@ All (GUI):
 - wxGraphicsContext is now enabled by default if supported by the platform.
 - Fix building with using system libpng 1.4 (Volker Grabsch).
 - Add wxComboBox::Popup() and Dismiss() methods (Igor Korot).
+- Added wxTreeCtrl::SelectChildren() (Nikolay Tjushkov).
 
 GTK:
 
index 86f2a905192032ecbc11d055c55fd64385e2f96a..6a1a838e18c82cbb84804a697687cd641176429e 100644 (file)
@@ -155,6 +155,7 @@ public:
     virtual void Unselect();
     virtual void UnselectAll();
     virtual void SelectItem(const wxTreeItemId& item, bool select = true);
+    virtual void SelectChildren(const wxTreeItemId& parent);
 
     virtual void EnsureVisible(const wxTreeItemId& item);
     virtual void ScrollTo(const wxTreeItemId& item);
index 4c621980efff4656a2fec1acc52e627863358a79..25461a87de14b03ee0f875c9b0cd03fd1d97eb81 100644 (file)
@@ -162,6 +162,7 @@ public:
     virtual void Unselect();
     virtual void UnselectAll();
     virtual void SelectItem(const wxTreeItemId& item, bool select = true);
+    virtual void SelectChildren(const wxTreeItemId& parent);
 
     virtual void EnsureVisible(const wxTreeItemId& item);
     virtual void ScrollTo(const wxTreeItemId& item);
@@ -276,6 +277,7 @@ private:
     void DoToggleItemSelection(const wxTreeItemId& item);
 
     void DoUnselectAll();
+    void DoSelectChildren(const wxTreeItemId& parent);
 
     void DeleteTextCtrl();
 
index ee13f4f4a4a5c350361f4fb56687a072e0752a08..fe8b7f1fb62ed8bc3d2c8aa82650872023f7c544 100644 (file)
@@ -324,6 +324,9 @@ public:
     virtual void UnselectAll() = 0;
         // select this item
     virtual void SelectItem(const wxTreeItemId& item, bool select = true) = 0;
+        // selects all (direct) children for given parent (only for
+        // multiselection controls)
+    virtual void SelectChildren(const wxTreeItemId& parent) = 0;
         // unselect this item
     void UnselectItem(const wxTreeItemId& item) { SelectItem(item, false); }
         // toggle item selection
@@ -400,7 +403,7 @@ public:
 protected:
     virtual wxSize DoGetBestSize() const;
 
-    // comon part of Get/SetItemState()
+    // common part of Get/SetItemState()
     virtual int DoGetItemState(const wxTreeItemId& item) const = 0;
     virtual void DoSetItemState(const wxTreeItemId& item, int state) = 0;
 
index f1cdacd5293d7581528a41c224ef4ee545ad1cc7..9b9fb7c14150b40cf9d031d34df54c43ba6fcc05 100644 (file)
@@ -954,6 +954,15 @@ public:
         Unselects the given item. This works in multiselection controls only.
     */
     void UnselectItem(const wxTreeItemId& item);
+
+    /**
+        Select all the immediate children of the given parent.
+
+        This function can be used with multiselection controls only.
+
+        @since 2.9.1
+    */
+    virtual void SelectChildren(const wxTreeItemId& parent);
 };
 
 
index 41a86c466c83e229985dae9e9527b589a726b6b1..0da06d9ea11f13d7a66b977a9d4e329ca30c3316 100644 (file)
@@ -98,6 +98,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     MENU_LINK(Select)
     MENU_LINK(Unselect)
     MENU_LINK(ToggleSel)
+    MENU_LINK(SelectChildren)
 #endif // NO_MULTIPLE_SELECTION
     MENU_LINK(Rename)
     MENU_LINK(Count)
@@ -262,6 +263,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
     tree_menu->Append(TreeTest_DeleteChildren, wxT("Delete &children"));
     tree_menu->Append(TreeTest_DeleteAll, wxT("Delete &all items"));
     tree_menu->Append(TreeTest_SelectRoot, wxT("Select root item"));
+
     tree_menu->AppendSeparator();
     tree_menu->Append(TreeTest_Count, wxT("Count children of current item"));
     tree_menu->Append(TreeTest_CountRec, wxT("Recursively count children of current item"));
@@ -307,6 +309,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
     item_menu->Append(TreeTest_DumpSelected, wxT("Dump selected items\tAlt-D"));
     item_menu->Append(TreeTest_Select, wxT("Select current item\tAlt-S"));
     item_menu->Append(TreeTest_Unselect, wxT("Unselect everything\tAlt-U"));
+    item_menu->Append(TreeTest_SelectChildren, wxT("Select all children\tCtrl-A"));
 #endif // NO_MULTIPLE_SELECTION
 
     wxMenuBar *menu_bar = new wxMenuBar;
@@ -594,6 +597,15 @@ void MyFrame::OnUnselect(wxCommandEvent& WXUNUSED(event))
     m_treeCtrl->UnselectAll();
 }
 
+void MyFrame::OnSelectChildren(wxCommandEvent& WXUNUSED(event))
+{
+    wxTreeItemId item = m_treeCtrl->GetFocusedItem();
+    if ( !item.IsOk() )
+        item = m_treeCtrl->GetRootItem();
+
+    m_treeCtrl->SelectChildren(item);
+}
+
 #endif // NO_MULTIPLE_SELECTION
 
 void MyFrame::DoSetBold(bool bold)
index 90bbebb0da2cb874b59a1198f7f01bb71b32eab9..50db3d92e394e503a14fe18014ac5b4222d64420 100644 (file)
@@ -209,6 +209,7 @@ public:
     void OnSelect(wxCommandEvent& event);
     void OnUnselect(wxCommandEvent& event);
     void OnToggleSel(wxCommandEvent& event);
+    void OnSelectChildren(wxCommandEvent& event);
 #endif // NO_MULTIPLE_SELECTION
     void OnSelectRoot(wxCommandEvent& event);
     void OnDelete(wxCommandEvent& event);
@@ -354,6 +355,7 @@ enum
     TreeTest_Select,
     TreeTest_Unselect,
     TreeTest_SelectRoot,
+    TreeTest_SelectChildren,
     TreeTest_ShowFirstVisible,
     TreeTest_ShowLastVisible,
     TreeTest_ShowNextVisible,
index 7f0dc649c641ada4b8c1e4d16975c217823fb719..da93936fdf2a0d7375a423ed23bbe0e4f8f71080 100644 (file)
@@ -1983,6 +1983,42 @@ void wxGenericTreeCtrl::UnselectAll()
     }
 }
 
+void wxGenericTreeCtrl::SelectChildren(const wxTreeItemId& parent)
+{
+    wxCHECK_RET( HasFlag(wxTR_MULTIPLE),
+                 "this only works with multiple selection controls" );
+
+    UnselectAll();
+
+    if ( !HasChildren(parent) )
+        return;
+
+
+    wxArrayGenericTreeItems&
+        children = ((wxGenericTreeItem*) parent.m_pItem)->GetChildren();
+    size_t count = children.GetCount();
+
+    wxGenericTreeItem *
+        item = (wxGenericTreeItem*) ((wxTreeItemId)children[0]).m_pItem;
+    wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item);
+    event.m_itemOld = m_current;
+
+    if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() )
+        return;
+
+    for ( size_t n = 0; n < count; ++n )
+    {
+        m_current = m_key_current = children[n];
+        m_current->SetHilight(true);
+        RefreshSelected();
+    }
+
+
+    event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED);
+    GetEventHandler()->ProcessEvent( event );
+}
+
+
 // Recursive function !
 // To stop we must have crt_item<last_item
 // Algorithm :
index 7baecbd622f1f96f58303643553933de902a3f81..9464bec90b3669822d36e04c1e34098d4910e195 100644 (file)
@@ -1883,6 +1883,39 @@ void wxTreeCtrl::UnselectAll()
     }
 }
 
+void wxTreeCtrl::DoSelectChildren(const wxTreeItemId& parent)
+{
+    DoUnselectAll();
+
+    wxTreeItemIdValue cookie;
+    wxTreeItemId child = GetFirstChild(parent, cookie);
+    while ( child.IsOk() )
+    {
+        DoSelectItem(child, true);
+        child = GetNextChild(child, cookie);
+    }
+}
+
+void wxTreeCtrl::SelectChildren(const wxTreeItemId& parent)
+{
+    wxCHECK_RET( HasFlag(wxTR_MULTIPLE),
+                 "this only works with multiple selection controls" );
+
+    HTREEITEM htFocus = (HTREEITEM)TreeView_GetSelection(GetHwnd());
+
+    wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this);
+    changingEvent.m_itemOld = htFocus;
+
+    if ( IsTreeEventAllowed(changingEvent) )
+    {
+        DoSelectChildren(parent);
+
+        wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED, this);
+        changedEvent.m_itemOld = htFocus;
+        (void)HandleTreeEvent(changedEvent);
+    }
+}
+
 void wxTreeCtrl::DoSelectItem(const wxTreeItemId& item, bool select)
 {
     TempSetter set(m_changingSelection);