]> git.saurik.com Git - wxWidgets.git/commitdiff
fixed processing of the implicit wxTextCtrl accelerators (Ctrl-C/V/X)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 5 Aug 2001 15:07:28 +0000 (15:07 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 5 Aug 2001 15:07:28 +0000 (15:07 +0000)
without breaking all the others by using a new MSWShouldPreProcessMessage()
function

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/textctrl.h
include/wx/msw/window.h
src/msw/app.cpp
src/msw/textctrl.cpp
src/msw/window.cpp

index b516b8c8a33c8a589afbf345d3a33c977a0655c5..b76a6d5fb8f3084d1254183115da3eb8dcab2f49 100644 (file)
@@ -172,6 +172,8 @@ protected:
     // limit is big enough)
     void AdjustSpaceLimit();
 
+    // override some base class virtuals
+    virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg);
     virtual wxSize DoGetBestSize() const;
 
 private:
index 27432a415d7c5436bd70592013e5cd0ba353bbe9..587deb23ca6971b04e8cb61db80c3f82f5dc85f6 100644 (file)
@@ -347,8 +347,20 @@ public:
 
     // Calls an appropriate default window procedure
     virtual long MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+
+    // message processing helpers
+
+    // return FALSE if the message shouldn't be translated/preprocessed but
+    // dispatched normally
+    virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg);
+
+    // return TRUE if the message was preprocessed and shouldn't be dispatched
     virtual bool MSWProcessMessage(WXMSG* pMsg);
+
+    // return TRUE if the message was translated and shouldn't be dispatched
     virtual bool MSWTranslateMessage(WXMSG* pMsg);
+
+    // called when the window is about to be destroyed
     virtual void MSWDestroyWindow();
 
     // Detach "Window" menu from menu bar so it doesn't get deleted
index ed4fa69c077f10691d4a3ffc851465cad38ed1a5..72d8437e63cf690832c1acdc218c5fd79db1c2b0 100644 (file)
@@ -1079,6 +1079,14 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg)
     }
 #endif // wxUSE_TOOLTIPS
 
+    // allow the window to prevent certain messages from being
+    // translated/processed (this is currently used by wxTextCtrl to always
+    // grab Ctrl-C/V/X, even if they are also accelerators in some parent)
+    if ( !wndThis->MSWShouldPreProcessMessage(wxmsg) )
+    {
+        return FALSE;
+    }
+
     // try translations first: the accelerators override everything
     wxWindow *wnd;
 
@@ -1094,13 +1102,16 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg)
             break;
     }
 
-    // now try the other hooks (kbd navigation is handled here)
-    for ( wnd = wndThis; wnd; wnd = wnd->GetParent() )
+    // now try the other hooks (kbd navigation is handled here): we start from
+    // wndThis->GetParent() because wndThis->MSWProcessMessage() was already
+    // called above
+    for ( wnd = wndThis->GetParent(); wnd; wnd = wnd->GetParent() )
     {
         if ( wnd->MSWProcessMessage(wxmsg) )
             return TRUE;
     }
 
+    // no special preprocessing for this message, dispatch it normally
     return FALSE;
 }
 
index f692d4857896d48cd2e3ca9c481bb98edbe37404..c6beb418d7fb96c206f249463c5ed39d45ae98f2 100644 (file)
@@ -928,6 +928,52 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
+// ----------------------------------------------------------------------------
+// kbd input processing
+// ----------------------------------------------------------------------------
+
+bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg)
+{
+    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 = msg->wParam;
+        if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
+        {
+            if ( vkey == VK_BACK )
+                return FALSE;
+        }
+        else // no Alt
+        {
+            if ( wxIsCtrlDown() )
+            {
+                switch ( vkey )
+                {
+                    case 'C':
+                    case 'V':
+                    case 'X':
+                    case VK_INSERT:
+                    case VK_DELETE:
+                    case VK_HOME:
+                    case VK_END:
+                        return FALSE;
+                }
+            }
+            else if ( wxIsShiftDown() )
+            {
+                if ( vkey == VK_INSERT || vkey == VK_DELETE )
+                    return FALSE;
+            }
+        }
+    }
+
+    return wxControl::MSWShouldPreProcessMessage(pMsg);
+}
+
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     switch ( event.KeyCode() )
index 27298fab610a257fb17434e735ce75a0dc3b557f..05e43c34de0ce7a9069bca690b553126f4ddf1ff 100644 (file)
@@ -1958,6 +1958,12 @@ bool wxWindowMSW::MSWTranslateMessage(WXMSG* pMsg)
 #endif // wxUSE_ACCEL
 }
 
+bool wxWindowMSW::MSWShouldPreProcessMessage(WXMSG* pMsg)
+{
+    // preprocess all messages by default
+    return TRUE;
+}
+
 // ---------------------------------------------------------------------------
 // message params unpackers (different for Win16 and Win32)
 // ---------------------------------------------------------------------------