]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
[ 1216436 ] cleanup 'shadow variable' warnings from gcc in headers.
[wxWidgets.git] / src / os2 / window.cpp
index 6c57b9aa91ddcf612968e21c2285c628f2ba7b89..bac428084893af6ecdcde8ba139bc0fadc340e04 100644 (file)
@@ -128,8 +128,6 @@ QMSG                      s_currentMsg;
 wxMenu*                   wxCurrentPopupMenu = NULL;
 #endif // wxUSE_MENUS_NATIVE
 
-wxList*                   wxWinHandleList = NULL;
-
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
@@ -218,17 +216,17 @@ wxWindow* wxWindowOS2::FindItem(
     }
 #endif // wxUSE_CONTROLS
 
-    wxWindowList::Node*             pCurrent = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator  current = GetChildren().GetFirst();
 
-    while (pCurrent)
+    while (current)
     {
-        wxWindow*                   pChildWin = pCurrent->GetData();
+        wxWindow*                   pChildWin = current->GetData();
         wxWindow*                   pWnd = pChildWin->FindItem(lId);
 
         if (pWnd)
             return pWnd;
 
-        pCurrent = pCurrent->GetNext();
+        current = current->GetNext();
     }
     return(NULL);
 } // end of wxWindowOS2::FindItem
@@ -241,11 +239,11 @@ wxWindow* wxWindowOS2::FindItemByHWND(
 , bool                              bControlOnly
 ) const
 {
-    wxWindowList::Node*             pCurrent = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator current = GetChildren().GetFirst();
 
-    while (pCurrent)
+    while (current)
     {
-        wxWindow*                   pParent = pCurrent->GetData();
+        wxWindow*                   pParent = current->GetData();
 
         //
         // Do a recursive search.
@@ -261,7 +259,7 @@ wxWindow* wxWindowOS2::FindItemByHWND(
 #endif // wxUSE_CONTROLS
             )
         {
-            wxWindow*               pItem = pCurrent->GetData();
+            wxWindow*               pItem = current->GetData();
 
             if (pItem->GetHWND() == hWnd)
                 return(pItem);
@@ -271,7 +269,7 @@ wxWindow* wxWindowOS2::FindItemByHWND(
                     return(pItem);
             }
         }
-        pCurrent = pCurrent->GetNext();
+        current = current->GetNext();
     }
     return(NULL);
 } // end of wxWindowOS2::FindItemByHWND
@@ -396,6 +394,10 @@ bool wxWindowOS2::Create(
                   _T("wxStaticBox can't be used as a window parent!") );
 #endif // wxUSE_STATBOX
 
