]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
Modified wxMSW listbox.cpp to work with wxCommandEvent::m_commandString
[wxWidgets.git] / src / msw / window.cpp
index ff224f849206b2c3a636c8e68709493807f20735..404ae402a7a6e9200f0c5546996e79d8213b47b8 100644 (file)
 
 #include "wx/menuitem.h"
 #include "wx/log.h"
+
+#if wxUSE_TOOLTIPS
 #include "wx/tooltip.h"
+#endif
+
+#include "wx/intl.h"
+#include "wx/log.h"
 
 #include "wx/msw/private.h"
 
+#include "wx/textctrl.h"
+
 #include <string.h>
 
 #ifndef __GNUWIN32__
@@ -189,6 +197,7 @@ bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam),
                          WXLPARAM* WXUNUSED(result))
 {
 #ifdef __WIN95__
+#if wxUSE_TOOLTIPS
     NMHDR* hdr = (NMHDR *)lParam;
     if ( hdr->code == TTN_NEEDTEXT && m_tooltip )
     {
@@ -198,6 +207,7 @@ bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam),
         // processed
         return TRUE;
     }
+#endif
 #endif
 
     return FALSE;
@@ -223,13 +233,15 @@ void wxWindow::SetHWND(WXHWND hWnd)
 
 void wxWindow::Init()
 {
+    m_isWindow = TRUE;
+
     // Generic
+//    m_windowCursor = * wxSTANDARD_CURSOR;
     m_windowId = 0;
     m_isShown = TRUE;
     m_windowStyle = 0;
     m_windowParent = NULL;
     m_windowEventHandler = this;
-    m_windowCursor = *wxSTANDARD_CURSOR;
     m_children = new wxList;
     m_doubleClickAllowed = 0 ;
     m_winCaptured = FALSE;
@@ -287,7 +299,9 @@ void wxWindow::Init()
     m_pDropTarget = NULL;
 #endif
 
+#if wxUSE_TOOLTIPS
     m_tooltip = NULL;
+#endif
 }
 
 wxWindow::wxWindow()
@@ -302,7 +316,9 @@ wxWindow::~wxWindow()
 
     // first of all, delete the things on which nothing else depends
 
+#if wxUSE_TOOLTIPS
     wxDELETE(m_tooltip);
+#endif
 
     // JACS - if behaviour is odd, restore this
     // to the start of ~wxWindow. Vadim has changed
@@ -542,6 +558,8 @@ void wxWindow::DragAcceptFiles(bool accept)
 // tooltips
 // ----------------------------------------------------------------------------
 
+#if wxUSE_TOOLTIPS
+
 void wxWindow::SetToolTip(const wxString &tip)
 {
     SetToolTip(new wxToolTip(tip));
@@ -556,6 +574,8 @@ void wxWindow::SetToolTip(wxToolTip *tooltip)
     m_tooltip->SetWindow(this);
 }
 
+#endif // wxUSE_TOOLTIPS
+
 // Get total size
 void wxWindow::GetSize(int *x, int *y) const
 {
@@ -654,12 +674,12 @@ void wxWindow::GetClientSize(int *x, int *y) const
 {
     HWND hWnd = (HWND) GetHWND();
     RECT rect;
-    GetClientRect(hWnd, &rect);
+    ::GetClientRect(hWnd, &rect);
     *x = rect.right;
     *y = rect.bottom;
 }
 
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
     int currentX, currentY;
     GetPosition(&currentX, &currentY);
@@ -690,14 +710,16 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
         MoveWindow(hWnd, actualX, actualY, actualWidth, actualHeight, (BOOL)TRUE);
 }
 
