]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
crash upon hide fix
[wxWidgets.git] / src / os2 / frame.cpp
index d6087502a303b0021eb97e7530d04b250670adaf..0ca6894be97dc28f7db8e0ae70b482880fa8438c 100644 (file)
@@ -67,7 +67,6 @@ extern void  wxAssociateWinWithHandle( HWND         hWnd
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
-    EVT_ACTIVATE(wxFrame::OnActivate)
     EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
     EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
@@ -101,7 +100,6 @@ void wxFrame::Init()
     m_nFsToolBarHeight   = 0;
     m_hWndToolTip        = 0L;
     m_bWasMinimized      = FALSE;
     m_nFsToolBarHeight   = 0;
     m_hWndToolTip        = 0L;
     m_bWasMinimized      = FALSE;
-    m_pWinLastFocused    = NULL;
 
 
     m_frameMenuBar   = NULL;
 
 
     m_frameMenuBar   = NULL;
@@ -144,7 +142,6 @@ bool wxFrame::Create(
                                   ,rsName
                                  ))
         return FALSE;
                                   ,rsName
                                  ))
         return FALSE;
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
     wxModelessWindows.Append(this);
     return TRUE;
 } // end of wxFrame::Create
     wxModelessWindows.Append(this);
     return TRUE;
 } // end of wxFrame::Create
@@ -211,21 +208,6 @@ void wxFrame::Raise()
                      );
 }
 
                      );
 }
 
-// generate an artificial resize event
-void wxFrame::SendSizeEvent()
-{
-    if (!m_bIconized)
-    {
-        RECTL                       vRect = wxGetWindowRect(GetHwnd());
-
-        (void)::WinPostMsg( m_hFrame
-                           ,WM_SIZE
-                           ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom)
-                           ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom)
-                          );
-    }
-}
-
 #if wxUSE_STATUSBAR
 wxStatusBar* wxFrame::OnCreateStatusBar(
   int                               nNumber
 #if wxUSE_STATUSBAR
 wxStatusBar* wxFrame::OnCreateStatusBar(
   int                               nNumber
@@ -248,6 +230,26 @@ wxStatusBar* wxFrame::OnCreateStatusBar(
     if( !pStatusBar )
         return NULL;
 
     if( !pStatusBar )
         return NULL;
 
+    wxClientDC                      vDC(pStatusBar);
+    int                             nY;
+
+    //
+    // Set the height according to the font and the border size
+    //
+    vDC.SetFont(pStatusBar->GetFont()); // Screws up the menues for some reason
+    vDC.GetTextExtent( "X"
+                      ,NULL
+                      ,&nY
+                     );
+
+    int                             nHeight = ((11 * nY) / 10 + 2 * pStatusBar->GetBorderY());
+
+    pStatusBar->SetSize( -1
+                        ,-1
+                        ,-1
+                        ,nHeight
+                       );
+
     ::WinSetParent( pStatusBar->GetHWND()
                    ,m_hFrame
                    ,FALSE
     ::WinSetParent( pStatusBar->GetHWND()
                    ,m_hFrame
                    ,FALSE
@@ -316,6 +318,29 @@ void wxFrame::PositionStatusBar()
 } // end of wxFrame::PositionStatusBar
 #endif // wxUSE_STATUSBAR
 
 } // end of wxFrame::PositionStatusBar
 #endif // wxUSE_STATUSBAR
 
+#if wxUSE_TOOLBAR
+wxToolBar* wxFrame::OnCreateToolBar(
+  long                              lStyle
+, wxWindowID                        vId
+, const wxString&                   rsName
+)
+{
+    wxToolBar*                      pToolBar = wxFrameBase::OnCreateToolBar( lStyle
+                                                                            ,vId
+                                                                            ,rsName
+                                                                           );
+
+    ::WinSetParent( pToolBar->GetHWND()
+                   ,m_hFrame
+                   ,FALSE
+                  );
+    ::WinSetOwner( pToolBar->GetHWND()
+                  ,m_hFrame
+                 );
+    return pToolBar;
+} // end of WinGuiBase_CFrame::OnCreateToolBar
+#endif
+
 #if wxUSE_MENUS_NATIVE
 void wxFrame::DetachMenuBar()
 {
 #if wxUSE_MENUS_NATIVE
 void wxFrame::DetachMenuBar()
 {
@@ -654,70 +679,13 @@ bool wxFrame::ShowFullScreen(
                           ,m_vFsOldSize.height
                           ,SWP_SIZE | SWP_SHOW
                          );
                           ,m_vFsOldSize.height
                           ,SWP_SIZE | SWP_SHOW
                          );
-        return TRUE;
     }
     }
+    return wxFrameBase::ShowFullScreen(bShow, lStyle);
 } // end of wxFrame::ShowFullScreen
 
 //
 // Frame window
 //
 } // end of wxFrame::ShowFullScreen
 
 //
 // Frame window
 //
