* Bug #13549 fixed - Slider uicontrols triggered three callbacks instead of one. 94/15594/2
Vincent COUVERT [Wed, 26 Nov 2014 11:05:18 +0000 (12:05 +0100)]
Change-Id: I48bade97378a64c0befdf2b23835179f65d0565e

scilab/CHANGES_5.5.X
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/slider/SwingScilabSlider.java
scilab/modules/gui/tests/nonreg_tests/bug_13549.tst [new file with mode: 0644]

index f970456..52b77c2 100644 (file)
@@ -23,6 +23,8 @@ Removed Functions
 Scilab Bug Fixes
 ================
 
+* Bug #13549 fixed - Slider uicontrols triggered three callbacks instead of one.
+
 * Bug #13673 fixed - Anti-aliasing of xpoly marks did not render correctly.
 
 * Bug #13674 fixed - User .wgetrc configuration file is now by-passed when ATOMS does not use a proxy.
index f0f9ef8..4439d6b 100644 (file)
@@ -65,6 +65,8 @@ public class SwingScilabSlider extends JSlider implements SwingViewObject, Simpl
     private ChangeListener changeListener;
 
     private Border defaultBorder = null;
+    
+    private int previousValueCallback = 0;
 
     static {
         if (OS.get() == OS.UNIX) {
@@ -160,10 +162,26 @@ public class SwingScilabSlider extends JSlider implements SwingViewObject, Simpl
 
 
         changeListener = new ChangeListener() {
-            public void stateChanged(ChangeEvent arg0) {
-                updateModel();
-                if (callback != null) {
-                    callback.actionPerformed(null);
+            public void stateChanged(ChangeEvent changeEvent) {
+                JSlider source = (JSlider) changeEvent.getSource();
+                if (!source.getValueIsAdjusting()) {
+                       previousValueCallback = getValue();
+                    updateModel();
+                    if (callback != null) {
+                        callback.actionPerformed(null);
+                    }
+                } else {
+                       int offset = Math.abs(getValue()-previousValueCallback);
+                       previousValueCallback = getValue();
+                       // When the user has clicked on the slider itself (not the knob)
+                       // and the knob makes a step of getMajorTickSpacing() value
+                       // ==> We do not call the callback (Bug #13549)
+                       if (offset != getMajorTickSpacing() && offset != 0) {
+                        updateModel();
+                        if (callback != null) {
+                            callback.actionPerformed(null);
+                        }
+                       }
                 }
             }
         };
diff --git a/scilab/modules/gui/tests/nonreg_tests/bug_13549.tst b/scilab/modules/gui/tests/nonreg_tests/bug_13549.tst
new file mode 100644 (file)
index 0000000..2c78ecd
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Vincent COUVERT
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+
+// <-- INTERACTIVE TEST -->
+
+//
+// <-- Non-regression test for bug 13549 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13549
+//
+// <-- Short Description -->
+// Slider uicontrol triggers 3 callbacks instead of one
+
+h=uicontrol("Style", "slider", ...
+"Units","normalized", ...
+"Position", [0.125 0.1 .75 .25], ...
+"Callback","disp(gcbo.value)");
+
+// Click on the slider
+// Check that the value appears only once in the console
\ No newline at end of file