-void wxWindow::SetClientSize(int width, int height)
+void wxWindow::DoSetClientSize(int width, int height)
 {
     wxWindow *parent = GetParent();
     HWND hWnd = (HWND) GetHWND();
-    HWND hParentWnd = (HWND) (HWND) parent->GetHWND();
+    HWND hParentWnd = (HWND) 0;
+    if (parent)
+        hParentWnd = (HWND) parent->GetHWND();
 
     RECT rect;
-    GetClientRect(hWnd, &rect);
+    ::GetClientRect(hWnd, &rect);
 
     RECT rect2;
     GetWindowRect(hWnd, &rect2);
@@ -746,13 +768,14 @@ void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
 
 bool wxWindow::Show(bool show)
 {
+    m_isShown = show;
     HWND hWnd = (HWND) GetHWND();
     int cshow;
     if (show)
         cshow = SW_SHOW;
     else
         cshow = SW_HIDE;
-    ShowWindow(hWnd, (BOOL)cshow);
+    ShowWindow(hWnd, cshow);
     if (show)
     {
         BringWindowToTop(hWnd);
@@ -764,7 +787,11 @@ bool wxWindow::Show(bool show)
 
 bool wxWindow::IsShown(void) const
 {
-    return (::IsWindowVisible((HWND) GetHWND()) != 0);
+    // Can't rely on IsWindowVisible, since it will return FALSE
+    // if the parent is not visible.
+    return m_isShown;
+//    int ret = ::IsWindowVisible((HWND) GetHWND()) ;
+//    return (ret != 0);
 }
 
 int wxWindow::GetCharHeight(void) const
@@ -914,7 +941,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
     #define DIMENSION_TYPE int
 #endif
 
-// Main Windows window proc
+// Main Windows window proc
 long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
     wxASSERT( m_lastMsg == message &&
@@ -1152,6 +1179,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWOnSysCommand(wParam, lParam);
             break;
         }
+
     case WM_COMMAND:
         {
 #ifdef __WIN32__
@@ -1203,12 +1231,19 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWOnMeasureItem((int)wParam, (WXMEASUREITEMSTRUCT *)lParam);
             break;
         }
-
     case WM_KEYDOWN:
-        MSWOnKeyDown((WORD) wParam, lParam);
-        // we consider these message "not interesting"
+        // If this has been processed by an event handler,
+        // return 0 now (we've handled it).
+        if (MSWOnKeyDown((WORD) wParam, lParam))
+        {
+            return 0;
+        }
+
+        // we consider these message "not interesting" to OnChar
         if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
+        {
             return Default();
+        }
 
         // Avoid duplicate messages to OnChar for these special keys
         switch ( wParam )
@@ -1222,30 +1257,58 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             case VK_RIGHT:
             case VK_DOWN:
             case VK_UP:
-                if ( ::GetKeyState(VK_CONTROL) & 0x100 )
-                    MSWOnChar((WORD)wParam, lParam);
+                return Default();
+
+#ifdef VK_APPS
+            // special case of VK_APPS: treat it the same as right mouse click
+            // because both usually pop up a context menu
+            case VK_APPS:
+                {
+
+#ifndef GET_X_LPARAM
+#define GET_X_LPARAM(lp)                        ((int)(short)LOWORD(lp))
+#define GET_Y_LPARAM(lp)                        ((int)(short)HIWORD(lp))
+#endif
+
+                    // construct the key mask
+                    WPARAM fwKeys = MK_RBUTTON;
+                    if ( (::GetKeyState(VK_CONTROL) & 0x100) != 0 )
+                        fwKeys |= MK_CONTROL;
+                    if ( (::GetKeyState(VK_SHIFT) & 0x100) != 0 )
+                        fwKeys |= MK_SHIFT;
+
+                    // simulate right mouse button click
+                    DWORD dwPos = ::GetMessagePos();
+                    int x = GET_X_LPARAM(dwPos),
+                        y = GET_Y_LPARAM(dwPos);
+
+                    ScreenToClient(&x, &y);
+                    MSWOnRButtonDown(x, y, fwKeys);
+                }
                 break;
+#endif // VK_APPS
 
             default:
-                MSWOnChar((WORD)wParam, lParam);
-                if ( ::GetKeyState(VK_CONTROL) & 0x100 )
+                if (!MSWOnChar((WORD)wParam, lParam))
+                {
                     return Default();
+                }
                 break;
         }
 
         break;
-
     case WM_KEYUP:
     {
-        MSWOnKeyUp((WORD) wParam, lParam);
+        if (!MSWOnKeyUp((WORD) wParam, lParam))
+            return Default();
         break;
     }
     case WM_CHAR: // Always an ASCII character
         {
-            MSWOnChar((WORD)wParam, lParam, TRUE);
+            if (!MSWOnChar((WORD)wParam, lParam, TRUE))
+                return Default();
             break;
         }
-
     case WM_HSCROLL:
         {
 #ifdef __WIN32__
@@ -1423,7 +1486,6 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
                 return 1L;
             break;
         }
-
     case WM_GETMINMAXINFO:
         {
             MINMAXINFO *info = (MINMAXINFO *)lParam;
@@ -1438,9 +1500,64 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             return MSWDefWindowProc(message, wParam, lParam );
             break;
         }
-
     case WM_GETDLGCODE:
-        return MSWGetDlgCode();
+        {
+            return MSWGetDlgCode();
+        }
+    case WM_SETCURSOR:
+        {
+            // don't set cursor for other windows, only for this one: this
+            // prevents children of this window from gettign the same cursor
+            // as the parent has (don't forget that this message is propagated
+            // by default up the window parent-child hierarchy)
+            if ( (HWND)wParam == hWnd )
+            {
+                // don't set cursor when the mouse is not in the client part
+                short nHitTest = LOWORD(lParam);
+                if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
+                {
+                    HCURSOR hcursor = 0;
+                    if ( wxIsBusy() )
+                    {
+                        // from msw\utils.cpp
+                        extern HCURSOR gs_wxBusyCursor;
+
+                        hcursor = gs_wxBusyCursor;
+                    }
+                    else
+                    {
+                        wxCursor *cursor = NULL;
+
+                        if ( m_windowCursor.Ok() )
+                        {
+                            cursor = &m_windowCursor;
+                        }
+                        else
+                        {
+                            // from msw\data.cpp
+                            extern wxCursor *g_globalCursor;
+
+                            if ( g_globalCursor && g_globalCursor->Ok() )
+                                cursor = g_globalCursor;
+                        }
+
+                        if ( cursor )
+                            hcursor = (HCURSOR)cursor->GetHCURSOR();
+                    }
+
+                    if ( hcursor )
+                    {
+                        ::SetCursor(hcursor);
+
+                        // returning TRUE stops the DefWindowProc() from
+                        // further processing this message - exactly what we
+                        // need because we've just set the cursor.
+                        return TRUE;
+                    }
+                }
+            }
+        }
+        return MSWDefWindowProc(message, wParam, lParam );
 
     default:
         return MSWDefWindowProc(message, wParam, lParam );
@@ -1682,7 +1799,7 @@ long wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam)
 #endif  // Win95
 
     // not processed
-    return FALSE;
+    return Default();
 }
 
 void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu))
