+ lines.push_back(word.substr(0, n));
+
+ // Check if the remainder of the string fits in one line.
+ //
+ // Unfortunately we can't use the existing partial text extents as the
+ // extent of the remainder may be different when it's rendered in a
+ // separate line instead of as part of the same one, so we have to
+ // recompute it.
+ const wxString rest = word.substr(n);
+ const wxCoord restWidth = dc.GetTextExtent(rest).x;
+ if ( restWidth <= maxWidth )
+ {
+ line = rest;
+ return restWidth;
+ }
+
+ // Break the rest of the word into lines.
+ //
+ // TODO: Perhaps avoid recursion? The code is simpler like this but using a
+ // loop in this function would probably be more efficient.
+ return BreakWord(dc, rest, maxWidth, lines, line);
+}
+
+wxSize
+wxGridCellAutoWrapStringRenderer::GetBestSize(wxGrid& grid,
+ wxGridCellAttr& attr,
+ wxDC& dc,
+ int row, int col)
+{
+ const int lineHeight = dc.GetCharHeight();
+
+ // Search for a shape no taller than the golden ratio.
+ wxSize size;
+ for ( size.x = 10; ; size.x += 10 )
+ {
+ const size_t
+ numLines = GetTextLines(grid, dc, attr, size, row, col).size();
+ size.y = numLines * lineHeight;
+ if ( size.x >= size.y*1.68 )
+ break;
+ }
+
+ return size;