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