Only xclick can catch callback execution. 91/10391/3
Bruno JOFRET [Fri, 1 Feb 2013 17:08:04 +0000 (18:08 +0100)]
Change-Id: Ie5d56e1fe66482120d9b38ef005f40092aac4690

scilab/CHANGES_5.4.X
scilab/modules/graphics/help/en_US/interaction/xclick.xml
scilab/modules/graphics/help/en_US/interaction/xgetmouse.xml
scilab/modules/graphics/help/fr_FR/interaction/xclick.xml
scilab/modules/gui/src/java/org/scilab/modules/gui/events/GlobalEventWatcher.java
scilab/modules/gui/src/java/org/scilab/modules/gui/events/GlobalMouseEventWatcher.java
scilab/modules/gui/src/java/org/scilab/modules/gui/events/Jxclick.java
scilab/modules/gui/src/java/org/scilab/modules/gui/events/Jxgetmouse.java
scilab/modules/gui/src/java/org/scilab/modules/gui/events/callback/CommonCallBack.java

index 2e8cc29..1315487 100644 (file)
@@ -210,6 +210,8 @@ Bug fixes
 
 * Bug #10815 fixed - diff help page did not have a "See Also" section.
 
+* Bug #11134 fixed - xgetmouse() prevented callback menu execution.
+
 * Bug #11436 fixed - With Matplot, color outside the colormap was replaced with
                      the last color in colormap.
 
index 53338f5..c311df4 100644 (file)
@@ -3,11 +3,11 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
  * Copyright (C) 2008 - INRIA - Vincent COUVERT
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  -->
@@ -79,8 +79,9 @@
     <refsection>
         <title>Description</title>
         <para>
-            <literal>xclick</literal> waits for a mouse click or other events in the graphics
-            window.
+            <literal>xclick</literal> waits for a mouse click, a keyboard event, a menu activation or windows closure in the graphics
+            window. <literal>xclick</literal> prevents menu callback to be executed. Callback will be returned in <literal>cbmenu</literal>
+            return value.
         </para>
         <para>If it is called with 3 left hand side arguments, it waits for a
             mouse click in the current graphics window.
index dcb9557..16a2933 100644 (file)
@@ -3,11 +3,11 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Serge Steer
  * Copyright (C) 2008 - INRIA - Vincent COUVERT
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  -->
     <refsection>
         <title>Description</title>
         <para>
+          Despite <literal>xclick</literal>, <literal>xgetmouse</literal> does not prevent callback menu to be executed.
+        </para>
+        <para>
             If the mouse pointer is located in the current graphics window, <literal>xgetmouse</literal> returns
             in <literal>rep</literal> the current pointer position (x,y) and the value <literal>ibutton</literal>.
-            
+
             The <literal>ibutton</literal> value indicates the event type:
         </para>
         <variablelist>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 //  rectangle selection
 clf();  // erase/create window
 a=gca();a.data_bounds=[0 0;100 100];//set user coordinates
index e89925b..3bbb1b9 100644 (file)
@@ -3,11 +3,11 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) ENPC - Jean-Philippe Chancelier
  * Copyright (C) 2008 - INRIA - Vincent COUVERT
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  -->
@@ -80,8 +80,9 @@
     <refsection>
         <title>Description</title>
         <para>
-            <literal>xclick</literal> attend l'appui sur un bouton de la
-            souris.
+            <literal>xclick</literal> attend un évènement souris, clavier, la fermeture de la fenêtre ou
+            l'activation d'un menu. <literal>xclick</literal> empèche l'exécution du callback associé au menu.
+            La valeur du callback sera retournée dans l'argument de sortie <literal>cbmenu</literal>.
         </para>
         <para>Appelée avec 3 arguments en sortie, cette fonction attend qu'un
             bouton de la souris soit pressé avec le pointeur dans la fenêtre graphique
index 6eb0dbc..9ececd9 100644 (file)
@@ -27,6 +27,7 @@ public final class GlobalEventWatcher {
        private static GlobalMouseEventWatcher mouseWatcher;
        private static boolean activated;
     private static String axesUID = null;
+    private static boolean catchingCallback = false;
 
        /**
         * Private Constructor : SINGLETON.
@@ -78,6 +79,7 @@ public final class GlobalEventWatcher {
                Toolkit.getDefaultToolkit().removeAWTEventListener(GlobalEventWatcher.keyWatcher);
                Toolkit.getDefaultToolkit().removeAWTEventListener(GlobalEventWatcher.mouseWatcher);
                activated = false;
+               catchingCallback = false;
        }
 
        /**
@@ -96,4 +98,16 @@ public final class GlobalEventWatcher {
         return axesUID ;
     }
 
+    public static void enableCatchingCallback() {
+        catchingCallback = true;  
+    }
+
+    public static void disableableCatchingCallback() {
+        catchingCallback = false;  
+    }
+
+    public static boolean isCatchingCallback() {
+        return catchingCallback;  
+    }
+    
 }
index 9d88141..c0f2d92 100644 (file)
@@ -169,7 +169,8 @@ public abstract class GlobalMouseEventWatcher implements AWTEventListener {
          * and the event is not comming from a Canvas itself.
          * and got a RELEASED
          */
-        if (mouseEvent.getID() == MouseEvent.MOUSE_RELEASED && inCanvas 
+        if (mouseEvent.getID() == MouseEvent.MOUSE_RELEASED && inCanvas
+                && mouseEvent.getSource().getClass().getCanonicalName().contains(ScilabOpenGLComponentCanonicalName)
                 && (clickTranslator.getClickAction() == SciTranslator.UNMANAGED 
                 || clickTranslator.getClickAction() == SciTranslator.MOVED)) {
             clickTranslator.setClickAction(SciTranslator.RELEASED);
index 4491af4..3f5b45a 100644 (file)
@@ -57,6 +57,12 @@ public final class Jxclick {
                 mouseActionFilter(mouseEvent, axesUID, scilabMouseAction, isControlDown);
             }
         });
+        
+        /*
+         *  Force xclick not to catch/disable callback execution.
+         */
+        GlobalEventWatcher.enableCatchingCallback();
+        
         synchronized (ClickInfos.getInstance()) {
             try {
                 ClickInfos.getInstance().init();
index a916cf9..26b8323 100644 (file)
@@ -77,6 +77,12 @@ public final class Jxgetmouse {
                 mouseActionFilter(mouseEvent, axesUID, scilabMouseAction, isControlDown);
             }
         });
+        
+        /*
+         *  Force xgetmouse not to catch/disable callback execution.
+         */
+        GlobalEventWatcher.disableableCatchingCallback();
+        
         synchronized (ClickInfos.getInstance()) {
             try {
                 ClickInfos.getInstance().init();
index 61eafc5..3da5eca 100644 (file)
@@ -118,7 +118,7 @@ public abstract class CommonCallBack extends AbstractAction {
      * @param e The event that launch the callback.
      */
     public void actionPerformed(ActionEvent e) {
-        if (!GlobalEventWatcher.isActivated()) {
+        if (!GlobalEventWatcher.isCatchingCallback()) {
             callBack();
         } else {
             if (this.callback.getCommand() != null) {