-//
-// Default activation behaviour - set the focus for the first child
-// subwindow found.
-//
-void wxFrame::OnActivate(
-  wxActivateEvent&                  rEvent
-)
-{
-    if ( rEvent.GetActive() )
-    {
-        // restore focus to the child which was last focused
-        wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd);
-
-        wxWindow*                           pParent = m_pWinLastFocused ? m_pWinLastFocused->GetParent()
-                                            : NULL;
-        if (!pParent)
-        {
-            pParent = this;
-        }
-
-        wxSetFocusToChild( pParent
-                          ,&m_pWinLastFocused
-                         );
-    }
-    else // deactivating
-    {
-        //
-        // Remember the last focused child if it is our child
-        //
-        m_pWinLastFocused = FindFocus();
-
-        for (wxWindowList::Node* pNode = GetChildren().GetFirst();
-             pNode;
-             pNode = pNode->GetNext())
-        {
-            // FIXME all this is totally bogus - we need to do the same as wxPanel,
-            //       but how to do it without duplicating the code?
-
-            // restore focus
-            wxWindow*                   pChild = pNode->GetData();
-
-            if (!pChild->IsTopLevel()
-#if wxUSE_TOOLBAR
-                 && !wxDynamicCast(pChild, wxToolBar)
-#endif // wxUSE_TOOLBAR
-#if wxUSE_STATUSBAR
-                 && !wxDynamicCast(pChild, wxStatusBar)
-#endif // wxUSE_STATUSBAR
-               )
-            {
-                pChild->SetFocus();
-                return;
-            }
-        }
-    }
-} // end of wxFrame::OnActivate
-
 // ----------------------------------------------------------------------------
 // wxFrame size management: we exclude the areas taken by menu/status/toolbars
 // from the client area, so the client area is what's really available for the
 // ----------------------------------------------------------------------------
 // wxFrame size management: we exclude the areas taken by menu/status/toolbars
 // from the client area, so the client area is what's really available for the
@@ -727,29 +695,13 @@ void wxFrame::OnActivate(
 // Checks if there is a toolbar, and returns the first free client position
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
 // Checks if there is a toolbar, and returns the first free client position
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
-    wxPoint                         vPoint(0, 0);
+    wxPoint                         vPoint = wxTopLevelWindow::GetClientAreaOrigin();
 
 
-#if wxUSE_TOOLBAR
-    if (GetToolBar())
-    {
-        int                         nWidth;
-        int                         nHeight;
-
-        GetToolBar()->GetSize( &nWidth
-                              ,&nHeight
-                             );
-
-        if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
-        {
-            vPoint.x += nWidth;
-        }
-        else
-        {
-            // PM is backwards from windows
-            vPoint.y += nHeight;
-        }
-    }
-#endif //wxUSE_TOOLBAR
+    //
+    // In OS/2 the toolbar and statusbar are frame extensions so there is no
+    // adjustment.  The client is supposedly resized for a toolbar in OS/2
+    // as it is for the status bar.
+    //
     return vPoint;
 } // end of wxFrame::GetClientAreaOrigin
 
     return vPoint;
 } // end of wxFrame::GetClientAreaOrigin
 
