]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
We need to update the scrollbar even if it's not shown, otherwise it can get stuck...
[wxWidgets.git] / src / os2 / frame.cpp
index 55c626ed148ffb879aaacb4e88e1448d8998d207..8a8545f7c8e50b186748da3c3c83a2cc2d28bc8b 100644 (file)
@@ -30,6 +30,7 @@
     #include "wx/dialog.h"
     #include "wx/settings.h"
     #include "wx/dcclient.h"
+    #include "wx/mdi.h"
 #endif // WX_PRECOMP
 
 #include "wx/os2/private.h"
@@ -50,9 +51,7 @@
 // globals
 // ----------------------------------------------------------------------------
 
-extern wxWindowList wxModelessWindows;
 extern wxList WXDLLEXPORT wxPendingDelete;
-extern const wxChar* wxFrameClassName;
 
 #if wxUSE_MENUS_NATIVE
 extern wxMenu *wxCurrentPopupMenu;
@@ -67,7 +66,6 @@ extern void  wxAssociateWinWithHandle( HWND         hWnd
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
-    EVT_ACTIVATE(wxFrame::OnActivate)
     EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
@@ -101,7 +99,6 @@ void wxFrame::Init()
     m_nFsToolBarHeight   = 0;
     m_hWndToolTip        = 0L;
     m_bWasMinimized      = FALSE;
-    m_pWinLastFocused    = NULL;
 
 
     m_frameMenuBar   = NULL;
@@ -144,8 +141,6 @@ bool wxFrame::Create(
                                   ,rsName
                                  ))
         return FALSE;
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
-    wxModelessWindows.Append(this);
     return TRUE;
 } // end of wxFrame::Create
 
@@ -176,15 +171,13 @@ void wxFrame::DoGetClientSize(
 
 //
 // Set the client size (i.e. leave the calculation of borders etc.
-// to wxWindows)
+// to wxWidgets)
 //
 void wxFrame::DoSetClientSize(
   int                               nWidth
 , int                               nHeight
 )
 {
-    wxStatusBar*                    pStatusBar = GetStatusBar();
-
     //
     // Statusbars are not part of the OS/2 Client but parent frame
     // so no statusbar consideration
@@ -211,21 +204,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
@@ -235,8 +213,6 @@ wxStatusBar* wxFrame::OnCreateStatusBar(
 )
 {
     wxStatusBar*                    pStatusBar = NULL;
-    SWP                             vSwp;
-    ERRORID                         vError;
     wxString                        sError;
 
     pStatusBar = wxFrameBase::OnCreateStatusBar( nNumber
@@ -248,6 +224,26 @@ wxStatusBar* wxFrame::OnCreateStatusBar(
     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
@@ -279,7 +275,6 @@ void wxFrame::PositionStatusBar()
         int                         nY;
         int                         nStatbarWidth;
         int                         nStatbarHeight;
-        HWND                        hWndClient;
         RECTL                       vRect;
         RECTL                       vFRect;
 
@@ -309,13 +304,36 @@ void wxFrame::PositionStatusBar()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError("Error setting parent for StautsBar. Error: %s\n", sError);
+            wxLogError("Error setting parent for StautsBar. Error: %s\n", sError.c_str());
             return;
         }
     }
 } // 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()
 {
@@ -330,17 +348,7 @@ void wxFrame::SetMenuBar(
   wxMenuBar*                        pMenuBar
 )
 {
-    ERRORID                         vError;
     wxString                        sError;
-    HWND                            hTitlebar = NULLHANDLE;
-    HWND                            hHScroll = NULLHANDLE;
-    HWND                            hVScroll = NULLHANDLE;
-    HWND                            hMenuBar = NULLHANDLE;
-    SWP                             vSwp;
-    SWP                             vSwpTitlebar;
-    SWP                             vSwpVScroll;
-    SWP                             vSwpHScroll;
-    SWP                             vSwpMenu;
 
     if (!pMenuBar)
     {
@@ -359,7 +367,7 @@ void wxFrame::SetMenuBar(
         //
         // Can set a menubar several times.
         // TODO: how to prevent a memory leak if you have a currently-unattached
-        // menubar? wxWindows assumes that the frame will delete the menu (otherwise
+        // menubar? wxWidgets assumes that the frame will delete the menu (otherwise
         // there are problems for MDI).
         //
         if (pMenuBar->GetHMenu())
@@ -429,14 +437,14 @@ void wxFrame::InternalSetMenuBar()
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str());
     }
 
     if (!::WinSetOwner(m_hMenu, m_hFrame))
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str());
     }
     ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
 } // end of wxFrame::InternalSetMenuBar
@@ -654,70 +662,13 @@ bool wxFrame::ShowFullScreen(
                           ,m_vFsOldSize.height
                           ,SWP_SIZE | SWP_SHOW
                          );
-        return TRUE;
     }
