]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
Fix the off-by-one a little differently, and correct a refresh problem
[wxWidgets.git] / src / os2 / window.cpp
index 25610ad24863b1e170559b5cd6c8c934dab7461f..df354d873394e9a80904ec08c894bad668f59ead 100644 (file)
@@ -294,17 +294,11 @@ bool wxWindowOS2::OS2Command(
 
 void wxWindowOS2::Init()
 {
 
 void wxWindowOS2::Init()
 {
-    //
-    // Generic
-    //
-    InitBase();
-
     //
     // PM specific
     //
     m_bWinCaptured = FALSE;
 
     //
     // PM specific
     //
     m_bWinCaptured = FALSE;
 
-    m_isBeingDeleted        = FALSE;
     m_fnOldWndProc          = NULL;
     m_bUseCtl3D             = FALSE;
     m_bMouseInWindow        = FALSE;
     m_fnOldWndProc          = NULL;
     m_bUseCtl3D             = FALSE;
     m_bMouseInWindow        = FALSE;
@@ -362,9 +356,6 @@ wxWindowOS2::~wxWindowOS2()
 
     DestroyChildren();
 
 
     DestroyChildren();
 
-    if (m_parent)
-        m_parent->RemoveChild(this);
-
     if (m_hWnd)
     {
         if(!::WinDestroyWindow(GetHWND()))
     if (m_hWnd)
     {
         if(!::WinDestroyWindow(GetHWND()))
@@ -691,81 +682,11 @@ void wxWindowOS2::WarpPointer(
     ::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY));
 } // end of wxWindowOS2::WarpPointer
 
     ::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY));
 } // end of wxWindowOS2::WarpPointer
 
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::OS2DeviceToLogical (float *x, float *y) const
-{
-}
-#endif // WXWIN_COMPATIBILITY
 
 // ---------------------------------------------------------------------------
 // scrolling stuff
 // ---------------------------------------------------------------------------
 
 
 // ---------------------------------------------------------------------------
 // scrolling stuff
 // ---------------------------------------------------------------------------
 
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::SetScrollRange(
-  int                               nOrient
-, int                               nRange
-, bool                              bRefresh
-)
-{
-    int                             nRange1 = nRange;
-    int                             nPageSize = GetScrollPage(nOrient);
-
-    if (nPpageSize > 1 && nRange > 0)
-    {
-        nRange1 += (nPageSize - 1);
-    }
-
-    if (nOrient == wxHORIZONTAL)
-    {
-        ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
-        ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
-    }
-    else
-    {
-        ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
-        ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
-    }
-} // end of wxWindowOS2::SetScrollRange
-
-void wxWindowOS2::SetScrollPage(
-  int                               nOrient
-, int                               nPage
-, bool                              bRefresh
-)
-{
-    if (nOrient == wxHORIZONTAL )
-        m_nXThumbSize = nPage;
-    else
-        m_nYThumbSize = nPage;
-} // end of wxWindowOS2::SetScrollPage
-
-int wxWindowOS2::OldGetScrollRange(
-  int                               nOrient
-) const
-{
-    MRESULT                         mRc;
-    HWND                            hWnd = GetHwnd();
-
-    if (hWnd)
-    {
-        mRc = WinSendMsg(hWnd, SBM_QUERYRANGE, (MPARAM)0L, (MPARAM)0L);
-        return(SHORT2FROMMR(mRc));
-     }
-     return 0;
-} // end of wxWindowOS2::OldGetScrollRange
-
-int  wxWindowOS2::GetScrollPage(
-  int                               nOrient
-) const
-{
-    if (nOrient == wxHORIZONTAL)
-        return m_nXThumbSize;
-    else
-        return m_nYThumbSize;
-} // end of wxWindowOS2::GetScrollPage
-#endif // WXWIN_COMPATIBILITY
-
 int  wxWindowOS2::GetScrollPos(
   int                               nOrient
 ) const
 int  wxWindowOS2::GetScrollPos(
   int                               nOrient
 ) const
@@ -1202,118 +1123,6 @@ WXDWORD wxWindowOS2::MakeExtendedStyle(
     return dwStyle;
 } // end of wxWindowOS2::MakeExtendedStyle
 
     return dwStyle;
 } // end of wxWindowOS2::MakeExtendedStyle
 
