[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - vcl/source

Michael Meeks michael.meeks at suse.com
Thu Mar 28 01:13:57 PDT 2013


 vcl/source/window/dlgctrl.cxx |   46 +++++++++---------------------------------
 1 file changed, 10 insertions(+), 36 deletions(-)

New commits:
commit 1107e4d7e03ecd3f36993d362b6b42e5806817d8
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Wed Mar 27 16:45:05 2013 +0000

    fdo#62094 - fix infinite loop in radio button group iteration.
    
    Simplify the code too - we copy the vector anyway, so reversing it
    should be cheap.
    
    Change-Id: Ie655ba3044c7e0dd5a15b0e839a3712a32a1e298
    Reviewed-on: https://gerrit.libreoffice.org/3095
    Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
    Tested-by: Fridrich Strba <fridrich at documentfoundation.org>

diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx
index 6c481da..e6c1ddd 100644
--- a/vcl/source/window/dlgctrl.cxx
+++ b/vcl/source/window/dlgctrl.cxx
@@ -533,39 +533,14 @@ namespace
         return (pWindow && isVisibleInLayout(pWindow) && isEnabledInLayout(pWindow) && pWindow->IsInputEnabled());
     }
 
-    bool backInGroup(std::vector<RadioButton*>::reverse_iterator aRevStart, std::vector<RadioButton*> &rGroup)
+    bool focusNextInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup)
     {
-        std::vector<RadioButton*>::reverse_iterator aI(aRevStart);
-        while (aI != rGroup.rend())
-        {
-            Window *pWindow = *aI;
-
-            if (isSuitableDestination(pWindow))
-            {
-                pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD );
-                return true;
-            }
-        }
-
-        aI = rGroup.rbegin();
-        while (aI != aRevStart)
-        {
-            Window *pWindow = *aI;
-
-            if (isSuitableDestination(pWindow))
-            {
-                pWindow->ImplControlFocus( GETFOCUS_CURSOR | GETFOCUS_BACKWARD );
-                return true;
-            }
-        }
+        std::vector<RadioButton*>::iterator aI(aStart);
 
-        return false;
-    }
+        if (aStart != rGroup.end())
+            ++aI;
 
-    bool forwardInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup)
-    {
-        std::vector<RadioButton*>::iterator aI(aStart);
-        while (++aI != rGroup.end())
+        for (; aI != rGroup.end(); ++aI)
         {
             Window *pWindow = *aI;
 
@@ -576,8 +551,7 @@ namespace
             }
         }
 
-        aI = rGroup.begin();
-        while (aI != aStart)
+        for (aI = rGroup.begin(); aI != aStart; ++aI)
         {
             Window *pWindow = *aI;
 
@@ -598,14 +572,14 @@ namespace
         if (aGroup.size() == 1) //only one button in group
             return false;
 
+        if (bBackward)
+            std::reverse(aGroup.begin(), aGroup.end());
+
         std::vector<RadioButton*>::iterator aStart(std::find(aGroup.begin(), aGroup.end(), pSourceWindow));
 
         assert(aStart != aGroup.end());
 
-        if (bBackward)
-            return backInGroup(std::vector<RadioButton*>::reverse_iterator(aStart), aGroup);
-        else
-            return forwardInGroup(aStart, aGroup);
+        return focusNextInGroup(aStart, aGroup);
     }
 }
 


More information about the Libreoffice-commits mailing list