Fix icon for static figures
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / tab / SwingScilabStaticPanel.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Bruno JOFRET
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.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.bridge.tab;
14
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AUTORESIZE__;
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AXES_SIZE__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_SIZE__;
19
20 import java.awt.Color;
21 import java.awt.Component;
22 import java.awt.Container;
23 import java.awt.Dimension;
24 import java.awt.event.ComponentEvent;
25 import java.awt.event.ComponentListener;
26 import java.awt.event.HierarchyBoundsListener;
27 import java.awt.event.HierarchyEvent;
28
29 import javax.swing.ImageIcon;
30 import javax.swing.JLayeredPane;
31 import javax.swing.SwingUtilities;
32
33 import org.scilab.modules.action_binding.InterpreterManagement;
34 import org.scilab.modules.commons.gui.FindIconHelper;
35 import org.scilab.modules.graphic_objects.figure.Figure;
36 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
37 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
38 import org.scilab.modules.gui.SwingViewObject;
39 import org.scilab.modules.gui.SwingViewWidget;
40 import org.scilab.modules.gui.bridge.canvas.SwingScilabCanvas;
41 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
42 import org.scilab.modules.gui.events.callback.CommonCallBack;
43 import org.scilab.modules.gui.menubar.MenuBar;
44 import org.scilab.modules.gui.textbox.TextBox;
45 import org.scilab.modules.gui.toolbar.ToolBar;
46 import org.scilab.modules.gui.utils.Position;
47 import org.scilab.modules.gui.utils.Size;
48 import org.scilab.modules.gui.widget.Widget;
49
50 public class SwingScilabStaticPanel extends SwingScilabScrollPane implements SwingScilabPanel {
51     private static final long serialVersionUID = -3887923938827929317L;
52     private Integer id;
53     private TextBox infoBar;
54     private MenuBar menuBar;
55     private ToolBar toolBar;
56     private String parentWindowId;
57     private JLayeredPane uiContentPane;
58     private JLayeredPane layeredPane;
59     private ComponentListener componentListener;
60     private HierarchyBoundsListener ancestorListener;
61
62     private SwingScilabCanvas contentCanvas;
63     protected boolean hasLayout;
64     private Dimension deltaSize = null;
65
66     public SwingScilabStaticPanel(String figureTitle, Integer figureId, Figure figure) {
67         super(new JLayeredPane(), new JLayeredPane(), figure);
68         uiContentPane = (JLayeredPane) getUIComponent();
69         layeredPane = (JLayeredPane) getGlobalComponent();
70         setVisible(true);
71         layeredPane.setLayout(null);
72         layeredPane.setOpaque(true);
73         setHasLayout(false);
74
75         uiContentPane.setOpaque(false);
76         uiContentPane.setLayout(null);
77         layeredPane.add(uiContentPane, JLayeredPane.DEFAULT_LAYER + 1, 0);
78
79         layeredPane.setVisible(true);
80         uiContentPane.setVisible(true);
81
82         /* Manage figure_position property */
83         ancestorListener = new HierarchyBoundsListener() {
84             public void ancestorResized(HierarchyEvent arg0) {
85             }
86
87             public void ancestorMoved(HierarchyEvent e) {
88                 if (e.getChanged() instanceof SwingScilabWindow) {
89                     Position parentPosition = SwingScilabWindow.allScilabWindows.get(parentWindowId).getPosition();
90                     Integer[] newPosition = new Integer[] { parentPosition.getX(), parentPosition.getY() };
91                     GraphicController.getController().setProperty(id, __GO_POSITION__, newPosition);
92                 }
93             }
94         };
95         addHierarchyBoundsListener(ancestorListener);
96
97         /* Manage figure_size property */
98         componentListener = new ComponentListener() {
99             public void componentShown(ComponentEvent arg0) {
100             }
101
102             public void componentResized(ComponentEvent arg0) {
103
104                 /* Update the figure_size property */
105                 Size parentSize = SwingScilabWindow.allScilabWindows.get(parentWindowId).getDims();
106                 Integer[] newSize = new Integer[] { parentSize.getWidth(), parentSize.getHeight() };
107
108                 GraphicController.getController().setProperty(id, __GO_SIZE__, newSize);
109
110                 Boolean autoreSize = (Boolean) GraphicController.getController().getProperty(id, __GO_AUTORESIZE__);
111
112                 if (autoreSize != null && autoreSize) {
113                     /* Update the axes_size property */
114                     Integer[] newAxesSize = new Integer[] { getContentPane().getWidth(), getContentPane().getHeight() };
115                     GraphicController.getController().setProperty(id, __GO_AXES_SIZE__, newAxesSize);
116                 }
117
118                 String resizeFcn = (String) GraphicController.getController().getProperty(id, GraphicObjectProperties.__GO_RESIZEFCN__);
119                 if (resizeFcn != null && !resizeFcn.equals("")) {
120                     String resizeCommand = "if exists(\"gcbo\") then %oldgcbo = gcbo; end;"
121                                            + "gcbo = getcallbackobject(" + id + ");"
122                                            + resizeFcn
123                                            + ";if exists(\"%oldgcbo\") then gcbo = %oldgcbo; else clear gcbo; end;";
124                     InterpreterManagement.requestScilabExec(resizeCommand);
125                 } else if (hasLayout == false) {
126                     for (Component comp : getWidgetPane().getComponents()) {
127                         if (comp instanceof Widget) {
128                             Widget widget = (Widget) comp;
129                             SwingViewObject obj = (SwingViewObject) comp;
130                             SwingViewWidget.update(widget, __GO_POSITION__, GraphicController.getController().getProperty(obj.getId(), __GO_POSITION__));
131                         }
132                     }
133                 }
134             }
135
136             public void componentMoved(ComponentEvent arg0) {
137             }
138
139             public void componentHidden(ComponentEvent arg0) {
140             }
141         };
142         addComponentListener(componentListener);
143     }
144
145     public void setId(Integer id) {
146         this.id = id;
147     }
148
149     public Integer getId() {
150         return id;
151     }
152
153     public void update(int property, Object value) {
154         SwingScilabCommonPanel.update(this, property, value);
155     }
156
157     public void setFigureBackground(Color color) {
158         if (layeredPane != null) {
159             layeredPane.setBackground(color);
160         }
161     }
162
163     public TextBox getInfoBar() {
164         return infoBar;
165     }
166
167     public void setInfoBar(TextBox infoBar) {
168         this.infoBar = infoBar;
169     }
170
171     public MenuBar getMenuBar() {
172         return menuBar;
173     }
174
175     public void setMenuBar(MenuBar menuBar) {
176         this.menuBar = menuBar;
177     }
178
179     public ToolBar getToolBar() {
180         return toolBar;
181     }
182
183     public void setToolBar(ToolBar toolBar) {
184         this.toolBar = toolBar;
185     }
186
187     public void setEventHandler(String eventHandler) {
188     }
189
190     public void setEventHandlerEnabled(boolean enabled) {
191     }
192
193     public void setParentWindowId(String parentWindowId) {
194         this.parentWindowId = parentWindowId;
195         SwingScilabWindow.allScilabWindows.get(parentWindowId).setIconImage(new ImageIcon(FindIconHelper.findIcon("graphic-window", "256x256")).getImage());
196     }
197
198     public void setWindowIcon(String windowIcon) {
199     }
200
201     public void addMember(SwingViewObject member) {
202         if (member instanceof SwingScilabAxes) {
203             if (contentCanvas == null) {
204                 contentCanvas = new SwingScilabCanvas((Figure) GraphicController.getController().getObjectFromId(((SwingScilabAxes) member).getFigureId()));
205                 layeredPane.add(contentCanvas, JLayeredPane.FRAME_CONTENT_LAYER);
206                 setCanvas(contentCanvas);
207             }
208             return;
209         }
210
211         SwingScilabCommonPanel.addMember(this, member);
212     }
213
214     public String getParentWindowId() {
215         return parentWindowId;
216     }
217
218     public SwingScilabWindow getParentWindow() {
219         return (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, this);
220     }
221
222     public JLayeredPane getWidgetPane() {
223         return uiContentPane;
224     }
225
226     public void setCallback(CommonCallBack callback) {
227         // TODO Auto-generated method stub
228
229     }
230
231     public Container getContentPane() {
232         return this.getAsContainer();
233     }
234
235     public void close() {
236         setMenuBar(null);
237         setToolBar(null);
238         setInfoBar(null);
239         removeAll();
240         // without this children canvas are not released.
241         SwingScilabWindow win = getParentWindow();
242         Container dummyContainer = new Container();
243         win.setContentPane(dummyContainer);
244         win.close();
245         setVisible(false);
246     }
247
248     /**
249      * Remove a SwingViewObject (from SwingView.java)
250      * @param member the member to remove
251      */
252     public void removeMember(SwingViewObject member) {
253         SwingScilabCommonPanel.removeMember(this, member);
254     }
255
256     public void setName(String name) {
257         super.setName(name);
258         getParentWindow().setName(name);
259     }
260
261     public void setHasLayout(boolean hasLayout) {
262         this.hasLayout = hasLayout;
263     }
264
265     public void applyDeltaSize() {
266         if (deltaSize != null) {
267             if (deltaSize.getWidth() != 0 || deltaSize.getHeight() != 0) {
268                 //update view and update model ( from componentResize of Window )
269                 SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
270                 Size oldFigureSize = figure.getDims();
271                 figure.setDims(new Size((int)(oldFigureSize.getWidth() + deltaSize.getWidth()), (int)(oldFigureSize.getHeight() + deltaSize.getHeight())));
272             }
273
274             deltaSize = null;
275         }
276     }
277
278     public void storeSizeDelta() {
279         Dimension axesSize = getContentPane().getSize();
280         SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
281         Size figureSize = figure.getDims();
282         deltaSize = new Dimension((int)(figureSize.getWidth() - axesSize.getWidth()), (int)(figureSize.getHeight() - axesSize.getHeight()));
283     }
284
285     public void disableResizeEvent() {
286         removeComponentListener(componentListener);
287     }
288
289     public void enableResizeEvent() {
290         addComponentListener(componentListener);
291     }
292 }