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