]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treectrl.cpp
BIG glitch.
[wxWidgets.git] / src / generic / treectrl.cpp
index d9cb6dbb249bcdf3ce9e237344899ec003635dc9..4602d32e8300527033b11c418814adb40db4305e 100644 (file)
@@ -908,6 +908,16 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
 {
     wxGenericTreeItem *gitem = item.m_pItem;
 
+    // first expand all parent branches
+    wxGenericTreeItem *parent = gitem->GetParent();
+    while ( parent && !parent->IsExpanded() )
+    {
+        Expand(parent);
+
+        parent = parent->GetParent();
+    }
+
+    // now scroll to the item
     int item_y = gitem->GetY();
 
     int start_x = 0;
@@ -926,11 +936,9 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
         m_anchor->GetSize( x, y );
         y += 2*m_lineHeight;
         int x_pos = GetScrollPos( wxHORIZONTAL );
-    SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-client_h/2)/10 );
-        return;
+        SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-client_h/2)/10 );
     }
-
-    if (item_y > start_y+client_h-16)
+    else if (item_y > start_y+client_h-16)
     {
        int x = 0;
        int y = 0;
@@ -938,7 +946,6 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
        y += 2*m_lineHeight;
        int x_pos = GetScrollPos( wxHORIZONTAL );
        SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-client_h/2)/10 );
-       return;
     }
 }
 
@@ -1017,7 +1024,21 @@ wxImageList *wxTreeCtrl::GetStateImageList() const
 
 void wxTreeCtrl::SetImageList(wxImageList *imageList)
 {
-    m_imageListNormal = imageList;
+   m_imageListNormal = imageList;
+   // calculate a m_lineHeight value from the image sizes
+   wxPaintDC dc(this);
+   PrepareDC( dc );
+   m_lineHeight = (int)(dc.GetCharHeight() + 4);
+   int
+      width = 0,
+      height = 0,
+      n = m_imageListNormal->GetImageCount();
+   for(int i = 0; i < n ; i++)
+   {
+      m_imageListNormal->GetSize(i, width, height);
+      height += height/5;  //20% extra spacing
+      if(height > m_lineHeight) m_lineHeight = height;
+   }
 }
 
 void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
@@ -1049,7 +1070,7 @@ void wxTreeCtrl::AdjustMyScrollbars()
 
 void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
 {
-    /* render bold items in bold */
+    // render bold items in bold
     wxFont fontOld;
     wxFont fontNew;
 
@@ -1058,7 +1079,7 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
         fontOld = dc.GetFont();
         if (fontOld.Ok())
         {
-          /* @@ is there any better way to make a bold variant of old font? */
+          // VZ: is there any better way to make a bold variant of old font?
           fontNew = wxFont( fontOld.GetPointSize(),
                             fontOld.GetFamily(),
                             fontOld.GetStyle(),
@@ -1089,29 +1110,35 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
         image_w += 4;
     }
 
-    dc.DrawRectangle( item->GetX()-2, item->GetY()-2, image_w+text_w+4, text_h+4 );
+    int total_h = (image_h > text_h) ? image_h : text_h;
+    if(m_lineHeight > total_h) total_h = m_lineHeight;
+    
+    dc.DrawRectangle( item->GetX()-2, item->GetY(), image_w+text_w+2, total_h );
 
     if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
     {
-        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
+        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, total_h );
         m_imageListNormal->Draw( item->GetSelectedImage(), dc,
-                                 item->GetX(), item->GetY()-1,
+                                 item->GetX(),
+                                 item->GetY() +((total_h > image_h)?((total_h-image_h)/2):0),
                                  wxIMAGELIST_DRAW_TRANSPARENT );
         dc.DestroyClippingRegion();
     }
     else if (item->GetImage() != -1)
     {
-        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
+        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, total_h );
         m_imageListNormal->Draw( item->GetImage(), dc,
-                                 item->GetX(), item->GetY()-1,
+                                 item->GetX(),
+                                 item->GetY() +((total_h > image_h)?((total_h-image_h)/2):0),
                                  wxIMAGELIST_DRAW_TRANSPARENT );
         dc.DestroyClippingRegion();
     }
 
     dc.SetBackgroundMode(wxTRANSPARENT);
