X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/22574b4a9c8a805d2d476aa6f531e408b647523e..f164c52bc761d08cbfe5b733198e9d21afc3c221:/src/generic/treectlg.cpp?ds=inline diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 112fecc4d1..e4d81b2b4c 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: treectlg.cpp +// Name: src/generic/treectlg.cpp // Purpose: generic tree control implementation // Author: Robert Roebling // Created: 01/02/97 @@ -26,14 +26,18 @@ #if wxUSE_TREECTRL -#include "wx/treebase.h" #include "wx/treectrl.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" + #include "wx/listbox.h" + #include "wx/textctrl.h" +#endif + #include "wx/generic/treectlg.h" -#include "wx/timer.h" -#include "wx/textctrl.h" #include "wx/imaglist.h" -#include "wx/settings.h" -#include "wx/dcclient.h" #include "wx/renderer.h" @@ -199,9 +203,9 @@ public: wxGenericTreeItem *GetParent() const { return m_parent; } // operations - // deletes all children notifying the treectrl about it if !NULL - // pointer given - void DeleteChildren(wxGenericTreeCtrl *tree = NULL); + + // deletes all children notifying the treectrl about it + void DeleteChildren(wxGenericTreeCtrl *tree); // get count of all children (and grand children if 'recursively') size_t GetChildrenCount(bool recursively = true) const; @@ -548,11 +552,10 @@ void wxGenericTreeItem::DeleteChildren(wxGenericTreeCtrl *tree) for ( size_t n = 0; n < count; n++ ) { wxGenericTreeItem *child = m_children[n]; - if (tree) - tree->SendDeleteEvent(child); + tree->SendDeleteEvent(child); child->DeleteChildren(tree); - if (child == tree->m_select_me) + if ( child == tree->m_select_me ) tree->m_select_me = NULL; delete child; } @@ -864,7 +867,7 @@ wxGenericTreeCtrl::~wxGenericTreeCtrl() // accessors // ----------------------------------------------------------------------------- -size_t wxGenericTreeCtrl::GetCount() const +unsigned int wxGenericTreeCtrl::GetCount() const { if ( !m_anchor ) { @@ -872,7 +875,7 @@ size_t wxGenericTreeCtrl::GetCount() const return 0; } - size_t count = m_anchor->GetChildrenCount(); + unsigned int count = m_anchor->GetChildrenCount(); if ( !HasFlag(wxTR_HIDE_ROOT) ) { // take the root itself into account @@ -1018,6 +1021,12 @@ void wxGenericTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold) if ( pItem->IsBold() != bold ) { pItem->SetBold(bold); + + // recalculate the item size as bold and non bold fonts have different + // widths + wxClientDC dc(this); + CalculateSize(pItem, dc); + RefreshLine(pItem); } } @@ -1386,10 +1395,12 @@ wxTreeItemId wxGenericTreeCtrl::FindItem(const wxTreeItemId& idParent, } // and try all the items (stop when we get to the one we started from) - while ( id != idParent && !GetItemText(id).Lower().StartsWith(prefix) ) + while (id.IsOk() && id != idParent && !GetItemText(id).Lower().StartsWith(prefix) ) { id = GetNext(id); } + // If we haven't found the item, id.IsOk() will be false, as per + // documentation } return id; @@ -1490,9 +1501,7 @@ wxTreeItemId wxGenericTreeCtrl::DoInsertAfter(const wxTreeItemId& parentId, void wxGenericTreeCtrl::SendDeleteEvent(wxGenericTreeItem *item) { - wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_DELETE_ITEM, this, item); ProcessEvent( event ); } @@ -1610,9 +1619,7 @@ void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) if ( item->IsExpanded() ) return; - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDING, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_EXPANDING, this, item); if ( ProcessEvent( event ) && !event.IsAllowed() ) { @@ -1629,25 +1636,6 @@ void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) ProcessEvent( event ); } -void wxGenericTreeCtrl::ExpandAll(const wxTreeItemId& item) -{ - if ( !HasFlag(wxTR_HIDE_ROOT) || item != GetRootItem()) - { - Expand(item); - if ( !IsExpanded(item) ) - return; - } - - wxTreeItemIdValue cookie; - wxTreeItemId child = GetFirstChild(item, cookie); - while ( child.IsOk() ) - { - ExpandAll(child); - - child = GetNextChild(item, cookie); - } -} - void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) { wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(), @@ -1658,9 +1646,7 @@ void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) if ( !item->IsExpanded() ) return; - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, GetId() ); - event.m_item = item; - event.SetEventObject( this ); + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, this, item); if ( ProcessEvent( event ) && !event.IsAllowed() ) { // cancelled by program @@ -1840,10 +1826,8 @@ void wxGenericTreeCtrl::DoSelectItem(const wxTreeItemId& itemId, return; } - wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, GetId() ); - event.m_item = item; + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); event.m_itemOld = m_current; - event.SetEventObject( this ); // TODO : Here we don't send any selection mode yet ! if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) @@ -1858,8 +1842,6 @@ void wxGenericTreeCtrl::DoSelectItem(const wxTreeItemId& itemId, parent = GetItemParent( parent ); } - EnsureVisible( itemId ); - // ctrl press if (unselect_others) { @@ -1891,6 +1873,11 @@ void wxGenericTreeCtrl::DoSelectItem(const wxTreeItemId& itemId, RefreshLine( m_current ); } + // This can cause idle processing to select the root + // if no item is selected, so it must be after the + // selection is set + EnsureVisible( itemId ); + event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); GetEventHandler()->ProcessEvent( event ); } @@ -1905,9 +1892,16 @@ void wxGenericTreeCtrl::SelectItem(const wxTreeItemId& itemId, bool select) { wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; wxCHECK_RET( item, wxT("SelectItem(): invalid tree item") ); + + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); + if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) + return; item->SetHilight(false); RefreshLine(item); + + event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); + GetEventHandler()->ProcessEvent( event ); } } @@ -1983,7 +1977,7 @@ void wxGenericTreeCtrl::ScrollTo(const wxTreeItemId &item) #if defined( __WXMSW__ ) || defined(__WXMAC__) Update(); #else - wxYieldIfNeeded(); + DoDirtyProcessing(); #endif wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem; @@ -2321,7 +2315,7 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level if (IsExposed(exposed_x, exposed_y, 10000, h)) // 10000 = very much { - wxPen *pen = + const wxPen *pen = #ifndef __WXMAC__ // don't draw rect outline if we already have the // background color under Mac @@ -2330,7 +2324,15 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level wxTRANSPARENT_PEN; wxColour colText; - if ( item->IsSelected() ) + if ( item->IsSelected() +#ifdef __WXMAC__ + // On wxMac, if the tree doesn't have the focus we draw an empty + // rectangle, so we want to make sure that the text is visible + // against the normal background, not the highlightbackground, so + // don't use the highlight text colour unless we have the focus. + && m_hasFocus +#endif + ) { colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); } @@ -2566,9 +2568,8 @@ void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &event ) void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) { - wxTreeEvent te( wxEVT_COMMAND_TREE_KEY_DOWN, GetId() ); + wxTreeEvent te( wxEVT_COMMAND_TREE_KEY_DOWN, this); te.m_evtKey = event; - te.SetEventObject( this ); if ( GetEventHandler()->ProcessEvent( te ) ) { // intercepted by the user code @@ -2588,6 +2589,14 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) event.CmdDown(), is_multiple, extended_select, unselect_others); + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + // + : Expand // - : Collaspe // * : Expand all/Collapse all @@ -2615,7 +2624,7 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) if ( !IsExpanded(m_current) ) { // expand all - ExpandAll(m_current); + ExpandAllChildren(m_current); break; } //else: fall through to Collapse() it @@ -2634,22 +2643,19 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) wxRect ItemRect; GetBoundingRect(m_current, ItemRect, true); - wxTreeEvent eventMenu( wxEVT_COMMAND_TREE_ITEM_MENU, GetId() ); - eventMenu.m_item = m_current; + wxTreeEvent eventMenu(wxEVT_COMMAND_TREE_ITEM_MENU, this, m_current); // Use the left edge, vertical middle eventMenu.m_pointDrag = wxPoint(ItemRect.GetX(), ItemRect.GetY() + ItemRect.GetHeight() / 2); - eventMenu.SetEventObject( this ); GetEventHandler()->ProcessEvent( eventMenu ); - break; } + break; + case ' ': case WXK_RETURN: if ( !event.HasModifiers() ) { - wxTreeEvent eventAct( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, GetId() ); - eventAct.m_item = m_current; - eventAct.SetEventObject( this ); + wxTreeEvent eventAct(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, m_current); GetEventHandler()->ProcessEvent( eventAct ); } @@ -2838,11 +2844,9 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) } } -wxTreeItemId wxGenericTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags) +wxTreeItemId +wxGenericTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags) const { - // JACS: removed wxYieldIfNeeded() because it can cause the window - // to be deleted from under us if a close window event is pending - int w, h; GetSize(&w, &h); flags=0; @@ -2877,12 +2881,9 @@ bool wxGenericTreeCtrl::GetBoundingRect(const wxTreeItemId& item, wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; - int startX, startY; - GetViewStart(& startX, & startY); - if ( textOnly ) { - rect.x = i->GetX() - startX*PIXELS_PER_UNIT; + rect.x = i->GetX(); rect.width = i->GetWidth(); if ( m_imageListNormal ) @@ -2898,9 +2899,12 @@ bool wxGenericTreeCtrl::GetBoundingRect(const wxTreeItemId& item, rect.width = GetClientSize().x; } - rect.y = i->GetY() - startY*PIXELS_PER_UNIT; + rect.y = i->GetY(); rect.height = GetLineHeight(i); + // we have to return the logical coordinates, not physical ones + rect.SetTopLeft(CalcScrolledPosition(rect.GetTopLeft())); + return true; } @@ -2911,9 +2915,7 @@ wxTextCtrl *wxGenericTreeCtrl::EditLabel(const wxTreeItemId& item, wxGenericTreeItem *itemEdit = (wxGenericTreeItem *)item.m_pItem; - wxTreeEvent te( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, GetId() ); - te.m_item = itemEdit; - te.SetEventObject( this ); + wxTreeEvent te(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, this, itemEdit); if ( GetEventHandler()->ProcessEvent( te ) && !te.IsAllowed() ) { // vetoed by user @@ -2927,7 +2929,7 @@ wxTextCtrl *wxGenericTreeCtrl::EditLabel(const wxTreeItemId& item, #if defined( __WXMSW__ ) || defined(__WXMAC__) Update(); #else - wxYieldIfNeeded(); + DoDirtyProcessing(); #endif // TODO: use textCtrlClass here to create the control of correct class @@ -2957,9 +2959,7 @@ void wxGenericTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool wxGenericTreeCtrl::OnRenameAccept(wxGenericTreeItem *item, const wxString& value) { - wxTreeEvent le( wxEVT_COMMAND_TREE_END_LABEL_EDIT, GetId() ); - le.m_item = item; - le.SetEventObject( this ); + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); le.m_label = value; le.m_editCancelled = false; @@ -2969,9 +2969,7 @@ bool wxGenericTreeCtrl::OnRenameAccept(wxGenericTreeItem *item, void wxGenericTreeCtrl::OnRenameCancelled(wxGenericTreeItem *item) { // let owner know that the edit was cancelled - wxTreeEvent le( wxEVT_COMMAND_TREE_END_LABEL_EDIT, GetId() ); - le.m_item = item; - le.SetEventObject( this ); + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); le.m_label = wxEmptyString; le.m_editCancelled = true; @@ -2985,7 +2983,7 @@ void wxGenericTreeCtrl::OnRenameTimer() void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) { - if ( !m_anchor ) return; + if ( !m_anchor )return; wxPoint pt = CalcUnscrolledPosition(event.GetPosition()); @@ -3032,9 +3030,7 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) if (underMouseChanged && hoverItem.IsOk() && !m_isDragging && (!m_renameTimer || !m_renameTimer->IsRunning())) { // Ask the tree control what tooltip (if any) should be shown - wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, GetId()); - hevent.m_item = hoverItem; - hevent.SetEventObject(this); + wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, this, hoverItem); if ( GetEventHandler()->ProcessEvent(hevent) && hevent.IsAllowed() ) { @@ -3043,11 +3039,12 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } #endif - // we process left mouse up event (enables in-place edit), right down + // we process left mouse up event (enables in-place edit), middle/right down // (pass to the user code), left dbl click (activate item) and // dragging/moving events for items drag-and-drop if ( !(event.LeftDown() || event.LeftUp() || + event.MiddleDown() || event.RightDown() || event.LeftDClick() || event.Dragging() || @@ -3079,10 +3076,8 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) ? wxEVT_COMMAND_TREE_BEGIN_RDRAG : wxEVT_COMMAND_TREE_BEGIN_DRAG; - wxTreeEvent nevent( command, GetId() ); - nevent.m_item = m_current; - nevent.SetEventObject(this); - nevent.SetPoint(pt); + wxTreeEvent nevent(command, this, m_current); + nevent.SetPoint(CalcScrolledPosition(pt)); // by default the dragging is not supported, the user code must // explicitly allow the event for it to take place @@ -3133,6 +3128,8 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } else if ( (event.LeftUp() || event.RightUp()) && m_isDragging ) { + ReleaseMouse(); + // erase the highlighting DrawDropEffect(m_dropTarget); @@ -3144,19 +3141,15 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) } // generate the drag end event - wxTreeEvent eventEndDrag(wxEVT_COMMAND_TREE_END_DRAG, GetId()); + wxTreeEvent eventEndDrag(wxEVT_COMMAND_TREE_END_DRAG, this, item); - eventEndDrag.m_item = item; - eventEndDrag.m_pointDrag = pt; - eventEndDrag.SetEventObject(this); + eventEndDrag.m_pointDrag = CalcScrolledPosition(pt); (void)GetEventHandler()->ProcessEvent(eventEndDrag); m_isDragging = false; m_dropTarget = (wxGenericTreeItem *)NULL; - ReleaseMouse(); - SetCursor(m_oldCursor); #if defined( __WXMSW__ ) || defined(__WXMAC__) @@ -3192,20 +3185,22 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) DoSelectItem(item, true, false); } - wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, GetId()); - nevent.m_item = item; + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, this, item); nevent.m_pointDrag = CalcScrolledPosition(pt); - nevent.SetEventObject(this); event.Skip(!GetEventHandler()->ProcessEvent(nevent)); // Consistent with MSW (for now), send the ITEM_MENU *after* // the RIGHT_CLICK event. TODO: This behavior may change. - wxTreeEvent nevent2(wxEVT_COMMAND_TREE_ITEM_MENU, GetId()); - nevent2.m_item = item; + wxTreeEvent nevent2(wxEVT_COMMAND_TREE_ITEM_MENU, this, item); nevent2.m_pointDrag = CalcScrolledPosition(pt); - nevent2.SetEventObject(this); GetEventHandler()->ProcessEvent(nevent2); } + else if ( event.MiddleDown() ) + { + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, this, item); + nevent.m_pointDrag = CalcScrolledPosition(pt); + event.Skip(!GetEventHandler()->ProcessEvent(nevent)); + } else if ( event.LeftUp() ) { // this facilitates multiple-item drag-and-drop @@ -3245,7 +3240,7 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) m_lastOnSame = false; } } - else // !RightDown() && !LeftUp() ==> LeftDown() || LeftDClick() + else // !RightDown() && !MiddleDown() && !LeftUp() ==> LeftDown() || LeftDClick() { if ( event.LeftDown() ) { @@ -3295,10 +3290,8 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) m_lastOnSame = false; // send activate event first - wxTreeEvent nevent( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, GetId() ); - nevent.m_item = item; + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, item); nevent.m_pointDrag = CalcScrolledPosition(pt); - nevent.SetEventObject( this ); if ( !GetEventHandler()->ProcessEvent( nevent ) ) { // if the user code didn't process the activate event, @@ -3330,17 +3323,10 @@ void wxGenericTreeCtrl::OnInternalIdle() SelectItem(GetRootItem()); } - /* after all changes have been done to the tree control, - * we actually redraw the tree when everything is over */ - - if (!m_dirty) return; - if (m_freezeCount) return; - - m_dirty = false; - - CalculatePositions(); - Refresh(); - AdjustMyScrollbars(); + // after all changes have been done to the tree control, + // actually redraw the tree when everything is over + if (m_dirty) + DoDirtyProcessing(); } void wxGenericTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc ) @@ -3443,10 +3429,16 @@ void wxGenericTreeCtrl::CalculatePositions() CalculateLevel( m_anchor, dc, 0, y ); // start recursion } +void wxGenericTreeCtrl::Refresh(bool eraseBackground, const wxRect *rect) +{ + if ( !m_freezeCount ) + wxTreeCtrlBase::Refresh(eraseBackground, rect); +} + void wxGenericTreeCtrl::RefreshSubtree(wxGenericTreeItem *item) { - if (m_dirty) return; - if (m_freezeCount) return; + if (m_dirty || m_freezeCount) + return; wxSize client = GetClientSize(); @@ -3462,8 +3454,8 @@ void wxGenericTreeCtrl::RefreshSubtree(wxGenericTreeItem *item) void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item ) { - if (m_dirty) return; - if (m_freezeCount) return; + if (m_dirty || m_freezeCount) + return; wxRect rect; CalcScrolledPosition(0, item->GetY(), NULL, &rect.y); @@ -3475,7 +3467,8 @@ void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item ) void wxGenericTreeCtrl::RefreshSelected() { - if (m_freezeCount) return; + if (m_freezeCount) + return; // TODO: this is awfully inefficient, we should keep the list of all // selected items internally, should be much faster @@ -3485,7 +3478,8 @@ void wxGenericTreeCtrl::RefreshSelected() void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item) { - if (m_freezeCount) return; + if (m_freezeCount) + return; if ( item->IsSelected() ) RefreshLine(item); @@ -3507,7 +3501,7 @@ void wxGenericTreeCtrl::Thaw() { wxCHECK_RET( m_freezeCount > 0, _T("thawing unfrozen tree control?") ); - if ( !--m_freezeCount ) + if ( --m_freezeCount == 0 ) { Refresh(); } @@ -3522,8 +3516,6 @@ bool wxGenericTreeCtrl::SetBackgroundColour(const wxColour& colour) if ( !wxWindow::SetBackgroundColour(colour) ) return false; - if (m_freezeCount) return true; - Refresh(); return true; @@ -3534,8 +3526,6 @@ bool wxGenericTreeCtrl::SetForegroundColour(const wxColour& colour) if ( !wxWindow::SetForegroundColour(colour) ) return false; - if (m_freezeCount) return true; - Refresh(); return true; @@ -3553,10 +3543,6 @@ void wxGenericTreeCtrl::OnGetToolTip( wxTreeEvent &event ) // be removed, as well as the #else case below. #define _USE_VISATTR 0 -#if _USE_VISATTR -#include "wx/listbox.h" -#endif - //static wxVisualAttributes #if _USE_VISATTR @@ -3591,4 +3577,16 @@ void wxGenericTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image #endif // WXWIN_COMPATIBILITY_2_4 +void wxGenericTreeCtrl::DoDirtyProcessing() +{ + if (m_freezeCount) + return; + + m_dirty = false; + + CalculatePositions(); + Refresh(); + AdjustMyScrollbars(); +} + #endif // wxUSE_TREECTRL