From 3e3a7b97ec7ac9226a7ee288b6458dff65190618 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 1 May 2003 15:37:30 +0000 Subject: [PATCH] Implemented delayed selection (e.g. after adding the root or deleting items) so that the event handler will be called appropriately. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20406 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/treectlg.h | 4 +++- src/generic/treectlg.cpp | 40 ++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/include/wx/generic/treectlg.h b/include/wx/generic/treectlg.h index c27a8608b0..72da30c0f2 100644 --- a/include/wx/generic/treectlg.h +++ b/include/wx/generic/treectlg.h @@ -376,7 +376,9 @@ protected: wxGenericTreeItem *m_anchor; wxGenericTreeItem *m_current, - *m_key_current; + *m_key_current, + // A hint to select a parent item after deleting a child + *m_select_me; unsigned short m_indent; unsigned short m_spacing; int m_lineHeight; diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 5a2ae98fb0..f0be2d8723 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -734,7 +734,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxGenericTreeCtrl) void wxGenericTreeCtrl::Init() { - m_current = m_key_current = m_anchor = (wxGenericTreeItem *) NULL; + m_current = m_key_current = m_anchor = m_select_me = (wxGenericTreeItem *) NULL; m_hasFocus = FALSE; m_dirty = FALSE; @@ -1487,12 +1487,30 @@ void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId) // don't keep stale pointers around! if ( IsDescendantOf(item, m_key_current) ) { - m_key_current = parent; + // Don't silently change the selection: + // do it properly in idle time, so event + // handlers get called. + + // m_key_current = parent; + m_key_current = NULL; + } + + // m_select_me records whether we need to select + // a different item, in idle time. + if ( m_select_me && IsDescendantOf(item, m_select_me) ) + { + m_select_me = parent; } if ( IsDescendantOf(item, m_current) ) { - m_current = parent; + // Don't silently change the selection: + // do it properly in idle time, so event + // handlers get called. + + // m_current = parent; + m_current = NULL; + m_select_me = parent; } // remove the item from the tree @@ -1634,6 +1652,7 @@ void wxGenericTreeCtrl::Unselect() RefreshLine( m_current ); m_current = NULL; + m_select_me = NULL; } } @@ -1719,6 +1738,7 @@ void wxGenericTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeI { // item2 is not necessary after item1 wxGenericTreeItem *first=NULL, *last=NULL; + m_select_me = NULL; // choice first' and 'last' between item1 and item2 if (item1->GetY()GetY()) @@ -1746,6 +1766,8 @@ void wxGenericTreeCtrl::SelectItem(const wxTreeItemId& itemId, { wxCHECK_RET( itemId.IsOk(), wxT("invalid tree item") ); + m_select_me = NULL; + bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE); wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; @@ -3138,6 +3160,18 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) void wxGenericTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) { + // Check if we need to select the root item + // because nothing else has been selected. + // Delaying it means that we can invoke event handlers + // as required, when a first item is selected. + if (!HasFlag(wxTR_MULTIPLE) && !GetSelection().IsOk()) + { + if (m_select_me) + SelectItem(m_select_me); + else if (GetRootItem().IsOk()) + SelectItem(GetRootItem()); + } + /* after all changes have been done to the tree control, * we actually redraw the tree when everything is over */ -- 2.45.2