@@ -1716,7 +1833,7 @@ bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd))
     wxWindow *parent = GetParent();
     if ( parent && parent->IsKindOf(CLASSINFO(wxPanel)) )
     {
-        ((wxPanel *)parent)->SetLastFocus(this);
+        ((wxPanel *)parent)->SetLastFocus(GetId());
     }
 
     wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
@@ -1999,7 +2116,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
                             // it
                             return FALSE;
                         }
-
+#ifndef __WIN16__
                         wxButton *btnDefault = GetDefaultItem();
                         if ( btnDefault && !bCtrlDown )
                         {
@@ -2012,6 +2129,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
                         // else: but if there is not it makes sense to make it
                         //       work like a TAB - and that's what we do.
                         //       Note that Ctrl-Enter always works this way.
+#endif
                     }
                     break;
 
@@ -2034,6 +2152,7 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
         if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
             return TRUE;
     }
+
 #if wxUSE_TOOLTIPS
     if ( m_tooltip )
     {
@@ -2044,6 +2163,19 @@ bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
     }
 #endif // wxUSE_TOOLTIPS
 
+/* This code manages to disable character input completely. Nice one!
+ * Probably because the dialog is requesting all char input. Or,
+ * it gets called by non-dialog windows.
+
+    // In case we don't have wxTAB_TRAVERSAL style on.
+    // If we don't call this, we may never process Enter correctly.
+    if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) == 0 )
+    {
+        MSG *msg = (MSG *)pMsg;
+        if ( ::IsDialogMessage((HWND)GetHWND(), msg) )
+            return TRUE;
+    }
+*/
     return FALSE;
 }
 
