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
This commit is contained in:
@@ -376,7 +376,9 @@ protected:
|
|||||||
|
|
||||||
wxGenericTreeItem *m_anchor;
|
wxGenericTreeItem *m_anchor;
|
||||||
wxGenericTreeItem *m_current,
|
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_indent;
|
||||||
unsigned short m_spacing;
|
unsigned short m_spacing;
|
||||||
int m_lineHeight;
|
int m_lineHeight;
|
||||||
|
@@ -734,7 +734,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxGenericTreeCtrl)
|
|||||||
|
|
||||||
void wxGenericTreeCtrl::Init()
|
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_hasFocus = FALSE;
|
||||||
m_dirty = FALSE;
|
m_dirty = FALSE;
|
||||||
|
|
||||||
@@ -1487,12 +1487,30 @@ void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId)
|
|||||||
// don't keep stale pointers around!
|
// don't keep stale pointers around!
|
||||||
if ( IsDescendantOf(item, m_key_current) )
|
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) )
|
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
|
// remove the item from the tree
|
||||||
@@ -1634,6 +1652,7 @@ void wxGenericTreeCtrl::Unselect()
|
|||||||
RefreshLine( m_current );
|
RefreshLine( m_current );
|
||||||
|
|
||||||
m_current = NULL;
|
m_current = NULL;
|
||||||
|
m_select_me = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1719,6 +1738,7 @@ void wxGenericTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeI
|
|||||||
{
|
{
|
||||||
// item2 is not necessary after item1
|
// item2 is not necessary after item1
|
||||||
wxGenericTreeItem *first=NULL, *last=NULL;
|
wxGenericTreeItem *first=NULL, *last=NULL;
|
||||||
|
m_select_me = NULL;
|
||||||
|
|
||||||
// choice first' and 'last' between item1 and item2
|
// choice first' and 'last' between item1 and item2
|
||||||
if (item1->GetY()<item2->GetY())
|
if (item1->GetY()<item2->GetY())
|
||||||
@@ -1746,6 +1766,8 @@ void wxGenericTreeCtrl::SelectItem(const wxTreeItemId& itemId,
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( itemId.IsOk(), wxT("invalid tree item") );
|
wxCHECK_RET( itemId.IsOk(), wxT("invalid tree item") );
|
||||||
|
|
||||||
|
m_select_me = NULL;
|
||||||
|
|
||||||
bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE);
|
bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE);
|
||||||
wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem;
|
wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem;
|
||||||
|
|
||||||
@@ -3138,6 +3160,18 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event )
|
|||||||
|
|
||||||
void wxGenericTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(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,
|
/* after all changes have been done to the tree control,
|
||||||
* we actually redraw the tree when everything is over */
|
* we actually redraw the tree when everything is over */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user