@@ -777,53 +729,59 @@ wxToolBar* wxFrame::CreateToolBar(
 
 void wxFrame::PositionToolBar()
 {
 
 void wxFrame::PositionToolBar()
 {
+    wxToolBar*                      pToolBar = GetToolBar();
+    wxCoord                         vWidth;
+    wxCoord                         vHeight;
+    wxCoord                         vTWidth;
+    wxCoord                         vTHeight;
+
+    if (!pToolBar)
+        return;
+
     HWND                            hWndClient;
     RECTL                           vRect;
     HWND                            hWndClient;
     RECTL                           vRect;
+    RECTL                           vFRect;
+    SWP                             vSwp;
+    wxPoint                         vPos;
 
 
-    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    ::WinQueryWindowRect(m_hFrame, &vRect);
+    vPos.y = (wxCoord)vRect.yTop;
+    ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2);
+    vFRect = vRect;
+    ::WinCalcFrameRect(m_hFrame, &vRect, TRUE);
 
 
-#if wxUSE_STATUSBAR
-    if (GetStatusBar())
-    {
-        int                         nStatusX;
-        int                         nStatusY;
+    vPos.y = (wxCoord)(vFRect.yTop - vRect.yTop);
+    pToolBar->GetSize( &vTWidth
+                      ,&vTHeight
+                     );
 
 
-        GetStatusBar()->GetClientSize( &nStatusX
-                                      ,&nStatusY
-                                     );
-        // PM is backwards from windows
-        vRect.yBottom += nStatusY;
+    if (pToolBar->GetWindowStyleFlag() & wxTB_HORIZONTAL)
+    {
+        vWidth = (wxCoord)(vRect.xRight - vRect.xLeft);
+        pToolBar->SetSize( vRect.xLeft - vFRect.xLeft
+                          ,vPos.y
+                          ,vWidth
+                          ,vTHeight
+                         );
     }
     }
-#endif // wxUSE_STATUSBAR
-
-    if ( m_frameToolBar )
+    else
     {
     {
-        int                         nToolbarWidth;
-        int                         nToolbarHeight;
-
-        m_frameToolBar->GetSize( &nToolbarWidth
-                              ,&nToolbarHeight
-                             );
-
-        if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
-        {
-            nToolbarHeight = vRect.yBottom;
-        }
-        else
-        {
-            nToolbarWidth = vRect.xRight;
-        }
+        wxCoord                     vSwidth = 0;
+        wxCoord                     vSheight = 0;
 
 
-        //
-        // Use the 'real' PM position here
-        //
-        GetToolBar()->SetSize( 0
-                              ,0
-                              ,nToolbarWidth
-                              ,nToolbarHeight
-                              ,wxSIZE_NO_ADJUSTMENTS
-                             );
+        if (m_frameStatusBar)
+            m_frameStatusBar->GetSize( &vSwidth
+                                      ,&vSheight
+                                     );
+        vHeight = (wxCoord)(vRect.yTop - vRect.yBottom);
+        pToolBar->SetSize( vRect.xLeft - vFRect.xLeft
+                          ,vPos.y
+                          ,vTWidth
+                          ,vHeight - vSheight
+                         );
     }
     }
+    if( ::WinIsWindowShowing(m_hFrame) )
+        ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0);
 } // end of wxFrame::PositionToolBar
 #endif // wxUSE_TOOLBAR
 
 } // end of wxFrame::PositionToolBar
 #endif // wxUSE_TOOLBAR
 
@@ -919,9 +877,10 @@ bool wxFrame::HandlePaint()
             //
             // Icons in PM are the same as "pointers"
             //
             //
             // Icons in PM are the same as "pointers"
             //
+            const wxIcon&           vIcon = GetIcon();
             HPOINTER                hIcon;
 
             HPOINTER                hIcon;
 
-            if (m_icon.Ok())
+            if (vIcon.Ok())
                 hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L);
             else
                 hIcon = (HPOINTER)m_hDefaultIcon;
                 hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L);
             else
                 hIcon = (HPOINTER)m_hDefaultIcon;
