In browsevar, allows a user to plot the variable (already available in editvar).
[scilab.git] / scilab / modules / ui_data / src / java / org / scilab / modules / ui_data / variableeditor / actions / PlotAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
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-en.txt
10  *
11  */
12
13 package org.scilab.modules.ui_data.variableeditor.actions;
14
15 import java.awt.Component;
16 import java.util.HashMap;
17 import java.util.Map;
18
19 import javax.swing.ImageIcon;
20 import javax.swing.JPopupMenu;
21 import javax.swing.JTable;
22
23 import org.scilab.modules.types.ScilabTypeEnumDescription;
24 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
25 import org.scilab.modules.gui.bridge.menuitem.SwingScilabMenuItem;
26 import org.scilab.modules.gui.bridge.pushbutton.SwingScilabPushButton;
27 import org.scilab.modules.gui.events.callback.CommonCallBack;
28 import org.scilab.modules.gui.menuitem.MenuItem;
29 import org.scilab.modules.gui.menuitem.ScilabMenuItem;
30 import org.scilab.modules.gui.pushbutton.PushButton;
31 import org.scilab.modules.gui.pushbutton.ScilabPushButton;
32 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
33 import org.scilab.modules.ui_data.BrowseVar;
34 import org.scilab.modules.ui_data.EditVar;
35 import org.scilab.modules.ui_data.datatable.SwingEditvarTableModel;
36 import org.scilab.modules.ui_data.variableeditor.SwingScilabVariableEditor;
37 import org.scilab.modules.ui_data.variablebrowser.SwingScilabVariableBrowser;
38
39 import static org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.asynchronousScilabExec;
40
41 import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException;
42
43
44 /**
45  * RefreshAction class
46  * @author Calixte DENIZET
47  */
48 @SuppressWarnings(value = { "serial" })
49 public final class PlotAction extends CommonCallBack {
50
51     public static final int PLOT2D = 0;
52     public static final int MATPLOT = 1;
53     public static final int GRAYPLOT = 2;
54     public static final int SGRAYPLOT = 3;
55     public static final int CHAMP = 4;
56     public static final int HISTPLOT = 5;
57     public static final int MESH = 6;
58     public static final int SURF = 7;
59     public static final int HIST3D = 8;
60     public static final int CONTOUR2D = 9;
61     public static final int PIE = 10;
62
63     private static final Map<String, Integer> map = new HashMap<String, Integer>();
64     static {
65         map.put("plot2d", 0);
66         map.put("Matplot", 1);
67         map.put("grayplot", 2);
68         map.put("Sgrayplot", 3);
69         map.put("champ", 4);
70         map.put("histplot", 5);
71         map.put("mesh", 6);
72         map.put("surf", 7);
73         map.put("hist3d", 8);
74         map.put("contour2d", 9);
75         map.put("pie", 10);
76     }
77
78     private static final String COM_PLOT2D = "plot2d(%s)";
79     private static final String COM_MATPLOT = "Matplot(%s)";
80     private static final String COM_GRAYPLOT = "grayplot(1:%s,1:%s,%s)";
81     private static final String COM_SGRAYPLOT = "Sgrayplot(1:%s,1:%s,%s)";
82     private static final String COM_CHAMP = "champ(1:%s,1:%s,real(%s),imag(%s))";
83     private static final String COM_HISTPLOT = "histplot(10,%s)";
84     private static final String COM_MESH = "mesh(%s)";
85     private static final String COM_SURF = "surf(%s)";
86     private static final String COM_HIST3D = "hist3d(%s)";
87     private static final String COM_CONTOUR2D = "L?8625083632641564278=xget(\"fpf\");xset(\"fpf\",\" \");contour2d(1:%s,1:%s,%s,10);xset(\"fpf\",L?8625083632641564278);clear(\"L?8625083632641564278\")";
88     private static final String COM_PIE = "L?8625083632641564278=%s;pie(L?8625083632641564278(find(L?8625083632641564278>0&L?8625083632641564278<>%%inf&L?8625083632641564278<>%%nan)))";
89
90     private static final String[] COMMANDS = new String[] {COM_PLOT2D, COM_MATPLOT, COM_GRAYPLOT, COM_SGRAYPLOT, COM_CHAMP, COM_HISTPLOT, COM_MESH, COM_SURF, COM_HIST3D, COM_CONTOUR2D, COM_PIE};
91     private static final String[] IMG = new String[] {
92         "application-x-scilab-plot2d",
93         "application-x-scilab-Matplot",
94         "application-x-scilab-grayplot",
95         "application-x-scilab-Sgrayplot",
96         "application-x-scilab-champ",
97         "application-x-scilab-histplot",
98         "application-x-scilab-mesh",
99         "application-x-scilab-surf",
100         "application-x-scilab-hist3d",
101         "application-x-scilab-contour2d",
102         "application-x-scilab-pie"
103     };
104
105     private static final String CREATE = "Create";
106
107     private final SwingScilabTab editor;
108     private final int type;
109     private final boolean onSelection;
110
111     /**
112      * Constructor
113      * @param editor the editor
114      * @param name the name of the action
115      */
116     public PlotAction(SwingScilabTab editor, String name, boolean onSelection) {
117         super(name);
118         this.editor = editor;
119         this.type = map.get(name);
120         this.onSelection = onSelection;
121     }
122
123     /**
124      * {@inheritDoc}
125      */
126     @Override
127     public void callBack() {
128
129         String data = null;
130         int rowC = 0;
131         int colC = 0;
132         String modelType = null;
133         SwingEditvarTableModel model = null;
134
135         if (editor instanceof SwingScilabVariableEditor) {
136             JTable table = ((SwingScilabVariableEditor)editor).getCurrentTable();
137             model = (SwingEditvarTableModel) table.getModel();
138             modelType = model.getType();
139
140             if (!onSelection) {
141                 rowC = model.getScilabMatrixRowCount();
142                 colC = model.getScilabMatrixColCount();
143                 data = model.getVarName();
144             } else {
145                 int[] cols = table.getSelectedColumns();
146                 int[] rows = table.getSelectedRows();
147                 if (cols == null || cols.length == 0 || rows == null || rows.length == 0) {
148                     rowC = model.getScilabMatrixRowCount();
149                     colC = model.getScilabMatrixColCount();
150                     data = model.getVarName();
151                 } else {
152                     if (model.getType().equals(EditVar.STRING)) {
153                         return;
154                     }
155
156                     int[] rowSize = new int[1];
157                     int[] colSize = new int[1];
158                     data = model.getScilabSubMatrix(rows, cols, rowSize, colSize);
159                     if (data == null) {
160                         return;
161                     }
162                     rowC = rowSize[0];
163                     colC = colSize[0];
164                 }
165             }
166
167             if (!modelType.equals(EditVar.DOUBLE)) {
168                 data = "double(" + data + ")";
169             }
170
171         } else {
172             // Variable Browser
173             int clickedRow = ((SwingScilabVariableBrowser)editor).getTable().getSelectedRow();
174
175             // Does nothing if no variable selected
176             if (clickedRow != -1) {
177                 rowC = Integer.parseInt(((SwingScilabVariableBrowser)editor).getTable().getModel().getValueAt(clickedRow, BrowseVar.NB_ROWS_INDEX).toString());
178                 colC = Integer.parseInt(((SwingScilabVariableBrowser)editor).getTable().getModel().getValueAt(clickedRow, BrowseVar.NB_COLS_INDEX).toString());
179                 data = ((SwingScilabVariableBrowser)editor).getTable().getValueAt(clickedRow, BrowseVar.NAME_COLUMN_INDEX).toString();
180             }
181             int type = Integer.parseInt(((SwingScilabVariableBrowser)editor).getTable().getModel().getValueAt(clickedRow, BrowseVar.TYPE_COLUMN_INDEX).toString());
182
183             if (!ScilabTypeEnumDescription.getTypeDescriptionFromId(type).equals(EditVar.DOUBLE)) {
184                 data = "double(" + data + ")";
185             }
186
187         }
188
189         if (rowC == 0 || colC == 0) {
190             return;
191         }
192
193         String com = COMMANDS[type];
194         switch (type) {
195             case 0:
196             case 1:
197             case 5:
198             case 6:
199             case 7:
200             case 8:
201             case 10:
202                 com = String.format(com, data);
203                 break;
204             case 2:
205             case 3:
206                 com = String.format(com, rowC, colC, data);
207                 break;
208             case 4:
209                 com = String.format(com, rowC, colC, data, data);
210                 break;
211             case 9:
212                 if (rowC >= 2 && colC >= 2) {
213                     com = String.format(com, rowC, colC, data);
214                 } else {
215                     return;
216                 }
217                 break;
218         }
219         if (editor instanceof SwingScilabVariableEditor) {
220             model.execCommand("clf();" + com);
221         } else {
222             // Browse var case
223             try {
224                 asynchronousScilabExec(null, "clf();" + com);
225             } catch (InterpreterException e1) {
226                 System.err.println("An error in the interpreter has been catched: " + e1.getLocalizedMessage());
227             }
228
229         }
230     }
231
232     /**
233      * Create a button for a tool bar
234      * @param editor the associated editor
235      * @param title tooltip for the button
236      * @return the button
237      */
238     public static PushButton createButton(SwingScilabTab editor, String title) {
239         final PushButton button = ScilabPushButton.createPushButton();
240         button.setToolTipText(title);
241         ImageIcon imageIcon = new ImageIcon(ScilabSwingUtilities.findIcon("plot"));
242         ((SwingScilabPushButton) button.getAsSimplePushButton()).setIcon(imageIcon);
243
244         final JPopupMenu popup = new JPopupMenu() {
245             @Override
246             public void show(Component c, int x, int y) {
247                 SwingScilabPushButton but = (SwingScilabPushButton) button.getAsSimplePushButton();
248                 super.show(but, 0, but.getBounds(null).height);
249             }
250         };
251         popup.setBorderPainted(true);
252
253         popup.add(PlotAction.createJMenuItem(editor, "plot2d", true));
254         popup.add(PlotAction.createJMenuItem(editor, "Matplot", true));
255         popup.add(PlotAction.createJMenuItem(editor, "grayplot", true));
256         popup.add(PlotAction.createJMenuItem(editor, "Sgrayplot", true));
257         popup.add(PlotAction.createJMenuItem(editor, "champ", true));
258         popup.add(PlotAction.createJMenuItem(editor, "histplot", true));
259         popup.add(PlotAction.createJMenuItem(editor, "mesh", true));
260         popup.add(PlotAction.createJMenuItem(editor, "surf", true));
261         popup.add(PlotAction.createJMenuItem(editor, "hist3d", true));
262         popup.add(PlotAction.createJMenuItem(editor, "contour2d", true));
263         popup.add(PlotAction.createJMenuItem(editor, "pie", true));
264
265         popup.pack();
266
267         ((SwingScilabPushButton) button.getAsSimplePushButton()).addActionListener(new CommonCallBack(null) {
268             @Override
269             public void callBack() {
270                 if (!popup.isVisible()) {
271                     popup.show(null, 0, 0);
272                 } else {
273                     popup.setVisible(false);
274                 }
275             }
276         });
277
278         return button;
279     }
280
281     /**
282      * Create a menu item
283      * @param editor the associated editor
284      * @param title the menu title
285      * @return the menu item
286      */
287     public static MenuItem createMenuItem(SwingScilabTab editor, String title, boolean onSelection) {
288         MenuItem menu = ScilabMenuItem.createMenuItem();
289         menu.setCallback(new PlotAction(editor, title, onSelection));
290         menu.setText(title);
291         ((SwingScilabMenuItem) menu.getAsSimpleMenuItem()).setIcon(new ImageIcon(ScilabSwingUtilities.findIcon(IMG[map.get(title)])));
292
293         return menu;
294     }
295
296     /**
297      * Create a menu item as a SwingScilabMenuItem
298      * @param editor the associated editor
299      * @param title the menu title
300      * @return the menu item
301      */
302     public static SwingScilabMenuItem createJMenuItem(SwingScilabTab editor, String title, boolean onSelection) {
303         return (SwingScilabMenuItem) createMenuItem(editor, title, onSelection).getAsSimpleMenuItem();
304     }
305 }