X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d22956def712d1e823fbc68c09231f6dba817a87..77b7cd4fc381ada7099a0efcb3d124c2704f79fb:/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp diff --git a/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp b/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp index 260d264ff7..8a59591666 100644 --- a/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp +++ b/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include "wx/treelistctrl.h" @@ -152,6 +153,7 @@ public: void DrawCurrent(); void AdjustDC(wxDC& dc); + void OnEraseBackground( wxEraseEvent& event ); void OnPaint( wxPaintEvent &event ); void OnMouse( wxMouseEvent &event ); void OnSetFocus( wxFocusEvent &event ); @@ -1075,9 +1077,10 @@ void wxTreeListTextCtrl::OnKillFocus( wxFocusEvent &event ) IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow,wxWindow); BEGIN_EVENT_TABLE(wxTreeListHeaderWindow,wxWindow) - EVT_PAINT (wxTreeListHeaderWindow::OnPaint) - EVT_MOUSE_EVENTS (wxTreeListHeaderWindow::OnMouse) - EVT_SET_FOCUS (wxTreeListHeaderWindow::OnSetFocus) + EVT_ERASE_BACKGROUND (wxTreeListHeaderWindow::OnEraseBackground) + EVT_PAINT (wxTreeListHeaderWindow::OnPaint) + EVT_MOUSE_EVENTS (wxTreeListHeaderWindow::OnMouse) + EVT_SET_FOCUS (wxTreeListHeaderWindow::OnSetFocus) END_EVENT_TABLE() void wxTreeListHeaderWindow::Init() @@ -1110,7 +1113,7 @@ wxTreeListHeaderWindow::wxTreeListHeaderWindow( wxWindow *win, m_owner = owner; m_resizeCursor = new wxCursor(wxCURSOR_SIZEWE); - SetBackgroundColour(wxSystemSettings::GetSystemColour( + SetBackgroundColour(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE)); } @@ -1136,7 +1139,7 @@ void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h ) dc->SetBrush( *wxTRANSPARENT_BRUSH ); - dc->SetPen( wxPen(wxSystemSettings::GetSystemColour( + dc->SetPen( wxPen(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW), 1, wxSOLID)); dc->DrawLine( x+w-m_corner+1, y, x+w, y+h ); // right (outer) dc->DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) @@ -1161,7 +1164,7 @@ void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h ) dc->DrawLine( x+w-m_corner+1, y, x+w, y+h ); // right (outer) dc->DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) - wxPen pen(wxSystemSettings::GetSystemColour( + wxPen pen(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW ), 1, wxSOLID); dc->SetPen( pen ); @@ -1190,33 +1193,42 @@ void wxTreeListHeaderWindow::AdjustDC(wxDC& dc) dc.SetDeviceOrigin( -x * xpix, 0 ); } + +void wxTreeListHeaderWindow::OnEraseBackground( wxEraseEvent& event ) +{ +} + void wxTreeListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { #ifdef __WXGTK__ - wxClientDC dc( this ); + wxClientDC real_dc( this ); #else - wxPaintDC dc( this ); + wxPaintDC real_dc( this ); #endif - PrepareDC( dc ); - AdjustDC( dc ); - - dc.BeginDrawing(); - - dc.SetFont( GetFont() ); + AdjustDC( real_dc ); // width and height of the entire header window int w, h; GetClientSize( &w, &h ); m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); + // Setup double buffering to eliminate the flicker + wxMemoryDC dc; + wxBitmap buffer(w, h); + dc.SelectObject(buffer); + dc.SetBackground(wxBrush(GetBackgroundColour())); + dc.Clear(); + + dc.BeginDrawing(); + dc.SetFont( GetFont() ); dc.SetBackgroundMode(wxTRANSPARENT); // do *not* use the listctrl colour for headers - one day we will have a // function to set it separately //dc.SetTextForeground( *wxBLACK ); dc.SetTextForeground(wxSystemSettings:: - GetSystemColour( wxSYS_COLOUR_WINDOWTEXT )); + GetColour( wxSYS_COLOUR_WINDOWTEXT )); int x = HEADER_OFFSET_X; @@ -1298,8 +1310,10 @@ void wxTreeListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) m_parent->IsEnabled() ? 0 : wxCONTROL_DISABLED); } - + // Finish up by drawing the buffer to the real dc dc.EndDrawing(); + dc.SelectObject(wxNullBitmap); + real_dc.DrawBitmap(buffer, 0, 0, false); } void wxTreeListHeaderWindow::DrawCurrent() @@ -1676,8 +1690,10 @@ wxTreeListItem *wxTreeListItem::HitTest(const wxPoint& point, } // check for image hit - if (theCtrl->m_imgWidth > 0) { + if (theCtrl->m_imgWidth > 0 && GetImage() != NO_IMAGE) { int imgX = m_x - theCtrl->m_imgWidth2; + if (HasPlus() && theCtrl->HasButtons()) + imgX += theCtrl->m_btnWidth + LINEATROOT; int imgY = y_mid - theCtrl->m_imgHeight2; if ((point.x >= imgX) && (point.x <= (imgX + theCtrl->m_imgWidth)) && (point.y >= imgY) && (point.y <= (imgY + theCtrl->m_imgHeight))) { @@ -1843,7 +1859,7 @@ void wxTreeListMainWindow::Init() m_hilightBrush = new wxBrush ( - wxSystemSettings::GetSystemColour + wxSystemSettings::GetColour ( wxSYS_COLOUR_HIGHLIGHT ), @@ -1852,7 +1868,7 @@ void wxTreeListMainWindow::Init() m_hilightUnfocusedBrush = new wxBrush ( - wxSystemSettings::GetSystemColour + wxSystemSettings::GetColour ( wxSYS_COLOUR_BTNSHADOW ), @@ -1875,7 +1891,7 @@ void wxTreeListMainWindow::Init() m_underMouse = NULL; -#if defined( __WXMAC__ ) && __WXMAC_CARBON__ +#if defined( __WXMAC__ ) && defined(__WXMAC_CARBON__) m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ; #else m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); @@ -1920,7 +1936,7 @@ bool wxTreeListMainWindow::Create(wxTreeListCtrl *parent, SetValidator( validator ); #endif - SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) ); + SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) ); #ifdef __WXMSW__ { @@ -3298,7 +3314,7 @@ void wxTreeListMainWindow::PaintItem(wxTreeListItem *item, wxDC& dc) if (item->IsSelected() && HasFlag(wxTR_FULL_ROW_HIGHLIGHT)) { dc.SetBrush(*(m_hasFocus ? m_hilightBrush : m_hilightUnfocusedBrush)); dc.SetPen(*wxBLACK_PEN); - colText = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT); + colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); } else { wxColour colBg; if (attr && attr->HasBackgroundColour()) { @@ -3364,7 +3380,7 @@ void wxTreeListMainWindow::PaintItem(wxTreeListItem *item, wxDC& dc) int width = wxMin(text_w+2, colwidth - text_x - x_colstart); dc.DrawRectangle(text_x-1, item->GetY() + offset, width, total_h-offset); dc.SetBackgroundMode(wxTRANSPARENT); - dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); }else{ dc.SetTextForeground(colText); } @@ -4637,15 +4653,22 @@ void wxTreeListCtrl::CalculateAndSetHeaderHeight() } } - -void wxTreeListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxTreeListCtrl::DoHeaderLayout() { int w, h; GetClientSize(&w, &h); if (m_header_win) + { m_header_win->SetSize(0, 0, w, m_headerHeight); + m_header_win->Refresh(false); + } if (m_main_win) m_main_win->SetSize(0, m_headerHeight + 1, w, h - m_headerHeight - 1); +} + +void wxTreeListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + DoHeaderLayout(); } @@ -4996,7 +5019,10 @@ wxString wxTreeListCtrl::GetColumnText(size_t column) const { return m_header_win->GetColumnText(column); } void wxTreeListCtrl::AddColumn(const wxTreeListColumnInfo& col) -{ m_header_win->AddColumn(col); } +{ + m_header_win->AddColumn(col); + DoHeaderLayout(); +} void wxTreeListCtrl::InsertColumn(size_t before, const wxTreeListColumnInfo& col)