X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57a67daf9a8a97941b61a30c989e38bd8dffd871..a87f2821adee59d00f99cad1f9bcf61b0accbcb6:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 180b5bbdd6..5c1fcdeacc 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/textctrl.cpp +// Name: src/msw/textctrl.cpp // Purpose: wxTextCtrl // Author: Julian Smart // Modified by: @@ -206,7 +206,7 @@ wxBEGIN_FLAGS( wxTextCtrlStyle ) wxFLAGS_MEMBER(wxTE_CENTRE) wxFLAGS_MEMBER(wxTE_RIGHT) wxFLAGS_MEMBER(wxTE_DONTWRAP) - wxFLAGS_MEMBER(wxTE_LINEWRAP) + wxFLAGS_MEMBER(wxTE_CHARWRAP) wxFLAGS_MEMBER(wxTE_WORDWRAP) wxEND_FLAGS( wxTextCtrlStyle ) @@ -227,11 +227,11 @@ wxEND_HANDLERS_TABLE() wxCONSTRUCTOR_6( wxTextCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size , long , WindowStyle) #else -IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) #endif -BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) +BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_CHAR(wxTextCtrl::OnChar) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) @@ -258,10 +258,50 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_SET_FOCUS(wxTextCtrl::OnSetFocus) END_EVENT_TABLE() +// ---------------------------------------------------------------------------- +// function prototypes +// ---------------------------------------------------------------------------- + +LRESULT APIENTRY _EXPORT wxTextCtrlWndProc(HWND hWnd, + UINT message, + WPARAM wParam, + LPARAM lParam); + +// --------------------------------------------------------------------------- +// global vars +// --------------------------------------------------------------------------- + +// the pointer to standard text control wnd proc +static WNDPROC gs_wndprocEdit = (WNDPROC)NULL; + // ============================================================================ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wnd proc for subclassed edit control +// ---------------------------------------------------------------------------- + +LRESULT APIENTRY _EXPORT wxTextCtrlWndProc(HWND hWnd, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + switch ( message ) + { + case WM_CUT: + case WM_COPY: + case WM_PASTE: + { + wxWindow *win = wxFindWinFromHandle((WXHWND)hWnd); + if( win->HandleClipboardEvent( message ) ) + return 0; + break; + } + } + return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam); +} + // ---------------------------------------------------------------------------- // creation // ---------------------------------------------------------------------------- @@ -372,7 +412,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if (!IsInkEdit()) { if ( m_verRichEdit == 2 ) - { + { if ( wxRichEditModule::Load(wxRichEditModule::Version_41) ) { // yes, class name for version 4.1 really is 5.0 @@ -414,7 +454,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_verRichEdit = 0; } } - } // !useInkEdit + } // !useInkEdit } #endif // wxUSE_RICHEDIT @@ -441,12 +481,12 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, // Pass IEM_InsertText (0) as wParam, in order to have the ink always // converted to text. ::SendMessage(GetHwnd(), EM_SETINKINSERTMODE, 0, 0); - + // Make sure the mouse can be used for input ::SendMessage(GetHwnd(), EM_SETUSEMOUSEFORINPUT, 1, 0); } #endif - + // enable the events we're interested in: we want to get EN_CHANGE as // for the normal controls LPARAM mask = ENM_CHANGE; @@ -479,6 +519,9 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, } #endif // wxUSE_RICHEDIT + gs_wndprocEdit = wxSetWindowProc((HWND)GetHwnd(), + wxTextCtrlWndProc); + return true; } @@ -749,20 +792,24 @@ void wxTextCtrl::SetValue(const wxString& value) { DoWriteText(value, false /* not selection only */); + // mark the control as being not dirty - we changed its text, not the + // user + DiscardEdits(); + // for compatibility, don't move the cursor when doing SetValue() SetInsertionPoint(0); } else // same text { + // still reset the modified flag even if the value didn't really change + // because now it comes from the program and not the user (and do it + // before generating the event so that the event handler could get the + // expected value from IsModified()) + DiscardEdits(); + // still send an event for consistency SendUpdateEvent(); } - - // we should reset the modified flag even if the value didn't really change - - // mark the control as being not dirty - we changed its text, not the - // user - DiscardEdits(); } #if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU) @@ -1184,7 +1231,8 @@ void wxTextCtrl::SetInsertionPointEnd() // if it doesn't actually move the caret anywhere and so the simple fact of // doing it results in horrible flicker when appending big amounts of text // to the control in a few chunks (see DoAddText() test in the text sample) - if ( GetInsertionPoint() == GetLastPosition() ) + const wxTextPos lastPosition = GetLastPosition(); + if ( GetInsertionPoint() == lastPosition ) { return; } @@ -1200,7 +1248,7 @@ void wxTextCtrl::SetInsertionPointEnd() else // !RichEdit 1.0 #endif // wxUSE_RICHEDIT { - pos = GetLastPosition(); + pos = lastPosition; } SetInsertionPoint(pos); @@ -1735,18 +1783,17 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event) // kbd input processing // ---------------------------------------------------------------------------- -bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg) +bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* msg) { - MSG *msg = (MSG *)pMsg; - // check for our special keys here: if we don't do it and the parent frame // uses them as accelerators, they wouldn't work at all, so we disable // usual preprocessing for them if ( msg->message == WM_KEYDOWN ) { - WORD vkey = (WORD) msg->wParam; - if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN ) + const WPARAM vkey = msg->wParam; + if ( HIWORD(msg->lParam) & KF_ALTDOWN ) { + // Alt-Backspace is accelerator for "Undo" if ( vkey == VK_BACK ) return false; } @@ -1764,6 +1811,9 @@ bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg) // fall through case 0: + if ( IsMultiLine() && vkey == VK_RETURN ) + return false; + // fall through case 2: break; @@ -1792,7 +1842,7 @@ bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg) } } - return wxControl::MSWShouldPreProcessMessage(pMsg); + return wxControl::MSWShouldPreProcessMessage(msg); } void wxTextCtrl::OnChar(wxKeyEvent& event) @@ -1800,16 +1850,15 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) switch ( event.GetKeyCode() ) { case WXK_RETURN: - if ( !HasFlag(wxTE_MULTILINE) ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); InitCommandEvent(event); event.SetString(GetValue()); if ( GetEventHandler()->ProcessEvent(event) ) + if ( !HasFlag(wxTE_MULTILINE) ) return; + //else: multiline controls need Enter for themselves } - //else: multiline controls need Enter for themselves - break; case WXK_TAB: @@ -2774,9 +2823,9 @@ bool wxRichEditModule::LoadInkEdit() static bool ms_inkEditLibLoadAttemped; if (ms_inkEditLibLoadAttemped) ms_inkEditLib.IsLoaded(); - + ms_inkEditLibLoadAttemped = true; - + wxLogNull logNull; return ms_inkEditLib.Load(wxT("inked")); }