X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/64e0c5c617a742529c52c0b79abc0a37c4326fe6..1be06faf7318abf88a35b299b90ceb2a49c0353b:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index e1244b42d8..9de5fdf513 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -164,6 +164,7 @@ bool wxFrame::Create( wxFrame::~wxFrame() { m_isBeingDeleted = TRUE; + wxTopLevelWindows.DeleteObject(this); DeleteAllBars(); @@ -174,9 +175,10 @@ wxFrame::~wxFrame() if (wxTheApp->GetExitOnFrameDelete()) { - ::WinPostMsg(m_hFrame, WM_QUIT, 0, 0); + ::WinPostMsg(NULL, WM_QUIT, 0, 0); } } + wxModelessWindows.DeleteObject(this); // @@ -262,7 +264,7 @@ void wxFrame::DoSetClientSize( ::WinQueryWindowRect(GetHwnd(), &vRect); - ::WinQueryWindowRect(m_hFrame, &vRect2); + ::WinQueryWindowRect(GetHWND(), &vRect2); // // Find the difference between the entire window (title bar and all) @@ -319,7 +321,7 @@ void wxFrame::DoGetSize( { RECTL vRect; - ::WinQueryWindowRect(m_hFrame, &vRect); + ::WinQueryWindowRect(GetHWND(), &vRect); *pWidth = vRect.xRight - vRect.xLeft; *pHeight = vRect.yTop - vRect.yBottom; } // end of wxFrame::DoGetSize @@ -332,7 +334,7 @@ void wxFrame::DoGetPosition( RECTL vRect; POINTL vPoint; - ::WinQueryWindowRect(m_hFrame, &vRect); + ::WinQueryWindowRect(GetHWND(), &vRect); vPoint.x = vRect.xLeft; // @@ -352,7 +354,7 @@ void wxFrame::DoShowWindow( int bShowCmd ) { - ::WinShowWindow(m_hFrame, (BOOL)bShowCmd); + ::WinShowWindow(GetHWND(), (BOOL)bShowCmd); m_bIconized = bShowCmd == SWP_MINIMIZE; } // end of wxFrame::DoShowWindow @@ -368,9 +370,10 @@ bool wxFrame::Show( { wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId); - ::WinQueryWindowPos(m_hFrame, &vSwp); + ::WinQueryWindowPos(GetHWND(), &vSwp); m_bIconized = vSwp.fl & SWP_MINIMIZE; - ::WinEnableWindow(m_hFrame, TRUE); + ::WinSendMsg(GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + ::WinEnableWindow(GetHWND(), TRUE); vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); } @@ -437,7 +440,7 @@ bool wxFrame::IsMaximized() const SWP vSwp; bool bIconic; - ::WinQueryWindowPos(m_hFrame, &vSwp); + ::WinQueryWindowPos(GetHWND(), &vSwp); return (vSwp.fl & SWP_MAXIMIZE); } // end of wxFrame::IsMaximized @@ -449,12 +452,12 @@ void wxFrame::SetIcon( if ((m_icon.GetHICON()) != NULLHANDLE) { - ::WinSendMsg( m_hFrame + ::WinSendMsg( GetHWND() ,WM_SETICON ,(MPARAM)((HPOINTER)m_icon.GetHICON()) ,NULL ); - ::WinSendMsg( m_hFrame + ::WinSendMsg( GetHWND() ,WM_UPDATEFRAME ,(MPARAM)FCF_ICON ,(MPARAM)0 @@ -474,51 +477,22 @@ wxStatusBar* wxFrame::OnCreateStatusBar( SWP vSwp; ERRORID vError; wxString sError; - HWND hWnd; pStatusBar = wxFrameBase::OnCreateStatusBar( nNumber ,lulStyle ,vId ,rName - ); - // - // The default parent set for the Statusbar is m_hWnd which, of course, - // is the handle to the client window of the frame. We don't want that, - // so we have to set the parent to actually be the Frame. - // - hWnd = pStatusBar->GetHWND(); - if (!::WinSetParent(hWnd, m_hFrame, FALSE)) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for statusbar. Error: %s\n", sError); + ); + + if( !pStatusBar ) return NULL; - } + // + // to show statusbar // - // Also we need to reset it positioning to enable the SHOW attribute - // - if (!::WinQueryWindowPos((HWND)pStatusBar->GetHWND(), &vSwp)) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error querying frame for statusbar position. Error: %s\n", sError); - return NULL; - } - if (!::WinSetWindowPos( (HWND)pStatusBar->GetHWND() - ,HWND_TOP - ,vSwp.cx - ,vSwp.cy - ,vSwp.x - ,vSwp.y - ,SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER - )) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error setting statusbar position. Error: %s\n", sError); - return NULL; - } + if( ::WinIsWindowShowing(GetHWND()) ) + ::WinSendMsg(GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + return pStatusBar; } // end of wxFrame::OnCreateStatusBar @@ -566,10 +540,10 @@ void wxFrame::PositionStatusBar() } if (!::WinSetWindowPos( m_frameStatusBar->GetHWND() ,HWND_TOP - ,nStatbarWidth - ,nStatbarHeight ,vSwp.x ,vSwp.y + ,nStatbarWidth + ,nStatbarHeight ,SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER )) { @@ -648,14 +622,14 @@ void wxFrame::SetMenuBar( // // Now resize the client to fit the new frame // - WinQueryWindowPos(m_hFrame, &vSwp); - hTitlebar = WinWindowFromID(m_hFrame, FID_TITLEBAR); + WinQueryWindowPos(GetHWND(), &vSwp); + hTitlebar = WinWindowFromID(GetHWND(), FID_TITLEBAR); WinQueryWindowPos(hTitlebar, &vSwpTitlebar); - hHScroll = WinWindowFromID(m_hFrame, FID_HORZSCROLL); + hHScroll = WinWindowFromID(GetHWND(), FID_HORZSCROLL); WinQueryWindowPos(hHScroll, &vSwpHScroll); - hVScroll = WinWindowFromID(m_hFrame, FID_VERTSCROLL); + hVScroll = WinWindowFromID(GetHWND(), FID_VERTSCROLL); WinQueryWindowPos(hVScroll, &vSwpVScroll); - hMenuBar = WinWindowFromID(m_hFrame, FID_MENU); + hMenuBar = WinWindowFromID(GetHWND(), FID_MENU); WinQueryWindowPos(hMenuBar, &vSwpMenu); WinSetWindowPos( GetHwnd() ,HWND_TOP @@ -674,20 +648,20 @@ void wxFrame::InternalSetMenuBar() // // Set the parent and owner of the menubar to be the frame // - if (!::WinSetParent(m_hMenu, m_hFrame, FALSE)) + if (!::WinSetParent(m_hMenu, GetHWND(), FALSE)) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); wxLogError("Error setting parent for submenu. Error: %s\n", sError); } - if (!::WinSetOwner(m_hMenu, m_hFrame)) + if (!::WinSetOwner(m_hMenu, GetHWND())) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); wxLogError("Error setting parent for submenu. Error: %s\n", sError); } - WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); + WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } // end of wxFrame::InternalSetMenuBar // @@ -749,9 +723,9 @@ bool wxFrame::ShowFullScreen( if (lStyle & wxFULLSCREEN_NOMENUBAR) { - ::WinSetParent(m_hMenu, m_hFrame, FALSE); - ::WinSetOwner(m_hMenu, m_hFrame); - ::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); + ::WinSetParent(m_hMenu, GetHWND(), FALSE); + ::WinSetOwner(m_hMenu, GetHWND()); + ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } // @@ -859,14 +833,14 @@ bool wxFrame::ShowFullScreen( if ((m_lFsStyle & wxFULLSCREEN_NOSTATUSBAR) && (m_nFsStatusBarFields > 0)) { CreateStatusBar(m_nFsStatusBarFields); - PositionStatusBar(); +// PositionStatusBar(); } if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) { - ::WinSetParent(m_hMenu, m_hFrame, FALSE); - ::WinSetOwner(m_hMenu, m_hFrame); - ::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); + ::WinSetParent(m_hMenu, GetHWND(), FALSE); + ::WinSetOwner(m_hMenu, GetHWND()); + ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } Maximize(m_bFsIsMaximized); @@ -987,43 +961,35 @@ bool wxFrame::OS2Create( // // Create the frame window // - if ((m_hFrame = ::WinCreateWindow( hParent // Frame is parent - ,WC_FRAME // standard frame class - ,(PSZ)zTitle // Window title - ,0 // No styles - ,0, 0, 0, 0 // Window position - ,NULLHANDLE // Owner - ,HWND_TOP // Sibling - ,(ULONG)nId // ID - ,(PVOID)&vFrameCtlData // Creation data - ,NULL // Window Pres Params - )) == 0L) - { - return FALSE; - } - if (!wxWindow::OS2Create( m_hFrame - ,wxFrameClassName - ,NULL - ,0L - ,0L - ,0L - ,0L - ,0L - ,m_hFrame + if (!wxWindow::OS2Create( hParent + ,WC_FRAME + ,(PSZ)zTitle + ,0 + ,0, 0, 0, 0 + ,NULLHANDLE ,HWND_TOP - ,(unsigned long)FID_CLIENT - ,NULL + ,(ULONG)nId + ,(PVOID)&vFrameCtlData ,NULL )) { return FALSE; } + // + // Now need to subclass window. + // + + //SubclassWin(GetHWND()); + +// ::WinCreateWindow(GetHWND(), WC_LISTBOX, "", WS_VISIBLE, 0, 0, +// 0, 0, GetHWND(), HWND_TOP, FID_CLIENT, NULL, NULL); // // Now size everything. If adding a menu the client will need to be resized. // - if (!::WinSetWindowPos( m_hFrame + + if (!::WinSetWindowPos( GetHWND() ,HWND_TOP ,nX ,nY @@ -1032,11 +998,11 @@ bool wxFrame::OS2Create( ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER )) return FALSE; - - uCtlCount = SHORT1FROMMP(::WinSendMsg(m_hFrame, WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect)); +/* + uCtlCount = SHORT1FROMMP(::WinSendMsg(GetHWND(), WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect)); for (int i = 0; i < uCtlCount; i++) { - if (vSwp[i].hwnd == m_hFrame) + if (vSwp[i].hwnd == GetHWND()) memcpy(&m_vSwp, &vSwp[i], sizeof(SWP)); else if (vSwp[i].hwnd == m_hVScroll) memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP)); @@ -1044,7 +1010,7 @@ bool wxFrame::OS2Create( memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP)); else if (vSwp[i].hwnd == m_hTitleBar) memcpy(&m_vSwpTitleBar, &vSwp[i], sizeof(SWP)); - } + }*/ return TRUE; } // end of wxFrame::OS2Create @@ -1234,7 +1200,7 @@ bool wxFrame::OS2TranslateMessage( return FALSE; const wxAcceleratorTable& rAcceleratorTable = pMenuBar->GetAccelTable(); - return rAcceleratorTable.Translate(m_hFrame, pMsg); + return rAcceleratorTable.Translate(GetHWND(), pMsg); } // end of wxFrame::OS2TranslateMessage // --------------------------------------------------------------------------- @@ -1244,7 +1210,7 @@ bool wxFrame::HandlePaint() { RECTL vRect; - if (::WinQueryUpdateRect(GetHwnd(), &vRect)) + if (::WinQueryUpdateRect(GetHWND(), &vRect)) { if (m_bIconized) { @@ -1254,7 +1220,7 @@ bool wxFrame::HandlePaint() HPOINTER hIcon; if (m_icon.Ok()) - hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); + hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L); else hIcon = (HPOINTER)m_hDefaultIcon; @@ -1289,12 +1255,13 @@ bool wxFrame::HandlePaint() } else { +/* DosBeep(500,500); HPS hPS; RECTL vRect; hPS = WinBeginPaint(GetHwnd(), 0L, &vRect); WinFillRect(hPS, &vRect, SYSCLR_WINDOW); - WinEndPaint(hPS); + WinEndPaint(hPS);*/ return wxWindow::HandlePaint(); } @@ -1366,7 +1333,7 @@ bool wxFrame::HandleSize( } #endif // wxUSE_NATIVE_STATUSBAR - PositionStatusBar(); +// PositionStatusBar(); PositionToolBar(); wxSizeEvent vEvent( wxSize( nX ,nY @@ -1402,7 +1369,7 @@ bool wxFrame::HandleCommand( // // Handle here commands from menus and accelerators // - if (nCmd == 0 || nCmd == 1) + if (nCmd == CMDSRC_MENU || nCmd == CMDSRC_ACCELERATOR) { if (wxCurrentPopupMenu) { @@ -1429,8 +1396,9 @@ bool wxFrame::HandleMenuSelect( , WXHMENU hMenu ) { - int nMenuItem; +// int nMenuItem; +/* This is wrong section according to IBM's documentation if (nFlags == 0xFFFF && hMenu == 0) { // @@ -1450,10 +1418,24 @@ bool wxFrame::HandleMenuSelect( // return FALSE; } - wxMenuEvent vEvent(wxEVT_MENU_HIGHLIGHT, nMenuItem); +*/ - vEvent.SetEventObject(this); - return GetEventHandler()->ProcessEvent(vEvent); + if( !nFlags ) + { + MENUITEM mItem; + MRESULT rc; + + rc = WinSendMsg(hMenu, MM_QUERYITEM, MPFROM2SHORT(nItem, TRUE), (MPARAM)&mItem); + + if(rc && !(mItem.afStyle & (MIS_SUBMENU | MIS_SEPARATOR))) + { + wxMenuEvent vEvent(wxEVT_MENU_HIGHLIGHT, nItem); + + vEvent.SetEventObject(this); + GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM + } + } + return TRUE; } // end of wxFrame::HandleMenuSelect // --------------------------------------------------------------------------- @@ -1486,11 +1468,12 @@ MRESULT wxFrame::OS2WindowProc( WXHWND hWnd; UnpackCommand( (WXWPARAM)wParam - ,(WXLPARAM)lParam - ,&wId - ,&hWnd - ,&wCmd - ); + ,(WXLPARAM)lParam + ,&wId + ,&hWnd + ,&wCmd + ); + bProcessed = HandleCommand( wId ,wCmd ,(WXHWND)hWnd @@ -1514,6 +1497,7 @@ MRESULT wxFrame::OS2WindowProc( ,wFlags ,hMenu ); + mRc = (MRESULT)TRUE; } break; @@ -1535,7 +1519,7 @@ MRESULT wxFrame::OS2WindowProc( HPOINTER hIcon; if (m_icon.Ok()) - hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); + hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L); else hIcon = (HPOINTER)m_hDefaultIcon; mRc = (MRESULT)hIcon; @@ -1546,6 +1530,81 @@ MRESULT wxFrame::OS2WindowProc( case WM_SIZE: bProcessed = HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam); break; + + case WM_QUERYFRAMECTLCOUNT: + { + USHORT itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam)); + if(m_frameStatusBar) + ++itemCount; + bProcessed = TRUE; + mRc = MRFROMSHORT( itemCount ); + } + break; + + case WM_FORMATFRAME: + { + PSWP pSWP = 0; + USHORT usClient = 0; + SWP swp; + USHORT itemCount; + char s[128]; + + itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam)); + pSWP = (PSWP)PVOIDFROMMP( wParam ); + + while(pSWP[usClient].hwnd != WinWindowFromID(GetHWND(), FID_CLIENT) + && usClient < itemCount) + usClient++; + + if(m_frameStatusBar) + { + int height; + + m_frameStatusBar->GetSize(NULL, &height); + + if(usClient == itemCount) + { + // frame has no client window + // using another method of calculation + RECTL wRectl; + + ::WinQueryWindowRect(GetHWND(), &wRectl); + ::WinMapWindowPoints(GetHWND(), HWND_DESKTOP, (PPOINTL)&wRectl, 2); + ::WinCalcFrameRect(GetHWND(), &wRectl, TRUE); + ::WinMapWindowPoints(HWND_DESKTOP, GetHWND(), (PPOINTL)&wRectl, 2); + + pSWP[itemCount].x = wRectl.xLeft; + pSWP[itemCount].y = wRectl.yBottom; + pSWP[itemCount].cx = wRectl.xRight - wRectl.xLeft - 1; + pSWP[itemCount].cy = height; + pSWP[itemCount].fl = SWP_SIZE | + SWP_MOVE | + SWP_SHOW; + pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND(); + pSWP[itemCount].hwndInsertBehind = HWND_TOP; + ++itemCount; + } + else + { + pSWP[itemCount].x = pSWP[usClient].x; + pSWP[itemCount].y = pSWP[usClient].y; + pSWP[itemCount].cx = pSWP[usClient].cx; + pSWP[itemCount].cy = height; + pSWP[itemCount].fl = SWP_SIZE | + SWP_MOVE | + SWP_SHOW; + pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND(); + pSWP[itemCount].hwndInsertBehind = HWND_TOP; + pSWP[usClient].cy -= height; + pSWP[usClient].y += height; + + ++itemCount; + } + } + bProcessed = TRUE; + mRc = MRFROMSHORT(itemCount); + } + break; } if (!bProcessed ) @@ -1553,6 +1612,66 @@ MRESULT wxFrame::OS2WindowProc( ,wParam ,lParam ); - return (MRESULT)0; + return (MRESULT)mRc; } // wxFrame::OS2WindowProc + +void wxFrame::SetClient(WXHWND c_Hwnd) +{ + // Are we really need to implement it? +} + +void wxFrame::SetClient(wxWindow* c_Window) +{ + wxWindow *oldClient = this->GetClient(); + bool clientHasFocus = oldClient && (oldClient == wxWindow::FindFocus()); + + if(oldClient == c_Window) // nothing to do + return; + + if(c_Window == NULL) // just need to remove old client + { + if(oldClient == NULL) // nothing to do + return; + + if( clientHasFocus ) + this->SetFocus(); + + oldClient->Enable( FALSE ); + oldClient->Show( FALSE ); + ::WinSetWindowUShort(oldClient->GetHWND(), QWS_ID, (USHORT)oldClient->GetId()); + // to avoid OS/2 bug need to update frame + ::WinSendMsg((HWND)this->GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + return; + } + + // else need to change client + if( clientHasFocus ) + this->SetFocus(); + + ::WinEnableWindowUpdate((HWND)GetHWND(), FALSE); + if( oldClient ) + { + oldClient->Enable( FALSE ); + oldClient->Show( FALSE ); + ::WinSetWindowUShort(oldClient->GetHWND(), QWS_ID, (USHORT)oldClient->GetId()); + } + + c_Window->Reparent( this ); + ::WinSetWindowUShort(c_Window->GetHWND(), QWS_ID, FID_CLIENT); + + ::WinEnableWindowUpdate((HWND)GetHWND(), TRUE); + c_Window->Enable(); + c_Window->Show(); // ensure client is showing + + if( this->IsShown() ) + { + this->Show(); + ::WinSendMsg(GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0); + } +} + +wxWindow *wxFrame::GetClient() +{ + return wxFindWinFromHandle((WXHWND)::WinWindowFromID(GetHWND(), FID_CLIENT)); +}