* Bug #8157 fixed - Under Mac OS X, item "Scilab/Quit Scilab" and "File/Quit" were
[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 public final class ScilabVariableEditor extends SwingScilabWindow implements VariableEditor {
33
34     private static Map<String, Component> map = new HashMap();
35
36     private static ScilabVariableEditor instance;
37
38     private static SwingScilabVariableEditor editorTab;
39     private static ScilabTabbedPane tabPane;
40
41     /**
42      * Constructor
43      * @param type the variable type
44      * @param data the JTable data.
45      * @param variableName the name in Scilab of the variable being edited.
46      */
47     private ScilabVariableEditor(String type, Object[][] data, String variableName) {
48         super();
49         editorTab = new SwingScilabVariableEditor(variableName, type, data);
50         tabPane = editorTab.getTabPane();
51         TextBox infobar = ScilabTextBox.createTextBox();
52         editorTab.addInfoBar(infobar);
53         addTab(editorTab);
54         map.put(variableName, tabPane.getSelectedComponent());
55     }
56
57     /**
58      * Close Variable Editor
59      */
60     public void close() {
61         SwingScilabWindow editvarWindow = SwingScilabWindow.allScilabWindows.get(editorTab.getParentWindowId());
62         ChangeListener[] cl = tabPane.getChangeListeners();
63         for (int i = 0; i < cl.length; i++) {
64             tabPane.removeChangeListener(cl[i]);
65         }
66         instance = null;
67         map.clear();
68         super.close();
69     }
70
71     /**
72      * Close the edition of the variable
73      * @param name the variable
74      */
75     public static void close(String name) {
76         map.remove(name);
77     }
78
79     /**
80      * Set data displayed in JTable
81      * @param name the variable name
82      * @param type the variable type
83      * @param data : data to be displayed in JTable
84      */
85     public void updateData(String name, String type, Object[][] data) {
86         if (map.containsKey(name)) {
87             editorTab.updateData(map.get(name), name, type, data);
88         } else {
89             editorTab.setData(name, type, data);
90             map.put(name, tabPane.getSelectedComponent());
91         }
92     }
93
94     /**
95      * Set data displayed in JTable
96      * @param name the variable name
97      * @param type the variable type
98      * @param data : data to be displayed in JTable
99      */
100     public void updateData(String name, String type, Object[][] data, double[] rowsIndex, double[] colsIndex) {
101         if (map.containsKey(name)) {
102             ((SwingScilabVariableEditor) editorTab).updateData(map.get(name), name, type, data, rowsIndex, colsIndex);
103         }
104     }
105
106     /**
107      * Get the variable editor singleton
108      * @return the Variable Editor
109      */
110     public static ScilabVariableEditor getVariableEditor() {
111         return instance;
112     }
113
114     /**
115      * Get the variable editor singleton with specified data.
116      * @param type the variable type
117      * @param data : the data to fill the editor with
118      * @param variableName : the scilab name of the variable being edited.
119      * @return the Variable Editor
120      */
121     public static ScilabVariableEditor getVariableEditor(final String type, final Object[][] data, final String variableName) {
122         if (instance == null) {
123             instance = new ScilabVariableEditor(type, data, variableName);
124             instance.setVisible(true);
125         } else {
126             SwingScilabWindow window = (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, editorTab);
127             window.setVisible(true);
128             window.toFront();
129             final JTable table = ((SwingScilabVariableEditor) editorTab).getCurrentTable();
130             SwingUtilities.invokeLater(new Runnable() {
131                 public void run() {
132                     int r = -1;
133                     int c = -1;
134
135                     if (table != null) {
136                         r = table.getSelectedRow();
137                         c = table.getSelectedColumn();
138                     }
139                     boolean b = map.containsKey(variableName);
140                     instance.updateData(variableName, type, data);
141                     if (b && r != -1 && c != -1) {
142                         table.setRowSelectionInterval(r, r);
143                         table.setColumnSelectionInterval(c, c);
144                     }
145                 }
146             });
147         }
148
149         editorTab.setName(Messages.gettext("Variable Editor") + " - " + variableName + "  (" + type + ")");
150         return instance;
151     }
152
153     public static void refreshVariableEditor(final String type, final Object[][] data, double[] rowsIndex, double[] colsIndex, final String variableName) {
154         if (instance != null) {
155             instance.updateData(variableName, type, data, rowsIndex, colsIndex);
156         }
157     }
158
159     /**
160      * {@inheritDoc}
161      */
162     public String getVariablename() {
163         String title = tabPane.getScilabTitleAt(tabPane.getSelectedIndex());
164         return title.substring(SwingScilabVariableEditor.PREFIX.length());
165     }
166
167     /**
168      * {@inheritDoc}
169      */
170     public void setVariableName(String variableName) {
171         tabPane.setTitleAt(tabPane.getSelectedIndex(), SwingScilabVariableEditor.PREFIX + variableName);
172     }
173
174     /**
175      * {@inheritDoc}
176      */
177     public void setVisible(boolean status) {
178         super.setVisible(status);
179         editorTab.setVisible(status);
180     }
181
182     /**
183      * This method is called by the OSXAdapter class when the specific Mac
184      * OS X "About" menu is called. It is the only case where this method
185      * should be used
186      */
187     public void macosxAbout() {
188         InterpreterManagement.requestScilabExec("about()");
189     }
190
191     /**
192      * This method is called by the OSXAdapter class when the specific Mac
193      * OS X "Quit Scilab" menu is called. It is the only case where this method
194      * should be used
195      */
196     public void macosxQuit() {
197         InterpreterManagement.requestScilabExec("exit()");
198     }
199
200     /**
201      * This method is called by the OSXAdapter class when the specific Mac
202      * OS X "Preferences" menu is called. It is the only case where this method
203      * should be used
204      */
205     public void macosxPreferences() {
206         InterpreterManagement.requestScilabExec("preferences();");
207     }
208
209
210 }