]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
removed unused variables
[wxWidgets.git] / src / os2 / window.cpp
index 6fc21ee0c34257daf4d0dba498ed893d47b1d00e..e99ecaa4d2c9d00d4dd4b81f7db6e1b4840c58db 100644 (file)
     #include "wx/app.h"
     #include "wx/panel.h"
     #include "wx/layout.h"
+    #include "wx/checkbox.h"
+    #include "wx/combobox.h"
     #include "wx/dialog.h"
     #include "wx/frame.h"
     #include "wx/listbox.h"
     #include "wx/button.h"
+    #include "wx/bmpbuttn.h"
     #include "wx/msgdlg.h"
     #include "wx/scrolwin.h"
     #include "wx/radiobox.h"
+    #include "wx/radiobut.h"
     #include "wx/slider.h"
     #include "wx/statbox.h"
     #include "wx/statusbr.h"
     #include "wx/tooltip.h"
 #endif
 
+#if wxUSE_NOTEBOOK
+    #include "wx/notebook.h"
+#endif
+
 #if wxUSE_CARET
     #include "wx/caret.h"
 #endif // wxUSE_CARET
@@ -301,7 +309,6 @@ void wxWindowOS2::Init()
     m_bUseCtl3D             = FALSE;
     m_bMouseInWindow        = FALSE;
     m_bLastKeydownProcessed = FALSE;
-    m_bIsActivePage         = TRUE;
     m_pChildrenDisabled     = NULL;
 
     //
@@ -503,6 +510,14 @@ bool wxWindowOS2::Enable(
     if ( hWnd )
         ::WinEnableWindow(hWnd, (BOOL)bEnable);
 
+    //
+    // The logic below doesn't apply to the top level windows -- otherwise
+    // showing a modal dialog would result in total greying out (and ungreying
+    // out later) of everything which would be really ugly
+    //
+    if (IsTopLevel())
+        return TRUE;
+
     wxWindowList::Node*             pNode = GetChildren().GetFirst();
 
     while (pNode)
@@ -1439,14 +1454,7 @@ void wxWindowOS2::SetDropTarget(
   wxDropTarget*                     pDropTarget
 )
 {
-    if (m_dropTarget != 0)
-    {
-        m_dropTarget->Revoke(m_hWnd);
-        delete m_dropTarget;
-    }
     m_dropTarget = pDropTarget;
-    if (m_dropTarget != 0)
-        m_dropTarget->Register(m_hWnd);
 } // end of wxWindowOS2::SetDropTarget
 #endif
 
@@ -2219,6 +2227,8 @@ static void wxYieldForCommandsOnly()
     {
         wxTheApp->DoMessage((WXMSG*)&vMsg);
     }
+    if (vMsg.msg == WM_QUIT)
+        ::WinPostMsg(NULL, WM_QUIT, 0, 0);
 }
 #endif // wxUSE_MENUS_NATIVE
 
@@ -2412,6 +2422,14 @@ bool wxWindowOS2::OS2ProcessMessage(
                                 pBtn->OS2Command(BN_CLICKED, 0 /* unused */);
                                 return TRUE;
                             }
+                            else if (!IsTopLevel())
+                            {
+                                //
+                                // if not a top level window, let parent
+                                // handle it
+                                //
+                                return FALSE;
+                            }
                             // else: but if it does 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.
@@ -2800,6 +2818,11 @@ MRESULT wxWindowOS2::OS2WindowProc(
                                                                    ,&nX
                                                                    ,&nY
                                                                   );
+                    if (!pWin->IsOfStandardClass())
+                    {
+                        if (uMsg == WM_BUTTON1DOWN && pWin->AcceptsFocus() )
+                            pWin->SetFocus();
+                    }
                     bProcessed = pWin->HandleMouseEvent( uMsg
                                                         ,nX
                                                         ,nY
@@ -2838,8 +2861,9 @@ MRESULT wxWindowOS2::OS2WindowProc(
                 }
                 else
                 {
-                    bProcessed = OS2OnMeasureItem(nIdCtrl,
-                                                 (WXMEASUREITEMSTRUCT *)lParam);
+                    return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
+                                                       ,(WXMEASUREITEMSTRUCT *)lParam
+                                                      ));
                 }
 
                 if ( bProcessed )
