X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57e9abd61307aa069b2cb449d215896e97857f5e..205bdf2069b93743848d69a39c0bd4a32e9ff8b7:/src/generic/grid.cpp?ds=sidebyside diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 2ce9f06c70..e0d9dc6c37 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -80,12 +80,28 @@ WX_DECLARE_HASH_SET_WITH_DECL(int, wxIntegerHash, wxIntegerEqual, // globals // ---------------------------------------------------------------------------- +namespace +{ + //#define DEBUG_ATTR_CACHE #ifdef DEBUG_ATTR_CACHE static size_t gs_nAttrCacheHits = 0; static size_t gs_nAttrCacheMisses = 0; #endif +// this struct simply combines together the default header renderers +// +// as the renderers ctors are trivial, there is no problem with making them +// globals +struct DefaultHeaderRenderers +{ + wxGridColumnHeaderRendererDefault colRenderer; + wxGridRowHeaderRendererDefault rowRenderer; + wxGridCornerHeaderRendererDefault cornerRenderer; +} gs_defaultHeaderRenderers; + +} // anonymous namespace + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -191,6 +207,90 @@ wxGridCellWorker::~wxGridCellWorker() { } +// ---------------------------------------------------------------------------- +// wxGridHeaderLabelsRenderer and related classes +// ---------------------------------------------------------------------------- + +void wxGridHeaderLabelsRenderer::DrawLabel(const wxGrid& grid, + wxDC& dc, + const wxString& value, + const wxRect& rect, + int horizAlign, + int vertAlign, + int textOrientation) const +{ + dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); + dc.SetTextForeground(grid.GetLabelTextColour()); + dc.SetFont(grid.GetLabelFont()); + grid.DrawTextRectangle(dc, value, rect, horizAlign, vertAlign, textOrientation); +} + + +void wxGridRowHeaderRendererDefault::DrawBorder(const wxGrid& WXUNUSED(grid), + wxDC& dc, + wxRect& rect) const +{ + dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); + dc.DrawLine(rect.GetRight(), rect.GetTop(), + rect.GetRight(), rect.GetBottom()); + dc.DrawLine(rect.GetLeft(), rect.GetTop(), + rect.GetLeft(), rect.GetBottom()); + dc.DrawLine(rect.GetLeft(), rect.GetBottom(), + rect.GetRight() + 1, rect.GetBottom()); + + dc.SetPen(*wxWHITE_PEN); + dc.DrawLine(rect.GetLeft() + 1, rect.GetTop(), + rect.GetLeft() + 1, rect.GetBottom()); + dc.DrawLine(rect.GetLeft() + 1, rect.GetTop(), + rect.GetRight(), rect.GetTop()); + + rect.Deflate(2); +} + +void wxGridColumnHeaderRendererDefault::DrawBorder(const wxGrid& WXUNUSED(grid), + wxDC& dc, + wxRect& rect) const +{ + dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); + dc.DrawLine(rect.GetRight(), rect.GetTop(), + rect.GetRight(), rect.GetBottom()); + dc.DrawLine(rect.GetLeft(), rect.GetTop(), + rect.GetRight(), rect.GetTop()); + dc.DrawLine(rect.GetLeft(), rect.GetBottom(), + rect.GetRight() + 1, rect.GetBottom()); + + dc.SetPen(*wxWHITE_PEN); + dc.DrawLine(rect.GetLeft(), rect.GetTop() + 1, + rect.GetLeft(), rect.GetBottom()); + dc.DrawLine(rect.GetLeft(), rect.GetTop() + 1, + rect.GetRight(), rect.GetTop() + 1); + + rect.Deflate(2); +} + +void wxGridCornerHeaderRendererDefault::DrawBorder(const wxGrid& WXUNUSED(grid), + wxDC& dc, + wxRect& rect) const +{ + dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); + dc.DrawLine(rect.GetRight() - 1, rect.GetBottom() - 1, + rect.GetRight() - 1, rect.GetTop()); + dc.DrawLine(rect.GetRight() - 1, rect.GetBottom() - 1, + rect.GetLeft(), rect.GetBottom() - 1); + dc.DrawLine(rect.GetLeft(), rect.GetTop(), + rect.GetRight(), rect.GetTop()); + dc.DrawLine(rect.GetLeft(), rect.GetTop(), + rect.GetLeft(), rect.GetBottom()); + + dc.SetPen(*wxWHITE_PEN); + dc.DrawLine(rect.GetLeft() + 1, rect.GetTop() + 1, + rect.GetRight() - 1, rect.GetTop() + 1); + dc.DrawLine(rect.GetLeft() + 1, rect.GetTop() + 1, + rect.GetLeft() + 1, rect.GetBottom() - 1); + + rect.Deflate(2); +} + // ---------------------------------------------------------------------------- // wxGridCellAttr // ---------------------------------------------------------------------------- @@ -859,6 +959,23 @@ void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols ) } } +const wxGridColumnHeaderRenderer& +wxGridCellAttrProvider::GetColumnHeaderRenderer(int WXUNUSED(col)) +{ + return gs_defaultHeaderRenderers.colRenderer; +} + +const wxGridRowHeaderRenderer& +wxGridCellAttrProvider::GetRowHeaderRenderer(int WXUNUSED(row)) +{ + return gs_defaultHeaderRenderers.rowRenderer; +} + +const wxGridCornerHeaderRenderer& wxGridCellAttrProvider::GetCornerRenderer() +{ + return gs_defaultHeaderRenderers.cornerRenderer; +} + // ---------------------------------------------------------------------------- // wxGridTableBase // ---------------------------------------------------------------------------- @@ -5324,32 +5441,25 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) if ( GetRowHeight(row) <= 0 || m_rowLabelWidth <= 0 ) return; - wxRect rect; - - int rowTop = GetRowTop(row), - rowBottom = GetRowBottom(row) - 1; + wxGridCellAttrProvider * const + attrProvider = m_table ? m_table->GetAttrProvider() : NULL; - dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); - dc.DrawLine( m_rowLabelWidth - 1, rowTop, m_rowLabelWidth - 1, rowBottom ); - dc.DrawLine( 0, rowTop, 0, rowBottom ); - dc.DrawLine( 0, rowBottom, m_rowLabelWidth, rowBottom ); + // notice that an explicit static_cast is needed to avoid a compilation + // error with VC7.1 which, for some reason, tries to instantiate (abstract) + // wxGridRowHeaderRenderer class without it + const wxGridRowHeaderRenderer& + rend = attrProvider ? attrProvider->GetRowHeaderRenderer(row) + : static_cast + (gs_defaultHeaderRenderers.rowRenderer); - dc.SetPen( *wxWHITE_PEN ); - dc.DrawLine( 1, rowTop, 1, rowBottom ); - dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop ); - - dc.SetBackgroundMode( wxBRUSHSTYLE_TRANSPARENT ); - dc.SetTextForeground( GetLabelTextColour() ); - dc.SetFont( GetLabelFont() ); + wxRect rect(0, GetRowTop(row), m_rowLabelWidth, GetRowHeight(row)); + rend.DrawBorder(*this, dc, rect); int hAlign, vAlign; - GetRowLabelAlignment( &hAlign, &vAlign ); + GetRowLabelAlignment(&hAlign, &vAlign); - rect.SetX( 2 ); - rect.SetY( GetRowTop(row) + 2 ); - rect.SetWidth( m_rowLabelWidth - 4 ); - rect.SetHeight( GetRowHeight(row) - 4 ); - DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign ); + rend.DrawLabel(*this, dc, GetRowLabelValue(row), + rect, hAlign, vAlign, wxHORIZONTAL); } void wxGrid::UseNativeColHeader(bool native) @@ -5397,26 +5507,27 @@ void wxGrid::DrawColLabels( wxDC& dc,const wxArrayInt& cols ) void wxGrid::DrawCornerLabel(wxDC& dc) { + wxRect rect(wxSize(m_rowLabelWidth, m_colLabelHeight)); + if ( m_nativeColumnLabels ) { - wxRect rect(wxSize(m_rowLabelWidth, m_colLabelHeight)); rect.Deflate(1); wxRendererNative::Get().DrawHeaderButton(m_cornerLabelWin, dc, rect, 0); } else { - dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); - dc.DrawLine( m_rowLabelWidth - 1, m_colLabelHeight - 1, - m_rowLabelWidth - 1, 0 ); - dc.DrawLine( m_rowLabelWidth - 1, m_colLabelHeight - 1, - 0, m_colLabelHeight - 1 ); - dc.DrawLine( 0, 0, m_rowLabelWidth, 0 ); - dc.DrawLine( 0, 0, 0, m_colLabelHeight ); + rect.width++; + rect.height++; - dc.SetPen( *wxWHITE_PEN ); - dc.DrawLine( 1, 1, m_rowLabelWidth - 1, 1 ); - dc.DrawLine( 1, 1, 1, m_colLabelHeight - 1 ); + wxGridCellAttrProvider * const + attrProvider = m_table ? m_table->GetAttrProvider() : NULL; + const wxGridCornerHeaderRenderer& + rend = attrProvider ? attrProvider->GetCornerRenderer() + : static_cast + (gs_defaultHeaderRenderers.cornerRenderer); + + rend.DrawBorder(*this, dc, rect); } } @@ -5428,6 +5539,12 @@ void wxGrid::DrawColLabel(wxDC& dc, int col) int colLeft = GetColLeft(col); wxRect rect(colLeft, 0, GetColWidth(col), m_colLabelHeight); + wxGridCellAttrProvider * const + attrProvider = m_table ? m_table->GetAttrProvider() : NULL; + const wxGridColumnHeaderRenderer& + rend = attrProvider ? attrProvider->GetColumnHeaderRenderer(col) + : static_cast + (gs_defaultHeaderRenderers.colRenderer); if ( m_nativeColumnLabels ) { @@ -5443,34 +5560,18 @@ void wxGrid::DrawColLabel(wxDC& dc, int col) : wxHDR_SORT_ICON_DOWN : wxHDR_SORT_ICON_NONE ); + rect.Deflate(2); } else { - int colRight = GetColRight(col) - 1; - - dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW))); - dc.DrawLine( colRight, 0, - colRight, m_colLabelHeight - 1 ); - dc.DrawLine( colLeft, 0, - colRight, 0 ); - dc.DrawLine( colLeft, m_colLabelHeight - 1, - colRight + 1, m_colLabelHeight - 1 ); - - dc.SetPen( *wxWHITE_PEN ); - dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 ); - dc.DrawLine( colLeft, 1, colRight, 1 ); + rend.DrawBorder(*this, dc, rect); } - dc.SetBackgroundMode( wxBRUSHSTYLE_TRANSPARENT ); - dc.SetTextForeground( GetLabelTextColour() ); - dc.SetFont( GetLabelFont() ); - int hAlign, vAlign; - GetColLabelAlignment( &hAlign, &vAlign ); + GetColLabelAlignment(&hAlign, &vAlign); const int orient = GetColLabelTextOrientation(); - rect.Deflate(2); - DrawTextRectangle(dc, GetColLabelValue(col), rect, hAlign, vAlign, orient); + rend.DrawLabel(*this, dc, GetColLabelValue(col), rect, hAlign, vAlign, orient); } // TODO: these 2 functions should be replaced with wxDC::DrawLabel() to which @@ -5480,7 +5581,7 @@ void wxGrid::DrawTextRectangle( wxDC& dc, const wxRect& rect, int horizAlign, int vertAlign, - int textOrientation ) + int textOrientation ) const { wxArrayString lines; @@ -5494,7 +5595,7 @@ void wxGrid::DrawTextRectangle(wxDC& dc, const wxRect& rect, int horizAlign, int vertAlign, - int textOrientation) + int textOrientation) const { if ( lines.empty() ) return;