wxSize wxTextCtrl::DoGetBestSize() const
{
- // FIXME should be different for multi-line controls...
- wxSize ret( wxControl::DoGetBestSize() );
- wxSize best(80, ret.y);
- CacheBestSize(best);
- return best;
+ return DoGetSizeFromTextSize(80);
}
+wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+ wxASSERT_MSG( m_widget, wxS("GetSizeFromTextSize called before creation") );
+
+ wxSize tsize(xlen, 0);
+ int cHeight = GetCharHeight();
+
+ if ( IsSingleLine() )
+ {
+ if ( HasFlag(wxBORDER_NONE) )
+ {
+ tsize.y = cHeight;
+#ifdef __WXGTK3__
+ tsize.IncBy(9, 0);
+#else
+ tsize.IncBy(4, 0);
+#endif // GTK3
+ }
+ else
+ {
+ // default height
+ tsize.y = GTKGetPreferredSize(m_widget).y;
+ // Add the margins we have previously set, but only the horizontal border
+ // as vertical one has been taken account at GTKGetPreferredSize().
+ // Also get other GTK+ margins.
+ tsize.IncBy( GTKGetEntryMargins(GetEntry()).x, 0);
+ }
+ }
+
+ //multiline
+ else
+ {
+ // add space for vertical scrollbar
+ if ( m_scrollBar[1] && !(m_windowStyle & wxTE_NO_VSCROLL) )
+ tsize.IncBy(GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[1])).x + 3, 0);
+
+ // height
+ tsize.y = cHeight;
+ if ( ylen <= 0 )
+ {
+ tsize.y = 1 + cHeight * wxMax(wxMin(GetNumberOfLines(), 10), 2);
+ // add space for horizontal scrollbar
+ if ( m_scrollBar[0] && (m_windowStyle & wxHSCROLL) )
+ tsize.IncBy(0, GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[0])).y + 3);
+ }
+
+ if ( !HasFlag(wxBORDER_NONE) )
+ {
+ // hardcode borders, margins, etc
+ tsize.IncBy(5, 4);
+ }
+ }
+
+ // Perhaps the user wants something different from CharHeight, or ylen
+ // is used as the height of a multiline text.
+ if ( ylen > 0 )
+ tsize.IncBy(0, ylen - cHeight);
+
+ return tsize;
+}
+
+
// ----------------------------------------------------------------------------
// freeze/thaw
// ----------------------------------------------------------------------------