@@ -2905,7 +2929,6 @@ MRESULT wxWindowOS2::OS2WindowProc(
                             // Avoid duplicate messages to OnChar for these ASCII keys: they
                             // will be translated by TranslateMessage() and received in WM_CHAR
                             case VK_ESC:
-                            case VK_SPACE:
                             case VK_ENTER:
                             case VK_BACKSPACE:
                             case VK_TAB:
@@ -2966,7 +2989,61 @@ MRESULT wxWindowOS2::OS2WindowProc(
         case WM_CONTROL:
             switch(SHORT2FROMMP(wParam))
             {
-                case BN_CLICKED:
+                case BN_PAINT:
+                    {
+                        HWND                hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
+                        wxWindowOS2*        pWin = wxFindWinFromHandle(hWnd);
+
+                        if (!pWin)
+                        {
+                            bProcessed = FALSE;
+                            break;
+                        }
+                        if (pWin->IsKindOf(CLASSINFO(wxBitmapButton)))
+                        {
+                            wxBitmapButton*     pBitmapButton = wxDynamicCast(pWin, wxBitmapButton);
+
+                            pBitmapButton->OS2OnDraw((WXDRAWITEMSTRUCT *)lParam);
+                        }
+                        return 0;
+                    }
+                    break;
+
+                case BKN_PAGESELECTEDPENDING:
+                    {
+                        PPAGESELECTNOTIFY  pPage = (PPAGESELECTNOTIFY)lParam;
+
+                        if ((pPage->ulPageIdNew != pPage->ulPageIdCur) &&
+                            (pPage->ulPageIdNew > 0L && pPage->ulPageIdCur > 0L))
+                        {
+                            wxWindowOS2*        pWin = wxFindWinFromHandle(pPage->hwndBook);
+                            wxNotebookEvent     vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
+                                                       ,(int)SHORT1FROMMP(wParam)
+                                                       ,(int)pPage->ulPageIdNew
+                                                       ,(int)pPage->ulPageIdCur
+                                                      );
+                            if (!pWin)
+                            {
+                                bProcessed = FALSE;
+                                break;
+                            }
+                            if (pWin->IsKindOf(CLASSINFO(wxNotebook)))
+                            {
+                                wxNotebook*         pNotebook = wxDynamicCast(pWin, wxNotebook);
+
+                                vEvent.SetEventObject(pWin);
+                                pNotebook->OnSelChange(vEvent);
+                                bProcessed = TRUE;
+                            }
+                            else
+                                bProcessed = FALSE;
+                        }
+                        else
+                            bProcessed = FALSE;
+                    }
+                    break;
+
+                case BN_CLICKED: // Dups as LN_SELECT and CBN_LBSELECT
                     {
                         HWND                hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
                         wxWindowOS2*        pWin = wxFindWinFromHandle(hWnd);
@@ -3004,6 +3081,61 @@ MRESULT wxWindowOS2::OS2WindowProc(
                                                   ,(WXUINT)SHORT1FROMMP(wParam)
                                                  );
                         }
+                        if (pWin->IsKindOf(CLASSINFO(wxListBox)))
+                        {
+                            wxListBox*          pListBox = wxDynamicCast(pWin, wxListBox);
+
+                            pListBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+                                                 ,(WXUINT)SHORT1FROMMP(wParam)
+                                                );
+                            if (pListBox->GetWindowStyle() & wxLB_OWNERDRAW)
+                                Refresh();
+                        }
+                        if (pWin->IsKindOf(CLASSINFO(wxComboBox)))
+                        {
+                            wxComboBox*          pComboBox = wxDynamicCast(pWin, wxComboBox);
+
+                            pComboBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+                                                  ,(WXUINT)SHORT1FROMMP(wParam)
+                                                 );
+                        }
+                        return 0;
+                    }
+                    break;
+
+                case LN_ENTER:   /* dups as CBN_EFCHANGE */
+                    {
+                        HWND                hWnd = HWNDFROMMP(lParam);
+                        wxWindowOS2*        pWin = wxFindWinFromHandle(hWnd);
+
+                        if (!pWin)
+                        {
+                            bProcessed = FALSE;
+                            break;
+                        }
+                        //
+                        // Simulate a WM_COMMAND here, as wxWindows expects all control
+                        // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
+                        //
+                        if (pWin->IsKindOf(CLASSINFO(wxListBox)))
+                        {
+                            wxListBox*          pListBox = wxDynamicCast(pWin, wxListBox);
+
+                            pListBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+                                                 ,(WXUINT)SHORT1FROMMP(wParam)
+                                                );
+                            if (pListBox->GetWindowStyle() & wxLB_OWNERDRAW)
+                                Refresh();
+
+                        }
+                        if (pWin->IsKindOf(CLASSINFO(wxComboBox)))
+                        {
+                            wxComboBox*          pComboBox = wxDynamicCast(pWin, wxComboBox);
+
+                            pComboBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+                                                  ,(WXUINT)SHORT1FROMMP(wParam)
+                                                 );
+                        }
                         return 0;
                     }
                     break;
