From 46042843e817e70e4acf66be34e6529d064b8be7 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 11 Jan 2020 19:15:15 +0100 Subject: [PATCH] Implement support for ellipsization mode in wxGrid Add another wxGrid::DrawTextRectangle() overload, taking wxGridCellAttr and ellipsizing the string if necessary, i.e. if the fitting mode of this attribute indicates that we should do it. Switch the code of all renderers for which it makes sense to use ellipsization to use the new overload. --- include/wx/generic/grid.h | 7 ++++++ src/generic/grid.cpp | 22 +++++++++++++++++++ src/generic/gridctrl.cpp | 46 +++++++++++++++------------------------ 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index 99645ba7cc..d4e403e8eb 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -1160,6 +1160,13 @@ public: int verticalAlignment = wxALIGN_TOP, int textOrientation = wxHORIZONTAL ) const; + void DrawTextRectangle(wxDC& dc, + const wxString& text, + const wxRect& rect, + const wxGridCellAttr& attr, + int defaultHAlign = wxALIGN_INVALID, + int defaultVAlign = wxALIGN_INVALID); + // ------ grid render function for printing // void Render( wxDC& dc, diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 3cacdc3810..68bcc9afc4 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -6822,6 +6822,28 @@ void wxGrid::DrawTextRectangle(wxDC& dc, } } +void wxGrid::DrawTextRectangle(wxDC& dc, + const wxString& text, + const wxRect& rect, + const wxGridCellAttr& attr, + int hAlign, + int vAlign) +{ + attr.GetNonDefaultAlignment(&hAlign, &vAlign); + + // This does nothing if there is no need to ellipsize. + const wxString& ellipsizedText = wxControl::Ellipsize + ( + text, + dc, + attr.GetFitMode().GetEllipsizeMode(), + rect.GetWidth(), + wxELLIPSIZE_FLAGS_NONE + ); + + DrawTextRectangle(dc, ellipsizedText, rect, hAlign, vAlign); +} + // Split multi-line text up into an array of strings. // Any existing contents of the string array are preserved. // diff --git a/src/generic/gridctrl.cpp b/src/generic/gridctrl.cpp index 585a8e6341..9a3a728696 100644 --- a/src/generic/gridctrl.cpp +++ b/src/generic/gridctrl.cpp @@ -148,15 +148,12 @@ void wxGridCellDateRenderer::Draw(wxGrid& grid, SetTextColoursAndFont(grid, attr, dc, isSelected); - // draw the text right aligned by default - int hAlign = wxALIGN_RIGHT, - vAlign = wxALIGN_INVALID; - attr.GetNonDefaultAlignment(&hAlign, &vAlign); - wxRect rect = rectCell; rect.Inflate(-1); - grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); + // draw the text right aligned by default + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, attr, + wxALIGN_RIGHT); } wxSize wxGridCellDateRenderer::GetBestSize(wxGrid& grid, @@ -246,15 +243,12 @@ void wxGridCellEnumRenderer::Draw(wxGrid& grid, SetTextColoursAndFont(grid, attr, dc, isSelected); - // draw the text right aligned by default - int hAlign = wxALIGN_RIGHT, - vAlign = wxALIGN_INVALID; - attr.GetNonDefaultAlignment(&hAlign, &vAlign); - wxRect rect = rectCell; rect.Inflate(-1); - grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); + // draw the text right aligned by default + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, attr, + wxALIGN_RIGHT); } wxSize wxGridCellEnumRenderer::GetBestSize(wxGrid& grid, @@ -308,6 +302,8 @@ wxGridCellAutoWrapStringRenderer::Draw(wxGrid& grid, wxRect rect = rectCell; rect.Inflate(-1); + // Do not use here the overload taking the attribute, as this would + // ellipsize the text, which is never necessary with this renderer. grid.DrawTextRectangle(dc, GetTextLines(grid,dc,attr,rect,row,col), rect, horizAlign, vertAlign); } @@ -595,11 +591,11 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, // erase only this cells background, overflow cells should have been erased wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); - int hAlign, vAlign; - attr.GetAlignment(&hAlign, &vAlign); - if (attr.GetOverflow()) { + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + int overflowCols = 0; int cols = grid.GetNumberCols(); int best_width = GetBestSize(grid,attr,dc,row,col).GetWidth(); @@ -675,7 +671,7 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, SetTextColoursAndFont(grid, attr, dc, isSelected); grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), - rect, hAlign, vAlign); + rect, attr); } // ---------------------------------------------------------------------------- @@ -709,15 +705,12 @@ void wxGridCellNumberRenderer::Draw(wxGrid& grid, SetTextColoursAndFont(grid, attr, dc, isSelected); - // draw the text right aligned by default - int hAlign = wxALIGN_RIGHT, - vAlign = wxALIGN_INVALID; - attr.GetNonDefaultAlignment(&hAlign, &vAlign); - wxRect rect = rectCell; rect.Inflate(-1); - grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); + // draw the text right aligned by default + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, attr, + wxALIGN_RIGHT); } wxSize wxGridCellNumberRenderer::GetBestSize(wxGrid& grid, @@ -824,15 +817,12 @@ void wxGridCellFloatRenderer::Draw(wxGrid& grid, SetTextColoursAndFont(grid, attr, dc, isSelected); - // draw the text right aligned by default - int hAlign = wxALIGN_RIGHT, - vAlign = wxALIGN_INVALID; - attr.GetNonDefaultAlignment(&hAlign, &vAlign); - wxRect rect = rectCell; rect.Inflate(-1); - grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); + // draw the text right aligned by default + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, attr, + wxALIGN_RIGHT); } wxSize wxGridCellFloatRenderer::GetBestSize(wxGrid& grid,