@@ -2153,7 +2285,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control)
 
 long wxWindow::MSWOnSysCommand(WXWPARAM wParam, WXLPARAM lParam)
 {
-    switch (wParam)
+    switch (wParam & 0xFFFFFFF0)
     {
     case SC_MAXIMIZE:
         {
@@ -2355,11 +2487,6 @@ void wxWindow::MSWOnRButtonDClick(int x, int y, WXUINT flags)
 void wxWindow::MSWOnMouseMove(int x, int y, WXUINT flags)
 {
     // 'normal' move event...
-    // Set cursor, but only if we're not in 'busy' mode
-
-    // Trouble with this is that it sets the cursor for controls too :-(
-    if (m_windowCursor.Ok() && !wxIsBusy())
-        ::SetCursor((HCURSOR) m_windowCursor.GetHCURSOR());
 
     if (!m_mouseInWindow)
     {
@@ -2438,7 +2565,7 @@ void wxWindow::MSWOnMouseLeave(int x, int y, WXUINT flags)
     GetEventHandler()->ProcessEvent(event);
 }
 
-void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+bool wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 {
     int id;
     bool tempControlDown = FALSE;
@@ -2500,12 +2627,16 @@ void wxWindow::MSWOnChar(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 
         event.m_x = pt.x; event.m_y = pt.y;
 
-        if (!GetEventHandler()->ProcessEvent(event))
-            Default();
+        if (GetEventHandler()->ProcessEvent(event))
+            return TRUE;
+        else
+            return FALSE;
     }
+    else
+        return FALSE;
 }
 
-void wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+bool wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 {
     int id;
 
@@ -2534,12 +2665,19 @@ void wxWindow::MSWOnKeyDown(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 
         event.m_x = pt.x; event.m_y = pt.y;
 
-        if (!GetEventHandler()->ProcessEvent(event))
-            Default();
+        if (GetEventHandler()->ProcessEvent(event))
+        {
+            return TRUE;
+        }
+        else return FALSE;
+    }
+    else
+    {
+        return FALSE;
     }
 }
 
-void wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII)
+bool wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 {
     int id;
 
@@ -2568,9 +2706,13 @@ void wxWindow::MSWOnKeyUp(WXWORD wParam, WXLPARAM lParam, bool isASCII)
 
         event.m_x = pt.x; event.m_y = pt.y;
 
-        if (!GetEventHandler()->ProcessEvent(event))
-            Default();
+        if (GetEventHandler()->ProcessEvent(event))
+            return TRUE;
+        else
+            return FALSE;
     }
+    else
+        return FALSE;
 }
 
 void wxWindow::MSWOnJoyDown(int joystick, int x, int y, WXUINT flags)
@@ -3648,10 +3790,25 @@ void wxWindow::OnChar(wxKeyEvent& event)
     if ( id == -1 )
         id= m_lastWParam;
 
-    if ( !event.ControlDown() )
+    if ( !event.ControlDown() ) // Why this test?
         (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam);
 }
 
+void wxWindow::OnKeyDown(wxKeyEvent& event)
+{
+    Default();
+}
+
+void wxWindow::OnKeyUp(wxKeyEvent& event)
+{
+    Default();
+}
+
+void wxWindow::OnPaint(wxPaintEvent& event)
+{
+    Default();
+}
+
 bool wxWindow::IsEnabled(void) const
 {
     return (::IsWindowEnabled((HWND) GetHWND()) != 0);