* Bug #10433 fixed - Xcos stop simulation button
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / actions / StartAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2009 - DIGITEO - Vincent COUVERT
5  * Copyright (C) 2010 - DIGITEO - Clement DAVID
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 package org.scilab.modules.xcos.actions;
16
17 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.asynchronousScilabExec;
18 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.buildCall;
19
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.io.IOException;
23 import java.util.logging.Logger;
24
25 import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException;
26 import org.scilab.modules.graph.ScilabComponent;
27 import org.scilab.modules.graph.ScilabGraph;
28 import org.scilab.modules.graph.actions.base.GraphActionManager;
29 import org.scilab.modules.graph.actions.base.OneBlockDependantAction;
30 import org.scilab.modules.gui.menuitem.MenuItem;
31 import org.scilab.modules.gui.pushbutton.PushButton;
32 import org.scilab.modules.xcos.graph.XcosDiagram;
33 import org.scilab.modules.xcos.io.scicos.ScilabDirectHandler;
34 import org.scilab.modules.xcos.utils.XcosMessages;
35
36 /**
37  * Start the simulation
38  */
39 @SuppressWarnings(value = { "serial" })
40 public final class StartAction extends OneBlockDependantAction {
41     /** Name of the action */
42     public static final String NAME = XcosMessages.START;
43     /** Icon name of the action */
44     public static final String SMALL_ICON = "media-playback-start";
45     /** Mnemonic key of the action */
46     public static final int MNEMONIC_KEY = 0;
47     /** Accelerator key for the action */
48     public static final int ACCELERATOR_KEY = 0;
49
50     /**
51      * @param scilabGraph
52      *            graph
53      */
54     public StartAction(ScilabGraph scilabGraph) {
55         super(scilabGraph);
56         setEnabled(GraphActionManager.getEnable(StartAction.class));
57     }
58
59     /**
60      * @param scilabGraph
61      *            graph
62      * @return push button
63      */
64     public static PushButton createButton(ScilabGraph scilabGraph) {
65         return createButton(scilabGraph, StartAction.class);
66     }
67
68     /**
69      * @param scilabGraph
70      *            graph
71      * @return menu item
72      */
73     public static MenuItem createMenu(ScilabGraph scilabGraph) {
74         return createMenu(scilabGraph, StartAction.class);
75     }
76
77     /**
78      * Action !!!
79      *
80      * @param e
81      *            the source event
82      * @see org.scilab.modules.gui.events.callback.CallBack#actionPerformed(java.awt.event.ActionEvent)
83      */
84     @Override
85     public void actionPerformed(ActionEvent e) {
86         final XcosDiagram graph = (XcosDiagram) getGraph(e);
87         String cmd;
88
89         // action disabled when the cell is edited
90         final ScilabComponent comp = ((ScilabComponent) graph.getAsComponent());
91         if (comp.isEditing()) {
92             return;
93         }
94
95         final ScilabDirectHandler handler = ScilabDirectHandler.acquire();
96         if (handler == null) {
97             return;
98         }
99
100         updateUI(true);
101
102         try {
103             cmd = createSimulationCommand(graph, handler);
104         } catch (IOException ex) {
105             Logger.getLogger(StartAction.class.getName()).severe(ex.toString());
106             updateUI(false);
107
108             handler.release();
109             return;
110         }
111
112         final ActionListener action = new ActionListener() {
113             @Override
114             public void actionPerformed(ActionEvent e) {
115                 updateUI(false);
116                 graph.getEngine().setCompilationNeeded(false);
117
118                 handler.release();
119             }
120         };
121
122         try {
123             asynchronousScilabExec(action, cmd);
124         } catch (InterpreterException e1) {
125             e1.printStackTrace();
126             updateUI(false);
127
128             handler.release();
129         }
130     }
131
132     /**
133      * Create the command String
134      *
135      * @param diagram
136      *            the working diagram
137      * @param handler
138      *            the handler use to communicate with Scilab
139      * @return the command string
140      * @throws IOException
141      *             when temporary files must not be created.
142      */
143     private String createSimulationCommand(final XcosDiagram diagram, final ScilabDirectHandler handler) throws IOException {
144         String cmd;
145         final StringBuilder command = new StringBuilder();
146
147         /*
148          * Log compilation info
149          */
150         final Logger log = Logger.getLogger(StartAction.class.getName());
151         log.finest("start simulation");
152
153         /*
154          * Import a valid scs_m structure into Scilab
155          */
156         handler.writeDiagram(diagram);
157         command.append(buildCall("scicos_debug", diagram.getScicosParameters().getDebugLevel()));
158
159         /*
160          * Simulate
161          */
162         command.append("xcos_simulate(scs_m, 4); ");
163
164         cmd = command.toString();
165         return cmd;
166     }
167
168     /**
169      * Update the UI depending on the action selected or not
170      *
171      * @param started
172      *            the started status
173      */
174     public void updateUI(boolean started) {
175         GraphActionManager.setEnable(StartAction.class, !started);
176         GraphActionManager.setEnable(StopAction.class, false);
177         ((XcosDiagram) getGraph(null)).setReadOnly(started);
178
179         if (started) {
180             ((XcosDiagram) getGraph(null)).info(XcosMessages.SIMULATION_IN_PROGRESS);
181         } else {
182             ((XcosDiagram) getGraph(null)).info(XcosMessages.EMPTY_INFO);
183         }
184     }
185 }