Add wxTreeCtrl::SelectChildren() method.
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
This commit is contained in:
parent
6b2f55531a
commit
5cb3a695e0
@ -492,6 +492,7 @@ All (GUI):
|
|||||||
- wxGraphicsContext is now enabled by default if supported by the platform.
|
- wxGraphicsContext is now enabled by default if supported by the platform.
|
||||||
- Fix building with using system libpng 1.4 (Volker Grabsch).
|
- Fix building with using system libpng 1.4 (Volker Grabsch).
|
||||||
- Add wxComboBox::Popup() and Dismiss() methods (Igor Korot).
|
- Add wxComboBox::Popup() and Dismiss() methods (Igor Korot).
|
||||||
|
- Added wxTreeCtrl::SelectChildren() (Nikolay Tjushkov).
|
||||||
|
|
||||||
GTK:
|
GTK:
|
||||||
|
|
||||||
|
@ -155,6 +155,7 @@ public:
|
|||||||
virtual void Unselect();
|
virtual void Unselect();
|
||||||
virtual void UnselectAll();
|
virtual void UnselectAll();
|
||||||
virtual void SelectItem(const wxTreeItemId& item, bool select = true);
|
virtual void SelectItem(const wxTreeItemId& item, bool select = true);
|
||||||
|
virtual void SelectChildren(const wxTreeItemId& parent);
|
||||||
|
|
||||||
virtual void EnsureVisible(const wxTreeItemId& item);
|
virtual void EnsureVisible(const wxTreeItemId& item);
|
||||||
virtual void ScrollTo(const wxTreeItemId& item);
|
virtual void ScrollTo(const wxTreeItemId& item);
|
||||||
|
@ -162,6 +162,7 @@ public:
|
|||||||
virtual void Unselect();
|
virtual void Unselect();
|
||||||
virtual void UnselectAll();
|
virtual void UnselectAll();
|
||||||
virtual void SelectItem(const wxTreeItemId& item, bool select = true);
|
virtual void SelectItem(const wxTreeItemId& item, bool select = true);
|
||||||
|
virtual void SelectChildren(const wxTreeItemId& parent);
|
||||||
|
|
||||||
virtual void EnsureVisible(const wxTreeItemId& item);
|
virtual void EnsureVisible(const wxTreeItemId& item);
|
||||||
virtual void ScrollTo(const wxTreeItemId& item);
|
virtual void ScrollTo(const wxTreeItemId& item);
|
||||||
@ -276,6 +277,7 @@ private:
|
|||||||
void DoToggleItemSelection(const wxTreeItemId& item);
|
void DoToggleItemSelection(const wxTreeItemId& item);
|
||||||
|
|
||||||
void DoUnselectAll();
|
void DoUnselectAll();
|
||||||
|
void DoSelectChildren(const wxTreeItemId& parent);
|
||||||
|
|
||||||
void DeleteTextCtrl();
|
void DeleteTextCtrl();
|
||||||
|
|
||||||
|
@ -324,6 +324,9 @@ public:
|
|||||||
virtual void UnselectAll() = 0;
|
virtual void UnselectAll() = 0;
|
||||||
// select this item
|
// select this item
|
||||||
virtual void SelectItem(const wxTreeItemId& item, bool select = true) = 0;
|
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
|
// unselect this item
|
||||||
void UnselectItem(const wxTreeItemId& item) { SelectItem(item, false); }
|
void UnselectItem(const wxTreeItemId& item) { SelectItem(item, false); }
|
||||||
// toggle item selection
|
// toggle item selection
|
||||||
@ -400,7 +403,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual wxSize DoGetBestSize() const;
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
// comon part of Get/SetItemState()
|
// common part of Get/SetItemState()
|
||||||
virtual int DoGetItemState(const wxTreeItemId& item) const = 0;
|
virtual int DoGetItemState(const wxTreeItemId& item) const = 0;
|
||||||
virtual void DoSetItemState(const wxTreeItemId& item, int state) = 0;
|
virtual void DoSetItemState(const wxTreeItemId& item, int state) = 0;
|
||||||
|
|
||||||
|
@ -954,6 +954,15 @@ public:
|
|||||||
Unselects the given item. This works in multiselection controls only.
|
Unselects the given item. This works in multiselection controls only.
|
||||||
*/
|
*/
|
||||||
void UnselectItem(const wxTreeItemId& item);
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,6 +98,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
MENU_LINK(Select)
|
MENU_LINK(Select)
|
||||||
MENU_LINK(Unselect)
|
MENU_LINK(Unselect)
|
||||||
MENU_LINK(ToggleSel)
|
MENU_LINK(ToggleSel)
|
||||||
|
MENU_LINK(SelectChildren)
|
||||||
#endif // NO_MULTIPLE_SELECTION
|
#endif // NO_MULTIPLE_SELECTION
|
||||||
MENU_LINK(Rename)
|
MENU_LINK(Rename)
|
||||||
MENU_LINK(Count)
|
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_DeleteChildren, wxT("Delete &children"));
|
||||||
tree_menu->Append(TreeTest_DeleteAll, wxT("Delete &all items"));
|
tree_menu->Append(TreeTest_DeleteAll, wxT("Delete &all items"));
|
||||||
tree_menu->Append(TreeTest_SelectRoot, wxT("Select root item"));
|
tree_menu->Append(TreeTest_SelectRoot, wxT("Select root item"));
|
||||||
|
|
||||||
tree_menu->AppendSeparator();
|
tree_menu->AppendSeparator();
|
||||||
tree_menu->Append(TreeTest_Count, wxT("Count children of current item"));
|
tree_menu->Append(TreeTest_Count, wxT("Count children of current item"));
|
||||||
tree_menu->Append(TreeTest_CountRec, wxT("Recursively 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_DumpSelected, wxT("Dump selected items\tAlt-D"));
|
||||||
item_menu->Append(TreeTest_Select, wxT("Select current item\tAlt-S"));
|
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_Unselect, wxT("Unselect everything\tAlt-U"));
|
||||||
|
item_menu->Append(TreeTest_SelectChildren, wxT("Select all children\tCtrl-A"));
|
||||||
#endif // NO_MULTIPLE_SELECTION
|
#endif // NO_MULTIPLE_SELECTION
|
||||||
|
|
||||||
wxMenuBar *menu_bar = new wxMenuBar;
|
wxMenuBar *menu_bar = new wxMenuBar;
|
||||||
@ -594,6 +597,15 @@ void MyFrame::OnUnselect(wxCommandEvent& WXUNUSED(event))
|
|||||||
m_treeCtrl->UnselectAll();
|
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
|
#endif // NO_MULTIPLE_SELECTION
|
||||||
|
|
||||||
void MyFrame::DoSetBold(bool bold)
|
void MyFrame::DoSetBold(bool bold)
|
||||||
|
@ -209,6 +209,7 @@ public:
|
|||||||
void OnSelect(wxCommandEvent& event);
|
void OnSelect(wxCommandEvent& event);
|
||||||
void OnUnselect(wxCommandEvent& event);
|
void OnUnselect(wxCommandEvent& event);
|
||||||
void OnToggleSel(wxCommandEvent& event);
|
void OnToggleSel(wxCommandEvent& event);
|
||||||
|
void OnSelectChildren(wxCommandEvent& event);
|
||||||
#endif // NO_MULTIPLE_SELECTION
|
#endif // NO_MULTIPLE_SELECTION
|
||||||
void OnSelectRoot(wxCommandEvent& event);
|
void OnSelectRoot(wxCommandEvent& event);
|
||||||
void OnDelete(wxCommandEvent& event);
|
void OnDelete(wxCommandEvent& event);
|
||||||
@ -354,6 +355,7 @@ enum
|
|||||||
TreeTest_Select,
|
TreeTest_Select,
|
||||||
TreeTest_Unselect,
|
TreeTest_Unselect,
|
||||||
TreeTest_SelectRoot,
|
TreeTest_SelectRoot,
|
||||||
|
TreeTest_SelectChildren,
|
||||||
TreeTest_ShowFirstVisible,
|
TreeTest_ShowFirstVisible,
|
||||||
TreeTest_ShowLastVisible,
|
TreeTest_ShowLastVisible,
|
||||||
TreeTest_ShowNextVisible,
|
TreeTest_ShowNextVisible,
|
||||||
|
@ -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 !
|
// Recursive function !
|
||||||
// To stop we must have crt_item<last_item
|
// To stop we must have crt_item<last_item
|
||||||
// Algorithm :
|
// Algorithm :
|
||||||
|
@ -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)
|
void wxTreeCtrl::DoSelectItem(const wxTreeItemId& item, bool select)
|
||||||
{
|
{
|
||||||
TempSetter set(m_changingSelection);
|
TempSetter set(m_changingSelection);
|
||||||
|
Loading…
Reference in New Issue
Block a user