X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4a162522b875bc7cb23f1d165703f71bd7010f7..411165f3f40f411d6feba4d13d4934f7fff6cc4f:/src/os2/button.cpp?ds=sidebyside diff --git a/src/os2/button.cpp b/src/os2/button.cpp index 83301398f7..46892a89fc 100644 --- a/src/os2/button.cpp +++ b/src/os2/button.cpp @@ -71,14 +71,6 @@ bool wxButton::Create( // if (m_windowStyle & wxCLIP_SIBLINGS ) lStyle |= WS_CLIPSIBLINGS; - // - // If the parent is a scrolled window the controls must - // have this style or they will overlap the scrollbars - // - if (pParent) - if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) || - pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow))) - lStyle |= WS_CLIPSIBLINGS; m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) // Parent handle ,WC_BUTTON // A Button class window @@ -100,12 +92,20 @@ bool wxButton::Create( // Subclass again for purposes of dialog editing mode // SubclassWin(m_hWnd); - SetFont(pParent->GetFont()); + wxFont* pButtonFont = new wxFont( 8 + ,wxSWISS + ,wxNORMAL + ,wxNORMAL + ); + SetFont(*pButtonFont); + SetXComp(0); + SetYComp(0); SetSize( rPos.x ,rPos.y ,rSize.x ,rSize.y ); + delete pButtonFont; return TRUE; } // end of wxButton::Create @@ -162,13 +162,19 @@ wxSize wxButton::DoGetBestSize() const // nHeightButton += nHeightChar/1.5; - wxSize vSize = GetDefaultSize(); + if (!HasFlag(wxBU_EXACTFIT)) + { + wxSize vSize = GetDefaultSize(); - if (nWidthButton > vSize.x) - vSize.x = nWidthButton; - if (nHeightButton > vSize.y) - vSize.y = nHeightButton; - return vSize; + if (nWidthButton > vSize.x) + vSize.x = nWidthButton; + if (nHeightButton > vSize.y) + vSize.y = nHeightButton; + return vSize; + } + return wxSize( nWidthButton + ,nHeightButton + ); } // end of wxButton::DoGetBestSize /* static */ @@ -221,27 +227,64 @@ bool wxButton::SendClickEvent() void wxButton::SetDefault() { wxWindow* pParent = GetParent(); - wxButton* pBtnOldDefault = NULL; - wxPanel* pPanel = wxDynamicCast(pParent, wxPanel); - long lStyle = 0L; - if (pParent) + wxCHECK_RET( pParent, _T("button without parent?") ); + + // + // Set this one as the default button both for wxWindows and Windows + // + wxWindow* pWinOldDefault = pParent->SetDefaultItem(this); + UpdateDefaultStyle( this + ,pWinOldDefault + ); +} // end of wxButton::SetDefault + +void wxButton::SetTmpDefault() +{ + wxWindow* pParent = GetParent(); + + wxCHECK_RET( pParent, _T("button without parent?") ); + + wxWindow* pWinOldDefault = pParent->GetDefaultItem(); + pParent->SetTmpDefaultItem(this); + if (pWinOldDefault != this) { - wxWindow* pWinOldDefault = pParent->SetDefaultItem(this); + UpdateDefaultStyle( this + ,pWinOldDefault + ); + } + //else: no styles to update +} // end of wxButton::SetTmpDefault + +void wxButton::UnsetTmpDefault() +{ + wxWindow* pParent = GetParent(); + + wxCHECK_RET( pParent, _T("button without parent?") ); - pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton); + pParent->SetTmpDefaultItem(NULL); + + wxWindow* pWinOldDefault = pParent->GetDefaultItem(); + + if (pWinOldDefault != this) + { + UpdateDefaultStyle( pWinOldDefault + ,this + ); } - if (pBtnOldDefault && pBtnOldDefault != this) + //else: we had been default before anyhow +} // end of wxButton::UnsetTmpDefault + +void wxButton::UpdateDefaultStyle( + wxWindow* pWinDefault +, wxWindow* pWinOldDefault) +{ + wxButton* pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton); + long lStyle; + + if ( pBtnOldDefault && pBtnOldDefault != pWinDefault ) { - // - // Remove the BS_DEFPUSHBUTTON style from the other button - // lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE); - - // - // Don't do it with the owner drawn buttons because it will reset - // BS_OWNERDRAW style bit too (BS_OWNERDRAW & BS_DEFPUSHBUTTON != 0)! - // if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON) { lStyle &= ~BS_DEFAULT; @@ -249,24 +292,24 @@ void wxButton::SetDefault() } else { - // - // Redraw the button - it will notice itself that it's not the + // redraw the button - it will notice itself that it's not the // default one any longer - // pBtnOldDefault->Refresh(); } } - // - // Set this button as the default - // - lStyle = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE); - if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON) + wxButton* pBtnDefault = wxDynamicCast(pWinDefault, wxButton); + + if (pBtnDefault) { - lStyle != BS_DEFAULT; - ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle); + lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE); + if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON) + { + lStyle != BS_DEFAULT; + ::WinSetWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE, lStyle); + } } -} // end of wxButton::SetDefault +} // end of wxButton::UpdateDefaultStyle // ---------------------------------------------------------------------------- // event/message handlers @@ -318,7 +361,28 @@ void wxButton::MakeOwnerDrawn() lStyle |= BS_USERBUTTON; ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle); } -} // end of wxCButton::MakeOwnerDrawn +} // end of wxButton::MakeOwnerDrawn + +WXDWORD wxButton::OS2GetStyle( + long lStyle +, WXDWORD* pdwExstyle +) const +{ + // + // Buttons never have an external border, they draw their own one + // + WXDWORD dwStyle = wxControl::OS2GetStyle( (lStyle & ~wxBORDER_MASK) | wxBORDER_NONE + ,pdwExstyle + ); + + // + // We must use WS_CLIPSIBLINGS with the buttons or they would draw over + // each other in any resizeable dialog which has more than one button in + // the bottom + // + dwStyle |= WS_CLIPSIBLINGS; + return dwStyle; +} // end of wxButton::OS2GetStyle MRESULT wxButton::WindowProc( WXUINT uMsg @@ -327,12 +391,16 @@ MRESULT wxButton::WindowProc( ) { // - // When we receive focus, we want to become the default button in our - // parent panel + // When we receive focus, we want to temporary become the default button in + // our parent panel so that pressing "Enter" would activate us -- and when + // losing it we should restore the previous default button as well // if (uMsg == WM_SETFOCUS) { - SetDefault(); + if (SHORT1FROMMP(lParam) == TRUE) + SetTmpDefault(); + else + UnsetTmpDefault(); // // Let the default processign take place too @@ -362,5 +430,5 @@ MRESULT wxButton::WindowProc( ,wParam ,lParam )); -} // end of wxW indowProc +} // end of wxWindowProc