+    return wxFrameBase::ShowFullScreen(bShow, lStyle);
 } // 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
@@ -727,29 +678,13 @@ void wxFrame::OnActivate(
 // 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
 
@@ -777,53 +712,57 @@ wxToolBar* wxFrame::CreateToolBar(
 
 void wxFrame::PositionToolBar()
 {
-    HWND                            hWndClient;
-    RECTL                           vRect;
+    wxToolBar*                      pToolBar = GetToolBar();
+    wxCoord                         vWidth;
+    wxCoord                         vHeight;
+    wxCoord                         vTWidth;
+    wxCoord                         vTHeight;
 
-    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    if (!pToolBar)
+        return;
 
-#if wxUSE_STATUSBAR
-    if (GetStatusBar())
-    {
-        int                         nStatusX;
-        int                         nStatusY;
+    RECTL                           vRect;
+    RECTL                           vFRect;
+    wxPoint                         vPos;
+
+    ::WinQueryWindowRect(m_hFrame, &vRect);
+    vPos.y = (wxCoord)vRect.yTop;
+    ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2);
+    vFRect = vRect;
+    ::WinCalcFrameRect(m_hFrame, &vRect, TRUE);
+
+    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
-                             );
+        wxCoord                     vSwidth = 0;
+        wxCoord                     vSheight = 0;
 
-        if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
-        {
-            nToolbarHeight = vRect.yBottom;
-        }
-        else
-        {
-            nToolbarWidth = vRect.xRight;
-        }
-
-        //
-        // 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
 
@@ -840,6 +779,10 @@ void wxFrame::IconizeChildFrames(
   bool                              bIconize
 )
 {
+  // FIXME: Generic MDI does not use Frames for the Childs, so this does _not_
+  //        work. Possibly, the right thing is simply to eliminate this
+  //        functions and all the calls to it from within this file.
+#if 0
     for (wxWindowList::Node* pNode = GetChildren().GetFirst();
          pNode;
          pNode = pNode->GetNext() )
@@ -871,6 +814,7 @@ void wxFrame::IconizeChildFrames(
                 pFrame->Iconize(bIconize);
         }
     }
+#endif
 } // end of wxFrame::IconizeChildFrames
 
 WXHICON wxFrame::GetDefaultIcon() const
@@ -919,9 +863,10 @@ bool wxFrame::HandlePaint()
             //
             // Icons in PM are the same as "pointers"
             //
+            const wxIcon&           vIcon = GetIcon();
             HPOINTER                hIcon;
 
-            if (m_icon.Ok())
+            if (vIcon.Ok())
                 hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L);
             else
                 hIcon = (HPOINTER)m_hDefaultIcon;
@@ -940,7 +885,6 @@ bool wxFrame::HandlePaint()
 
             if (hIcon)
             {
-                HWND                            hWndClient;
                 RECTL                           vRect3;
 
                 ::WinQueryWindowRect(GetHwnd(), &vRect3);
@@ -1067,15 +1011,10 @@ bool wxFrame::HandleSize(
         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
@@ -1146,6 +1085,11 @@ bool wxFrame::HandleMenuSelect(
             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
@@ -1187,10 +1131,12 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 int                 nItemCount;
                 int                 i;
                 PSWP                pSWP = NULL;
-                SWP                 vSwpStb;
                 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));
@@ -1198,18 +1144,11 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 {
                     ::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);
@@ -1219,10 +1158,20 @@ MRESULT EXPENTRY wxFrameMainWndProc(
                 {
                     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;
                     }
@@ -1263,7 +1212,6 @@ MRESULT EXPENTRY wxFrameWndProc(
     //
 
     MRESULT                         rc = (MRESULT)0;
-    bool                            bProcessed = FALSE;
 
     //
     // Stop right here if we don't have a valid handle in our wxWindow object.
@@ -1361,8 +1309,6 @@ MRESULT wxFrame::OS2WindowProc(
 
         case WM_SIZE:
             {
-                SHORT               nScxold = SHORT1FROMMP(wParam); // Old horizontal size.
-                SHORT               nScyold = SHORT2FROMMP(wParam); // Old vertical size.
                 SHORT               nScxnew = SHORT1FROMMP(lParam); // New horizontal size.
                 SHORT               nScynew = SHORT2FROMMP(lParam); // New vertical size.
 
@@ -1376,9 +1322,10 @@ MRESULT wxFrame::OS2WindowProc(
 
         case CM_QUERYDRAGIMAGE:
             {
+                const wxIcon&           vIcon = GetIcon();
                 HPOINTER                hIcon;
 
-                if (m_icon.Ok())
+                if (vIcon.Ok())
                     hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
                 else
                     hIcon = (HPOINTER)m_hDefaultIcon;
@@ -1455,3 +1402,22 @@ wxWindow* wxFrame::GetClient()
 {
     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
+                                  )
+                    );
+    }
+}
+