make wxTreeCtrl::SelectItem(false) work in single selection controls under MSW (fixing the recently added unit test); also set the previously selected item in the selection changing/changed messages
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60921 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1878,8 +1878,9 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( !IsHiddenRoot(item), _T("can't select hidden root item") );
|
wxCHECK_RET( !IsHiddenRoot(item), _T("can't select hidden root item") );
|
||||||
|
|
||||||
if ( IsSelected(item) == select )
|
if ( select == IsSelected(item) )
|
||||||
{
|
{
|
||||||
|
// nothing to do, the item is already in the requested state
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1902,20 +1903,31 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
|
|||||||
(void)HandleTreeEvent(changedEvent);
|
(void)HandleTreeEvent(changedEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // single selection
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( select,
|
wxTreeItemId itemOld, itemNew;
|
||||||
_T("SelectItem(false) works only for multiselect") );
|
if ( select )
|
||||||
|
{
|
||||||
|
itemOld = GetSelection();
|
||||||
|
itemNew = item;
|
||||||
|
}
|
||||||
|
else // deselecting the currently selected item
|
||||||
|
{
|
||||||
|
itemOld = item;
|
||||||
|
// leave itemNew invalid
|
||||||
|
}
|
||||||
|
|
||||||
// in spite of the docs (MSDN Jan 99 edition), we don't seem to receive
|
// in spite of the docs (MSDN Jan 99 edition), we don't seem to receive
|
||||||
// the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so
|
// the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so
|
||||||
// send them ourselves
|
// send them ourselves
|
||||||
|
|
||||||
wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item);
|
wxTreeEvent
|
||||||
|
changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, itemNew);
|
||||||
|
changingEvent.SetOldItem(itemOld);
|
||||||
|
|
||||||
if ( IsTreeEventAllowed(changingEvent) )
|
if ( IsTreeEventAllowed(changingEvent) )
|
||||||
{
|
{
|
||||||
if ( !TreeView_SelectItem(GetHwnd(), HITEM(item)) )
|
if ( !TreeView_SelectItem(GetHwnd(), HITEM(itemNew)) )
|
||||||
{
|
{
|
||||||
wxLogLastError(wxT("TreeView_SelectItem"));
|
wxLogLastError(wxT("TreeView_SelectItem"));
|
||||||
}
|
}
|
||||||
@@ -1924,7 +1936,8 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
|
|||||||
SetFocusedItem(item);
|
SetFocusedItem(item);
|
||||||
|
|
||||||
wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
|
wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
|
||||||
this, item);
|
this, itemNew);
|
||||||
|
changedEvent.SetOldItem(itemOld);
|
||||||
(void)HandleTreeEvent(changedEvent);
|
(void)HandleTreeEvent(changedEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user