-//
-// Determines whether simulated 3D effects or CTL3D should be used,
-// applying a default border style if required, and returning an extended
-// style to pass to OS2Create.
-//
-WXDWORD wxWindowOS2::Determine3DEffects(
-  WXDWORD                           dwDefaultBorderStyle
-, bool*                             pbWant3D
-) const
-{
-    WXDWORD                         dwStyle = 0L;
-
-    //
-    // Native PM does not have any specialize 3D effects like WIN32 does,
-    // so we have to try and invent them.
-    //
-
-    //
-    // If matches certain criteria, then assume no 3D effects
-    // unless specifically requested (dealt with in MakeExtendedStyle)
-    //
-    if (!GetParent()                    ||
-        !IsKindOf(CLASSINFO(wxControl)) ||
-        (m_windowStyle & wxNO_BORDER)
-       )
-    {
-        *pbWant3D = FALSE;
-        return MakeExtendedStyle(m_windowStyle, FALSE);
-    }
-
-    //
-    // 1) App can specify global 3D effects
-    //
-    *pbWant3D = wxTheApp->GetAuto3D();
-
-    //
-    // 2) If the parent is being drawn with user colours, or simple border
-    //    specified, switch effects off.
-    //
-    if (GetParent() &&
-        (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) ||
-        (m_windowStyle & wxSIMPLE_BORDER)
-       )
-        *pbWant3D = FALSE;
-
-    //
-    // 3) Control can override this global setting by defining
-    //    a border style, e.g. wxSUNKEN_BORDER
-    //
-    if ((m_windowStyle & wxDOUBLE_BORDER) ||
-        (m_windowStyle & wxRAISED_BORDER) ||
-        (m_windowStyle & wxSTATIC_BORDER) ||
-        (m_windowStyle & wxSUNKEN_BORDER)
-       )
-        *pbWant3D = TRUE;
-
-    dwStyle = MakeExtendedStyle( m_windowStyle
-                                ,FALSE
-                               );
-
-    //
-    // If we want 3D, but haven't specified a border here,
-    // apply the default border style specified.
-    //
-    if (dwDefaultBorderStyle && (*pbWant3D) &&
-        !((m_windowStyle & wxDOUBLE_BORDER) ||
-          (m_windowStyle & wxRAISED_BORDER) ||
-          (m_windowStyle & wxSTATIC_BORDER) ||
-          (m_windowStyle & wxSIMPLE_BORDER)
-         )
-        )
-        dwStyle |= dwDefaultBorderStyle;
-    return dwStyle;
-} // end of wxWindowOS2::Determine3DEffects
-
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::OnCommand(
-  wxWindow&                         rWin
-, wxCommandEvent&                   rEvent
-)
-{
-    if (GetEventHandler()->ProcessEvent(rEvent))
-        return;
-    if (m_parent)
-        m_parent->GetEventHandler()->OnCommand( rWin
-                                               ,rEvent
-                                              );
-} // end of wxWindowOS2::OnCommand
-
-wxObject* wxWindowOS2::GetChild(
-  int                               nNumber
-) const
-{
-    //
-    // Return a pointer to the Nth object in the Panel
-    //
-    wxNode*                         pNode = GetChildren().First();
-    int                             n = nNumber;
-
-    while (pNode && n--)
-        pNode = pNode->Next();
-    if (pNode)
-    {
-        wxObject*                   pObj = (wxObject*)pNode->Data();
-        return(pObj);
-    }
-    else
-        return NULL;
-} // end of wxWindowOS2::GetChild
-
-#endif // WXWIN_COMPATIBILITY
-
 //
 // Setup background and foreground colours correctly
 //
 //
 // Setup background and foreground colours correctly
 //
@@ -1349,10 +1158,10 @@ void wxWindowOS2::OnIdle(
             //
             int                     nState = 0;
 
             //
             int                     nState = 0;
 
-            if (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) != 0)
-                nState |= VK_SHIFT;
-            if (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) != 0);
-                nState |= VK_CTRL;
+            if (IsShiftDown())
+                nState |= KC_SHIFT;
+            if (IsCtrlDown())
+                nState |= KC_CTRL;
 
             wxMouseEvent            rEvent(wxEVT_LEAVE_WINDOW);
 
 
             wxMouseEvent            rEvent(wxEVT_LEAVE_WINDOW);
 
@@ -1364,7 +1173,8 @@ void wxWindowOS2::OnIdle(
             (void)GetEventHandler()->ProcessEvent(rEvent);
         }
     }
             (void)GetEventHandler()->ProcessEvent(rEvent);
         }
     }
-    UpdateWindowUI();
+    if (wxUpdateUIEvent::CanUpdate(this))
+        UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
 } // end of wxWindowOS2::OnIdle
 
 //
 } // end of wxWindowOS2::OnIdle
 
 //
@@ -1384,17 +1194,6 @@ bool wxWindowOS2::Reparent(
     return TRUE;
 } // end of wxWindowOS2::Reparent
 
     return TRUE;
 } // end of wxWindowOS2::Reparent
 
