Add a closeEditvar() function
[scilab.git] / scilab / modules / ui_data / src / java / org / scilab / modules / ui_data / variableeditor / ScilabVariableEditor.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Allan SIMON
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 package org.scilab.modules.ui_data.variableeditor;
13
14 import java.awt.Component;
15 import java.util.HashMap;
16 import java.util.Map;
17
18 import javax.swing.JTable;
19 import javax.swing.SwingUtilities;
20 import javax.swing.event.ChangeListener;
21
22 import org.scilab.modules.action_binding.InterpreterManagement;
23 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
24 import org.scilab.modules.gui.textbox.ScilabTextBox;
25 import org.scilab.modules.gui.textbox.TextBox;
26 import org.scilab.modules.localization.Messages;
27
28 /**
29  * Class ScilabVariableEditor
30  * Implements a ScilabWindow containing Variable Editor (JTable)
31  */
32 @SuppressWarnings(value = { "serial" })
33 public final class ScilabVariableEditor extends SwingScilabWindow implements VariableEditor {
34
35     private static Map<String, Component> map = new HashMap();
36
37     private static ScilabVariableEditor instance;
38
39     private static SwingScilabVariableEditor editorTab;
40     private static ScilabTabbedPane tabPane;
41
42     /**
43      * Constructor
44      * @param type the variable type
45      * @param data the JTable data.
46      * @param variableName the name in Scilab of the variable being edited.
47      */
48     private ScilabVariableEditor(String type, Object[][] data, String variableName) {
49         super();
50         editorTab = new SwingScilabVariableEditor(variableName, type, data);
51         tabPane = editorTab.getTabPane();
52         TextBox infobar = ScilabTextBox.createTextBox();
53         editorTab.addInfoBar(infobar);
54         addTab(editorTab);
55         map.put(variableName, tabPane.getSelectedComponent());
56     }
57
58     /**
59      * Close Variable Editor
60      */
61     public void close() {
62         SwingScilabWindow editvarWindow = SwingScilabWindow.allScilabWindows.get(editorTab.getParentWindowId());
63         ChangeListener[] cl = tabPane.getChangeListeners();
64         for (int i = 0; i < cl.length; i++) {
65             tabPane.removeChangeListener(cl[i]);
66         }
67         instance = null;
68         map.clear();
69         super.close();
70     }
71
72     /**
73      * Close the edition of the variable
74      */
75     public static void closeEditVar() {
76         if (instance != null) {
77             instance.close();
78         }
79     }
80
81     /**
82      * Close the edition of the variable
83      * @param name the variable
84      */
85     public static void close(String name) {
86         map.remove(name);
87     }
88
89     /**
90      * Set data displayed in JTable
91      * @param name the variable name
92      * @param type the variable type
93      * @param data : data to be displayed in JTable
94      */
95     public void updateData(String name, String type, Object[][] data) {
96         if (map.containsKey(name)) {
97             editorTab.updateData(map.get(name), name, type, data);
98         } else {
99             editorTab.setData(name, type, data);
100             map.put(name, tabPane.getSelectedComponent());
101         }
102     }
103
104     /**
105      * Set data displayed in JTable
106      * @param name the variable name
107      * @param type the variable type
108      * @param data : data to be displayed in JTable
109      */
110     public void updateData(String name, String type, Object[][] data, double[] rowsIndex, double[] colsIndex) {
111         if (map.containsKey(name)) {
112             editorTab.updateData(map.get(name), name, type, data, rowsIndex, colsIndex);
113         }
114     }
115
116     /**
117      * Get the variable editor singleton
118      * @return the Variable Editor
119      */
120     public static ScilabVariableEditor getVariableEditor() {
121         return instance;
122     }
123
124     /**
125      * Get the variable editor singleton with specified data.
126      * @param type the variable type
127      * @param data : the data to fill the editor with
128      * @param variableName : the scilab name of the variable being edited.
129      * @return the Variable Editor
130      */
131     public static ScilabVariableEditor getVariableEditor(final String type, final Object[][] data, final String variableName) {
132         if (instance == null) {
133             try {
134                 SwingUtilities.invokeAndWait(new Runnable() {
135                         public void run() {
136                             instance = new ScilabVariableEditor(type, data, variableName);
137                             instance.setVisible(true);
138                         }
139                     });
140             } catch (Exception e) {
141                 System.err.println(e);
142             }
143         } else {
144             SwingUtilities.invokeLater(new Runnable() {
145                     public void run() {
146                         SwingScilabWindow window = (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, editorTab);
147                         window.setVisible(true);
148                         window.toFront();
149                         final JTable table = editorTab.getCurrentTable();
150                         int r = -1;
151                         int c = -1;
152
153                         if (table != null) {
154                             r = table.getSelectedRow();
155                             c = table.getSelectedColumn();
156                         }
157                         boolean b = map.containsKey(variableName);
158                         instance.updateData(variableName, type, data);
159                         if (b && r != -1 && c != -1) {
160                             table.setRowSelectionInterval(r, r);
161                             table.setColumnSelectionInterval(c, c);
162                         }
163                     }
164                 });
165         }
166
167         editorTab.setName(Messages.gettext("Variable Editor") + " - " + variableName + "  (" + type + ")");
168         return instance;
169     }
170
171     public static void refreshVariableEditor(final String type, final Object[][] data, double[] rowsIndex, double[] colsIndex, final String variableName) {
172         if (instance != null) {
173             instance.updateData(variableName, type, data, rowsIndex, colsIndex);
174         }
175     }
176
177     /**
178      * {@inheritDoc}
179      */
180     public String getVariablename() {
181         String title = tabPane.getScilabTitleAt(tabPane.getSelectedIndex());
182         return title.substring(SwingScilabVariableEditor.PREFIX.length());
183     }
184
185     /**
186      * {@inheritDoc}
187      */
188     public void setVariableName(String variableName) {
189         tabPane.setTitleAt(tabPane.getSelectedIndex(), SwingScilabVariableEditor.PREFIX + variableName);
190     }
191
192     /**
193      * {@inheritDoc}
194      */
195     public void setVisible(boolean status) {
196         super.setVisible(status);
197         editorTab.setVisible(status);
198     }
199
200     /**
201      * This method is called by the OSXAdapter class when the specific Mac
202      * OS X "About" menu is called. It is the only case where this method
203      * should be used
204      */
205     public void macosxAbout() {
206         InterpreterManagement.requestScilabExec("about()");
207     }
208
209     /**
210      * This method is called by the OSXAdapter class when the specific Mac
211      * OS X "Quit Scilab" menu is called. It is the only case where this method
212      * should be used
213      */
214     public boolean macosxQuit() {
215         InterpreterManagement.requestScilabExec("exit()");
216         return false;
217     }
218
219     /**
220      * This method is called by the OSXAdapter class when the specific Mac
221      * OS X "Preferences" menu is called. It is the only case where this method
222      * should be used
223      */
224     public void macosxPreferences() {
225         InterpreterManagement.requestScilabExec("preferences();");
226     }
227
228
229 }