draw the selected items in another colour when the control doesn't have focus, a bit like MSW does

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11421 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-08-20 14:13:34 +00:00
parent 643ccf6203
commit b771aa29dd
2 changed files with 63 additions and 19 deletions

View File

@ -81,10 +81,10 @@ public:
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
@ -357,10 +357,11 @@ protected:
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
@ -405,6 +406,12 @@ protected:
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();

View File

@ -614,9 +614,23 @@ void wxGenericTreeCtrl::Init()
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;
@ -672,7 +686,8 @@ bool wxGenericTreeCtrl::Create(wxWindow *parent,
wxGenericTreeCtrl::~wxGenericTreeCtrl()
{
wxDELETE( m_hilightBrush );
delete m_hilightBrush;
delete m_hilightUnfocusedBrush;
DeleteAllItems();
@ -1838,10 +1853,9 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
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
{
@ -1855,7 +1869,7 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
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
@ -1999,7 +2013,7 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
#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;
@ -2146,20 +2160,22 @@ void wxGenericTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
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 )
@ -2885,4 +2901,25 @@ void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item )
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