+wxCoord
+wxGridCellAutoWrapStringRenderer::BreakWord(wxDC& dc,
+ const wxString& word,
+ wxCoord maxWidth,
+ wxArrayString& lines,
+ wxString& line)
+{
+ wxArrayInt widths;
+ dc.GetPartialTextExtents(word, widths);
+
+ // TODO: Use binary search to find the first element > maxWidth.
+ const unsigned count = widths.size();
+ unsigned n;
+ for ( n = 0; n < count; n++ )
+ {
+ if ( widths[n] > maxWidth )
+ break;
+ }
+
+ if ( n == 0 )
+ {
+ // This is a degenerate case: the first character of the word is
+ // already wider than the available space, so we just can't show it
+ // completely and have to put the first character in this line.
+ n = 1;
+ }
+
+ 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);
+}
+