X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19193a2c85987b595932957e73013e7ea100f0e8..f96f6a880c6e7127bb9fe7aa7268d984dafdc7af:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index b7a9a6729b..567fa20eb6 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: frame.cpp -// Purpose: wxFrameOS2 +// Name: src/os2/frame.cpp +// Purpose: wxFrame // Author: David Webster // Modified by: // Created: 10/27/99 @@ -13,7 +13,6 @@ #include "wx/wxprec.h" #ifndef WX_PRECOMP - #include "wx/defs.h" #include "wx/object.h" #include "wx/dynarray.h" #include "wx/list.h" @@ -22,7 +21,6 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/event.h" - #include "wx/setup.h" #include "wx/frame.h" #include "wx/menu.h" #include "wx/app.h" @@ -30,50 +28,31 @@ #include "wx/dialog.h" #include "wx/settings.h" #include "wx/dcclient.h" + #include "wx/mdi.h" + #include "wx/toolbar.h" + #include "wx/statusbr.h" + #include "wx/menuitem.h" #endif // WX_PRECOMP #include "wx/os2/private.h" -#if wxUSE_STATUSBAR - #include "wx/statusbr.h" - #include "wx/generic/statusbr.h" -#endif // wxUSE_STATUSBAR - -#if wxUSE_TOOLBAR - #include "wx/toolbar.h" -#endif // wxUSE_TOOLBAR - -#include "wx/menuitem.h" -#include "wx/log.h" - // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- -extern wxWindowList wxModelessWindows; -extern wxList WXDLLEXPORT wxPendingDelete; -extern wxChar wxFrameClassName[]; - #if wxUSE_MENUS_NATIVE extern wxMenu *wxCurrentPopupMenu; #endif -extern void wxAssociateWinWithHandle( HWND hWnd - ,wxWindowOS2* pWin - ); - // ---------------------------------------------------------------------------- // event tables // ---------------------------------------------------------------------------- -BEGIN_EVENT_TABLE(wxFrameOS2, wxFrameBase) - EVT_ACTIVATE(wxFrameOS2::OnActivate) - EVT_SYS_COLOUR_CHANGED(wxFrameOS2::OnSysColourChanged) +BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) + EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() -#ifndef __WXUNIVERSAL__ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) -#endif // ============================================================================ // implementation @@ -85,9 +64,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) #if wxUSE_STATUSBAR #if wxUSE_NATIVE_STATUSBAR - bool wxFrameOS2::m_bUseNativeStatusBar = TRUE; + bool wxFrame::m_bUseNativeStatusBar = true; #else - bool wxFrameOS2::m_bUseNativeStatusBar = FALSE; + bool wxFrame::m_bUseNativeStatusBar = false; #endif #endif //wxUSE_STATUSBAR @@ -96,382 +75,118 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) // creation/destruction // ---------------------------------------------------------------------------- -void wxFrameOS2::Init() +void wxFrame::Init() { - m_bIconized = FALSE; - -#if wxUSE_TOOLTIPS - m_hWndToolTip = 0; -#endif - // Data to save/restore when calling ShowFullScreen - m_lFsStyle = 0L; - m_lFsOldWindowStyle = 0L; m_nFsStatusBarFields = 0; m_nFsStatusBarHeight = 0; m_nFsToolBarHeight = 0; - m_bFsIsMaximized = FALSE; - m_bFsIsShowing = FALSE; - m_bIsShown = FALSE; - m_pWinLastFocused = (wxWindow *)NULL; + m_hWndToolTip = 0L; + m_bWasMinimized = false; + + + m_frameMenuBar = NULL; + m_frameToolBar = NULL; + m_frameStatusBar = NULL; - m_hFrame = NULL; - m_hTitleBar = NULL; - m_hHScroll = NULL; - m_hVScroll = NULL; + m_hTitleBar = NULLHANDLE; + m_hHScroll = NULLHANDLE; + m_hVScroll = NULLHANDLE; // // Initialize SWP's // - memset(&m_vSwp, 0, sizeof(SWP)); - memset(&m_vSwpClient, 0, sizeof(SWP)); memset(&m_vSwpTitleBar, 0, sizeof(SWP)); memset(&m_vSwpMenuBar, 0, sizeof(SWP)); memset(&m_vSwpHScroll, 0, sizeof(SWP)); memset(&m_vSwpVScroll, 0, sizeof(SWP)); memset(&m_vSwpStatusBar, 0, sizeof(SWP)); memset(&m_vSwpToolBar, 0, sizeof(SWP)); -} // end of wxFrameOS2::Init + m_bIconized = false; -bool wxFrameOS2::Create( - wxWindow* pParent -, wxWindowID vId -, const wxString& rsTitle -, const wxPoint& rPos -, const wxSize& rSize -, long lulStyle -, const wxString& rsName -) -{ - int nX = rPos.x; - int nY = rPos.y; - int nWidth = rSize.x; - int nHeight = rSize.y; - bool bOk = FALSE; - - SetName(rsName); - m_windowStyle = lulStyle; - m_frameMenuBar = NULL; -#if wxUSE_TOOLBAR - m_frameToolBar = NULL; -#endif //wxUSE_TOOLBAR - -#if wxUSE_STATUSBAR - m_frameStatusBar = NULL; -#endif //wxUSE_STATUSBAR - - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); - - if (vId > -1 ) - m_windowId = vId; - else - m_windowId = (int)NewControlId(); - - if (pParent) - pParent->AddChild(this); - - m_bIconized = FALSE; - - if ((m_windowStyle & wxFRAME_FLOAT_ON_PARENT) == 0) - pParent = NULL; - - bOk = OS2Create( m_windowId - ,pParent - ,wxFrameClassName - ,this - ,rsTitle - ,nX - ,nY - ,nWidth - ,nHeight - ,lulStyle - ); - if (bOk) - { - if (!pParent) - wxTopLevelWindows.Append(this); - wxModelessWindows.Append(this); - } - return(bOk); -} // end of wxFrameOS2::Create +} // end of wxFrame::Init -wxFrameOS2::~wxFrameOS2() +bool wxFrame::Create( wxWindow* pParent, + wxWindowID vId, + const wxString& rsTitle, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle, + const wxString& rsName ) { - m_isBeingDeleted = TRUE; - - wxTopLevelWindows.DeleteObject(this); - + if (!wxTopLevelWindow::Create( pParent + ,vId + ,rsTitle + ,rPos + ,rSize + ,lStyle + ,rsName + )) + return false; + return true; +} // end of wxFrame::Create + +wxFrame::~wxFrame() +{ + m_isBeingDeleted = true; DeleteAllBars(); - - if (wxTheApp && (wxTopLevelWindows.Number() == 0)) - { - wxTheApp->SetTopWindow(NULL); - - if (wxTheApp->GetExitOnFrameDelete()) - { - ::WinPostMsg(NULL, WM_QUIT, 0, 0); - } - } - - wxModelessWindows.DeleteObject(this); - - // - // For some reason, wxWindows can activate another task altogether - // when a frame is destroyed after a modal dialog has been invoked. - // Try to bring the parent to the top. - // - // MT:Only do this if this frame is currently the active window, else weird - // things start to happen. - // - if (wxGetActiveWindow() == this) - { - if (GetParent() && GetParent()->GetHWND()) - { - ::WinSetWindowPos( (HWND) GetParent()->GetHWND() - ,HWND_TOP - ,0 - ,0 - ,0 - ,0 - ,SWP_ZORDER - ); - } - } -} // end of wxFrameOS2::~wxFrame +} // end of wxFrame::~wxFrame // // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. // -void wxFrameOS2::DoGetClientSize( +void wxFrame::DoGetClientSize( int* pX , int* pY ) const { - RECTL vRect; - ::WinQueryWindowRect(GetHwnd(), &vRect); - + wxTopLevelWindow::DoGetClientSize( pX + ,pY + ); // // No need to use statusbar code as in WIN32 as the FORMATFRAME // window procedure ensures PM knows about the new frame client - // size internally. A ::WinQueryWindowRect is all that is needed! + // size internally. A ::WinQueryWindowRect (that is called in + // wxWindow's GetClient size from above) is all that is needed! // - - if (pX) - *pX = vRect.xRight - vRect.xLeft; - if (pY) - *pY = vRect.yTop - vRect.yBottom; -} // end of wxFrameOS2::DoGetClientSize +} // end of wxFrame::DoGetClientSize // // Set the client size (i.e. leave the calculation of borders etc. -// to wxWindows) +// to wxWidgets) // -void wxFrameOS2::DoSetClientSize( +void wxFrame::DoSetClientSize( int nWidth , int nHeight ) { - HWND hWnd = GetHwnd(); - RECTL vRect; - RECTL vRect2; - - ::WinQueryWindowRect(GetHwnd(), &vRect); - ::WinQueryWindowRect(GetHwnd(), &vRect2); - // - // Find the difference between the entire window (title bar and all) - // and the client area; add this to the new client size to move the - // window. Remember OS/2's backwards y coord system! + // Statusbars are not part of the OS/2 Client but parent frame + // so no statusbar consideration // - int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth; - int nActualHeight = vRect2.yTop + vRect2.yTop - vRect.yTop + nHeight; - -#if wxUSE_STATUSBAR - if ( GetStatusBar() ) - { - int nStatusX; - int nStatusY; - - GetStatusBar()->GetClientSize( &nStatusX - ,&nStatusY + wxTopLevelWindow::DoSetClientSize( nWidth + ,nHeight ); - nActualHeight += nStatusY; - } -#endif // wxUSE_STATUSBAR - - wxPoint vPoint(GetClientAreaOrigin()); - nActualWidth += vPoint.y; - nActualHeight += vPoint.x; - - POINTL vPointl; - - vPointl.x = vRect2.xLeft; - vPointl.y = vRect2.yTop; - - ::WinSetWindowPos( hWnd - ,HWND_TOP - ,vPointl.x - ,vPointl.y - ,nActualWidth - ,nActualHeight - ,SWP_MOVE | SWP_SIZE | SWP_SHOW - ); - - wxSizeEvent vEvent( wxSize( nWidth - ,nHeight - ) - ,m_windowId - ); - vEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(vEvent); -} // end of wxFrameOS2::DoSetClientSize - -void wxFrameOS2::DoGetSize( - int* pWidth -, int* pHeight -) const -{ - RECTL vRect; - - ::WinQueryWindowRect(m_hFrame, &vRect); - *pWidth = vRect.xRight - vRect.xLeft; - *pHeight = vRect.yTop - vRect.yBottom; -} // end of wxFrameOS2::DoGetSize - -void wxFrameOS2::DoGetPosition( - int* pX -, int* pY -) const -{ - RECTL vRect; - POINTL vPoint; - - ::WinQueryWindowRect(m_hFrame, &vRect); - - *pX = vRect.xRight - vRect.xLeft; - *pY = vRect.yTop - vRect.yBottom; -} // end of wxFrameOS2::DoGetPosition +} // end of wxFrame::DoSetClientSize // ---------------------------------------------------------------------------- -// variations around ::ShowWindow() +// wxFrame: various geometry-related functions // ---------------------------------------------------------------------------- -void wxFrameOS2::DoShowWindow( - int bShowCmd -) -{ - ::WinShowWindow(m_hFrame, (BOOL)bShowCmd); - m_bIconized = bShowCmd == SWP_MINIMIZE; -} // end of wxFrameOS2::DoShowWindow - -bool wxFrameOS2::Show( - bool bShow -) -{ - SWP vSwp; - - DoShowWindow((int)bShow); - - if (bShow) - { - wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId); - - ::WinQueryWindowPos(m_hFrame, &vSwp); - m_bIconized = vSwp.fl & SWP_MINIMIZE; - ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); - ::WinEnableWindow(m_hFrame, TRUE); - vEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(vEvent); - } - else - { - // - // Try to highlight the correct window (the parent) - // - if (GetParent()) - { - HWND hWndParent = GetHwndOf(GetParent()); - - ::WinQueryWindowPos(hWndParent, &vSwp); - m_bIconized = vSwp.fl & SWP_MINIMIZE; - if (hWndParent) - ::WinSetWindowPos( hWndParent - ,HWND_TOP - ,vSwp.x - ,vSwp.y - ,vSwp.cx - ,vSwp.cy - ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE - ); - ::WinEnableWindow(hWndParent, TRUE); - } - } - return TRUE; -} // end of wxFrameOS2::Show - -void wxFrameOS2::Iconize( - bool bIconize -) -{ - DoShowWindow(bIconize ? SWP_MINIMIZE : SWP_RESTORE); -} // end of wxFrameOS2::Iconize - -void wxFrameOS2::Maximize( - bool bMaximize) -{ - DoShowWindow(bMaximize ? SWP_MAXIMIZE : SWP_RESTORE); -} // end of wxFrameOS2::Maximize - -void wxFrameOS2::Restore() -{ - DoShowWindow(SWP_RESTORE); -} // end of wxFrameOS2::Restore - -bool wxFrameOS2::IsIconized() const -{ - SWP vSwp; - - ::WinQueryWindowPos(m_hFrame, &vSwp); - - if (vSwp.fl & SWP_MINIMIZE) - ((wxFrame*)this)->m_bIconized = TRUE; - else - ((wxFrame*)this)->m_bIconized = FALSE; - return m_bIconized; -} // end of wxFrameOS2::IsIconized - -// Is it maximized? -bool wxFrameOS2::IsMaximized() const -{ - SWP vSwp; - bool bIconic; - - ::WinQueryWindowPos(m_hFrame, &vSwp); - return (vSwp.fl & SWP_MAXIMIZE); -} // end of wxFrameOS2::IsMaximized - -void wxFrameOS2::SetIcon( - const wxIcon& rIcon -) +void wxFrame::Raise() { - wxFrameBase::SetIcon(rIcon); - - if ((m_icon.GetHICON()) != NULLHANDLE) - { - ::WinSendMsg( m_hFrame - ,WM_SETICON - ,(MPARAM)((HPOINTER)m_icon.GetHICON()) - ,NULL - ); - ::WinSendMsg( m_hFrame - ,WM_UPDATEFRAME - ,(MPARAM)FCF_ICON - ,(MPARAM)0 - ); - } -} // end of wxFrameOS2::SetIcon + wxFrameBase::Raise(); + ::WinSetWindowPos( (HWND) GetParent()->GetHWND() + ,HWND_TOP + ,0 + ,0 + ,0 + ,0 + ,SWP_ZORDER + ); +} #if wxUSE_STATUSBAR -wxStatusBar* wxFrameOS2::OnCreateStatusBar( +wxStatusBar* wxFrame::OnCreateStatusBar( int nNumber , long lulStyle , wxWindowID vId @@ -479,8 +194,6 @@ wxStatusBar* wxFrameOS2::OnCreateStatusBar( ) { wxStatusBar* pStatusBar = NULL; - SWP vSwp; - ERRORID vError; wxString sError; pStatusBar = wxFrameBase::OnCreateStatusBar( nNumber @@ -492,13 +205,28 @@ wxStatusBar* wxFrameOS2::OnCreateStatusBar( if( !pStatusBar ) return NULL; - ::WinSetParent( pStatusBar->GetHWND() - ,m_hFrame - ,FALSE - ); - ::WinSetOwner( pStatusBar->GetHWND() - ,m_hFrame - ); + 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( wxT("X") + ,NULL + ,&nY + ); + + int nHeight = ((11 * nY) / 10 + 2 * pStatusBar->GetBorderY()); + + pStatusBar->SetSize( wxDefaultCoord + ,wxDefaultCoord + ,wxDefaultCoord + ,nHeight + ); + + ::WinSetParent( pStatusBar->GetHWND(), m_hFrame, FALSE ); + ::WinSetOwner( pStatusBar->GetHWND(), m_hFrame); // // to show statusbar // @@ -506,9 +234,9 @@ wxStatusBar* wxFrameOS2::OnCreateStatusBar( ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); return pStatusBar; -} // end of wxFrameOS2::OnCreateStatusBar +} // end of wxFrame::OnCreateStatusBar -void wxFrameOS2::PositionStatusBar() +void wxFrame::PositionStatusBar() { SWP vSwp; ERRORID vError; @@ -520,28 +248,31 @@ void wxFrameOS2::PositionStatusBar() if (m_frameStatusBar) { int nWidth; + int nY; int nStatbarWidth; int nStatbarHeight; - HWND hWndClient; RECTL vRect; RECTL vFRect; ::WinQueryWindowRect(m_hFrame, &vRect); + nY = vRect.yTop; ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2); vFRect = vRect; ::WinCalcFrameRect(m_hFrame, &vRect, TRUE); nWidth = vRect.xRight - vRect.xLeft; + nY = nY - (vRect.yBottom - vFRect.yBottom); m_frameStatusBar->GetSize( &nStatbarWidth ,&nStatbarHeight ); + nY= nY - nStatbarHeight; // // Since we wish the status bar to be directly under the client area, // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS. // m_frameStatusBar->SetSize( vRect.xLeft - vFRect.xLeft - ,vRect.yBottom - vFRect.yBottom + ,nY ,nWidth ,nStatbarHeight ); @@ -549,38 +280,42 @@ void wxFrameOS2::PositionStatusBar() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for StautsBar. Error: %s\n", sError); + wxLogError(_T("Error setting parent for StatusBar. Error: %s\n"), sError.c_str()); return; } } -} // end of wxFrameOS2::PositionStatusBar +} // 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 wxFrameOS2::DetachMenuBar() +void wxFrame::DetachMenuBar() { if (m_frameMenuBar) { m_frameMenuBar->Detach(); m_frameMenuBar = NULL; } -} // end of wxFrameOS2::DetachMenuBar +} // end of wxFrame::DetachMenuBar -void wxFrameOS2::SetMenuBar( +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) { @@ -599,7 +334,7 @@ void wxFrameOS2::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()) @@ -617,9 +352,9 @@ void wxFrameOS2::SetMenuBar( m_frameMenuBar = pMenuBar; pMenuBar->Attach((wxFrame*)this); } -} // end of wxFrameOS2::SetMenuBar +} // end of wxFrame::SetMenuBar -void wxFrameOS2::AttachMenuBar( +void wxFrame::AttachMenuBar( wxMenuBar* pMenubar ) { @@ -656,9 +391,9 @@ void wxFrameOS2::AttachMenuBar( } InternalSetMenuBar(); } -} // end of wxFrameOS2::AttachMenuBar +} // end of wxFrame::AttachMenuBar -void wxFrameOS2::InternalSetMenuBar() +void wxFrame::InternalSetMenuBar() { ERRORID vError; wxString sError; @@ -669,27 +404,27 @@ void wxFrameOS2::InternalSetMenuBar() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for submenu. Error: %s\n", sError); + wxLogError(_T("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(_T("Error setting parent for submenu. Error: %s\n"), sError.c_str()); } ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); -} // end of wxFrameOS2::InternalSetMenuBar +} // end of wxFrame::InternalSetMenuBar #endif // wxUSE_MENUS_NATIVE // // Responds to colour changes, and passes event on to children // -void wxFrameOS2::OnSysColourChanged( +void wxFrame::OnSysColourChanged( wxSysColourChangedEvent& rEvent ) { - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); Refresh(); #if wxUSE_STATUSBAR @@ -698,7 +433,7 @@ void wxFrameOS2::OnSysColourChanged( wxSysColourChangedEvent vEvent2; vEvent2.SetEventObject(m_frameStatusBar); - m_frameStatusBar->GetEventHandler()->ProcessEvent(vEvent2); + m_frameStatusBar->HandleWindowEvent(vEvent2); } #endif //wxUSE_STATUSBAR @@ -706,20 +441,17 @@ void wxFrameOS2::OnSysColourChanged( // Propagate the event to the non-top-level children // wxWindow::OnSysColourChanged(rEvent); -} // end of wxFrameOS2::OnSysColourChanged +} // end of wxFrame::OnSysColourChanged -// Pass TRUE to show full screen, FALSE to restore. -bool wxFrameOS2::ShowFullScreen( - bool bShow -, long lStyle -) +// Pass true to show full screen, false to restore. +bool wxFrame::ShowFullScreen( bool bShow, long lStyle ) { if (bShow) { if (IsFullScreen()) - return FALSE; + return false; - m_bFsIsShowing = TRUE; + m_bFsIsShowing = true; m_lFsStyle = lStyle; #if wxUSE_TOOLBAR @@ -748,8 +480,8 @@ bool wxFrameOS2::ShowFullScreen( // if ((lStyle & wxFULLSCREEN_NOTOOLBAR) && pTheToolBar) { - pTheToolBar->SetSize(-1,0); - pTheToolBar->Show(FALSE); + pTheToolBar->SetSize(wxDefaultCoord,0); + pTheToolBar->Show(false); } #endif //wxUSE_TOOLBAR @@ -792,8 +524,8 @@ bool wxFrameOS2::ShowFullScreen( // // Decide which window style flags to turn off // - LONG lNewStyle = m_lFsOldWindowStyle; - LONG lOffFlags = 0; + LONG lNewStyle = m_lFsOldWindowStyle; + LONG lOffFlags = 0; if (lStyle & wxFULLSCREEN_NOBORDER) lOffFlags |= FCF_BORDER; @@ -817,13 +549,11 @@ bool wxFrameOS2::ShowFullScreen( ::WinQueryWindowRect(HWND_DESKTOP, &vRect); nWidth = vRect.xRight - vRect.xLeft; // - // Rmember OS/2 is backwards! + // Remember OS/2 is backwards! // nHeight = vRect.yTop - vRect.yBottom; - SetSize( nWidth - ,nHeight - ); + SetSize( nWidth, nHeight); // // Now flush the window style cache and actually go full-screen @@ -837,21 +567,18 @@ bool wxFrameOS2::ShowFullScreen( ,SWP_SIZE | SWP_SHOW ); - wxSizeEvent vEvent( wxSize( nWidth - ,nHeight - ) - ,GetId() - ); + wxSize sz( nWidth, nHeight ); + wxSizeEvent vEvent( sz, GetId() ); - GetEventHandler()->ProcessEvent(vEvent); - return TRUE; + HandleWindowEvent(vEvent); + return true; } else { if (!IsFullScreen()) - return FALSE; + return false; - m_bFsIsShowing = FALSE; + m_bFsIsShowing = false; #if wxUSE_TOOLBAR wxToolBar* pTheToolBar = GetToolBar(); @@ -861,8 +588,8 @@ bool wxFrameOS2::ShowFullScreen( // if (pTheToolBar && (m_lFsStyle & wxFULLSCREEN_NOTOOLBAR)) { - pTheToolBar->SetSize(-1, m_nFsToolBarHeight); - pTheToolBar->Show(TRUE); + pTheToolBar->SetSize(wxDefaultCoord, m_nFsToolBarHeight); + pTheToolBar->Show(true); } #endif //wxUSE_TOOLBAR @@ -894,261 +621,13 @@ bool wxFrameOS2::ShowFullScreen( ,m_vFsOldSize.height ,SWP_SIZE | SWP_SHOW ); - return TRUE; } -} // end of wxFrameOS2::ShowFullScreen + return wxFrameBase::ShowFullScreen(bShow, lStyle); +} // end of wxFrame::ShowFullScreen // // Frame window // -bool wxFrameOS2::OS2Create( - int nId -, wxWindow* pParent -, const wxChar* zWclass -, wxWindow* pWxWin -, const wxChar* zTitle -, int nX -, int nY -, int nWidth -, int nHeight -, long ulStyle -) -{ - ULONG ulCreateFlags = 0L; - ULONG ulStyleFlags = 0L; - ULONG ulExtraFlags = 0L; - FRAMECDATA vFrameCtlData; - HWND hParent = NULLHANDLE; - HWND hTitlebar = NULLHANDLE; - HWND hHScroll = NULLHANDLE; - HWND hVScroll = NULLHANDLE; - HWND hFrame = NULLHANDLE; - HWND hClient = NULLHANDLE; - SWP vSwp[10]; - RECTL vRect[10]; - USHORT uCtlCount; - ERRORID vError; - wxString sError; - - m_hDefaultIcon = (WXHICON) (wxSTD_FRAME_ICON ? wxSTD_FRAME_ICON : wxDEFAULT_FRAME_ICON); - - if (pParent) - hParent = GetWinHwnd(pParent); - else - hParent = HWND_DESKTOP; - - if (ulStyle == wxDEFAULT_FRAME_STYLE) - ulCreateFlags = FCF_SIZEBORDER | FCF_TITLEBAR | FCF_SYSMENU | - FCF_MINMAX | FCF_TASKLIST; - else - { - if ((ulStyle & wxCAPTION) == wxCAPTION) - ulCreateFlags = FCF_TASKLIST; - else - ulCreateFlags = FCF_NOMOVEWITHOWNER; - - if ((ulStyle & wxVSCROLL) == wxVSCROLL) - ulCreateFlags |= FCF_VERTSCROLL; - if ((ulStyle & wxHSCROLL) == wxHSCROLL) - ulCreateFlags |= FCF_HORZSCROLL; - if (ulStyle & wxMINIMIZE_BOX) - ulCreateFlags |= FCF_MINBUTTON; - if (ulStyle & wxMAXIMIZE_BOX) - ulCreateFlags |= FCF_MAXBUTTON; - if (ulStyle & wxTHICK_FRAME) - ulCreateFlags |= FCF_DLGBORDER; - if (ulStyle & wxSYSTEM_MENU) - ulCreateFlags |= FCF_SYSMENU; - if (ulStyle & wxCAPTION) - ulCreateFlags |= FCF_TASKLIST; - if (ulStyle & wxCLIP_CHILDREN) - { - // Invalid for frame windows under PM - } - - if (ulStyle & wxTINY_CAPTION_VERT) - ulCreateFlags |= FCF_TASKLIST; - if (ulStyle & wxTINY_CAPTION_HORIZ) - ulCreateFlags |= FCF_TASKLIST; - - if ((ulStyle & wxTHICK_FRAME) == 0) - ulCreateFlags |= FCF_BORDER; - if (ulStyle & wxFRAME_TOOL_WINDOW) - ulExtraFlags = kFrameToolWindow; - - if (ulStyle & wxSTAY_ON_TOP) - ulCreateFlags |= FCF_SYSMODAL; - } - if ((ulStyle & wxMINIMIZE) || (ulStyle & wxICONIZE)) - ulStyleFlags |= WS_MINIMIZED; - if (ulStyle & wxMAXIMIZE) - ulStyleFlags |= WS_MAXIMIZED; - - // - // Clear the visible flag, we always call show - // - ulStyleFlags &= (unsigned long)~WS_VISIBLE; - m_bIconized = FALSE; - - // - // Set the frame control block - // - vFrameCtlData.cb = sizeof(vFrameCtlData); - vFrameCtlData.flCreateFlags = ulCreateFlags; - vFrameCtlData.hmodResources = 0L; - vFrameCtlData.idResources = 0; - - // - // Create the frame window: We break ranks with other ports now - // and instead of calling down into the base wxWindow class' OS2Create - // we do all our own stuff here. We will set the needed pieces - // of wxWindow manually, here. - // - - hFrame = ::WinCreateStdWindow( hParent - ,ulStyleFlags // frame-window style - ,&ulCreateFlags // window style - ,(PSZ)zWclass // class name - ,(PSZ)zTitle // window title - ,0L // default client style - ,NULLHANDLE // resource in executable file - ,0 // resource id - ,&hClient // receives client window handle - ); - if (!hFrame) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error creating frame. Error: %s\n", sError); - return FALSE; - } - - // - // wxWindow class' m_hWnd set here and needed associations - // - m_hFrame = hFrame; - m_hWnd = hClient; - wxAssociateWinWithHandle(m_hWnd, this); - wxAssociateWinWithHandle(m_hFrame, this); - - m_backgroundColour.Set(wxString("GREY")); - - LONG lColor = (LONG)m_backgroundColour.GetPixel(); - - if (!::WinSetPresParam( m_hWnd - ,PP_BACKGROUNDCOLOR - ,sizeof(LONG) - ,(PVOID)&lColor - )) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error creating frame. Error: %s\n", sError); - return FALSE; - } - - // - // Now need to subclass window. Instead of calling the SubClassWin in wxWindow - // we manually subclass here because we don't want to use the main wxWndProc - // by default - // - m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(m_hFrame, (PFNWP)wxFrameMainWndProc); - - // - // Now size everything. If adding a menu the client will need to be resized. - // - - if (!::WinSetWindowPos( m_hFrame - ,HWND_TOP - ,nX - ,nY - ,nWidth - ,nHeight - ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER - )) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error sizing frame. Error: %s\n", sError); - return FALSE; - } - // - // We may have to be smarter here when variable sized toolbars are added! - // - if (!::WinSetWindowPos( m_hWnd - ,HWND_TOP - ,nX // + 20 - ,nY // + 20 - ,nWidth // - 60 - ,nHeight // - 60 - ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER - )) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error sizing client. Error: %s\n", sError); - return FALSE; - } - return TRUE; -} // end of wxFrameOS2::OS2Create - -// -// Default activation behaviour - set the focus for the first child -// subwindow found. -// -void wxFrameOS2::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 wxFrameOS2::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 @@ -1156,33 +635,17 @@ void wxFrameOS2::OnActivate( // ---------------------------------------------------------------------------- // Checks if there is a toolbar, and returns the first free client position -wxPoint wxFrameOS2::GetClientAreaOrigin() const +wxPoint wxFrame::GetClientAreaOrigin() const { - wxPoint vPoint(0, 0); - -#if wxUSE_TOOLBAR - if (GetToolBar()) - { - int nWidth; - int nHeight; - - GetToolBar()->GetSize( &nWidth - ,&nHeight - ); + wxPoint vPoint = wxTopLevelWindow::GetClientAreaOrigin(); - 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 wxFrameOS2::GetClientAreaOrigin +} // end of wxFrame::GetClientAreaOrigin // ---------------------------------------------------------------------------- // tool/status bar stuff @@ -1190,7 +653,7 @@ wxPoint wxFrameOS2::GetClientAreaOrigin() const #if wxUSE_TOOLBAR -wxToolBar* wxFrameOS2::CreateToolBar( +wxToolBar* wxFrame::CreateToolBar( long lStyle , wxWindowID vId , const wxString& rName @@ -1204,58 +667,94 @@ wxToolBar* wxFrameOS2::CreateToolBar( PositionToolBar(); } return m_frameToolBar; -} // end of wxFrameOS2::CreateToolBar +} // end of wxFrame::CreateToolBar -void wxFrameOS2::PositionToolBar() +void wxFrame::PositionToolBar() { - HWND hWndClient; + wxToolBar* pToolBar = GetToolBar(); + wxCoord vWidth; + wxCoord vHeight; + wxCoord vTWidth; + wxCoord vTHeight; + + if (!pToolBar) + return; + RECTL vRect; + RECTL vFRect; + 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); + + vPos.y = (wxCoord)(vFRect.yTop - vRect.yTop); + pToolBar->GetSize( &vTWidth + ,&vTHeight + ); -#if wxUSE_STATUSBAR - if (GetStatusBar()) + if (pToolBar->GetWindowStyleFlag() & wxTB_TOP) { - int nStatusX; - int nStatusY; + vWidth = (wxCoord)(vRect.xRight - vRect.xLeft); + pToolBar->SetSize( vRect.xLeft - vFRect.xLeft + ,vPos.y + ,vWidth + ,vTHeight + ); + } + else if (pToolBar->GetWindowStyleFlag() & wxTB_BOTTOM) + { + wxCoord vSwidth = 0; + wxCoord vSheight = 0; - GetStatusBar()->GetClientSize( &nStatusX - ,&nStatusY + if (m_frameStatusBar) + m_frameStatusBar->GetSize( &vSwidth + ,&vSheight ); - // PM is backwards from windows - vRect.yBottom += nStatusY; + vWidth = (wxCoord)(vRect.xRight - vRect.xLeft); + pToolBar->SetSize( vRect.xLeft - vFRect.xLeft + ,vFRect.yTop - vRect.yBottom - vTHeight - vSheight + ,vWidth + ,vTHeight + ); } -#endif // wxUSE_STATUSBAR - - if ( m_frameToolBar ) + else if (pToolBar->GetWindowStyleFlag() & wxTB_LEFT) { - 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; - } + if (m_frameStatusBar) + m_frameStatusBar->GetSize( &vSwidth + ,&vSheight + ); + vHeight = (wxCoord)(vRect.yTop - vRect.yBottom); + pToolBar->SetSize( vRect.xLeft - vRect.xLeft + ,vPos.y + ,vTWidth + ,vHeight - vSheight + ); + } + else + { + 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.xRight - vFRect.xLeft - vTWidth + ,vPos.y + ,vTWidth + ,vHeight - vSheight + ); } -} // end of wxFrameOS2::PositionToolBar + if( ::WinIsWindowShowing(m_hFrame) ) + ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); +} // end of wxFrame::PositionToolBar #endif // wxUSE_TOOLBAR // ---------------------------------------------------------------------------- @@ -1267,23 +766,51 @@ void wxFrameOS2::PositionToolBar() // Windows behaviour where child frames float independently of the parent one // on the desktop, but are iconized/restored with it // -void wxFrameOS2::IconizeChildFrames( - bool bIconize -) +void wxFrame::IconizeChildFrames( bool WXUNUSED(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() ) { wxWindow* pWin = pNode->GetData(); + wxFrame* pFrame = wxDynamicCast(pWin, wxFrame); - if (pWin->IsKindOf(CLASSINFO(wxFrame)) ) + if ( pFrame +#if wxUSE_MDI_ARCHITECTURE + && !wxDynamicCast(pFrame, wxMDIChildFrame) +#endif // wxUSE_MDI_ARCHITECTURE + ) { - ((wxFrame *)pWin)->Iconize(bIconize); + // + // We don't want to restore the child frames which had been + // iconized even before we were iconized, so save the child frame + // status when iconizing the parent frame and check it when + // restoring it. + // + if (bIconize) + { + pFrame->m_bWasMinimized = pFrame->IsIconized(); + } + + // + // This test works for both iconizing and restoring + // + if (!pFrame->m_bWasMinimized) + pFrame->Iconize(bIconize); } } -} // end of wxFrameOS2::IconizeChildFrames +#endif +} // end of wxFrame::IconizeChildFrames +WXHICON wxFrame::GetDefaultIcon() const +{ + return (WXHICON)(wxSTD_FRAME_ICON ? wxSTD_FRAME_ICON + : wxDEFAULT_FRAME_ICON); +} // =========================================================================== // message processing // =========================================================================== @@ -1291,32 +818,30 @@ void wxFrameOS2::IconizeChildFrames( // --------------------------------------------------------------------------- // preprocessing // --------------------------------------------------------------------------- -bool wxFrameOS2::OS2TranslateMessage( - WXMSG* pMsg -) +bool wxFrame::OS2TranslateMessage( WXMSG* pMsg ) { // // try the menu bar accels // - wxMenuBar* pMenuBar = GetMenuBar(); + wxMenuBar* pMenuBar = GetMenuBar(); if (!pMenuBar) - return FALSE; + return false; #if wxUSE_ACCEL && wxUSE_MENUS_NATIVE const wxAcceleratorTable& rAcceleratorTable = pMenuBar->GetAccelTable(); return rAcceleratorTable.Translate(GetHWND(), pMsg); #else - return FALSE; + return false; #endif //wxUSE_ACCEL -} // end of wxFrameOS2::OS2TranslateMessage +} // end of wxFrame::OS2TranslateMessage // --------------------------------------------------------------------------- // our private (non virtual) message handlers // --------------------------------------------------------------------------- -bool wxFrameOS2::HandlePaint() +bool wxFrame::HandlePaint() { - RECTL vRect; + RECTL vRect; if (::WinQueryUpdateRect(GetHWND(), &vRect)) { @@ -1325,9 +850,10 @@ bool wxFrameOS2::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; @@ -1346,7 +872,6 @@ bool wxFrameOS2::HandlePaint() if (hIcon) { - HWND hWndClient; RECTL vRect3; ::WinQueryWindowRect(GetHwnd(), &vRect3); @@ -1359,28 +884,51 @@ bool wxFrameOS2::HandlePaint() ::WinDrawPointer(hPs, nIconX, nIconY, hIcon, DP_NORMAL); } ::WinEndPaint(hPs); - return TRUE; } else { - return(wxWindow::HandlePaint()); + if (!wxWindow::HandlePaint()) + { + HPS hPS; + RECTL vRect; + + hPS = ::WinBeginPaint( GetHwnd() + ,NULLHANDLE + ,&vRect + ); + if(hPS) + { + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + ); + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_RGB + ,0L + ,0L + ,NULL + ); + + ::WinFillRect( hPS + ,&vRect + ,GetBackgroundColour().GetPixel() + ); + ::WinEndPaint(hPS); + } + } } } - else - { - // nothing to paint - processed - return TRUE; - } - return FALSE; -} // end of wxFrameOS2::HandlePaint -bool wxFrameOS2::HandleSize( - int nX -, int nY -, WXUINT nId -) + return true; +} // end of wxFrame::HandlePaint + +bool wxFrame::HandleSize( int nX, int nY, WXUINT nId ) { - bool bProcessed = FALSE; + bool bProcessed = false; switch (nId) { @@ -1395,24 +943,24 @@ bool wxFrameOS2::HandleSize( // // restore all child frames too // - IconizeChildFrames(FALSE); - (void)SendIconizeEvent(FALSE); + IconizeChildFrames(false); + (void)SendIconizeEvent(false); // // fall through // case kSizeMax: - m_bIconized = FALSE; + m_bIconized = false; break; case kSizeMin: // // Iconize all child frames too // - IconizeChildFrames(TRUE); + IconizeChildFrames(true); (void)SendIconizeEvent(); - m_bIconized = TRUE; + m_bIconized = true; break; } @@ -1440,23 +988,17 @@ bool wxFrameOS2::HandleSize( PositionToolBar(); #endif // wxUSE_TOOLBAR - wxSizeEvent vEvent( wxSize( nX - ,nY - ) - ,m_windowId - ); - - vEvent.SetEventObject(this); - bProcessed = GetEventHandler()->ProcessEvent(vEvent); + bProcessed = wxWindow::HandleSize( nX + ,nY + ,nId + ); } return bProcessed; -} // end of wxFrameOS2::HandleSize +} // end of wxFrame::HandleSize -bool wxFrameOS2::HandleCommand( - WXWORD nId -, WXWORD nCmd -, WXHWND hControl -) +bool wxFrame::HandleCommand( WXWORD nId, + WXWORD nCmd, + WXHWND hControl ) { if (hControl) { @@ -1466,9 +1008,7 @@ bool wxFrameOS2::HandleCommand( wxWindow* pWin = wxFindWinFromHandle(hControl); if (pWin) - return pWin->OS2Command( nCmd - ,nId - ); + return pWin->OS2Command( nCmd, nId ); } // @@ -1483,26 +1023,21 @@ bool wxFrameOS2::HandleCommand( wxCurrentPopupMenu = NULL; - return pPopupMenu->OS2Command( nCmd - ,nId - ); - return TRUE; + return pPopupMenu->OS2Command( nCmd, nId ); } #endif if (ProcessCommand(nId)) { - return TRUE; + return true; } } - return FALSE; -} // end of wxFrameOS2::HandleCommand + return false; +} // end of wxFrame::HandleCommand -bool wxFrameOS2::HandleMenuSelect( - WXWORD nItem -, WXWORD nFlags -, WXHMENU hMenu -) +bool wxFrame::HandleMenuSelect( WXWORD nItem, + WXWORD nFlags, + WXHMENU hMenu ) { if( !nFlags ) { @@ -1516,25 +1051,28 @@ bool wxFrameOS2::HandleMenuSelect( wxMenuEvent vEvent(wxEVT_MENU_HIGHLIGHT, nItem); vEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM + HandleWindowEvent(vEvent); // return value would be ignored by PM + } + else + { + DoGiveHelp(wxEmptyString, true); + return false; } } - return TRUE; -} // end of wxFrameOS2::HandleMenuSelect + return true; +} // end of wxFrame::HandleMenuSelect // --------------------------------------------------------------------------- // Main Frame window proc // --------------------------------------------------------------------------- -MRESULT EXPENTRY wxFrameMainWndProc( - HWND hWnd -, ULONG ulMsg -, MPARAM wParam -, MPARAM lParam -) +MRESULT EXPENTRY wxFrameMainWndProc( HWND hWnd, + ULONG ulMsg, + MPARAM wParam, + MPARAM lParam ) { - MRESULT rc = (MRESULT)0; - bool bProcessed = FALSE; - wxFrame* pWnd = NULL; + MRESULT rc = (MRESULT)0; + bool bProcessed = false; + wxFrame* pWnd = NULL; pWnd = (wxFrame*) wxFindWinFromHandle((WXHWND) hWnd); switch (ulMsg) @@ -1559,10 +1097,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)); @@ -1570,18 +1110,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); @@ -1591,15 +1124,39 @@ 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_TOP) + { + 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 if (pWnd->m_frameToolBar && pWnd->m_frameToolBar->GetWindowStyleFlag() & wxTB_BOTTOM) + { + pSWP[i].x = vRectl.xLeft; + pSWP[i].y = vRectl.yBottom + nHeight + nHeight2; + pSWP[i].cx = vRectl.xRight - vRectl.xLeft; + pSWP[i].cy = vRectl.yTop - vRectl.yBottom - (nHeight + nHeight2); + } + else if (pWnd->m_frameToolBar && pWnd->m_frameToolBar->GetWindowStyleFlag() & wxTB_LEFT) + { + 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; + } + else + { + pSWP[i].x = vRectl.xLeft; + 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; } } - bProcessed = TRUE; + bProcessed = true; rc = MRFROMSHORT(nItemCount); } break; @@ -1635,7 +1192,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. @@ -1656,14 +1212,12 @@ MRESULT EXPENTRY wxFrameWndProc( return rc; } // end of wxFrameWndProc -MRESULT wxFrameOS2::OS2WindowProc( - WXUINT uMessage -, WXWPARAM wParam -, WXLPARAM lParam -) +MRESULT wxFrame::OS2WindowProc( WXUINT uMessage, + WXWPARAM wParam, + WXLPARAM lParam ) { - MRESULT mRc = 0L; - bool bProcessed = FALSE; + MRESULT mRc = 0L; + bool bProcessed = false; switch (uMessage) { @@ -1733,8 +1287,6 @@ MRESULT wxFrameOS2::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. @@ -1748,9 +1300,10 @@ MRESULT wxFrameOS2::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; @@ -1766,19 +1319,17 @@ MRESULT wxFrameOS2::OS2WindowProc( ,lParam ); return (MRESULT)mRc; -} // wxFrameOS2::OS2WindowProc +} // wxFrame::OS2WindowProc -void wxFrameOS2::SetClient(WXHWND c_Hwnd) +void wxFrame::SetClient(WXHWND WXUNUSED(c_Hwnd)) { // Duh...nothing to do under OS/2 } -void wxFrameOS2::SetClient( - wxWindow* pWindow -) +void wxFrame::SetClient( wxWindow* pWindow ) { - wxWindow* pOldClient = this->GetClient(); - bool bClientHasFocus = pOldClient && (pOldClient == wxWindow::FindFocus()); + wxWindow* pOldClient = this->GetClient(); + bool bClientHasFocus = pOldClient && (pOldClient == wxWindow::FindFocus()); if(pOldClient == pWindow) // nothing to do return; @@ -1790,8 +1341,8 @@ void wxFrameOS2::SetClient( if(bClientHasFocus ) this->SetFocus(); - pOldClient->Enable( FALSE ); - pOldClient->Show( FALSE ); + pOldClient->Enable( false ); + pOldClient->Show( false ); ::WinSetWindowUShort(pOldClient->GetHWND(), QWS_ID, (USHORT)pOldClient->GetId()); // to avoid OS/2 bug need to update frame ::WinSendMsg((HWND)this->GetFrame(), WM_UPDATEFRAME, (MPARAM)~0, 0); @@ -1807,8 +1358,8 @@ void wxFrameOS2::SetClient( ::WinEnableWindowUpdate((HWND)GetHWND(), FALSE); if(pOldClient) { - pOldClient->Enable(FALSE); - pOldClient->Show(FALSE); + pOldClient->Enable(false); + pOldClient->Show(false); ::WinSetWindowUShort(pOldClient->GetHWND(), QWS_ID, (USHORT)pOldClient->GetId()); } pWindow->Reparent(this); @@ -1823,7 +1374,25 @@ void wxFrameOS2::SetClient( } } -wxWindow* wxFrameOS2::GetClient() +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 + ) + ); + } +}