Resolves: tdf#132581 allow disabling the auto-group RadioButton feature
the older way of doing things is to dig around contiguous radiobuttons to see
what is part of the group, while the contemporary one is to explicitly use
group() to set the members. A problem of the legacy way of doing it is that the
results during setup and teardown of a collection of radiobuttons can be
misleading.
Change-Id: I6c590d0fb6fc6db3f5e5ba4397a62930a5c8f3f0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93567
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx
index 14c936f..d9e2106 100644
--- a/include/vcl/button.hxx
+++ b/include/vcl/button.hxx
@@ -283,6 +283,7 @@ private:
bool mbChecked;
bool mbRadioCheck;
bool mbStateChanged;
bool mbUsesExplicitGroup;
Link<RadioButton&,void> maToggleHdl;
SAL_DLLPRIVATE void ImplInitRadioButtonData();
SAL_DLLPRIVATE WinBits ImplInitStyle( const vcl::Window* pPrevWindow, WinBits nStyle );
@@ -317,7 +318,14 @@ protected:
void ImplAdjustNWFSizes() override;
public:
explicit RadioButton( vcl::Window* pParent, WinBits nWinStyle = 0 );
/*
bUsesExplicitGroup of true means that group() is used to set what radiobuttons are part of a group
while false means that contiguous radiobuttons are considered part of a group where WB_GROUP designates
the start of the group and all contiguous radiobuttons without WB_GROUP set form the rest of the group.
true is fairly straightforward, false leads to trick situations and is the legacy case
*/
explicit RadioButton(vcl::Window* pParent, bool bUsesExplicitGroup = true, WinBits nWinStyle = 0);
virtual ~RadioButton() override;
virtual void dispose() override;
diff --git a/sfx2/source/sidebar/TabItem.cxx b/sfx2/source/sidebar/TabItem.cxx
index e37f028..dcf0053 100644
--- a/sfx2/source/sidebar/TabItem.cxx
+++ b/sfx2/source/sidebar/TabItem.cxx
@@ -31,7 +31,7 @@ using namespace css::uno;
namespace sfx2::sidebar {
TabItem::TabItem (vcl::Window* pParentWindow)
: RadioButton(pParentWindow, 0)
: RadioButton(pParentWindow, false, 0)
, mbIsLeftButtonDown(false)
{
SetStyle(GetStyle() | WB_TABSTOP | WB_DIALOGCONTROL | WB_NOPOINTERFOCUS);
diff --git a/toolkit/source/awt/vclxtoolkit.cxx b/toolkit/source/awt/vclxtoolkit.cxx
index 77935fb7..d39a706 100644
--- a/toolkit/source/awt/vclxtoolkit.cxx
+++ b/toolkit/source/awt/vclxtoolkit.cxx
@@ -1599,7 +1599,7 @@ vcl::Window* VCLXToolkit::ImplCreateWindow( VCLXWindow** ppNewComp,
*ppNewComp = new VCLXMessageBox;
break;
case WindowType::RADIOBUTTON:
pNewWindow = VclPtr<RadioButton>::Create( pParent, nWinBits );
pNewWindow = VclPtr<RadioButton>::Create(pParent, false, nWinBits);
*ppNewComp = new VCLXRadioButton;
// by default, disable RadioCheck
diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx
index e9533fe..829b390 100644
--- a/vcl/source/control/button.cxx
+++ b/vcl/source/control/button.cxx
@@ -2150,6 +2150,10 @@ std::vector< VclPtr<RadioButton> > RadioButton::GetRadioButtonGroup(bool bInclud
return aGroup;
}
std::vector<VclPtr<RadioButton>> aGroup;
if (mbUsesExplicitGroup)
return aGroup;
//old-school
// go back to first in group;
@@ -2162,7 +2166,6 @@ std::vector< VclPtr<RadioButton> > RadioButton::GetRadioButtonGroup(bool bInclud
else
break;
}
std::vector< VclPtr<RadioButton> > aGroup;
// insert radiobuttons up to next group
do
{
@@ -2223,8 +2226,9 @@ void RadioButton::ImplCallClick( bool bGrabFocus, GetFocusFlags nFocusFlags )
mbStateChanged = false;
}
RadioButton::RadioButton( vcl::Window* pParent, WinBits nStyle ) :
Button( WindowType::RADIOBUTTON )
RadioButton::RadioButton(vcl::Window* pParent, bool bUsesExplicitGroup, WinBits nStyle)
: Button(WindowType::RADIOBUTTON)
, mbUsesExplicitGroup(bUsesExplicitGroup)
{
ImplInitRadioButtonData();
ImplInit( pParent, nStyle );
diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx
index 45582a7..1c7fb30 100644
--- a/vcl/source/window/dlgctrl.cxx
+++ b/vcl/source/window/dlgctrl.cxx
@@ -600,7 +600,7 @@ namespace
{
std::vector<VclPtr<RadioButton> > aGroup(pSourceWindow->GetRadioButtonGroup());
if (aGroup.size() == 1) //only one button in group
if (aGroup.size() < 2) // have to have at last 2 buttons to be a useful group
return false;
if (bBackward)