Xcos GUI: enable Compile action
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / actions / CompileAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Allan SIMON
4  * Copyright (C) 2010 - DIGITEO - Clement DAVID
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.actions;
15
16 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.asynchronousScilabExec;
17 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.buildCall;
18
19 import java.awt.event.ActionEvent;
20 import java.awt.event.ActionListener;
21 import java.util.logging.Logger;
22
23 import javax.swing.Timer;
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.xcos.JavaController;
32 import org.scilab.modules.xcos.ObjectProperties;
33 import org.scilab.modules.xcos.graph.XcosDiagram;
34 import org.scilab.modules.xcos.utils.XcosMessages;
35
36 /**
37  * Diagram compilation management
38  */
39 @SuppressWarnings(value = { "serial" })
40 public final class CompileAction extends OneBlockDependantAction {
41     /** Name of the action */
42     public static final String NAME = XcosMessages.COMPILE;
43     /** Icon name of the action */
44     public static final String SMALL_ICON = "";
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     private int counter;
51     private Timer displayTimer;
52
53     /**
54      * Constructor
55      *
56      * @param scilabGraph
57      *            associated diagram
58      */
59     public CompileAction(ScilabGraph scilabGraph) {
60         super(scilabGraph);
61         char[] msg = (XcosMessages.COMPILATION_IN_PROGRESS + XcosMessages.DOTS).toCharArray();
62         final int minimalMsgLen = XcosMessages.COMPILATION_IN_PROGRESS.length();
63
64         counter = 0;
65         displayTimer = new Timer(1000, e -> {
66             counter = (counter + 1) % (XcosMessages.DOTS.length() + 1);
67             ((XcosDiagram) scilabGraph).info(new String(msg, 0, minimalMsgLen + counter));
68         });
69     }
70
71     /**
72      * Create associated menu
73      *
74      * @param scilabGraph
75      *            associated diagram
76      * @return the menu
77      */
78     public static MenuItem createMenu(ScilabGraph scilabGraph) {
79         return createMenu(scilabGraph, CompileAction.class);
80     }
81
82     /**
83      * @param e
84      *            parameter
85      * @see org.scilab.modules.graph.actions.base.DefaultAction#actionPerformed(java.awt.event.ActionEvent)
86      */
87     @Override
88     public void actionPerformed(ActionEvent e) {
89         final XcosDiagram graph = (XcosDiagram) getGraph(e);
90
91         // Action disabled when the cell is edited
92         final ScilabComponent comp = ((ScilabComponent) graph.getAsComponent());
93         if (comp.isEditing()) {
94             return;
95         }
96
97         updateUI(true);
98         displayTimer.start();
99
100         final String cmd = createCompilationCommand(graph);
101         final ActionListener action = new ActionListener() {
102             @Override
103             public void actionPerformed(ActionEvent e) {
104                 displayTimer.stop();
105                 updateUI(false);
106             }
107         };
108
109         try {
110             asynchronousScilabExec(action, cmd);
111         } catch (InterpreterException e1) {
112             final Logger log = Logger.getLogger(CompileAction.class.getName());
113             log.warning(e1.getMessage());
114         }
115     }
116
117     /**
118      * Create the command String
119      *
120      * @param diagram
121      *            the working diagram
122      * @return the command string
123      */
124     private String createCompilationCommand(final XcosDiagram diagram) {
125         String cmd;
126         final StringBuilder command = new StringBuilder();
127
128         /*
129          * Log compilation info
130          */
131         final Logger log = Logger.getLogger(CompileAction.class.getName());
132         log.finest("start compilation");
133
134         JavaController controller = new JavaController();
135         int[] debugLevel = new int[1];
136         controller.getObjectProperty(diagram.getUID(), diagram.getKind(), ObjectProperties.DEBUG_LEVEL, debugLevel);
137         command.append(buildCall("scicos_debug", debugLevel[0])).append("; ");
138
139         /*
140          * Export the schema on `scs_m`
141          */
142         command.append("scs_m = scicos_new(\"0x").append(Long.toHexString(diagram.getUID())).append("\"); ");
143         command.append("cpr = xcos_compile(scs_m); ");
144
145         cmd = command.toString();
146         return cmd;
147     }
148
149     /**
150      * Update the UI depending on the action selected or not
151      *
152      * @param started
153      *            the started status
154      */
155     public void updateUI(boolean started) {
156         GraphActionManager.setEnable(StartAction.class, !started);
157         ((XcosDiagram) getGraph(null)).setReadOnly(started);
158
159         if (started) {
160             ((XcosDiagram) getGraph(null)).info(XcosMessages.COMPILATION_IN_PROGRESS);
161         } else {
162             ((XcosDiagram) getGraph(null)).info(XcosMessages.EMPTY_INFO);
163         }
164     }
165 }