wxCHECK_RET( item.IsOk(), "invalid tree item" );
wxClientDC dc(this);
- item.m_pItem->SetText(text, dc);
+ wxGenericTreeItem *pItem = item.m_pItem;
+ pItem->SetText(text, dc);
+ RefreshLine(pItem);
}
void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image)
{
wxCHECK_RET( item.IsOk(), "invalid tree item" );
- item.m_pItem->SetImage(image);
+ wxGenericTreeItem *pItem = item.m_pItem;
+ pItem->SetImage(image);
+ RefreshLine(pItem);
}
void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image)
{
wxCHECK_RET( item.IsOk(), "invalid tree item" );
- item.m_pItem->SetSelectedImage(image);
+ wxGenericTreeItem *pItem = item.m_pItem;
+ pItem->SetSelectedImage(image);
+ RefreshLine(pItem);
}
void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data)
{
wxCHECK_RET( item.IsOk(), "invalid tree item" );
- item.m_pItem->SetHasPlus(has);
+ wxGenericTreeItem *pItem = item.m_pItem;
+ pItem->SetHasPlus(has);
+ RefreshLine(pItem);
}
void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
wxArrayTreeItems& children = item.m_pItem->GetChildren();
- return children.IsEmpty() ? wxTreeItemId() : children.Last();
+ return (children.IsEmpty() ? wxTreeItemId() : wxTreeItemId(children.Last()));
}
wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
{
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;
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;
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;
}
}
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)
void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
{
- /* render bold items in bold */
+ // render bold items in bold
wxFont fontOld;
wxFont fontNew;
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(),
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);
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 );
dc.DrawLine( horizX+13, y, horizX+18, y );
if (!item->IsExpanded())
- {
+ {
dc.DrawLine( horizX+15, y-2, horizX+15, y+3 );
- }
+ }
}
if (item->HasHilight())
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 );
}
}
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 );
}
if (prev)
{
- while (IsExpanded(prev))
+ while ( IsExpanded(prev) && HasChildren(prev) )
{
- int c = (int)GetChildrenCount( prev, FALSE );
- long cockie = 0;
- prev = GetFirstChild( prev, cockie );
- for (int i = 0; i < c-1; i++)
- prev = GetNextSibling( prev );
+ wxTreeItemId child = GetLastChild(prev);
+ if ( child )
+ {
+ prev = child;
+ }
}
+
SelectItem( prev );
EnsureVisible( prev );
}
case WXK_DOWN:
{
- if (IsExpanded(m_current))
+ if (IsExpanded(m_current) && HasChildren(m_current))
{
long cookie = 0;
wxTreeItemId child = GetFirstChild( m_current, cookie );
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())
{
/* 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;
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;
}
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
}
}
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)