-void wxWindowOS2::Clear()
-{
-    wxClientDC                      vDc((wxWindow*)this);
-    wxBrush                         vBrush( GetBackgroundColour()
-                                           ,wxSOLID
-                                          );
-
-    vDc.SetBackground(vBrush);
-    vDc.Clear();
-} // end of wxWindowOS2::Clear
-
 void wxWindowOS2::Update()
 {
     ::WinUpdateWindow(GetHwnd());
 void wxWindowOS2::Update()
 {
     ::WinUpdateWindow(GetHwnd());
@@ -1430,9 +1229,9 @@ void wxWindowOS2::Refresh(
             RECTL                   vOs2Rect;
 
             vOs2Rect.xLeft   = pRect->x;
             RECTL                   vOs2Rect;
 
             vOs2Rect.xLeft   = pRect->x;
-            vOs2Rect.yTop    = pRect->y;
+            vOs2Rect.yBottom = pRect->y;
             vOs2Rect.xRight  = pRect->x + pRect->width;
             vOs2Rect.xRight  = pRect->x + pRect->width;
-            vOs2Rect.yBottom = pRect->y + pRect->height;
+            vOs2Rect.yTop    = pRect->y + pRect->height;
 
             ::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
         }
 
             ::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
         }
@@ -2044,7 +1843,7 @@ void wxWindowOS2::GetTextExtent(
     int                             i;
     int                             l;
     FONTMETRICS                     vFM; // metrics structure
     int                             i;
     int                             l;
     FONTMETRICS                     vFM; // metrics structure
-    BOOL                            bRc;
+    BOOL                            bRc = FALSE;
     char*                           pStr;
     ERRORID                         vErrorCode; // last error id code
     HPS                             hPS;
     char*                           pStr;
     ERRORID                         vErrorCode; // last error id code
     HPS                             hPS;
@@ -2147,67 +1946,6 @@ bool wxWindowOS2::IsMouseInWindow() const
     return hWnd != NULL;
 } // end of wxWindowOS2::IsMouseInWindow
 
     return hWnd != NULL;
 } // end of wxWindowOS2::IsMouseInWindow
 
-#if wxUSE_CARET && WXWIN_COMPATIBILITY
-// ---------------------------------------------------------------------------
-// Caret manipulation
-// ---------------------------------------------------------------------------
-
-void wxWindowOS2::CreateCaret(
-  int                               nWidth
-, int                               nHeight
-)
-{
-    SetCaret(new wxCaret( this
-                         ,nWidth
-                         ,nHeight
-                        ));
-} // end of wxWindowOS2::CreateCaret
-
-void wxWindowOS2::CreateCaret(
-  const wxBitmap*                   pBitmap
-)
-{
-    wxFAIL_MSG("not implemented");
-} // end of wxWindowOS2::CreateCaret
-
-void wxWindowOS2::ShowCaret(
-  bool                              bShow
-)
-{
-    wxCHECK_RET( m_caret, "no caret to show" );
-
-    m_caret->Show(bShow);
-} // end of wxWindowOS2::ShowCaret
-
-void wxWindowOS2::DestroyCaret()
-{
-    SetCaret(NULL);
-} // end of wxWindowOS2::DestroyCaret
-
-void wxWindowOS2::SetCaretPos(
-  int                               nX
-, int                               nY)
-{
-    wxCHECK_RET( m_caret, "no caret to move" );
-
-    m_caret->Move( nX
-                  ,nY
-                 );
-} // end of wxWindowOS2::SetCaretPos
-
-void wxWindowOS2::GetCaretPos(
-  int*                              pX
-, int*                              pY
-) const
-{
-    wxCHECK_RET( m_caret, "no caret to get position of" );
-
-    m_caret->GetPosition( pX
-                         ,pY
-                        );
-} // end of wxWindowOS2::GetCaretPos
-
-#endif //wxUSE_CARET
 
 // ---------------------------------------------------------------------------
 // popup menu
 
 // ---------------------------------------------------------------------------
 // popup menu
@@ -2225,7 +1963,10 @@ static void wxYieldForCommandsOnly()
     while (::WinPeekMsg(vHabmain, &vMsg, (HWND)0, WM_COMMAND, WM_COMMAND, PM_REMOVE)
            && vMsg.msg != WM_QUIT)
     {
     while (::WinPeekMsg(vHabmain, &vMsg, (HWND)0, WM_COMMAND, WM_COMMAND, PM_REMOVE)
            && vMsg.msg != WM_QUIT)
     {
-        wxTheApp->DoMessage((WXMSG*)&vMsg);
+        // luckily (as we don't have access to wxEventLoopImpl method from here
+        // anyhow...) we don't need to pre process WM_COMMANDs so dispatch it
+        // immediately
+        ::WinDispatchMsg(vHabmain, &vMsg);
     }
     if (vMsg.msg == WM_QUIT)
         ::WinPostMsg(NULL, WM_QUIT, 0, 0);
     }
     if (vMsg.msg == WM_QUIT)
         ::WinPostMsg(NULL, WM_QUIT, 0, 0);