-    dc.DrawText( item->GetText(), image_w + item->GetX(), item->GetY() );
+    dc.DrawText( item->GetText(), image_w + item->GetX(), item->GetY()
+                 + ((total_h > text_h) ? (total_h - text_h)/2 : 0));
 
-    /* restore normal font for bold items */
+    // restore normal font for bold items
     if (fontOld.Ok())
     {
         dc.SetFont( fontOld);
@@ -1123,7 +1150,7 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
     int horizX = level*m_indent;
 
     item->SetX( horizX+33 );
-    item->SetY( y-m_lineHeight/3 );
+    item->SetY( y-m_lineHeight/2 );
     item->SetHeight( m_lineHeight );
 
     item->SetCross( horizX+15, y );
@@ -1152,9 +1179,9 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
             dc.DrawLine( horizX+13, y, horizX+18, y );
 
             if (!item->IsExpanded())
-        {
+            {
                 dc.DrawLine( horizX+15, y-2, horizX+15, y+3 );
-        }
+            }
         }
 
         if (item->HasHilight())
@@ -1198,10 +1225,11 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
             PaintLevel( children[n], dc, level+1, y );
         }
 
-        /* it may happen that the item is expanded but has no items (when you
-         * delete all its children for example) - don't draw the vertical line
-         * in this case */
-        if (count > 0) dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY );
+        // it may happen that the item is expanded but has no items (when you
+        // delete all its children for example) - don't draw the vertical line
+        // in this case
+        if (count > 0)
+            dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY );
     }
 }
 
@@ -1220,7 +1248,8 @@ void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
     dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
     dc.SetPen( m_dottedPen );
-    m_lineHeight = (int)(dc.GetCharHeight() + 4);
+    if(GetImageList() == NULL)
+       m_lineHeight = (int)(dc.GetCharHeight() + 4);
 
     int y = m_lineHeight / 2 + 2;
     PaintLevel( m_anchor, dc, 0, y );
@@ -1455,7 +1484,8 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
         return;
     }
 
-    if (!IsSelected(item)) SelectItem(item);  /* we dont support multiple selections, BTW */
+    if (!IsSelected(item))
+        SelectItem(item);  /* we dont support multiple selections, BTW */
 
     if (event.LeftDClick())
     {
@@ -1477,7 +1507,8 @@ void wxTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
     /* 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_dirty)
+        return;
 
     m_dirty = FALSE;
 
@@ -1493,12 +1524,12 @@ void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, i
     int horizX = level*m_indent;
 
     item->SetX( horizX+33 );
-    item->SetY( y-m_lineHeight/3-2 );
+    item->SetY( y-m_lineHeight/2 );
     item->SetHeight( m_lineHeight );
 
     if ( !item->IsExpanded() )
     {
-        /* we dont need to calculate collapsed branches */
+        // we dont need to calculate collapsed branches
         return;
     }
 
@@ -1507,7 +1538,7 @@ void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, i
     for ( size_t n = 0; n < count; n++ )
     {
         y += m_lineHeight;
-        CalculateLevel( children[n], dc, level+1, y );  /* recurse */
+        CalculateLevel( children[n], dc, level+1, y );  // recurse
     }
 }
 
@@ -1521,10 +1552,11 @@ void wxTreeCtrl::CalculatePositions()
     dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
     dc.SetPen( m_dottedPen );
-    m_lineHeight = (int)(dc.GetCharHeight() + 4);
+    if(GetImageList() == NULL)
+       m_lineHeight = (int)(dc.GetCharHeight() + 4);
 
     int y = m_lineHeight / 2 + 2;
-    CalculateLevel( m_anchor, dc, 0, y ); /* start recursion */
+    CalculateLevel( m_anchor, dc, 0, y ); // start recursion
 }
 
 void wxTreeCtrl::RefreshSubtree(wxGenericTreeItem *item)