From: Vadim Zeitlin Date: Sun, 7 Apr 2002 22:29:04 +0000 (+0000) Subject: added wxTextCtrl::EmulateKeyPress X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/94af7d45eff65baa84c142b8238267217ba4617d added wxTextCtrl::EmulateKeyPress git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15005 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 225e93cceb..b01523546d 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -143,6 +143,7 @@ All (GUI): - added wxImage::FloodFill and implemented wxWindowDC::DoFloodFill method for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott) - added (platform-dependent) scan code to wxKeyEvent (Bryce Denney) +- added wxTextCtrl::EmulateKeyPress() wxMSW: diff --git a/docs/latex/wx/text.tex b/docs/latex/wx/text.tex index cc05b73006..b91a240ec3 100644 --- a/docs/latex/wx/text.tex +++ b/docs/latex/wx/text.tex @@ -395,6 +395,20 @@ Copies the selected text to the clipboard and removes the selection. Resets the internal `modified' flag as if the current edits had been saved. +\membersection{wxTextCtrl::EmulateKeyPress} + +\func{bool}{EmulateKeyPress}{\param{const wxKeyEvent\& }{event}} + +This functions inserts into the control the character which would have been +inserted if the given key event had occured in the text control. The +{\it event} object should be the same as the one passed to {\tt EVT\_KEY\_DOWN} +handler previously by wxWindows. + +\wxheading{Return value} + +{\tt TRUE} if the event resulted in a change to the control, {\tt FALSE} +otherwise. + \membersection{wxTextCtrl::GetDefaultStyle}\label{wxtextctrlgetdefaultstyle} \constfunc{const wxTextAttr\& }{GetDefaultStyle}{\void} diff --git a/include/wx/msw/textctrl.h b/include/wx/msw/textctrl.h index 66114fa0c7..c5e03295f3 100644 --- a/include/wx/msw/textctrl.h +++ b/include/wx/msw/textctrl.h @@ -82,6 +82,10 @@ public: virtual void WriteText(const wxString& text); virtual void AppendText(const wxString& text); +#ifdef __WIN32__ + virtual bool EmulateKeyPress(const wxKeyEvent& event); +#endif // __WIN32__ + #if wxUSE_RICHEDIT // apply text attribute to the range of text (only works with richedit // controls) diff --git a/include/wx/textctrl.h b/include/wx/textctrl.h index 0905218aae..141cbbe847 100644 --- a/include/wx/textctrl.h +++ b/include/wx/textctrl.h @@ -203,6 +203,10 @@ public: virtual void WriteText(const wxString& text) = 0; virtual void AppendText(const wxString& text) = 0; + // insert the character which would have resulted from this key event, + // return TRUE if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + // text control under some platforms supports the text styles: these // methods allow to apply the given text style to the given selection or to // set/get the style which will be used for all appended text diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index 11c063dfdd..bf4de031f1 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -277,6 +277,84 @@ bool wxTextCtrlBase::CanPaste() const return IsEditable(); } +// ---------------------------------------------------------------------------- +// emulating key presses +// ---------------------------------------------------------------------------- + +bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event) +{ + // the generic version is unused in wxMSW +#ifndef __WIN32__ + wxChar ch; + int keycode = event.GetKeyCode(); + switch ( keycode ) + { + case WXK_NUMPAD0: + case WXK_NUMPAD1: + case WXK_NUMPAD2: + case WXK_NUMPAD3: + case WXK_NUMPAD4: + case WXK_NUMPAD5: + case WXK_NUMPAD6: + case WXK_NUMPAD7: + case WXK_NUMPAD8: + case WXK_NUMPAD9: + ch = _T('0') + keycode - WXK_NUMPAD0; + break; + + case WXK_MULTIPLY: + case WXK_NUMPAD_MULTIPLY: + ch = _T('*'); + break; + + case WXK_ADD: + case WXK_NUMPAD_ADD: + ch = _T('+'); + break; + + case WXK_SUBTRACT: + case WXK_NUMPAD_SUBTRACT: + ch = _T('-'); + break; + + case WXK_DECIMAL: + case WXK_NUMPAD_DECIMAL: + ch = _T('.'); + break; + + case WXK_DIVIDE: + case WXK_NUMPAD_DIVIDE: + ch = _T('/'); + break; + + default: + if ( keycode < 256 && keycode >= 0 && isprint(keycode) ) + { + // FIXME this is not going to work for non letters... + if ( !event.ShiftDown() ) + { + keycode = tolower(keycode); + } + + ch = (wxChar)keycode; + } + else + { + ch = _T('\0'); + } + } + + if ( ch ) + { + WriteText(ch); + + return TRUE; + } +#endif // !__WIN32__ + + return FALSE; +} + // ---------------------------------------------------------------------------- // selection and ranges // ---------------------------------------------------------------------------- diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index b6afb0c214..101e6cf372 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -708,73 +708,7 @@ bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event) void wxGridCellTextEditor::StartingKey(wxKeyEvent& event) { - // we don't check for !HasModifiers() because IsAcceptedKey() did it - - // insert the key in the control - wxChar ch; - int keycode = event.GetKeyCode(); - switch ( keycode ) - { - case WXK_NUMPAD0: - case WXK_NUMPAD1: - case WXK_NUMPAD2: - case WXK_NUMPAD3: - case WXK_NUMPAD4: - case WXK_NUMPAD5: - case WXK_NUMPAD6: - case WXK_NUMPAD7: - case WXK_NUMPAD8: - case WXK_NUMPAD9: - ch = _T('0') + keycode - WXK_NUMPAD0; - break; - - case WXK_MULTIPLY: - case WXK_NUMPAD_MULTIPLY: - ch = _T('*'); - break; - - case WXK_ADD: - case WXK_NUMPAD_ADD: - ch = _T('+'); - break; - - case WXK_SUBTRACT: - case WXK_NUMPAD_SUBTRACT: - ch = _T('-'); - break; - - case WXK_DECIMAL: - case WXK_NUMPAD_DECIMAL: - ch = _T('.'); - break; - - case WXK_DIVIDE: - case WXK_NUMPAD_DIVIDE: - ch = _T('/'); - break; - - default: - if ( keycode < 256 && keycode >= 0 && isprint(keycode) ) - { - // FIXME this is not going to work for non letters... - if ( !event.ShiftDown() ) - { - keycode = tolower(keycode); - } - - ch = (wxChar)keycode; - } - else - { - ch = _T('\0'); - } - } - - if ( ch ) - { - Text()->AppendText(ch); - } - else + if ( !Text()->EmulateKeyPress(event) ) { event.Skip(); } diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 43ca7b27ef..cee29ac19e 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -692,6 +692,25 @@ void wxTextCtrl::Clear() ::SetWindowText(GetHwnd(), wxT("")); } +#ifdef __WIN32__ + +bool wxTextCtrl::EmulateKeyPress(const wxKeyEvent& event) +{ + SetFocus(); + + size_t lenOld = GetValue().length(); + + wxUint32 code = event.GetRawKeyCode(); + ::keybd_event(code, 0, 0 /* key press */, NULL); + ::keybd_event(code, 0, KEYEVENTF_KEYUP, NULL); + + // assume that any alphanumeric key changes the total number of characters + // in the control - this should work in 99% of cases + return GetValue().length() != lenOld; +} + +#endif // __WIN32__ + // ---------------------------------------------------------------------------- // Clipboard operations // ----------------------------------------------------------------------------