Bug #11746 fixed - Xcos : closing the palette window with the crossing box did not...
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / view / PaletteManagerView.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011 - Scilab Enterprises - 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-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.palette.view;
15
16 import java.util.List;
17 import java.util.ListIterator;
18
19 import javax.swing.JScrollPane;
20 import javax.swing.JTree;
21 import javax.swing.tree.DefaultTreeModel;
22 import javax.swing.tree.TreeNode;
23 import javax.swing.tree.TreePath;
24
25 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
26 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
27 import org.scilab.modules.gui.menu.Menu;
28 import org.scilab.modules.gui.menu.ScilabMenu;
29 import org.scilab.modules.gui.menubar.MenuBar;
30 import org.scilab.modules.gui.menubar.ScilabMenuBar;
31 import org.scilab.modules.gui.tab.SimpleTab;
32 import org.scilab.modules.gui.tabfactory.ScilabTabFactory;
33 import org.scilab.modules.gui.textbox.ScilabTextBox;
34 import org.scilab.modules.gui.toolbar.ScilabToolBar;
35 import org.scilab.modules.gui.toolbar.ToolBar;
36 import org.scilab.modules.gui.utils.ClosingOperationsManager;
37 import org.scilab.modules.gui.utils.WindowsConfigurationManager;
38 import org.scilab.modules.xcos.Xcos;
39 import org.scilab.modules.xcos.palette.PaletteManager;
40 import org.scilab.modules.xcos.palette.actions.ClosePalettesAction;
41 import org.scilab.modules.xcos.palette.actions.LoadAsPalAction;
42 import org.scilab.modules.xcos.utils.XcosMessages;
43
44 /**
45  * Implement the default view for the palette
46  */
47 public class PaletteManagerView extends SwingScilabTab implements SimpleTab {
48     public static final String DEFAULT_WIN_UUID = "xcos-palette-default-window";
49     public static final String DEFAULT_TAB_UUID = PaletteManager.MODEL_CLASS_PACKAGE;
50
51     private final PaletteManager controller;
52     private PaletteManagerPanel panel;
53
54     /**
55      * Default constructor
56      * 
57      * @param controller
58      *            the associated controller
59      */
60     private PaletteManagerView(final PaletteManager controller) {
61         super(XcosMessages.PALETTE_BROWSER + " - " + Xcos.TRADENAME,
62                 DEFAULT_TAB_UUID);
63
64         this.controller = controller;
65         setWindowIcon(Xcos.ICON.getImage());
66
67         initComponents();
68     }
69
70     private static class ClosingOperation
71             implements
72             org.scilab.modules.gui.utils.ClosingOperationsManager.ClosingOperation {
73
74         public ClosingOperation() {
75         }
76
77         @Override
78         public int canClose() {
79             return 1;
80         }
81
82         @Override
83         public void destroy() {
84             PaletteManager.getInstance().firePropertyChange("visible", true, false);
85         }
86
87         @Override
88         public String askForClosing(List<SwingScilabTab> list) {
89             return null;
90         }
91
92         @Override
93         public void updateDependencies(List<SwingScilabTab> list,
94                 ListIterator<SwingScilabTab> it) {
95         }
96     }
97
98     /*
99      * Static API for Tabs
100      */
101
102     public static PaletteManagerView get() {
103         return (PaletteManagerView) ScilabTabFactory.getInstance()
104                 .getFromCache(DEFAULT_TAB_UUID);
105     }
106
107     public static void restore(Void v) {
108         restore(v, true);
109     }
110
111     public static void restore(Void v, final boolean visible) {
112         PaletteManagerView tab = new PaletteManagerView(
113                 PaletteManager.getInstance());
114         if (visible) {
115             tab.createDefaultWindow().setVisible(true);
116         }
117         PaletteManager.getInstance().firePropertyChange("visible", false, true);
118
119         ClosingOperationsManager.addDependencyWithRoot((SwingScilabTab) tab);
120         ClosingOperationsManager.registerClosingOperation((SwingScilabTab) tab,
121                 new ClosingOperation());
122         ScilabTabFactory.getInstance().addToCache(tab);
123     }
124
125     /**
126      * @return the controller
127      */
128     protected PaletteManager getController() {
129         return controller;
130     }
131
132     /**
133      * @return the panel
134      */
135     public PaletteManagerPanel getPanel() {
136         return panel;
137     }
138
139     /**
140      * @param panel
141      *            the panel to set
142      */
143     public void setPanel(final PaletteManagerPanel panel) {
144         this.panel = panel;
145     }
146
147     /** Instantiate and setup all the components */
148     private void initComponents() {
149         /* Create the menu bar */
150         final MenuBar menuBar = ScilabMenuBar.createMenuBar();
151
152         final Menu menu = ScilabMenu.createMenu();
153         menu.setText(XcosMessages.PALETTES);
154         menu.setMnemonic('P');
155         menuBar.add(menu);
156
157         menu.add(LoadAsPalAction.createMenu(null));
158         menu.addSeparator();
159         menu.add(ClosePalettesAction.createMenu(null));
160
161         setMenuBar(menuBar);
162
163         /* Create the toolbar */
164         final ToolBar toolbar = ScilabToolBar.createToolBar();
165         toolbar.add(LoadAsPalAction.createButton(null));
166
167         setToolBar(toolbar);
168
169         /* Create the content pane */
170         panel = new PaletteManagerPanel(getController());
171         setContentPane(panel);
172
173         /* Create the infobar */
174         setInfoBar(ScilabTextBox.createTextBox());
175
176         setCallback(new ClosePalettesAction(null));
177         getTree().revalidate();
178         getPanel().performStartUpLayout();
179     }
180
181     /** @return the category tree */
182     public JTree getTree() {
183         return (JTree) ((JScrollPane) panel.getLeftComponent()).getViewport()
184                 .getView();
185     }
186
187     /**
188      * Update the selected path on the tree
189      */
190     public static void updateTree() {
191         if (get() == null) {
192             restore(null);
193         }
194         final JTree t = get().getTree();
195         final TreePath p = t.getSelectionPath();
196
197         if (p == null) {
198             updateWholeTree();
199         } else {
200             ((DefaultTreeModel) t.getModel()).reload((TreeNode) p
201                     .getLastPathComponent());
202             t.setSelectionPath(p);
203         }
204     }
205
206     /**
207      * Update the whole tree
208      */
209     public static void updateWholeTree() {
210         if (get() == null) {
211             restore(null);
212         }
213         final JTree t = get().getTree();
214
215         final TreePath selectedPath = t.getSelectionPath();
216         ((DefaultTreeModel) t.getModel()).reload();
217         t.setSelectionPath(selectedPath);
218     }
219
220     /**
221      * @param info
222      *            the information to write on the infobar
223      */
224     public void setInfo(final String info) {
225         getInfoBar().setText(info);
226     }
227
228     private SwingScilabWindow createDefaultWindow() {
229         final SwingScilabWindow win;
230
231         final SwingScilabWindow configuration = WindowsConfigurationManager.createWindow(
232                 DEFAULT_WIN_UUID, false);
233         if (configuration != null) {
234             win = configuration;
235         } else {
236             win = new SwingScilabWindow();
237         }
238
239         win.addTab(this);
240         return win;
241     }
242
243 }