]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treectlg.cpp
don't assume there's always an active wxEventLoop instance
[wxWidgets.git] / src / generic / treectlg.cpp
index 4c9305f01ee85cf66fc7a0b00410c6216e1a6917..98097d6a8e8897cc50ef252bb3ffada8c8739ed3 100644 (file)
@@ -2232,7 +2232,11 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
         else
         {
             int flags = wxCONTROL_SELECTED;
         else
         {
             int flags = wxCONTROL_SELECTED;
-            if (m_hasFocus)
+            if (m_hasFocus
+#ifdef __WXMAC__
+                && IsControlActive( (ControlRef)GetHandle() )
+#endif
+            )
                 flags |= wxCONTROL_FOCUSED;
             if ((item == m_current) && (m_hasFocus))
                 flags |= wxCONTROL_CURRENT;
                 flags |= wxCONTROL_FOCUSED;
             if ((item == m_current) && (m_hasFocus))
                 flags |= wxCONTROL_CURRENT;
@@ -2374,7 +2378,7 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
             // 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.
             // 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
+             && m_hasFocus && IsControlActive( (ControlRef)GetHandle() )
 #endif
             )
         {
 #endif
             )
         {
@@ -3649,6 +3653,11 @@ void wxGenericTreeCtrl::DoDirtyProcessing()
 
 wxSize wxGenericTreeCtrl::DoGetBestSize() const
 {
 
 wxSize wxGenericTreeCtrl::DoGetBestSize() const
 {
+    // make sure all positions are calculated as normally this only done during
+    // idle time but we need them for base class DoGetBestSize() to return the
+    // correct result
+    wxConstCast(this, wxGenericTreeCtrl)->CalculatePositions();
+
     wxSize size = wxTreeCtrlBase::DoGetBestSize();
 
     // there seems to be an implicit extra border around the items, although
     wxSize size = wxTreeCtrlBase::DoGetBestSize();
 
     // there seems to be an implicit extra border around the items, although
@@ -3656,9 +3665,19 @@ wxSize wxGenericTreeCtrl::DoGetBestSize() const
     // scrollbars appear in a tree with default/best size
     size.IncBy(4, 4);
 
     // scrollbars appear in a tree with default/best size
     size.IncBy(4, 4);
 
-    // avoid caching (necessarily arbitrary) default size for empty tree
-    if ( GetRootItem().IsOk() )
-        CacheBestSize(size);
+    // and the border has to be rounded up to a multiple of PIXELS_PER_UNIT or
+    // scrollbars still appear
+    const wxSize& borderSize = GetWindowBorderSize();
+
+    int dx = (size.x - borderSize.x) % PIXELS_PER_UNIT;
+    if ( dx )
+        size.x += PIXELS_PER_UNIT - dx;
+    int dy = (size.y - borderSize.y) % PIXELS_PER_UNIT;
+    if ( dy )
+        size.y += PIXELS_PER_UNIT - dy;
+
+    // we need to update the cache too as the base class cached its own value
+    CacheBestSize(size);
 
     return size;
 }
 
     return size;
 }