* Bug 10964 fixed: now Scinotes can execute the current file in NW mode
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / EvaluateSelectionAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2010 - Calixte DENIZET
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  * Copyright (C) 2021 - St├ęphane MOTTELET
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 package org.scilab.modules.scinotes.actions;
18
19 import java.beans.PropertyChangeEvent;
20 import java.beans.PropertyChangeListener;
21 import java.util.StringTokenizer;
22 import javax.swing.JMenuItem;
23 import javax.swing.KeyStroke;
24
25 import org.scilab.modules.gui.console.ScilabConsole;
26 import org.scilab.modules.gui.menuitem.MenuItem;
27 import org.scilab.modules.scinotes.SciNotes;
28 import org.scilab.modules.scinotes.ScilabEditorPane;
29
30 import org.scilab.modules.history_manager.HistoryManagement;
31 import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement;
32 import org.scilab.modules.console.SciPromptView;
33 import org.scilab.modules.console.AdvCLIManagement;
34
35 /**
36  * EvaluateSelectionAction class
37  * @author Bruno JOFRET
38  * @author Calixte DENIZET
39  */
40 public final class EvaluateSelectionAction extends DefaultAction {
41
42     /**
43      * serialVersionUID
44      */
45     private static final long serialVersionUID = 320938663765236236L;
46
47     /**
48      * Constructor
49      * @param name the name of the action
50      * @param editor SciNotes
51      */
52     public EvaluateSelectionAction(String name, SciNotes editor) {
53         super(name, editor);
54     }
55
56     /**
57      * doAction
58      */
59     public void doAction() {
60         /* Will do the job as if it was copy / paste in scilab Console */
61         ScilabEditorPane sep = getEditor().getTextPane();
62         String selection = sep.getCodeToExecute();
63         if (selection.compareTo("") != 0) {
64             StringTokenizer tokens = new StringTokenizer(selection, "\n");
65             String[] lines = new String[tokens.countTokens()];
66             int i = 0;
67             while (tokens.hasMoreTokens()) {
68                 lines[i++] = tokens.nextToken();
69             }
70             if (ScilabConsole.isExistingConsole())
71             {
72                 HistoryManagement.appendLinesToScilabHistory(lines, lines.length);
73                 ScilabConsole.getConsole().getAsSimpleConsole().sendCommandsToScilab(selection, true, false);
74             } else {
75                 /* This happens when SciNotes is launched as standalone (ie without
76                  * Scilab) or Scilab launched in -nw mode */
77                 new Thread(() -> {
78                     try {
79                         System.out.println(selection);
80                         ScilabInterpreterManagement.synchronousScilabExec(selection);
81                         System.out.println();
82                         System.out.print(AdvCLIManagement.GetCurrentPrompt());
83                     }
84                     catch (ScilabInterpreterManagement.InterpreterException e) {
85                         System.out.println(e.getMessage());
86                     }
87                 }).start();
88             }
89         }
90     }
91
92     /**
93      * createMenu
94      * @param label label of the menu
95      * @param editor scinotes
96      * @param key KeyStroke
97      * @return MenuItem
98      */
99     public static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key) {
100         StringTokenizer token = new StringTokenizer(label, ";\uff1b");
101         final String label1 = token.nextToken();
102         final String label2 = token.nextToken();
103         final MenuItem menuitem = createMenu(label1, null, new EvaluateSelectionAction(label1, editor), key);
104         if (!ScilabConsole.isExistingConsole()) { // Only available in STD mode
105             ((JMenuItem) menuitem.getAsSimpleMenuItem()).setEnabled(false);
106         }
107         ((JMenuItem) menuitem.getAsSimpleMenuItem()).addPropertyChangeListener(new PropertyChangeListener() {
108             public void propertyChange(PropertyChangeEvent e) {
109                 if (editor.getTextPane() != null) {
110                     String select = editor.getTextPane().getSelectedText();
111                     if (select == null) {
112                         menuitem.setText(label2);
113                     } else {
114                         menuitem.setText(label1);
115                     }
116                 }
117             }
118         });
119
120         return menuitem;
121     }
122 }