@@ -2809,7 +2550,7 @@ MRESULT wxWindowOS2::OS2WindowProc(
                     bProcessed = HandleMouseEvent( uMsg
                                                   ,nX
                                                   ,nY
                     bProcessed = HandleMouseEvent( uMsg
                                                   ,nX
                                                   ,nY
-                                                  ,(WXUINT)SHORT1FROMMP(wParam)
+                                                  ,(WXUINT)SHORT2FROMMP(lParam)
                                                  );
                 }
                 else
                                                  );
                 }
                 else
@@ -2826,7 +2567,7 @@ MRESULT wxWindowOS2::OS2WindowProc(
                     bProcessed = pWin->HandleMouseEvent( uMsg
                                                         ,nX
                                                         ,nY
                     bProcessed = pWin->HandleMouseEvent( uMsg
                                                         ,nX
                                                         ,nY
-                                                        ,(WXUINT)SHORT1FROMMP(wParam)
+                                                        ,(WXUINT)SHORT2FROMMP(lParam)
                                                        );
                 }
             }
                                                        );
                 }
             }
@@ -3441,7 +3182,7 @@ bool wxWindowOS2::OS2Create(
     // which is the same but without CS_[HV]REDRAW class styles so using it
     // ensures that the window is not fully repainted on each resize
     //
     // which is the same but without CS_[HV]REDRAW class styles so using it
     // ensures that the window is not fully repainted on each resize
     //
-    if (GetWindowStyleFlag() & wxNO_FULL_REPAINT_ON_RESIZE)
+    if (!HasFlag(wxFULL_REPAINT_ON_RESIZE))
     {
         sClassName += wxT("NR");
     }
     {
         sClassName += wxT("NR");
     }
@@ -3480,7 +3221,7 @@ bool wxWindowOS2::OS2Create(
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error creating frame. Error: %s\n", sError);
+        wxLogError("Error creating frame. Error: %s\n", sError.c_str());
         return FALSE;
     }
     SetSize( nX
         return FALSE;
     }
     SetSize( nX
@@ -3513,7 +3254,9 @@ bool wxWindowOS2::HandleCreate(
 
 bool wxWindowOS2::HandleDestroy()
 {
 
 bool wxWindowOS2::HandleDestroy()
 {
-    SendDestroyEvent();
+    wxWindowDestroyEvent            vEvent((wxWindow*)this);
+    vEvent.SetId(GetId());
+    (void)GetEventHandler()->ProcessEvent(vEvent);
 
     //
     // Delete our drop target if we've got one
 
     //
     // Delete our drop target if we've got one
@@ -3729,7 +3472,7 @@ bool wxWindowOS2::OS2OnDrawItem(
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError("Unable to set current color table. Error: %s\n", sError);
+            wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
         }
         //
         // Set the color table to RGB mode
         }
         //
         // Set the color table to RGB mode
@@ -3744,7 +3487,7 @@ bool wxWindowOS2::OS2OnDrawItem(
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError("Unable to set current color table. Error: %s\n", sError);
+            wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
         }
 
         wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
         }
 
         wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
@@ -4296,13 +4039,20 @@ void wxWindowOS2::InitMouseEvent(
 , WXUINT                            uFlags
 )
 {
 , WXUINT                            uFlags
 )
 {
+    int                                 nHeight;
+    DoGetSize(0, &nHeight);
     rEvent.m_x           = nX;
     rEvent.m_x           = nX;
-    rEvent.m_y           = nY;
-    rEvent.m_shiftDown   = ((uFlags & VK_SHIFT) != 0);
-    rEvent.m_controlDown = ((uFlags & VK_CTRL) != 0);
-    rEvent.m_leftDown    = ((uFlags & VK_BUTTON1) != 0);
-    rEvent.m_middleDown  = ((uFlags & VK_BUTTON3) != 0);
-    rEvent.m_rightDown   = ((uFlags & VK_BUTTON2) != 0);
+    // Convert to wxWindows standard coordinate system!
+    rEvent.m_y           = nHeight - nY;
+    rEvent.m_shiftDown   = ((uFlags & KC_SHIFT) != 0);
+    rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0);
+    rEvent.m_altDown     = ((uFlags & KC_ALT) != 0);
+    rEvent.m_leftDown    = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) &
+                           0x8000) != 0;
+    rEvent.m_middleDown  = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) &
+                           0x8000) != 0;
+    rEvent.m_rightDown   = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) &
+                           0x8000) != 0;
     rEvent.SetTimestamp(s_currentMsg.time);
     rEvent.m_eventObject = this;
     rEvent.SetId(GetId());
     rEvent.SetTimestamp(s_currentMsg.time);
     rEvent.m_eventObject = this;
     rEvent.SetId(GetId());