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();
}
// 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 )
{
break;
case WXK_ESCAPE:
- DoStopEditing();
+ StopEditing();
break;
default:
tree->SendDeleteEvent(child);
child->DeleteChildren(tree);
+ if (child == tree->m_select_me)
+ tree->m_select_me = NULL;
delete child;
}
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);
}
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();
// 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;
}
return;
}
+ ChildrenClosing(item);
item->Collapse();
#if 0 // TODO why should items be collapsed recursively?