@@ -1067,15 +1026,10 @@ bool wxFrame::HandleSize(
         PositionToolBar();
 #endif // wxUSE_TOOLBAR
 
         PositionToolBar();
 #endif // wxUSE_TOOLBAR
 
-        wxSizeEvent                 vEvent( wxSize( nX
-                                                   ,nY
-                                                  )
-                                           ,m_windowId
-                                          );
-
-        vEvent.SetEventObject(this);
-        bProcessed = GetEventHandler()->ProcessEvent(vEvent);
-        AlterChildPos();
+        bProcessed = wxWindow::HandleSize( nX
+                                          ,nY
+                                          ,nId
+                                         );
     }
     return bProcessed;
 } // end of wxFrame::HandleSize
     }
     return bProcessed;
 } // end of wxFrame::HandleSize
@@ -1146,6 +1100,11 @@ bool wxFrame::HandleMenuSelect(
             vEvent.SetEventObject(this);
             GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM
         }
             vEvent.SetEventObject(this);
             GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM
         }
+        else
+        {
+            DoGiveHelp(wxEmptyString, FALSE);
+            return FALSE;
+        }
     }
     return TRUE;
 } // end of wxFrame::HandleMenuSelect
     }
     return TRUE;
 } // end of wxFrame::HandleMenuSelect
@@ -1187,10 +1146,12 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 int                 nItemCount;
                 int                 i;
                 PSWP                pSWP = NULL;
                 int                 nItemCount;
                 int                 i;
                 PSWP                pSWP = NULL;
-                SWP                 vSwpStb;
                 RECTL               vRectl;
                 RECTL               vRstb;
                 RECTL               vRectl;
                 RECTL               vRstb;
-                int                 nHeight=0;
+                RECTL               vRtlb;
+                int                 nHeight = 0;
+                int                 nHeight2 = 0;
+                int                 nWidth = 0;
 
                 pSWP = (PSWP)PVOIDFROMMP(wParam);
                 nItemCount = SHORT1FROMMR(pWnd->m_fnOldWndProc(hWnd, ulMsg, wParam, lParam));
 
                 pSWP = (PSWP)PVOIDFROMMP(wParam);
                 nItemCount = SHORT1FROMMR(pWnd->m_fnOldWndProc(hWnd, ulMsg, wParam, lParam));
@@ -1198,18 +1159,11 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 {
                     ::WinQueryWindowRect(pWnd->m_frameStatusBar->GetHWND(), &vRstb);
                     pWnd->m_frameStatusBar->GetSize(NULL, &nHeight);
                 {
                     ::WinQueryWindowRect(pWnd->m_frameStatusBar->GetHWND(), &vRstb);
                     pWnd->m_frameStatusBar->GetSize(NULL, &nHeight);
-                    ::WinQueryWindowRect(pWnd->m_hFrame, &vRectl);
-                    ::WinMapWindowPoints(pWnd->m_hFrame, HWND_DESKTOP, (PPOINTL)&vRectl, 2);
-                    vRstb = vRectl;
-                    ::WinCalcFrameRect(pWnd->m_hFrame, &vRectl, TRUE);
-
-                    vSwpStb.x                = vRectl.xLeft - vRstb.xLeft;
-                    vSwpStb.y                = vRectl.yBottom - vRstb.yBottom;
-                    vSwpStb.cx               = vRectl.xRight - vRectl.xLeft - 1; //?? -1 ??
-                    vSwpStb.cy               = nHeight;
-                    vSwpStb.fl               = SWP_SIZE |SWP_MOVE | SWP_SHOW;
-                    vSwpStb.hwnd             = pWnd->m_frameStatusBar->GetHWND();
-                    vSwpStb.hwndInsertBehind = HWND_TOP;
+                }
+                if(pWnd->m_frameToolBar)
+                {
+                    ::WinQueryWindowRect(pWnd->m_frameToolBar->GetHWND(), &vRtlb);
+                    pWnd->m_frameToolBar->GetSize(&nWidth, &nHeight2);
                 }
                 ::WinQueryWindowRect(pWnd->m_hFrame, &vRectl);
                 ::WinMapWindowPoints(pWnd->m_hFrame, HWND_DESKTOP, (PPOINTL)&vRectl, 2);
                 }
                 ::WinQueryWindowRect(pWnd->m_hFrame, &vRectl);
                 ::WinMapWindowPoints(pWnd->m_hFrame, HWND_DESKTOP, (PPOINTL)&vRectl, 2);
