[Libreoffice-commits] core.git: include/vcl sfx2/source toolkit/source vcl/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed May 6 19:21:33 UTC 2020


 include/vcl/button.hxx             |   10 +++++++++-
 sfx2/source/sidebar/TabItem.cxx    |    2 +-
 toolkit/source/awt/vclxtoolkit.cxx |    2 +-
 vcl/source/control/button.cxx      |   10 +++++++---
 vcl/source/window/dlgctrl.cxx      |    2 +-
 5 files changed, 19 insertions(+), 7 deletions(-)

New commits:
commit 229ae93385e28e0dee407d9386809fa0595578bc
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed May 6 14:41:05 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed May 6 21:21:00 2020 +0200

    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 at redhat.com>

diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx
index 14c936f0ddee..d9e2106ea6d5 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 e37f028d8b47..dcf00532044f 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 77935fb7ac41..d39a70659161 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 e9533fec6ff4..829b390a31f7 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 45582a7a4e50..1c7fb30f4f99 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)


More information about the Libreoffice-commits mailing list