#include "wx/wxprec.h"
#ifndef WX_PRECOMP
+ #include "wx/app.h"
#include "wx/button.h"
#include "wx/brush.h"
#include "wx/panel.h"
#include "wx/scrolwin.h"
#endif
+#include "wx/stockitem.h"
#include "wx/os2/private.h"
#define BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cy) (11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)/10)
bool wxButton::Create(
wxWindow* pParent
, wxWindowID vId
-, const wxString& rsLabel
+, const wxString& rsLbl
, const wxPoint& rPos
, const wxSize& rSize
, long lStyle
-#if wxUSE_VALIDATORS
, const wxValidator& rValidator
-#endif
, const wxString& rsName
)
{
+ wxString rsLabel(rsLbl);
+ if (rsLabel.empty() && wxIsStockID(vId))
+ rsLabel = wxGetStockLabel(vId);
+
+ wxString sLabel = ::wxPMTextToLabel(rsLabel);
+
SetName(rsName);
#if wxUSE_VALIDATORS
SetValidator(rValidator);
m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) // Parent handle
,WC_BUTTON // A Button class window
- ,(PSZ)rsLabel.c_str() // Button text
+ ,(PSZ)sLabel.c_str() // Button text
,lStyle // Button style
,0, 0, 0, 0 // Location and size
,GetHwndOf(pParent) // Owner handle
int nWidthButton;
int nWidthChar;
int nHeightChar;
+ wxFont vFont = (wxFont)GetFont();
GetTextExtent( rsLabel
,&nWidthButton
wxGetCharSize( GetHWND()
,&nWidthChar
,&nHeightChar
- ,(wxFont*)&GetFont()
+ ,&vFont
);
//
//
// Need a little extra to make it look right
//
- nHeightButton += nHeightChar/1.5;
+ nHeightButton += (int)(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 */
void wxButton::SetDefault()
{
wxWindow* pParent = GetParent();
- wxButton* pBtnOldDefault = NULL;
- wxPanel* pPanel = wxDynamicCast(pParent, wxPanel);
- long lStyle = 0L;
- if (pParent)
- {
- wxWindow* pWinOldDefault = pParent->SetDefaultItem(this);
+ wxCHECK_RET( pParent, _T("button without parent?") );
- pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
- }
- if (pBtnOldDefault && pBtnOldDefault != this)
+ //
+ // Set this one as the default button both for wxWidgets and Windows
+ //
+ wxWindow* pWinOldDefault = pParent->SetDefaultItem(this);
+
+ SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+ ,FALSE
+ );
+ SetDefaultStyle( this
+ ,TRUE
+ );
+} // end of wxButton::SetDefault
+
+void wxButton::SetTmpDefault()
+{
+ wxWindow* pParent = GetParent();
+
+ wxCHECK_RET( pParent, _T("button without parent?") );
+
+ wxWindow* pWinOldDefault = pParent->GetDefaultItem();
+
+ pParent->SetTmpDefaultItem(this);
+ SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+ ,FALSE
+ );
+ SetDefaultStyle( this
+ ,TRUE
+ );
+} // end of wxButton::SetTmpDefault
+
+void wxButton::UnsetTmpDefault()
+{
+ wxWindow* pParent = GetParent();
+
+ wxCHECK_RET( pParent, _T("button without parent?") );
+
+ pParent->SetTmpDefaultItem(NULL);
+
+ wxWindow* pWinOldDefault = pParent->GetDefaultItem();
+
+ SetDefaultStyle( this
+ ,FALSE
+ );
+ SetDefaultStyle( wxDynamicCast(pWinOldDefault, wxButton)
+ ,TRUE
+ );
+} // end of wxButton::UnsetTmpDefault
+
+void wxButton::SetDefaultStyle(
+ wxButton* pBtn
+, bool bOn
+)
+{
+ long lStyle;
+ //
+ // We may be called with NULL pointer -- simpler to do the check here than
+ // in the caller which does wxDynamicCast()
+ //
+ if (!pBtn)
+ return;
+
+ //
+ // First, let DefDlgProc() know about the new default button
+ //
+ if (bOn)
{
- //
- // Remove the BS_DEFPUSHBUTTON style from the other button
- //
- lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE);
+ if (!wxTheApp->IsActive())
+ return;
//
- // Don't do it with the owner drawn buttons because it will reset
- // BS_OWNERDRAW style bit too (BS_OWNERDRAW & BS_DEFPUSHBUTTON != 0)!
+ // In OS/2 the dialog/panel doesn't really know it has a default
+ // button, the default button simply has that style. We'll just
+ // simulate by setting focus to it
//
+ pBtn->SetFocus();
+ }
+ lStyle = ::WinQueryWindowULong(GetHwndOf(pBtn), QWL_STYLE);
+ if (!(lStyle & BS_DEFAULT) == bOn)
+ {
if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
{
- lStyle &= ~BS_DEFAULT;
- ::WinSetWindowULong(GetHwndOf(pBtnOldDefault), QWL_STYLE, lStyle);
+ if (bOn)
+ lStyle |= BS_DEFAULT;
+ else
+ lStyle &= ~BS_DEFAULT;
+ ::WinSetWindowULong(GetHwndOf(pBtn), QWL_STYLE, lStyle);
}
else
{
// Redraw the button - it will notice itself that it's not the
// default one any longer
//
- pBtnOldDefault->Refresh();
+ pBtn->Refresh();
}
}
-
- //
- // Set this button as the default
- //
- lStyle = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE);
- if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
- {
- lStyle != BS_DEFAULT;
- ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
- }
-} // end of wxButton::SetDefault
+} // end of wxButton::UpdateDefaultStyle
// ----------------------------------------------------------------------------
// event/message handlers
)
{
//
- // 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