X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6574f2b143d9f33ef1e8c3ee4f43e44b657ecbe4..a733492856e139253ef8e912b6a5c23d1a12cf57:/src/generic/treectlg.cpp diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index b733643760..0018af55bd 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -88,25 +88,18 @@ class WXDLLEXPORT wxTreeTextCtrl: public wxTextCtrl public: wxTreeTextCtrl(wxGenericTreeCtrl *owner, wxGenericTreeItem *item); - // wxGenericTreeCtrl can use this one to abandon editing the given item, - // it's not an error to call it if this item is not being edited - void StopEditing(wxGenericTreeItem *item) + void StopEditing() { - if ( item == m_itemEdited ) - DoStopEditing(); + Finish(); + m_owner->OnRenameCancelled(m_itemEdited); } + const wxGenericTreeItem* item() const { return m_itemEdited; } protected: void OnChar( wxKeyEvent &event ); void OnKeyUp( wxKeyEvent &event ); void OnKillFocus( wxFocusEvent &event ); - void DoStopEditing() - { - Finish(); - m_owner->OnRenameCancelled(m_itemEdited); - } - bool AcceptChanges(); void Finish(); @@ -261,12 +254,12 @@ private: // tree ctrl images for the normal, selected, expanded and // expanded+selected states - short m_images[wxTreeItemIcon_Max]; + int m_images[wxTreeItemIcon_Max]; wxCoord m_x; // (virtual) offset from top wxCoord m_y; // (virtual) offset from left - short m_width; // width of this item - unsigned char m_height; // height of this item + int m_width; // width of this item + int m_height; // height of this item // use bitfields to save size int m_isCollapsed :1; @@ -302,7 +295,7 @@ static void EventFlagsToSelType(long style, } // check if the given item is under another one -static bool IsDescendantOf(wxGenericTreeItem *parent, wxGenericTreeItem *item) +static bool IsDescendantOf(const wxGenericTreeItem *parent, const wxGenericTreeItem *item) { while ( item ) { @@ -440,7 +433,7 @@ void wxTreeTextCtrl::OnChar( wxKeyEvent &event ) break; case WXK_ESCAPE: - DoStopEditing(); + StopEditing(); break; default: @@ -536,6 +529,8 @@ void wxGenericTreeItem::DeleteChildren(wxGenericTreeCtrl *tree) tree->SendDeleteEvent(child); child->DeleteChildren(tree); + if (child == tree->m_select_me) + tree->m_select_me = NULL; delete child; } @@ -765,7 +760,7 @@ void wxGenericTreeCtrl::Init() m_lastOnSame = false; -#if defined( __WXMAC__ ) && __WXMAC_CARBON__ +#ifdef __WXMAC_CARBON__ m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ; #else m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); @@ -1503,11 +1498,30 @@ void wxGenericTreeCtrl::SendDeleteEvent(wxGenericTreeItem *item) ProcessEvent( event ); } +// Don't leave edit or selection on a child which is about to disappear +void wxGenericTreeCtrl::ChildrenClosing(wxGenericTreeItem* item) +{ + if (m_textCtrl != NULL && item != m_textCtrl->item() && IsDescendantOf(item, m_textCtrl->item())) { + m_textCtrl->StopEditing(); + } + if (item != m_key_current && IsDescendantOf(item, m_key_current)) { + m_key_current = NULL; + } + if (IsDescendantOf(item, m_select_me)) { + m_select_me = item; + } + if (item != m_current && IsDescendantOf(item, m_current)) { + m_current = NULL; + m_select_me = item; + } +} + void wxGenericTreeCtrl::DeleteChildren(const wxTreeItemId& itemId) { m_dirty = true; // do this first so stuff below doesn't cause flicker wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + ChildrenClosing(item); item->DeleteChildren(this); } @@ -1517,10 +1531,10 @@ void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId) wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; - if ( m_textCtrl ) + if (m_textCtrl != NULL && IsDescendantOf(item, m_textCtrl->item())) { // can't delete the item being edited, cancel editing it first - m_textCtrl->StopEditing(item); + m_textCtrl->StopEditing(); } wxGenericTreeItem *parent = item->GetParent(); @@ -1568,6 +1582,10 @@ void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId) // and delete all of its children and the item itself now item->DeleteChildren(this); SendDeleteEvent(item); + + if (item == m_select_me) + m_select_me = NULL; + delete item; } @@ -1650,6 +1668,7 @@ void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) return; } + ChildrenClosing(item); item->Collapse(); #if 0 // TODO why should items be collapsed recursively? @@ -3129,6 +3148,16 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } else { + // If we got to this point, we are not dragging or moving the mouse. + // Because the code in carbon/toplevel.cpp will only set focus to the tree + // if we skip for EVT_LEFT_DOWN, we MUST skip this event here for focus to work. + // We skip even if we didn't hit an item because we still should + // restore focus to the tree control even if we didn't exactly hit an item. + if ( event.LeftDown() ) + { + event.Skip(); + } + // here we process only the messages which happen on tree items m_dragCount = 0;