@@ -3382,7 +3514,7 @@ bool wxWindowOS2::HandleCreate(
 bool wxWindowOS2::HandleDestroy()
 {
     wxWindowDestroyEvent            vEvent((wxWindow*)this);
-
+    vEvent.SetId(GetId());
     (void)GetEventHandler()->ProcessEvent(vEvent);
 
     //
@@ -3391,7 +3523,6 @@ bool wxWindowOS2::HandleDestroy()
 #if wxUSE_DRAG_AND_DROP
     if (m_dropTarget != NULL)
     {
-        m_dropTarget->Revoke(m_hWnd);
         delete m_dropTarget;
         m_dropTarget = NULL;
     }
@@ -3716,7 +3847,7 @@ bool wxWindowOS2::OS2OnDrawItem(
     return FALSE;
 } // end of wxWindowOS2::OS2OnDrawItem
 
-bool wxWindowOS2::OS2OnMeasureItem(
+long wxWindowOS2::OS2OnMeasureItem(
   int                               lId
 , WXMEASUREITEMSTRUCT*              pItemStruct
 )
@@ -3742,20 +3873,26 @@ bool wxWindowOS2::OS2OnMeasureItem(
                                          ,&nHeight
                                         ))
             {
+                MRESULT             mRc;
+
                 pMeasureStruct->rclItem.xRight  = nWidth;
                 pMeasureStruct->rclItem.xLeft   = 0L;
                 pMeasureStruct->rclItem.yTop    = nHeight;
                 pMeasureStruct->rclItem.yBottom = 0L;
-                return TRUE;
+                mRc = MRFROM2SHORT(nHeight, nWidth);
+                return LONGFROMMR(mRc);
             }
-            return FALSE;
+            return 0L;
         }
     }
     wxWindow*                      pItem = FindItem(lId);
 
     if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
     {
-        return ((wxControl *)pItem)->OS2OnMeasure(pItemStruct);
+        OWNERITEM                   vItem;
+
+        vItem.idItem = (LONG)pItemStruct;
+        return ((wxControl *)pItem)->OS2OnMeasure((WXMEASUREITEMSTRUCT*)&vItem);
     }
 #else
     lId = lId;
