+ if (style & ES_CENTER)
+ m_windowStyle |= wxTE_CENTRE;
+ if (style & ES_RIGHT)
+ m_windowStyle |= wxTE_RIGHT;
+}
+
+WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
+{
+ long msStyle = wxControl::MSWGetStyle(style, exstyle);
+
+ // styles which we always add by default
+ if ( style & wxTE_MULTILINE )
+ {
+ msStyle |= ES_MULTILINE | ES_WANTRETURN;
+ if ( !(style & wxTE_NO_VSCROLL) )
+ {
+ // always adjust the vertical scrollbar automatically if we have it
+ msStyle |= WS_VSCROLL | ES_AUTOVSCROLL;
+
+#if wxUSE_RICHEDIT
+ // we have to use this style for the rich edit controls because
+ // without it the vertical scrollbar never appears at all in
+ // richedit 3.0 because of our ECO_NOHIDESEL hack (search for it)
+ if ( style & wxTE_RICH2 )
+ {
+ msStyle |= ES_DISABLENOSCROLL;
+ }
+#endif // wxUSE_RICHEDIT
+ }
+
+ style |= wxTE_PROCESS_ENTER;
+ }
+ else // !multiline
+ {
+ // there is really no reason to not have this style for single line
+ // text controls
+ msStyle |= ES_AUTOHSCROLL;
+ }
+
+ // note that wxTE_DONTWRAP is the same as wxHSCROLL so if we have a horz
+ // scrollbar, there is no wrapping -- which makes sense
+ if ( style & wxTE_DONTWRAP )
+ {
+ // automatically scroll the control horizontally as necessary
+ //
+ // NB: ES_AUTOHSCROLL is needed for richedit controls or they don't
+ // show horz scrollbar at all, even in spite of WS_HSCROLL, and as
+ // it doesn't seem to do any harm for plain edit controls, add it
+ // always
+ msStyle |= WS_HSCROLL | ES_AUTOHSCROLL;
+ }
+
+ if ( style & wxTE_READONLY )
+ msStyle |= ES_READONLY;
+
+ if ( style & wxTE_PASSWORD )
+ msStyle |= ES_PASSWORD;
+
+ if ( style & wxTE_NOHIDESEL )
+ msStyle |= ES_NOHIDESEL;
+
+ // note that we can't do do "& wxTE_LEFT" as wxTE_LEFT == 0
+ if ( style & wxTE_CENTRE )
+ msStyle |= ES_CENTER;
+ else if ( style & wxTE_RIGHT )
+ msStyle |= ES_RIGHT;
+ else
+ msStyle |= ES_LEFT; // ES_LEFT is 0 as well but for consistency...
+
+ return msStyle;
+}
+
+void wxTextCtrl::SetWindowStyleFlag(long style)
+{
+ // changing the alignment of the control dynamically works under Win2003
+ // (but not older Windows version: it seems to work under some versions of
+ // XP but not other ones, and we have no way to determine it so be
+ // conservative here) and only for plain EDIT controls (not RICH ones) and
+ // we have to recreate the control to make it always work
+ if ( IsRich() || wxGetWinVersion() < wxWinVersion_2003 )
+ {
+ const long alignMask = wxTE_LEFT | wxTE_CENTRE | wxTE_RIGHT;
+ if ( (style & alignMask) != (GetWindowStyle() & alignMask) )
+ {
+ const wxString value = GetValue();
+ const wxPoint pos = GetPosition();
+ const wxSize size = GetSize();
+
+ // delete the old window
+ HWND hwnd = GetHwnd();
+ DissociateHandle();
+ ::DestroyWindow(hwnd);
+
+ // create the new one with the updated flags
+ m_windowStyle = style;
+ MSWCreateText(value, pos, size);
+
+ // and make sure it has the same attributes as before
+ if ( m_hasFont )
+ {
+ // calling SetFont(m_font) would do nothing as the code would
+ // notice that the font didn't change, so force it to believe
+ // that it did
+ wxFont font = m_font;
+ m_font = wxNullFont;
+ SetFont(font);
+ }
+
+ if ( m_hasFgCol )
+ {
+ wxColour colFg = m_foregroundColour;
+ m_foregroundColour = wxNullColour;
+ SetForegroundColour(colFg);
+ }
+
+ if ( m_hasBgCol )
+ {
+ wxColour colBg = m_backgroundColour;
+ m_backgroundColour = wxNullColour;
+ SetBackgroundColour(colBg);
+ }
+
+ // note that text styles are lost but this is probably not a big
+ // problem: if you use styles, you probably don't use nor change
+ // alignment flags anyhow
+
+ return;
+ }
+ }
+
+#if wxUSE_RICHEDIT
+ // we have to deal with some styles separately because they can't be
+ // changed by simply calling SetWindowLong(GWL_STYLE) but can be changed
+ // using richedit-specific EM_SETOPTIONS
+ if ( IsRich() &&
+ ((style & wxTE_NOHIDESEL) != (GetWindowStyle() & wxTE_NOHIDESEL)) )
+ {
+ bool set = (style & wxTE_NOHIDESEL) != 0;
+
+ ::SendMessage(GetHwnd(), EM_SETOPTIONS, set ? ECOOP_OR : ECOOP_AND,
+ set ? ECO_NOHIDESEL : ~ECO_NOHIDESEL);
+ }
+#endif // wxUSE_RICHEDIT
+
+ wxControl::SetWindowStyleFlag(style);