X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1de4baa31f17548b32a376a71ce50fee6a3e759c..f6f0900d306c28ab5736b372e19333d99d786c9b:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 951bf17e8c..40aa17e55d 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -27,13 +27,17 @@ #include "wx/app.h" #include "wx/panel.h" #include "wx/layout.h" + #include "wx/checkbox.h" + #include "wx/combobox.h" #include "wx/dialog.h" #include "wx/frame.h" #include "wx/listbox.h" #include "wx/button.h" + #include "wx/bmpbuttn.h" #include "wx/msgdlg.h" #include "wx/scrolwin.h" #include "wx/radiobox.h" + #include "wx/radiobut.h" #include "wx/slider.h" #include "wx/statbox.h" #include "wx/statusbr.h" @@ -506,6 +510,14 @@ bool wxWindowOS2::Enable( if ( hWnd ) ::WinEnableWindow(hWnd, (BOOL)bEnable); + // + // The logic below doesn't apply to the top level windows -- otherwise + // showing a modal dialog would result in total greying out (and ungreying + // out later) of everything which would be really ugly + // + if (IsTopLevel()) + return TRUE; + wxWindowList::Node* pNode = GetChildren().GetFirst(); while (pNode) @@ -679,81 +691,11 @@ void wxWindowOS2::WarpPointer( ::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY)); } // end of wxWindowOS2::WarpPointer -#if WXWIN_COMPATIBILITY -void wxWindowOS2::OS2DeviceToLogical (float *x, float *y) const -{ -} -#endif // WXWIN_COMPATIBILITY // --------------------------------------------------------------------------- // scrolling stuff // --------------------------------------------------------------------------- -#if WXWIN_COMPATIBILITY -void wxWindowOS2::SetScrollRange( - int nOrient -, int nRange -, bool bRefresh -) -{ - int nRange1 = nRange; - int nPageSize = GetScrollPage(nOrient); - - if (nPpageSize > 1 && nRange > 0) - { - nRange1 += (nPageSize - 1); - } - - if (nOrient == wxHORIZONTAL) - { - ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1)); - ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); - } - else - { - ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1)); - ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); - } -} // end of wxWindowOS2::SetScrollRange - -void wxWindowOS2::SetScrollPage( - int nOrient -, int nPage -, bool bRefresh -) -{ - if (nOrient == wxHORIZONTAL ) - m_nXThumbSize = nPage; - else - m_nYThumbSize = nPage; -} // end of wxWindowOS2::SetScrollPage - -int wxWindowOS2::OldGetScrollRange( - int nOrient -) const -{ - MRESULT mRc; - HWND hWnd = GetHwnd(); - - if (hWnd) - { - mRc = WinSendMsg(hWnd, SBM_QUERYRANGE, (MPARAM)0L, (MPARAM)0L); - return(SHORT2FROMMR(mRc)); - } - return 0; -} // end of wxWindowOS2::OldGetScrollRange - -int wxWindowOS2::GetScrollPage( - int nOrient -) const -{ - if (nOrient == wxHORIZONTAL) - return m_nXThumbSize; - else - return m_nYThumbSize; -} // end of wxWindowOS2::GetScrollPage -#endif // WXWIN_COMPATIBILITY - int wxWindowOS2::GetScrollPos( int nOrient ) const @@ -1265,43 +1207,6 @@ WXDWORD wxWindowOS2::Determine3DEffects( return dwStyle; } // end of wxWindowOS2::Determine3DEffects -#if WXWIN_COMPATIBILITY -void wxWindowOS2::OnCommand( - wxWindow& rWin -, wxCommandEvent& rEvent -) -{ - if (GetEventHandler()->ProcessEvent(rEvent)) - return; - if (m_parent) - m_parent->GetEventHandler()->OnCommand( rWin - ,rEvent - ); -} // end of wxWindowOS2::OnCommand - -wxObject* wxWindowOS2::GetChild( - int nNumber -) const -{ - // - // Return a pointer to the Nth object in the Panel - // - wxNode* pNode = GetChildren().First(); - int n = nNumber; - - while (pNode && n--) - pNode = pNode->Next(); - if (pNode) - { - wxObject* pObj = (wxObject*)pNode->Data(); - return(pObj); - } - else - return NULL; -} // end of wxWindowOS2::GetChild - -#endif // WXWIN_COMPATIBILITY - // // Setup background and foreground colours correctly // @@ -1352,7 +1257,8 @@ void wxWindowOS2::OnIdle( (void)GetEventHandler()->ProcessEvent(rEvent); } } - UpdateWindowUI(); + if (wxUpdateUIEvent::CanUpdate(this)) + UpdateWindowUI(wxUPDATE_UI_FROMIDLE); } // end of wxWindowOS2::OnIdle // @@ -1372,17 +1278,6 @@ bool wxWindowOS2::Reparent( return TRUE; } // end of wxWindowOS2::Reparent -void wxWindowOS2::Clear() -{ - wxClientDC vDc((wxWindow*)this); - wxBrush vBrush( GetBackgroundColour() - ,wxSOLID - ); - - vDc.SetBackground(vBrush); - vDc.Clear(); -} // end of wxWindowOS2::Clear - void wxWindowOS2::Update() { ::WinUpdateWindow(GetHwnd()); @@ -1442,14 +1337,7 @@ void wxWindowOS2::SetDropTarget( wxDropTarget* pDropTarget ) { - if (m_dropTarget != 0) - { - m_dropTarget->Revoke(m_hWnd); - delete m_dropTarget; - } m_dropTarget = pDropTarget; - if (m_dropTarget != 0) - m_dropTarget->Register(m_hWnd); } // end of wxWindowOS2::SetDropTarget #endif @@ -2142,67 +2030,6 @@ bool wxWindowOS2::IsMouseInWindow() const return hWnd != NULL; } // end of wxWindowOS2::IsMouseInWindow -#if wxUSE_CARET && WXWIN_COMPATIBILITY -// --------------------------------------------------------------------------- -// Caret manipulation -// --------------------------------------------------------------------------- - -void wxWindowOS2::CreateCaret( - int nWidth -, int nHeight -) -{ - SetCaret(new wxCaret( this - ,nWidth - ,nHeight - )); -} // end of wxWindowOS2::CreateCaret - -void wxWindowOS2::CreateCaret( - const wxBitmap* pBitmap -) -{ - wxFAIL_MSG("not implemented"); -} // end of wxWindowOS2::CreateCaret - -void wxWindowOS2::ShowCaret( - bool bShow -) -{ - wxCHECK_RET( m_caret, "no caret to show" ); - - m_caret->Show(bShow); -} // end of wxWindowOS2::ShowCaret - -void wxWindowOS2::DestroyCaret() -{ - SetCaret(NULL); -} // end of wxWindowOS2::DestroyCaret - -void wxWindowOS2::SetCaretPos( - int nX -, int nY) -{ - wxCHECK_RET( m_caret, "no caret to move" ); - - m_caret->Move( nX - ,nY - ); -} // end of wxWindowOS2::SetCaretPos - -void wxWindowOS2::GetCaretPos( - int* pX -, int* pY -) const -{ - wxCHECK_RET( m_caret, "no caret to get position of" ); - - m_caret->GetPosition( pX - ,pY - ); -} // end of wxWindowOS2::GetCaretPos - -#endif //wxUSE_CARET // --------------------------------------------------------------------------- // popup menu @@ -2222,6 +2049,8 @@ static void wxYieldForCommandsOnly() { wxTheApp->DoMessage((WXMSG*)&vMsg); } + if (vMsg.msg == WM_QUIT) + ::WinPostMsg(NULL, WM_QUIT, 0, 0); } #endif // wxUSE_MENUS_NATIVE @@ -2415,6 +2244,14 @@ bool wxWindowOS2::OS2ProcessMessage( pBtn->OS2Command(BN_CLICKED, 0 /* unused */); return TRUE; } + else if (!IsTopLevel()) + { + // + // if not a top level window, let parent + // handle it + // + return FALSE; + } // else: but if it does not it makes sense to make // it work like a TAB - and that's what we do. // Note that Ctrl-Enter always works this way. @@ -2803,6 +2640,11 @@ MRESULT wxWindowOS2::OS2WindowProc( ,&nX ,&nY ); + if (!pWin->IsOfStandardClass()) + { + if (uMsg == WM_BUTTON1DOWN && pWin->AcceptsFocus() ) + pWin->SetFocus(); + } bProcessed = pWin->HandleMouseEvent( uMsg ,nX ,nY @@ -2841,8 +2683,9 @@ MRESULT wxWindowOS2::OS2WindowProc( } else { - bProcessed = OS2OnMeasureItem(nIdCtrl, - (WXMEASUREITEMSTRUCT *)lParam); + return MRFROMLONG(OS2OnMeasureItem( nIdCtrl + ,(WXMEASUREITEMSTRUCT *)lParam + )); } if ( bProcessed ) @@ -2968,6 +2811,26 @@ MRESULT wxWindowOS2::OS2WindowProc( case WM_CONTROL: switch(SHORT2FROMMP(wParam)) { + case BN_PAINT: + { + HWND hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam)); + wxWindowOS2* pWin = wxFindWinFromHandle(hWnd); + + if (!pWin) + { + bProcessed = FALSE; + break; + } + if (pWin->IsKindOf(CLASSINFO(wxBitmapButton))) + { + wxBitmapButton* pBitmapButton = wxDynamicCast(pWin, wxBitmapButton); + + pBitmapButton->OS2OnDraw((WXDRAWITEMSTRUCT *)lParam); + } + return 0; + } + break; + case BKN_PAGESELECTEDPENDING: { PPAGESELECTNOTIFY pPage = (PPAGESELECTNOTIFY)lParam; @@ -3439,7 +3302,7 @@ bool wxWindowOS2::OS2Create( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error creating frame. Error: %s\n", sError); + wxLogError("Error creating frame. Error: %s\n", sError.c_str()); return FALSE; } SetSize( nX @@ -3473,7 +3336,7 @@ bool wxWindowOS2::HandleCreate( bool wxWindowOS2::HandleDestroy() { wxWindowDestroyEvent vEvent((wxWindow*)this); - + vEvent.SetId(GetId()); (void)GetEventHandler()->ProcessEvent(vEvent); // @@ -3482,7 +3345,6 @@ bool wxWindowOS2::HandleDestroy() #if wxUSE_DRAG_AND_DROP if (m_dropTarget != NULL) { - m_dropTarget->Revoke(m_hWnd); delete m_dropTarget; m_dropTarget = NULL; } @@ -3691,7 +3553,7 @@ bool wxWindowOS2::OS2OnDrawItem( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Unable to set current color table. Error: %s\n", sError); + wxLogError("Unable to set current color table. Error: %s\n", sError.c_str()); } // // Set the color table to RGB mode @@ -3706,7 +3568,7 @@ bool wxWindowOS2::OS2OnDrawItem( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Unable to set current color table. Error: %s\n", sError); + wxLogError("Unable to set current color table. Error: %s\n", sError.c_str()); } wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); @@ -3807,7 +3669,7 @@ bool wxWindowOS2::OS2OnDrawItem( return FALSE; } // end of wxWindowOS2::OS2OnDrawItem -bool wxWindowOS2::OS2OnMeasureItem( +long wxWindowOS2::OS2OnMeasureItem( int lId , WXMEASUREITEMSTRUCT* pItemStruct ) @@ -3833,13 +3695,16 @@ bool wxWindowOS2::OS2OnMeasureItem( ,&nHeight )) { + MRESULT mRc; + pMeasureStruct->rclItem.xRight = nWidth; pMeasureStruct->rclItem.xLeft = 0L; pMeasureStruct->rclItem.yTop = nHeight; pMeasureStruct->rclItem.yBottom = 0L; - return TRUE; + mRc = MRFROM2SHORT(nHeight, nWidth); + return LONGFROMMR(mRc); } - return FALSE; + return 0L; } } wxWindow* pItem = FindItem(lId); @@ -3936,6 +3801,21 @@ void wxWindowOS2::OnSysColourChanged( // painting // --------------------------------------------------------------------------- +void wxWindow::OnPaint ( + wxPaintEvent& rEvent +) +{ + HDC hDC = (HDC)wxPaintDC::FindDCInCache((wxWindow*) rEvent.GetEventObject()); + + if (hDC != 0) + { + OS2DefWindowProc( (WXUINT)WM_PAINT + ,(WXWPARAM)hDC + ,(WXLPARAM)0 + ); + } +} // end of wxWindow::OnPaint + bool wxWindowOS2::HandlePaint() { HRGN hRgn; @@ -4589,7 +4469,10 @@ void wxWindowOS2::MoveChildren( int nDiff ) { - if (GetAutoLayout()) + // + // We want to handle top levels ourself, manually + // + if (!IsTopLevel() && GetAutoLayout()) { Layout(); }