X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9fcbe0766385cc9f68c22da46d8081d02f8a4103..8fd7108e7cfd6d3564a71ab5f49c391613e27798:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index f3877df5c1..7218b339f2 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -37,6 +37,7 @@ #include "wx/menu.h" #include "wx/math.h" #include "wx/module.h" + #include "wx/wxcrtvararg.h" #endif #include "wx/sysopt.h" @@ -76,6 +77,15 @@ #include "wx/msw/missing.h" +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + +// dummy value used for m_dropTarget, different from any valid pointer value +// (which are all even under Windows) and NULL +static wxDropTarget * + wxRICHTEXT_DEFAULT_DROPTARGET = wx_reinterpret_cast(wxDropTarget *, 1); + +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -288,10 +298,19 @@ void wxTextCtrl::Init() wxTextCtrl::~wxTextCtrl() { +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + if ( m_dropTarget == wxRICHTEXT_DEFAULT_DROPTARGET ) + { + // don't try to destroy this dummy pointer in the base class dtor + m_dropTarget = NULL; + } +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + delete m_privateContextMenu; } -bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, +bool wxTextCtrl::Create(wxWindow *parent, + wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, @@ -299,15 +318,45 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { -#ifdef __WXWINCE__ - if ((style & wxBORDER_MASK) == 0) - style |= wxBORDER_SIMPLE; -#endif - // base initialization if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; + if ( !MSWCreateText(value, pos, size) ) + return false; + +#if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + if ( IsRich() ) + { + // rich text controls have a default associated drop target which + // allows them to receive (rich) text dropped on them, which is nice, + // but prevents us from associating a user-defined drop target with + // them as we need to unregister the old one first + // + // to make it work, we set m_dropTarget to this special value initially + // and check for it in our SetDropTarget() + m_dropTarget = wxRICHTEXT_DEFAULT_DROPTARGET; + } +#endif // wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT + + return true; +} + +// returns true if the platform should explicitly apply a theme border +bool wxTextCtrl::CanApplyThemeBorder() const +{ +#ifdef __WXWINCE__ + return false; +#else + // Standard text control already handles theming + return ((GetWindowStyle() & (wxTE_RICH|wxTE_RICH2)) != 0); +#endif +} + +bool wxTextCtrl::MSWCreateText(const wxString& value, + const wxPoint& pos, + const wxSize& size) +{ // translate wxWin style flags to MSW ones WXDWORD msStyle = MSWGetCreateWindowFlags(); @@ -316,7 +365,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, #if defined(__POCKETPC__) || defined(__SMARTPHONE__) // A control that capitalizes the first letter - if (style & wxTE_CAPITALIZE) + if ( HasFlag(wxTE_CAPITALIZE) ) windowClass = wxT("CAPEDIT"); #endif @@ -434,7 +483,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, valueWin = value; } - if ( !MSWCreateControl(windowClass, msStyle, pos, size, valueWin) ) + if ( !MSWCreateControl(windowClass.wx_str(), msStyle, pos, size, valueWin) ) return false; #if wxUSE_RICHEDIT @@ -471,7 +520,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, // Windows XP, so if we're sure it works correctly under other // systems we could do this only for XP SetSize(-1, 1); // 1 is small enough to force vert scrollbar - SetSize(size); + SetInitialSize(size); } else if ( m_windowStyle & wxTE_AUTO_URL ) { @@ -484,6 +533,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, } #endif // wxUSE_RICHEDIT +#ifndef __WXWINCE__ + // Without this, if we pass the size in the constructor and then don't change it, + // the themed borders will be drawn incorrectly. + SetWindowPos(GetHwnd(), NULL, 0, 0, 0, 0, + SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE| + SWP_FRAMECHANGED); +#endif + return true; } @@ -597,6 +654,62 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const 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 @@ -859,7 +972,7 @@ wxTextCtrl::StreamIn(const wxString& value, #else // !wxUSE_UNICODE_MSLU wxCSConv conv(encoding); - const size_t len = conv.MB2WC(NULL, value, value.length()); + const size_t len = conv.MB2WC(NULL, value.mb_str(), value.length()); #if wxUSE_WCHAR_T wxWCharBuffer wchBuf(len); @@ -869,7 +982,7 @@ wxTextCtrl::StreamIn(const wxString& value, wchar_t *wpc = wchBuf; #endif - conv.MB2WC(wpc, value, value.length()); + conv.MB2WC(wpc, value.mb_str(), value.length()); #endif // wxUSE_UNICODE_MSLU // finally, stream it in the control @@ -1048,7 +1161,7 @@ void wxTextCtrl::DoWriteText(const wxString& value, int flags) ::SendMessage(GetHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT, // EM_REPLACESEL takes 1 to indicate the operation should be redoable - selectionOnly ? 1 : 0, (LPARAM)valueDos.c_str()); + selectionOnly ? 1 : 0, (LPARAM)valueDos.wx_str()); if ( !ucf.GotUpdate() && (flags & SetValue_SendEvent) ) { @@ -1630,9 +1743,16 @@ wxString wxTextCtrl::GetLineText(long lineNo) const // should never see it if ( buf[len - 2] == _T('\r') && buf[len - 1] == _T('\n') ) { + // richedit 1.0 uses "\r\n" as line terminator, so remove "\r" + // here and "\n" below buf[len - 2] = _T('\n'); len--; } + else if ( buf[len - 1] == _T('\r') ) + { + // richedit 2.0+ uses only "\r", replace it with "\n" + buf[len - 1] = _T('\n'); + } } #endif // wxUSE_RICHEDIT @@ -2316,6 +2436,22 @@ bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) return wxTextCtrlBase::MSWOnNotify(idCtrl, lParam, result); } +#if wxUSE_DRAG_AND_DROP + +void wxTextCtrl::SetDropTarget(wxDropTarget *dropTarget) +{ + if ( m_dropTarget == wxRICHTEXT_DEFAULT_DROPTARGET ) + { + // get rid of the built-in drop target + ::RevokeDragDrop(GetHwnd()); + m_dropTarget = NULL; + } + + wxTextCtrlBase::SetDropTarget(dropTarget); +} + +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // colour setting for the rich edit controls // ----------------------------------------------------------------------------