@@ -3842,6 +3979,21 @@ void wxWindowOS2::OnSysColourChanged(
 // painting
 // ---------------------------------------------------------------------------
 
+void wxWindow::OnPaint (
+  wxPaintEvent&                     rEvent
+)
+{
+    HDC                             hDC = (HDC)wxPaintDC::FindDCInCache((wxWindow*) rEvent.GetEventObject());
+
+    if (hDC != 0)
+    {
+        OS2DefWindowProc( (WXUINT)WM_PAINT
+                         ,(WXWPARAM)hDC
+                         ,(WXLPARAM)0
+                        );
+    }
+} // end of wxWindow::OnPaint
+
 bool wxWindowOS2::HandlePaint()
 {
     HRGN                            hRgn;
@@ -3902,33 +4054,30 @@ bool wxWindowOS2::HandlePaint()
                                      ,0L
                                      ,NULL
                                     );
-
-            if (::WinIsWindowVisible(GetHWND()) && m_bIsActivePage)
-            {
+            if (::WinIsWindowVisible(GetHWND()))
                 ::WinFillRect(hPS, &vRect,  GetBackgroundColour().GetPixel());
-                if (m_dwExStyle)
-                {
-                    LINEBUNDLE      vLineBundle;
-
-                    vLineBundle.lColor     = 0x00000000; // Black
-                    vLineBundle.usMixMode  = FM_OVERPAINT;
-                    vLineBundle.fxWidth    = 1;
-                    vLineBundle.lGeomWidth = 1;
-                    vLineBundle.usType     = LINETYPE_SOLID;
-                    vLineBundle.usEnd      = 0;
-                    vLineBundle.usJoin     = 0;
-                    ::GpiSetAttrs( hPS
-                                  ,PRIM_LINE
-                                  ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
-                                  ,0L
-                                  ,&vLineBundle
-                                 );
-                    ::WinQueryWindowRect(GetHwnd(), &vRect);
-                    wxDrawBorder( hPS
-                                 ,vRect
-                                 ,m_dwExStyle
-                                );
-                }
+            if (m_dwExStyle)
+            {
+                LINEBUNDLE      vLineBundle;
+
+                vLineBundle.lColor     = 0x00000000; // Black
+                vLineBundle.usMixMode  = FM_OVERPAINT;
+                vLineBundle.fxWidth    = 1;
+                vLineBundle.lGeomWidth = 1;
+                vLineBundle.usType     = LINETYPE_SOLID;
+                vLineBundle.usEnd      = 0;
+                vLineBundle.usJoin     = 0;
+                ::GpiSetAttrs( hPS
+                              ,PRIM_LINE
+                              ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
+                              ,0L
+                              ,&vLineBundle
+                             );
+                ::WinQueryWindowRect(GetHwnd(), &vRect);
+                wxDrawBorder( hPS
+                             ,vRect
+                             ,m_dwExStyle
+                            );
             }
         }
         ::WinEndPaint(hPS);
@@ -3967,7 +4116,7 @@ bool wxWindowOS2::HandlePaint()
                                      ,NULL
                                     );
 
-            if (::WinIsWindowVisible(GetHWND()) && m_bIsActivePage)
+            if (::WinIsWindowVisible(GetHWND()))
                 ::WinFillRect(hPS, &vRect,  GetBackgroundColour().GetPixel());
         }
         ::WinEndPaint(hPS);
@@ -4327,7 +4476,7 @@ bool wxWindowOS2::HandleChar(
         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and
         // ControlDown() == TRUE.
         //
-        vId = (int)wParam;
+        vId = SHORT1FROMMP(lParam);
         if ((vId > 0) && (vId < 27))
         {
             switch (vId)
@@ -4352,7 +4501,7 @@ bool wxWindowOS2::HandleChar(
     }
     else  // we're called from WM_KEYDOWN
     {
-        vId = wxCharCodeOS2ToWX((int)wParam);
+        vId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
         if (vId == 0)
             return FALSE;
     }
@@ -4374,14 +4523,14 @@ bool wxWindowOS2::HandleKeyDown(
 , WXLPARAM                          lParam
 )
 {
-    int                             nId = wxCharCodeOS2ToWX((int)wParam);
+    int                             nId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
 
     if (!nId)
     {
         //
         // Normal ASCII char
         //
-        nId = (int)wParam;
+        nId = SHORT1FROMMP(lParam);
     }
 
     if (nId != -1)
@@ -4405,7 +4554,7 @@ bool wxWindowOS2::HandleKeyUp(
 , WXLPARAM                          lParam
 )
 {
-    int                             nId = wxCharCodeOS2ToWX((int)wParam);
+    int                             nId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
 
     if (!nId)
     {
@@ -4498,7 +4647,10 @@ void wxWindowOS2::MoveChildren(
   int                               nDiff
 )
 {
-    if (GetAutoLayout())
+    //
+    // We want to handle top levels ourself, manually
+    //
+    if (!IsTopLevel() && GetAutoLayout())
     {
         Layout();
     }