void SetSpacing(unsigned int spacing);
// image list: these functions allow to associate an image list with
- // the control and retrieve it. Note that when assigned with
+ // the control and retrieve it. Note that when assigned with
// SetImageList, the control does _not_ delete
// the associated image list when it's deleted in order to allow image
- // lists to be shared between different controls. If you use
+ // lists to be shared between different controls. If you use
// AssignImageList, the control _does_ delete the image list.
//
// The normal image list is for the icons which correspond to the
unsigned short m_spacing;
int m_lineHeight;
wxPen m_dottedPen;
- wxBrush *m_hilightBrush;
+ wxBrush *m_hilightBrush,
+ *m_hilightUnfocusedBrush;
bool m_hasFocus;
bool m_dirty;
- bool m_ownsImageListNormal,
+ bool m_ownsImageListNormal,
m_ownsImageListState,
m_ownsImageListButtons;
bool m_isDragging; // true between BEGIN/END drag events
void RefreshSubtree( wxGenericTreeItem *item );
void RefreshLine( wxGenericTreeItem *item );
+ // redraw all selected items
+ void RefreshSelected();
+
+ // RefreshSelected() recursive helper
+ void RefreshSelectedUnder(wxGenericTreeItem *item);
+
void OnRenameTimer();
void OnRenameAccept();
m_indent = 15;
m_spacing = 18;
- m_hilightBrush = new wxBrush(
- wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT),
- wxSOLID);
+ m_hilightBrush = new wxBrush
+ (
+ wxSystemSettings::GetSystemColour
+ (
+ wxSYS_COLOUR_HIGHLIGHT
+ ),
+ wxSOLID
+ );
+
+ m_hilightUnfocusedBrush = new wxBrush
+ (
+ wxSystemSettings::GetSystemColour
+ (
+ wxSYS_COLOUR_BTNSHADOW
+ ),
+ wxSOLID
+ );
m_imageListNormal = m_imageListButtons =
m_imageListState = (wxImageList *) NULL;
wxGenericTreeCtrl::~wxGenericTreeCtrl()
{
- wxDELETE( m_hilightBrush );
+ delete m_hilightBrush;
+ delete m_hilightUnfocusedBrush;
DeleteAllItems();
int total_h = GetLineHeight(item);
- bool paintBg = item->IsSelected() && m_hasFocus;
- if ( paintBg )
+ if ( item->IsSelected() )
{
- dc.SetBrush(*m_hilightBrush);
+ dc.SetBrush(*(m_hasFocus ? m_hilightBrush : m_hilightUnfocusedBrush));
}
else
{
int offset = HasFlag(wxTR_ROW_LINES) ? 1 : 0;
- if ( item->IsSelected() && image != NO_IMAGE)
+ if ( item->IsSelected() && image != NO_IMAGE )
{
// If it's selected, and there's an image, then we should
// take care to leave the area under the image painted in the
#ifndef __WXMAC__
// don't draw rect outline if we already have the
// background color under Mac
- (item->IsSelected()) ? wxBLACK_PEN :
+ (item->IsSelected() && m_hasFocus) ? wxBLACK_PEN :
#endif // !__WXMAC__
wxTRANSPARENT_PEN;
PaintLevel( m_anchor, dc, 0, y );
}
-void wxGenericTreeCtrl::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
+void wxGenericTreeCtrl::OnSetFocus( wxFocusEvent &event )
{
m_hasFocus = TRUE;
- if (m_current)
- RefreshLine( m_current );
+ RefreshSelected();
+
+ event.Skip();
}
-void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
+void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &event )
{
m_hasFocus = FALSE;
- if (m_current)
- RefreshLine( m_current );
+ RefreshSelected();
+
+ event.Skip();
}
void wxGenericTreeCtrl::OnChar( wxKeyEvent &event )
Refresh( TRUE, &rect );
}
+void wxGenericTreeCtrl::RefreshSelected()
+{
+ // TODO: this is awfully inefficient, we should keep the list of all
+ // selected items internally, should be much faster
+ if ( m_anchor )
+ RefreshSelectedUnder(m_anchor);
+}
+
+void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item)
+{
+ if ( item->IsSelected() )
+ RefreshLine(item);
+
+ const wxArrayGenericTreeItems& children = item->GetChildren();
+ size_t count = children.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ RefreshSelectedUnder(children[n]);
+ }
+}
+
#endif // wxUSE_TREECTRL