+     // Ensure groupbox backgrounds are painted
+     if (IsKindOf(CLASSINFO(wxPanel)))
+         lStyle &= ~wxCLIP_CHILDREN;
+
     if ( !CreateBase( pParent
                      ,vId
                      ,rPos
@@ -506,11 +508,11 @@ bool wxWindowOS2::Enable(
     if (IsTopLevel())
         return TRUE;
 
-    wxWindowList::Node*             pNode = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator     node = GetChildren().GetFirst();
 
-    while (pNode)
+    while (node)
     {
-        wxWindow*                   pChild = pNode->GetData();
+        wxWindow*                   pChild = node->GetData();
 
         if (bEnable)
         {
@@ -540,7 +542,7 @@ bool wxWindowOS2::Enable(
                 m_pChildrenDisabled->Append(pChild);
             }
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
     if (bEnable && m_pChildrenDisabled)
     {
@@ -585,7 +587,7 @@ void wxWindowOS2::SetTitle(
   const wxString&                   rTitle
 )
 {
-    ::WinSetWindowText(GetHwnd(), rTitle.c_str());
+    ::WinSetWindowText(GetHwnd(), (PSZ)rTitle.c_str());
 } // end of wxWindowOS2::SetTitle
 
 wxString wxWindowOS2::GetTitle() const
@@ -1472,6 +1474,16 @@ void wxWindowOS2::DoMoveWindow(
     RECTL                           vRect;
     wxWindow*                       pParent = GetParent();
 
+    /* Due to OS/2's inverted coordinate system, changing the height
+       of a window requires repositioning all it's children, e.g. if
+       you want a child of height 100 to be at the top left corner of
+       the parent you need to position the lower left corner of the
+       child at (0, (height of parent - 100)), so, obviously, if the
+       height of the parent changes, the child needs to be repositioned. */
+    int                         nHeightDelta;
+    GetSize(0, &nHeightDelta);
+    nHeightDelta = nHeight - nHeightDelta;
+
     if (pParent && !IsKindOf(CLASSINFO(wxDialog)))
     {
         int                         nOS2Height = GetOS2ParentHeight(pParent);
@@ -1615,11 +1627,19 @@ void wxWindowOS2::DoMoveWindow(
                               ,vSwpScroll.cy - nAdjustHeight
                               ,SWP_MOVE | SWP_SIZE
                              );
-            nYDiff += nAdjustHeight;
+            nYDiff -= nAdjustHeight;
         }
         MoveChildren(nYDiff);
         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
     }
+#if 0
+    // FIXME: By my logic, the next line should be needed as it moves child
+    //        windows when resizing the parent (see comment at beginning of
+    //       function). However, this seems to cause lots of problems. At
+    //        least, e.g. the grid sample almost works with this line
+    //        commented out but crashes badly with it. 
+    MoveChildren(nHeightDelta);
+#endif
 } // end of wxWindowOS2::DoMoveWindow
 
 //
@@ -1777,11 +1797,6 @@ void wxWindowOS2::DoSetClientSize(
     GetEventHandler()->ProcessEvent(vEvent);
 } // end of wxWindowOS2::DoSetClientSize
 
-wxPoint wxWindowOS2::GetClientAreaOrigin() const
-{
-    return wxPoint(0, 0);
-} // end of wxWindowOS2::GetClientAreaOrigin
-
 // ---------------------------------------------------------------------------
 // text metrics
 // ---------------------------------------------------------------------------
@@ -1951,10 +1966,15 @@ bool wxWindowOS2::DoPopupMenu(
     HWND                            hWndParent = GetHwnd();
     HWND                            hMenu = GetHmenuOf(pMenu);
     bool                            bIsWaiting = TRUE;
+    int                             nHeight;
+
+    // Protect against recursion
+    if (wxCurrentPopupMenu)
+        return false;
 
     pMenu->SetInvokingWindow(this);
     pMenu->UpdateUI();
-    
+
     if ( nX == -1 && nY == -1 )
     {
         wxPoint mouse = wxGetMousePosition();
@@ -1965,6 +1985,8 @@ bool wxWindowOS2::DoPopupMenu(
         DoClientToScreen( &nX
                          ,&nY
                         );
+        DoGetSize(0,&nHeight);
+        nY = nHeight - nY;
     }
     wxCurrentPopupMenu = pMenu;
 
@@ -1981,13 +2003,12 @@ bool wxWindowOS2::DoPopupMenu(
     {
         QMSG                            vMsg;
 
-        if (vMsg.msg == WM_MENUEND || vMsg.msg == WM_COMMAND)
-        {
+        ::WinGetMsg(vHabmain,&vMsg, (HWND)0, 0, 0);
+        if (vMsg.msg == WM_COMMAND)
             bIsWaiting = FALSE;
-        }
         ::WinDispatchMsg(vHabmain, (PQMSG)&vMsg);
-
     }
+
     wxCurrentPopupMenu = NULL;
     pMenu->SetInvokingWindow(NULL);
     return TRUE;
@@ -2958,6 +2979,20 @@ MRESULT wxWindowOS2::OS2WindowProc(
                 mResult = (MRESULT)TRUE;
             }
             break;
+
+#if wxUSE_MENUS_NATIVE
+         case WM_MENUEND:
+            if (wxCurrentPopupMenu)
+            {
+                if (GetHmenuOf(wxCurrentPopupMenu) == (HWND)lParam)
+                {
+                    // Break out of msg loop in DoPopupMenu
+                    ::WinPostMsg((HWND)lParam,WM_COMMAND,wParam,0);
+                }
+            }
+            break;
+#endif // wxUSE_MENUS_NATIVE
+
     }
     if (!bProcessed)
     {
@@ -2975,15 +3010,17 @@ MRESULT wxWindowOS2::OS2WindowProc(
     return mResult;
 } // end of wxWindowOS2::OS2WindowProc
 
+// ----------------------------------------------------------------------------
+// wxWindow <-> HWND map
+// ----------------------------------------------------------------------------
+
+wxWinHashTable *wxWinHandleHash = NULL;
+
 wxWindow* wxFindWinFromHandle(
   WXHWND                            hWnd
 )
 {
-    wxNode*                         pNode = wxWinHandleList->Find((long)hWnd);
-
-    if (!pNode)
-        return NULL;
-    return (wxWindow *)pNode->GetData();
+    return (wxWindow *)wxWinHandleHash->Get((long)hWnd);
 } // end of wxFindWinFromHandle
 
 void wxAssociateWinWithHandle(
@@ -3004,16 +3041,17 @@ void wxAssociateWinWithHandle(
     if (pOldWin && (pOldWin != pWin))
     {
         wxString                    str(pWin->GetClassInfo()->GetClassName());
-        wxLogError( "Bug! Found existing HWND %X for new window of class %s"
+
+        wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
                    ,(int)hWnd
-                   ,(const char*)str
+                   ,str.c_str()
                   );
     }
     else if (!pOldWin)
     {
-        wxWinHandleList->Append( (long)hWnd
-                                ,pWin
-                               );
+        wxWinHandleHash->Put( (long)hWnd
+                             ,(wxWindow *)pWin
+                            );
     }
 } // end of wxAssociateWinWithHandle
 
@@ -3021,7 +3059,7 @@ void wxRemoveHandleAssociation(
   wxWindowOS2*                      pWin
 )
 {
-    wxWinHandleList->DeleteObject(pWin);
+    wxWinHandleHash->Delete((long)pWin->GetHWND());
 } // end of wxRemoveHandleAssociation
 
 //
@@ -3075,7 +3113,7 @@ WXHWND wxWindowOS2::OS2GetParent() const
 
 bool wxWindowOS2::OS2Create(
   PSZ                               zClass
-, const char*                       zTitle
+, const wxChar*                     zTitle
 , WXDWORD                           dwStyle
 , const wxPoint&                    rPos
 , const wxSize&                     rSize
@@ -3121,7 +3159,7 @@ bool wxWindowOS2::OS2Create(
     }
     m_hWnd = (WXHWND)::WinCreateWindow( (HWND)OS2GetParent()
                                        ,(PSZ)sClassName.c_str()
-                                       ,(PSZ)zTitle ? zTitle : ""
+                                       ,(PSZ)(zTitle ? zTitle : wxEmptyString)
                                        ,(ULONG)dwStyle
                                        ,(LONG)0L
                                        ,(LONG)0L
@@ -3142,7 +3180,7 @@ bool wxWindowOS2::OS2Create(
     SubclassWin(m_hWnd);
     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 
-    m_backgroundColour.Set(wxString("GREY"));
+    m_backgroundColour.Set(wxString(wxT("GREY")));
 
     LONG                            lColor = (LONG)m_backgroundColour.GetPixel();
 
@@ -3154,7 +3192,7 @@ bool wxWindowOS2::OS2Create(
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error creating frame. Error: %s\n", sError.c_str());
+        wxLogError(_T("Error creating frame. Error: %s\n"), sError.c_str());
         return FALSE;
     }
     SetSize( nX
@@ -3327,7 +3365,7 @@ bool wxWindowOS2::HandleShow(
 {
     wxShowEvent                     vEvent(GetId(), bShow);
 
-    vEvent.m_eventObject = this;
+    vEvent.SetEventObject(this);
     return GetEventHandler()->ProcessEvent(vEvent);
 } // end of wxWindowOS2::HandleShow
 
@@ -3337,7 +3375,7 @@ bool wxWindowOS2::HandleInitDialog(
 {
     wxInitDialogEvent               vEvent(GetId());
 
-    vEvent.m_eventObject = this;
+    vEvent.SetEventObject(this);
     return GetEventHandler()->ProcessEvent(vEvent);
 } // end of wxWindowOS2::HandleInitDialog
 
@@ -3405,7 +3443,7 @@ bool wxWindowOS2::OS2OnDrawItem(
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
+            wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
         }
         //
         // Set the color table to RGB mode
@@ -3420,7 +3458,7 @@ bool wxWindowOS2::OS2OnDrawItem(
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
+            wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
         }
 
         wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
@@ -3629,23 +3667,23 @@ void wxWindowOS2::OnSysColourChanged(
   wxSysColourChangedEvent&          rEvent
 )
 {
-    wxWindowListNode*               pNode = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
 
-    while (pNode)
+    while (node)
     {
         //
         // Only propagate to non-top-level windows
         //
-        wxWindow*                   pWin = (wxWindow *)pNode->GetData();
+        wxWindow*                   pWin = (wxWindow *)node->GetData();
 
         if (pWin->GetParent())
         {
             wxSysColourChangedEvent vEvent;
 
-            rEvent.m_eventObject = pWin;
+            rEvent.SetEventObject(pWin);
             pWin->GetEventHandler()->ProcessEvent(vEvent);
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 } // end of wxWindowOS2::OnSysColourChanged
 
@@ -4026,7 +4064,7 @@ void wxWindowOS2::InitMouseEvent(
     rEvent.m_rightDown   = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) &
                            0x8000) != 0;
     rEvent.SetTimestamp(s_currentMsg.time);
-    rEvent.m_eventObject = this;
+    rEvent.SetEventObject(this);
     rEvent.SetId(GetId());
 
 #if wxUSE_MOUSEEVENT_HACK
@@ -4047,7 +4085,7 @@ bool wxWindowOS2::HandleMouseEvent(
 
     //
     // The mouse events take consecutive IDs from WM_MOUSEFIRST to
-    // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST
+    // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST
     // from the message id and take the value in the table to get wxWin event
     // id
     //
@@ -4065,26 +4103,30 @@ bool wxWindowOS2::HandleMouseEvent(
         wxEVT_MIDDLE_DCLICK
     };
 
-    wxMouseEvent                    vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]);
-
-    InitMouseEvent( vEvent
-                   ,nX
-                   ,nY
-                   ,uFlags
-                  );
-
-    bProcessed = GetEventHandler()->ProcessEvent(vEvent);
-    if (!bProcessed)
+    // Bounds check
+    if ((uMsg >= WM_MOUSEMOVE) && (uMsg <= WM_BUTTON3DBLCLK))
     {
-        HPOINTER                    hCursor = (HPOINTER)GetCursor().GetHCURSOR();
+        wxMouseEvent               vEvent(eventsMouse[uMsg - WM_MOUSEMOVE]);
 
-        if (hCursor != NULLHANDLE)
+        InitMouseEvent( vEvent
+                       ,nX
+                       ,nY
+                       ,uFlags
+                       );
+
+        bProcessed = GetEventHandler()->ProcessEvent(vEvent);
+        if (!bProcessed)
         {
-            ::WinSetPointer(HWND_DESKTOP, hCursor);
-            bProcessed = TRUE;
+            HPOINTER               hCursor = (HPOINTER)GetCursor().GetHCURSOR();
+
+            if (hCursor != NULLHANDLE)
+            {
+                ::WinSetPointer(HWND_DESKTOP, hCursor);
+                bProcessed = TRUE;
+            }
         }
     }
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return bProcessed;
 } // end of wxWindowOS2::HandleMouseEvent
 
 bool wxWindowOS2::HandleMouseMove(
@@ -4139,7 +4181,7 @@ wxKeyEvent wxWindowOS2::CreateKeyEvent(
     vEvent.m_controlDown = IsCtrlDown();
     vEvent.m_altDown     = (HIWORD(lParam) & KC_ALT) == KC_ALT;
 
-    vEvent.m_eventObject = (wxWindow *)this; // const_cast
+    vEvent.SetEventObject((wxWindow *)this); // const_cast
     vEvent.m_keyCode     = nId;
     vEvent.m_rawCode = (wxUint32)wParam;
     vEvent.m_rawFlags = (wxUint32)lParam;
@@ -4280,15 +4322,15 @@ bool wxWindowOS2::HandleKeyUp(
         //
         // Normal ASCII char
         //
-        nId = (int)wParam;
+        nId = CHAR1FROMMP(lParam);
     }
 
     if (nId != -1)
     {
         wxKeyEvent                  vEvent(CreateKeyEvent( wxEVT_KEY_UP
                                                           ,nId
-                                                          ,lParam
-                                                          ,wParam
+                                                          ,(MPARAM)lParam
+                                                          ,(MPARAM)wParam
                                                          ));
 
         if (GetEventHandler()->ProcessEvent(vEvent))
@@ -4328,32 +4370,32 @@ bool wxWindowOS2::OS2OnScroll(
 
     vEvent.SetPosition(wPos);
     vEvent.SetOrientation(nOrientation);
-    vEvent.m_eventObject = this;
+    vEvent.SetEventObject(this);
 
     switch (wParam)
     {
         case SB_LINEUP:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_LINEUP;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_LINEUP);
             break;
 
         case SB_LINEDOWN:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_LINEDOWN);
             break;
 
         case SB_PAGEUP:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEUP;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_PAGEUP);
             break;
 
         case SB_PAGEDOWN:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN);
             break;
 
         case SB_SLIDERPOSITION:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE);
             break;
 
         case SB_SLIDERTRACK:
-            vEvent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
+            vEvent.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK);
             break;
 
         default:
@@ -4377,15 +4419,19 @@ void wxWindowOS2::MoveChildren(
     {
         SWP                         vSwp;
 
-        for (wxWindowList::Node* pNode = GetChildren().GetFirst();
-             pNode;
-             pNode = pNode->GetNext())
+        for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+             node;
+             node = node->GetNext())
         {
-            wxWindow*               pWin = pNode->GetData();
+            wxWindow*               pWin = node->GetData();
 
             ::WinQueryWindowPos( GetHwndOf(pWin)
                                 ,&vSwp
                                );
+            // Actually, only move children that already are placed on the
+            // frame, not ones which are still at wxDefaultCoord.
+            if (vSwp.y == wxDefaultCoord)
+                continue;
             if (pWin->IsKindOf(CLASSINFO(wxControl)))
             {
                 wxControl*          pCtrl;
@@ -4590,6 +4636,8 @@ int wxCharCodeOS2ToWX(
         case VK_CTRL:       nId = WXK_CONTROL; break;
         case VK_PAUSE:      nId = WXK_PAUSE; break;
         case VK_SPACE:      nId = WXK_SPACE; break;
+        case VK_PAGEUP:     nId = WXK_PRIOR; break;
+        case VK_PAGEDOWN:   nId = WXK_NEXT; break;
         case VK_ESC:        nId = WXK_ESCAPE; break;
         case VK_END:        nId = WXK_END; break;
         case VK_HOME :      nId = WXK_HOME; break;
@@ -4660,6 +4708,8 @@ int wxCharCodeWXToOS2(
         case WXK_SHIFT:     nKeySym = VK_SHIFT; break;
         case WXK_CONTROL:   nKeySym = VK_CTRL; break;
         case WXK_PAUSE:     nKeySym = VK_PAUSE; break;
+        case WXK_PRIOR:     nKeySym = VK_PAGEUP; break;
+        case WXK_NEXT :     nKeySym = VK_PAGEDOWN; break;
         case WXK_END:       nKeySym = VK_END; break;
         case WXK_HOME :     nKeySym = VK_HOME; break;
         case WXK_LEFT :     nKeySym = VK_LEFT; break;
@@ -5276,7 +5326,7 @@ wxWindowOS2* FindWindowForMouseEvent(
 
         if (pWinUnderMouse)
         {
-            wxWindowList::Node*     pCurrent = pWinUnderMouse->GetChildren().GetFirst();
+            wxWindowList::compatibility_iterator current = pWinUnderMouse->GetChildren().GetFirst();
             wxWindow*               pGrandChild = NULL;
             RECTL                   vRect;
             POINTL                  vPoint2;
@@ -5285,9 +5335,9 @@ wxWindowOS2* FindWindowForMouseEvent(
             //
             // Find a child window mouse might be under
             //
-            while (pCurrent)
+            while (current)
             {
-                wxWindow*                   pChild = pCurrent->GetData();
+                wxWindow*                   pChild = current->GetData();
 
                 vPoint2.x = vPoint.x;
                 vPoint2.y = vPoint.y;
@@ -5298,11 +5348,11 @@ wxWindowOS2* FindWindowForMouseEvent(
                     if (pChild->IsTopLevel())
                     {
                         POINTL                  vPoint3;
-                        wxWindowList::Node*     pCurrent2 =pChild->GetChildren().GetFirst();
+                        wxWindowList::compatibility_iterator current2 =pChild->GetChildren().GetFirst();
 
-                        while (pCurrent2)
+                        while (current2)
                         {
-                            wxWindow*           pGrandChild = pCurrent2->GetData();
+                            wxWindow*           pGrandChild = current2->GetData();
 
                             vPoint3.x = vPoint2.x;
                             vPoint3.y = vPoint2.y;
@@ -5318,7 +5368,7 @@ wxWindowOS2* FindWindowForMouseEvent(
                                 pWinUnderMouse = pGrandChild;
                                 break;
                             }
-                            pCurrent2 = pCurrent2->GetNext();
+                            current2 = current2->GetNext();
                         }
                         if (pGrandChild)
                             break;
@@ -5330,7 +5380,7 @@ wxWindowOS2* FindWindowForMouseEvent(
                     if (rcVisible && rcEnabled)
                         break;
                 }
-                pCurrent = pCurrent->GetNext();
+                current = current->GetNext();
             }
         }
     }