GPL + CeCILL Header change
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / ViewPortTab.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010-2011 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011-2015 - Scilab Enterprises - Clement DAVID
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  * === LICENSE_END ===
15  *
16  */
17
18 package org.scilab.modules.xcos;
19
20 import java.util.List;
21 import java.util.ListIterator;
22 import java.util.UUID;
23
24 import org.scilab.modules.gui.bridge.tab.SwingScilabDockablePanel;
25 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
26 import org.scilab.modules.gui.tab.SimpleTab;
27 import org.scilab.modules.gui.tabfactory.ScilabTabFactory;
28 import org.scilab.modules.gui.utils.ClosingOperationsManager;
29 import org.scilab.modules.gui.utils.WindowsConfigurationManager;
30 import org.scilab.modules.xcos.configuration.ConfigurationManager;
31 import org.scilab.modules.xcos.graph.XcosDiagram;
32 import org.scilab.modules.xcos.utils.XcosMessages;
33
34 import com.mxgraph.swing.mxGraphOutline;
35
36 @SuppressWarnings(value = { "serial" })
37 public final class ViewPortTab extends SwingScilabDockablePanel implements SimpleTab {
38     public static final String DEFAULT_WIN_UUID = "xcos-viewport-default-window";
39     public static final String DEFAULT_TAB_UUID = "xcos-viewport-default-tab";
40
41     private ViewPortTab(XcosDiagram graph, String uuid) {
42         super(XcosMessages.VIEWPORT, uuid);
43
44         graph.setViewPortTab(uuid);
45         setWindowIcon(Xcos.ICON.getImage());
46
47         initComponents(graph);
48     }
49
50     private static class ClosingOperation implements org.scilab.modules.gui.utils.ClosingOperationsManager.ClosingOperation {
51         private final XcosDiagram graph;
52
53         public ClosingOperation(final XcosDiagram graph) {
54             this.graph = graph;
55         }
56
57         @Override
58         public int canClose() {
59             return 1;
60         }
61
62         @Override
63         public void destroy() {
64             graph.setViewPortTab(null);
65
66             final XcosTab tab = XcosTab.get(graph);
67             tab.setViewportChecked(false);
68         }
69
70         @Override
71         public String askForClosing(List<SwingScilabDockablePanel> list) {
72             return null;
73         }
74
75         @Override
76         public void updateDependencies(List<SwingScilabDockablePanel> list, ListIterator<SwingScilabDockablePanel> it) {
77         }
78
79     }
80
81     private static class EndedRestoration implements WindowsConfigurationManager.EndedRestoration {
82         private final XcosDiagram graph;
83
84         public EndedRestoration(XcosDiagram graph) {
85             this.graph = graph;
86         }
87
88         @Override
89         public void finish() {
90             ConfigurationManager.getInstance().removeFromRecentTabs(graph.getViewPortTab());
91         }
92     }
93
94     /*
95      * Static API for Tabs
96      */
97
98     /**
99      * Get the viewport for a graph.
100      *
101      * @param graph
102      *            the graph
103      * @return the view port
104      */
105     public static ViewPortTab get(XcosDiagram graph) {
106         final String uuid = graph.getViewPortTab();
107         return (ViewPortTab) ScilabTabFactory.getInstance().getFromCache(uuid);
108     }
109
110     /**
111      * Restore or create the viewport tab for the graph
112      *
113      * @param graph
114      *            the graph
115      */
116     public static void restore(XcosDiagram graph) {
117         restore(graph, true);
118     }
119
120     /**
121      * Restore or create the viewport tab for the graph
122      *
123      * @param graph
124      *            the graph
125      * @param visible
126      *            should the tab should be visible
127      */
128     public static void restore(final XcosDiagram graph, final boolean visible) {
129         String uuid = graph.getViewPortTab();
130         if (uuid == null) {
131             uuid = UUID.randomUUID().toString();
132         }
133
134         ViewPortTab tab = new ViewPortTab(graph, uuid);
135         if (visible) {
136             tab.createDefaultWindow().setVisible(true);
137             tab.setCurrent();
138         }
139         ScilabTabFactory.getInstance().addToCache(tab);
140
141         ClosingOperationsManager.registerClosingOperation((SwingScilabDockablePanel) tab, new ClosingOperation(graph));
142         ClosingOperationsManager.addDependency((SwingScilabDockablePanel) XcosTab.get(graph), (SwingScilabDockablePanel) tab);
143
144         WindowsConfigurationManager.registerEndedRestoration((SwingScilabDockablePanel) tab, new EndedRestoration(graph));
145     }
146
147     /*
148      * Specific implementation
149      */
150
151     private void initComponents(XcosDiagram graph) {
152         final mxGraphOutline outline = new mxGraphOutline(graph.getAsComponent());
153         outline.setDrawLabels(true);
154
155         setContentPane(outline);
156     }
157
158     private SwingScilabWindow createDefaultWindow() {
159         final SwingScilabWindow win;
160
161         final SwingScilabWindow configuration = WindowsConfigurationManager.createWindow(DEFAULT_WIN_UUID, false);
162         if (configuration != null) {
163             win = configuration;
164         } else {
165             win = SwingScilabWindow.createWindow(true);
166         }
167
168         win.addTab(this);
169         return win;
170     }
171
172 }