X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c4e98b3311ff7e3da14795563710dcfc8acfc055..7ab0c3adb780464f2ee58f88d2443f5a79a2c401:/src/generic/treectlg.cpp diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 5a2ae98fb0..b7140c589a 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -716,7 +716,6 @@ BEGIN_EVENT_TABLE(wxGenericTreeCtrl,wxScrolledWindow) EVT_CHAR (wxGenericTreeCtrl::OnChar) EVT_SET_FOCUS (wxGenericTreeCtrl::OnSetFocus) EVT_KILL_FOCUS (wxGenericTreeCtrl::OnKillFocus) - EVT_IDLE (wxGenericTreeCtrl::OnIdle) END_EVENT_TABLE() #if !defined(__WXMSW__) || defined(__WIN16__) || defined(__WXUNIVERSAL__) @@ -734,7 +733,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 +1486,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 +1651,7 @@ void wxGenericTreeCtrl::Unselect() RefreshLine( m_current ); m_current = NULL; + m_select_me = NULL; } } @@ -1719,6 +1737,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 +1765,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; @@ -1862,7 +1883,7 @@ void wxGenericTreeCtrl::EnsureVisible(const wxTreeItemId& item) if ( HasFlag(wxTR_HIDE_ROOT) ) { - while ( parent != m_anchor ) + while ( parent && parent != m_anchor ) { Expand(parent); parent = parent->GetParent(); @@ -2906,7 +2927,7 @@ void wxGenericTreeCtrl::OnRenameCancelled(wxGenericTreeItem *item) le.m_item = (long) item; le.SetEventObject( this ); le.m_label = wxEmptyString; - le.m_editCancelled = FALSE; + le.m_editCancelled = TRUE; GetEventHandler()->ProcessEvent( le ); } @@ -3136,8 +3157,22 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } } -void wxGenericTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) +void wxGenericTreeCtrl::OnInternalIdle() { + wxWindow::OnInternalIdle(); + + // 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 */