@@ -1219,10 +1173,20 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 {
                     if(pWnd->m_hWnd && pSWP[i].hwnd == pWnd->m_hWnd)
                     {
                 {
                     if(pWnd->m_hWnd && pSWP[i].hwnd == pWnd->m_hWnd)
                     {
-                        pSWP[i].x    = vRectl.xLeft;
-                        pSWP[i].y    = vRectl.yBottom + nHeight;
-                        pSWP[i].cx   = vRectl.xRight - vRectl.xLeft;
-                        pSWP[i].cy   = vRectl.yTop - vRectl.yBottom - nHeight;
+                        if (pWnd->m_frameToolBar && pWnd->m_frameToolBar->GetWindowStyleFlag() & wxTB_HORIZONTAL)
+                        {
+                            pSWP[i].x    = vRectl.xLeft;
+                            pSWP[i].y    = vRectl.yBottom + nHeight;
+                            pSWP[i].cx   = vRectl.xRight - vRectl.xLeft;
+                            pSWP[i].cy   = vRectl.yTop - vRectl.yBottom - (nHeight + nHeight2);
+                        }
+                        else
+                        {
+                            pSWP[i].x    = vRectl.xLeft + nWidth;
+                            pSWP[i].y    = vRectl.yBottom + nHeight;
+                            pSWP[i].cx   = vRectl.xRight - (vRectl.xLeft + nWidth);
+                            pSWP[i].cy   = vRectl.yTop - vRectl.yBottom - nHeight;
+                        }
                         pSWP[i].fl   = SWP_SIZE | SWP_MOVE | SWP_SHOW;
                         pSWP[i].hwndInsertBehind = HWND_TOP;
                     }
                         pSWP[i].fl   = SWP_SIZE | SWP_MOVE | SWP_SHOW;
                         pSWP[i].hwndInsertBehind = HWND_TOP;
                     }
@@ -1376,9 +1340,10 @@ MRESULT wxFrame::OS2WindowProc(
 
         case CM_QUERYDRAGIMAGE:
             {
 
         case CM_QUERYDRAGIMAGE:
             {
+                const wxIcon&           vIcon = GetIcon();
                 HPOINTER                hIcon;
 
                 HPOINTER                hIcon;
 
-                if (m_icon.Ok())
+                if (vIcon.Ok())
                     hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
                 else
                     hIcon = (HPOINTER)m_hDefaultIcon;
                     hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
                 else
                     hIcon = (HPOINTER)m_hDefaultIcon;
@@ -1455,3 +1420,22 @@ wxWindow* wxFrame::GetClient()
 {
     return wxFindWinFromHandle((WXHWND)::WinWindowFromID(m_hFrame, FID_CLIENT));
 }
 {
     return wxFindWinFromHandle((WXHWND)::WinWindowFromID(m_hFrame, FID_CLIENT));
 }
+
+void wxFrame::SendSizeEvent()
+{
+    if (!m_bIconized)
+    {
+        RECTL                       vRect = wxGetWindowRect(GetHwnd());
+
+        ::WinPostMsg( GetHwnd()
+                     ,WM_SIZE
+                     ,MPFROM2SHORT( vRect.xRight - vRect.xLeft
+                                   ,vRect.xRight - vRect.xLeft
+                                  )
+                     ,MPFROM2SHORT( vRect.yTop - vRect.yBottom
+                                   ,vRect.yTop - vRect.yBottom
+                                  )
+                    );
+    }
+}
+