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