X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/72366f68d1036084d1adc5971eeee4885f36fe5c..79d3dfac2fab5566dd0773e7226bee74fe989e15:/src/generic/treectlg.cpp?ds=sidebyside diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 1dd90fef81..a20a4fabe2 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -720,6 +720,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxGenericTreeCtrl, wxControl) BEGIN_EVENT_TABLE(wxGenericTreeCtrl, wxTreeCtrlBase) EVT_PAINT (wxGenericTreeCtrl::OnPaint) + EVT_SIZE (wxGenericTreeCtrl::OnSize) EVT_MOUSE_EVENTS (wxGenericTreeCtrl::OnMouse) EVT_CHAR (wxGenericTreeCtrl::OnChar) EVT_SET_FOCUS (wxGenericTreeCtrl::OnSetFocus) @@ -753,13 +754,6 @@ void wxGenericTreeCtrl::Init() m_indent = 15; m_spacing = 18; -#ifdef __WXMAC__ - // OS X sel item highlight color differs from text highlight color, which is - // what wxSYS_COLOUR_HIGHLIGHT returns. - RGBColor hilight; - GetThemeBrushAsColor(kThemeBrushAlternatePrimaryHighlightColor, 32, true, &hilight); - m_hilightBrush = new wxBrush( wxColour(hilight.red, hilight.green, hilight.blue ), wxSOLID ); -#else m_hilightBrush = new wxBrush ( wxSystemSettings::GetColour @@ -768,14 +762,7 @@ void wxGenericTreeCtrl::Init() ), wxSOLID ); -#endif -#ifdef __WXMAC__ - // on Mac, this color also differs from the wxSYS_COLOUR_BTNSHADOW, enough to be noticable. - // I don't know if BTNSHADOW is appropriate in other contexts, so I'm just changing it here. - GetThemeBrushAsColor(kThemeBrushSecondaryHighlightColor, 32, true, &hilight); - m_hilightUnfocusedBrush = new wxBrush( wxColour(hilight.red, hilight.green, hilight.blue ), wxSOLID ); -#else m_hilightUnfocusedBrush = new wxBrush ( wxSystemSettings::GetColour @@ -784,7 +771,7 @@ void wxGenericTreeCtrl::Init() ), wxSOLID ); -#endif + m_imageListButtons = NULL; m_ownsImageListButtons = false; @@ -2231,15 +2218,27 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) if ( HasFlag(wxTR_FULL_ROW_HIGHLIGHT) ) { - int x, y, w, h; - // TODO : using DoGetPosition should be wrong on any platform, the dc is focused on this window -#ifdef __WXMAC__ - x=y=0; + int x, w, h; + x=0; + GetVirtualSize(&w, &h); + wxRect rect( x, item->GetY()+offset, w, total_h-offset); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle(rect); #else - DoGetPosition(&x, &y); + if (!item->IsSelected()) + { + dc.DrawRectangle(rect); + } + else + { + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); + } #endif - DoGetSize(&w, &h); - dc.DrawRectangle(x, item->GetY()+offset, w, total_h-offset); } else { @@ -2248,16 +2247,49 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) // If it's selected, and there's an image, then we should // take care to leave the area under the image painted in the // background colour. - dc.DrawRectangle( item->GetX() + image_w - 2, item->GetY()+offset, - item->GetWidth() - image_w + 2, total_h-offset ); + wxRect rect( item->GetX() + image_w - 2, item->GetY()+offset, + item->GetWidth() - image_w + 2, total_h-offset ); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle( rect ); +#else + rect.x -= 1; + rect.width += 2; + + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); +#endif } // On GTK+ 2, drawing a 'normal' background is wrong for themes that // don't allow backgrounds to be customized. Not drawing the background, // except for custom item backgrounds, works for both kinds of theme. else if (drawItemBackground) { - dc.DrawRectangle( item->GetX()-2, item->GetY()+offset, - item->GetWidth()+2, total_h-offset ); + wxRect rect( item->GetX()-2, item->GetY()+offset, + item->GetWidth()+2, total_h-offset ); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle( rect ); +#else + if ( attr && attr->HasBackgroundColour() ) + { + dc.DrawRectangle( rect ); + } + else + { + rect.x -= 1; + rect.width += 2; + + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); + } +#endif } } @@ -2545,6 +2577,16 @@ void wxGenericTreeCtrl::DrawLine(const wxTreeItemId &item, bool below) // wxWidgets callbacks // ----------------------------------------------------------------------------- +void wxGenericTreeCtrl::OnSize( wxSizeEvent &event ) +{ +#ifdef __WXGTK__ + if (HasFlag( wxTR_FULL_ROW_HIGHLIGHT) && m_current) + RefreshLine( m_current ); +#endif + + event.Skip(true); +} + void wxGenericTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxPaintDC dc(this);