Create new callback types for uninterruptible callbacks.
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / events / callback / ScilabCallBack.java
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12 package org.scilab.modules.gui.events.callback;
13
14 import java.awt.event.ActionEvent;
15
16 import org.scilab.modules.action_binding.InterpreterManagement;
17 import org.scilab.modules.graphic_objects.graphicObject.CallBack;
18
19 /**
20  * ScilabCallback abstract class to easily manage callbacks
21  * that throws commands to Scilab.
22  *
23  * @author Bruno JOFRET
24  *
25  */
26 public abstract class ScilabCallBack extends CommonCallBack {
27
28     private static final long serialVersionUID = -4923246233703990342L;
29
30     private boolean isInterruptible = true;
31
32     /**
33      * Constructor
34      * @param command : the command to execute.
35      */
36     private ScilabCallBack(String command) {
37         super(command, CallBack.UNTYPED);
38     }
39
40     private ScilabCallBack(String command, boolean isInterruptible) {
41         super(command, CallBack.UNTYPED);
42         this.isInterruptible = isInterruptible;
43     }
44     /**
45      * Callback Factory to easily create a callback
46      * just like in scilab.
47      * @param command : the command to execute.
48      * @return a usable Scilab callback
49      */
50     public static ScilabCallBack create(String command) {
51         return create(command, true);
52     }
53
54     /**
55      * Callback Factory to easily create a callback
56      * just like in scilab.
57      * @param command : the command to execute.
58      * @return a usable Scilab callback
59      */
60     public static ScilabCallBack create(String command, boolean isInterruptible) {
61         return (new ScilabCallBack(command, isInterruptible) {
62
63             private static final long serialVersionUID = -7286803341046313407L;
64
65             public void callBack() {
66                 Thread launchMe = new Thread() {
67                     public void run() {
68                         if (isInterruptible()) {
69                             InterpreterManagement.putCommandInScilabQueue(getCommand());
70                         } else {
71                             InterpreterManagement.requestScilabExec(getCommand());
72                         }
73                     }
74                 };
75                 launchMe.start();
76             }
77         });
78     }
79
80     boolean isInterruptible() {
81         return isInterruptible;
82     }
83
84     /**
85      * Callback Factory to easily create a callback
86      * just like in scilab.
87      * WARNING : this callback will be ignored by xclick & xgetmouse
88      * @param command : the command to execute.
89      * @return a usable Scilab callback
90      */
91     public static ScilabCallBack createOutOfXclickAndXgetmouse(String command) {
92         return (new ScilabCallBack(command) {
93
94             private static final long serialVersionUID = -7286803341046313407L;
95
96             public void callBack() {
97                 Thread launchMe = new Thread() {
98                     public void run() {
99                         InterpreterManagement.putCommandInScilabQueue(getCommand());
100                     }
101                 };
102                 launchMe.start();
103             }
104
105             /**
106              * To match the standard Java Action management.
107              * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
108              * @param e The event that launch the callback.
109              */
110             public void actionPerformed(ActionEvent e) {
111                 callBack();
112             }
113         });
114     }
115
116 }