Files
wxWidgets/src/os2/radiobut.cpp
Vadim Zeitlin 3f66f6a5b3 Remove all lines containing cvs/svn "$Id$" keyword.
This keyword is not expanded by Git which means it's not replaced with the
correct revision value in the releases made using git-based scripts and it's
confusing to have lines with unexpanded "$Id$" in the released files. As
expanding them with Git is not that simple (it could be done with git archive
and export-subst attribute) and there are not many benefits in having them in
the first place, just remove all these lines.

If nothing else, this will make an eventual transition to Git simpler.

Closes #14487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-07-26 16:02:46 +00:00

285 lines
8.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/os2/radiobut.cpp
// Purpose: wxRadioButton
// Author: David Webster
// Modified by:
// Created: 10/12/99
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/radiobut.h"
#ifndef WX_PRECOMP
#include <stdio.h>
#include "wx/brush.h"
#include "wx/dcscreen.h"
#include "wx/settings.h"
#endif
#include "wx/os2/private.h"
extern void wxAssociateWinWithHandle( HWND hWnd
,wxWindowOS2* pWin
);
void wxRadioButton::Init()
{
m_bFocusJustSet = false;
} // end of wxRadioButton::Init
void wxRadioButton::Command ( wxCommandEvent& rEvent )
{
SetValue ((rEvent.GetInt() != 0) );
ProcessCommand (rEvent);
} // end of wxRadioButton::Command
bool wxRadioButton::Create( wxWindow* pParent,
wxWindowID vId,
const wxString& rsLabel,
const wxPoint& rPos,
const wxSize& rSize,
long lStyle,
const wxValidator& rValidator,
const wxString& rsName )
{
if ( !CreateControl( pParent
,vId
,rPos
,rSize
,lStyle
,rValidator
,rsName))
return false;
long lSstyle = WS_TABSTOP;
if (HasFlag(wxRB_GROUP))
lSstyle |= WS_GROUP;
//
// wxRB_SINGLE is a temporary workaround for the following problem: if you
// have 2 radiobuttons in the same group but which are not consecutive in
// the dialog, Windows can enter an infinite loop! The simplest way to
// reproduce it is to create radio button, then a panel and then another
// radio button: then checking the last button hangs the app.
//
// Ideally, we'd detect (and avoid) such situation automatically but for
// now, as I don't know how to do it, just allow the user to create
// BS_RADIOBUTTON buttons for such situations.
//
lSstyle |= HasFlag(wxRB_SINGLE) ? BS_RADIOBUTTON : BS_AUTORADIOBUTTON;
if (HasFlag(wxCLIP_SIBLINGS))
lSstyle |= WS_CLIPSIBLINGS;
if (!OS2CreateControl( wxT("BUTTON")
,lSstyle
,rPos
,rSize
,rsLabel
,0
))
return false;
wxAssociateWinWithHandle(m_hWnd, this);
if (HasFlag(wxRB_GROUP))
SetValue(true);
SetFont(*wxSMALL_FONT);
SetSize( rPos.x, rPos.y, rSize.x, rSize.y );
return true;
} // end of wxRadioButton::Create
wxSize wxRadioButton::DoGetBestSize() const
{
// We should probably compute snRadioSize but it seems to be a constant
// independent of its label's font size and not made available by OS/2.
static int snRadioSize = RADIO_SIZE;
wxString sStr = wxGetWindowText(GetHwnd());
int nRadioWidth;
int nRadioHeight;
if (!sStr.empty())
{
GetTextExtent( sStr
,&nRadioWidth
,&nRadioHeight
);
nRadioWidth += snRadioSize;
if (nRadioHeight < snRadioSize)
nRadioHeight = snRadioSize;
}
else
{
nRadioWidth = snRadioSize;
nRadioHeight = snRadioSize;
}
return wxSize( nRadioWidth
,nRadioHeight
);
} // end of wxRadioButton::DoGetBestSize
//
// Get single selection, for single choice list items
//
bool wxRadioButton::GetValue() const
{
return((::WinSendMsg((HWND) GetHWND(), BM_QUERYCHECK, (MPARAM)0L, (MPARAM)0L) != 0));
} // end of wxRadioButton::GetValue
bool wxRadioButton::OS2Command( WXUINT wParam, WXWORD WXUNUSED(wId) )
{
if (wParam != BN_CLICKED)
return false;
if (m_bFocusJustSet)
{
//
// See above: we want to ignore this event
//
m_bFocusJustSet = false;
}
else
{
bool bIsChecked = GetValue();
if (HasFlag(wxRB_SINGLE))
{
//
// When we use a "manual" radio button, we have to check the button
// ourselves -- but it's reset to unchecked state by the user code
// (presumably when another button is pressed)
//
if (!bIsChecked )
SetValue(true);
}
wxCommandEvent rEvent( wxEVT_RADIOBUTTON, m_windowId );
rEvent.SetEventObject(this);
ProcessCommand(rEvent);
}
return true;
} // end of wxRadioButton::OS2Command
void wxRadioButton::SetFocus()
{
// when the radio button receives a WM_SETFOCUS message it generates a
// BN_CLICKED which is totally unexpected and leads to catastrophic results
// if you pop up a dialog from the radio button event handler as, when the
// dialog is dismissed, the focus is returned to the radio button which
// generates BN_CLICKED which leads to showing another dialog and so on
// without end!
//
// to avoid this, we drop the pseudo BN_CLICKED events generated when the
// button gains focus
m_bFocusJustSet = true;
wxControl::SetFocus();
}
void wxRadioButton::SetLabel( const wxString& rsLabel )
{
wxString sLabel = ::wxPMTextToLabel(rsLabel);
::WinSetWindowText((HWND)GetHWND(), (const char *)sLabel.c_str());
} // end of wxRadioButton::SetLabel
void wxRadioButton::SetValue( bool bValue )
{
::WinSendMsg((HWND)GetHWND(), BM_SETCHECK, (MPARAM)bValue, (MPARAM)0);
if (bValue)
{
const wxWindowList& rSiblings = GetParent()->GetChildren();
wxWindowList::compatibility_iterator nodeThis = rSiblings.Find(this);
wxCHECK_RET(nodeThis, wxT("radio button not a child of its parent?"));
//
// If it's not the first item of the group ...
//
if ( !HasFlag(wxRB_GROUP) )
{
//
// ...turn off all radio buttons before this one
//
for ( wxWindowList::compatibility_iterator nodeBefore = nodeThis->GetPrevious();
nodeBefore;
nodeBefore = nodeBefore->GetPrevious() )
{
wxRadioButton* pBtn = wxDynamicCast( nodeBefore->GetData()
,wxRadioButton
);
if (!pBtn)
{
//
// The radio buttons in a group must be consecutive, so there
// are no more of them
//
break;
}
pBtn->SetValue(false);
if (pBtn->HasFlag(wxRB_GROUP))
{
//
// Even if there are other radio buttons before this one,
// they're not in the same group with us
//
break;
}
}
}
//
// ... and all after this one
//
for (wxWindowList::compatibility_iterator nodeAfter = nodeThis->GetNext();
nodeAfter;
nodeAfter = nodeAfter->GetNext())
{
wxRadioButton* pBtn = wxDynamicCast( nodeAfter->GetData()
,wxRadioButton
);
if (!pBtn || pBtn->HasFlag(wxRB_GROUP) )
{
//
// No more buttons or the first button of the next group
//
break;
}
pBtn->SetValue(false);
}
}
} // end of wxRadioButton::SetValue
MRESULT wxRadioButton::OS2WindowProc(
WXUINT uMsg
, WXWPARAM wParam
, WXLPARAM lParam
)
{
if (uMsg == WM_SETFOCUS)
{
m_bFocusJustSet = true;
MRESULT mRc = wxControl::OS2WindowProc( uMsg
,wParam
,lParam
);
m_bFocusJustSet = false;
return mRc;
}
return wxControl::OS2WindowProc( uMsg
,wParam
,lParam
);
} // end of wxRadioButton::OS2WindowProc