* Bug #13588 fixed - Default values of "event_handler" and "event_handler_enable...
[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.editor.EditorEventListener;
43 import org.scilab.modules.gui.events.ScilabEventListener;
44 import org.scilab.modules.gui.events.callback.CommonCallBack;
45 import org.scilab.modules.gui.menubar.MenuBar;
46 import org.scilab.modules.gui.textbox.TextBox;
47 import org.scilab.modules.gui.toolbar.ToolBar;
48 import org.scilab.modules.gui.utils.Position;
49 import org.scilab.modules.gui.utils.Size;
50 import org.scilab.modules.gui.widget.Widget;
51
52 public class SwingScilabStaticPanel extends SwingScilabScrollPane implements SwingScilabPanel {
53     private static final long serialVersionUID = -3887923938827929317L;
54     private Integer id;
55     private TextBox infoBar;
56     private MenuBar menuBar;
57     private ToolBar toolBar;
58     private String parentWindowId;
59     private JLayeredPane uiContentPane;
60     private JLayeredPane layeredPane;
61     private boolean eventEnabled = false;
62     private ComponentListener componentListener;
63     private HierarchyBoundsListener ancestorListener;
64
65     /** The listener for event handling */
66     private ScilabEventListener eventHandler;
67     private EditorEventListener editorEventHandler = null;
68
69     private SwingScilabCanvas contentCanvas;
70     protected boolean hasLayout;
71     private Dimension deltaSize = null;
72     
73     private CommonCallBack callback;
74
75     public SwingScilabStaticPanel(String figureTitle, Integer figureId, Figure figure) {
76         super(new JLayeredPane(), new JLayeredPane(), figure);
77
78         editorEventHandler = new EditorEventListener(figure.getIdentifier());
79
80         uiContentPane = (JLayeredPane) getUIComponent();
81         layeredPane = (JLayeredPane) getGlobalComponent();
82         setVisible(true);
83         layeredPane.setLayout(null);
84         layeredPane.setOpaque(true);
85         setHasLayout(false);
86
87         uiContentPane.setOpaque(false);
88         uiContentPane.setLayout(null);
89         layeredPane.add(uiContentPane, JLayeredPane.DEFAULT_LAYER + 1, 0);
90
91         layeredPane.setVisible(true);
92         uiContentPane.setVisible(true);
93
94         /* Manage figure_position property */
95         ancestorListener = new HierarchyBoundsListener() {
96             public void ancestorResized(HierarchyEvent arg0) {
97             }
98
99             public void ancestorMoved(HierarchyEvent e) {
100                 if (e.getChanged() instanceof SwingScilabWindow) {
101                     Position parentPosition = SwingScilabWindow.allScilabWindows.get(parentWindowId).getPosition();
102                     Integer[] newPosition = new Integer[] { parentPosition.getX(), parentPosition.getY() };
103                     GraphicController.getController().setProperty(id, __GO_POSITION__, newPosition);
104                 }
105             }
106         };
107         addHierarchyBoundsListener(ancestorListener);
108
109         /* Manage figure_size property */
110         componentListener = new ComponentListener() {
111             public void componentShown(ComponentEvent arg0) {
112             }
113
114             public void componentResized(ComponentEvent arg0) {
115
116                 /* Update the figure_size property */
117                 Size parentSize = SwingScilabWindow.allScilabWindows.get(parentWindowId).getDims();
118                 Integer[] newSize = new Integer[] { parentSize.getWidth(), parentSize.getHeight() };
119
120                 GraphicController.getController().setProperty(id, __GO_SIZE__, newSize);
121
122                 Boolean autoreSize = (Boolean) GraphicController.getController().getProperty(id, __GO_AUTORESIZE__);
123
124                 if (autoreSize != null && autoreSize) {
125                     /* Update the axes_size property */
126                     Integer[] newAxesSize = new Integer[] { getContentPane().getWidth(), getContentPane().getHeight() };
127                     GraphicController.getController().setProperty(id, __GO_AXES_SIZE__, newAxesSize);
128                 }
129
130                 String resizeFcn = (String) GraphicController.getController().getProperty(id, GraphicObjectProperties.__GO_RESIZEFCN__);
131                 if (resizeFcn != null && !resizeFcn.equals("")) {
132                     String resizeCommand = "if exists(\"gcbo\") then %oldgcbo = gcbo; end;"
133                                            + "gcbo = getcallbackobject(" + id + ");"
134                                            + resizeFcn
135                                            + ";if exists(\"%oldgcbo\") then gcbo = %oldgcbo; else clear gcbo; end;";
136                     InterpreterManagement.requestScilabExec(resizeCommand);
137                 } else if (hasLayout == false) {
138                     for (Component comp : getWidgetPane().getComponents()) {
139                         if (comp instanceof Widget) {
140                             Widget widget = (Widget) comp;
141                             SwingViewObject obj = (SwingViewObject) comp;
142                             SwingViewWidget.update(widget, __GO_POSITION__, GraphicController.getController().getProperty(obj.getId(), __GO_POSITION__));
143                         }
144                     }
145                 }
146             }
147
148             public void componentMoved(ComponentEvent arg0) {
149             }
150
151             public void componentHidden(ComponentEvent arg0) {
152             }
153         };
154         addComponentListener(componentListener);
155     }
156
157     /**
158      * Turn on event handling.
159      */
160     private void enableEventHandler() {
161         if (contentCanvas != null) {
162             contentCanvas.addEventHandlerKeyListener(eventHandler);
163             contentCanvas.addEventHandlerMouseListener(eventHandler);
164             contentCanvas.addEventHandlerMouseMotionListener(eventHandler);
165         }
166     }
167
168     /**
169      * Turn off event handling.
170      */
171     private void disableEventHandler() {
172         if (eventHandler != null && contentCanvas != null) {
173             contentCanvas.removeEventHandlerKeyListener(eventHandler);
174             contentCanvas.removeEventHandlerMouseListener(eventHandler);
175             contentCanvas.removeEventHandlerMouseMotionListener(eventHandler);
176         }
177     }
178
179     public void setId(Integer id) {
180         this.id = id;
181     }
182
183     public Integer getId() {
184         return id;
185     }
186
187     public void update(int property, Object value) {
188         SwingScilabCommonPanel.update(this, property, value);
189     }
190
191     public void setFigureBackground(Color color) {
192         if (layeredPane != null) {
193             layeredPane.setBackground(color);
194         }
195     }
196
197     public TextBox getInfoBar() {
198         return infoBar;
199     }
200
201     public void setInfoBar(TextBox infoBar) {
202         this.infoBar = infoBar;
203     }
204
205     public MenuBar getMenuBar() {
206         return menuBar;
207     }
208
209     public void setMenuBar(MenuBar menuBar) {
210         this.menuBar = menuBar;
211     }
212
213     public ToolBar getToolBar() {
214         return toolBar;
215     }
216
217     public void setToolBar(ToolBar toolBar) {
218         this.toolBar = toolBar;
219     }
220
221     /**
222      * Set the event handler of the Canvas
223      * @param funName the name of the Scilab function to call
224      */
225     public void setEventHandler(String funName) {
226         disableEventHandler();
227         eventHandler = new ScilabEventListener(funName, getId());
228         if (eventEnabled) {
229             editorEventHandler.setEnable(false);
230             enableEventHandler();
231         }
232     }
233
234     /**
235      * Set the status of the event handler of the Canvas
236      * @param status is true to set the event handler active
237      */
238     public void setEventHandlerEnabled(boolean status) {
239         if (status && eventEnabled) {
240             return;
241         }
242
243         if (status) {
244             editorEventHandler.setEnable(false);
245             enableEventHandler();
246             eventEnabled = true;
247         } else {
248             editorEventHandler.setEnable(true);
249             disableEventHandler();
250             eventEnabled = false;
251         }
252     }
253
254
255     public void setParentWindowId(String parentWindowId) {
256         this.parentWindowId = parentWindowId;
257         SwingScilabWindow.allScilabWindows.get(parentWindowId).setIconImage(new ImageIcon(FindIconHelper.findIcon("graphic-window", "256x256")).getImage());
258     }
259
260     public void setWindowIcon(String windowIcon) {
261     }
262
263     public void addMember(SwingViewObject member) {
264         if (member instanceof SwingScilabAxes) {
265             if (contentCanvas == null) {
266                 contentCanvas = new SwingScilabCanvas((Figure) GraphicController.getController().getObjectFromId(((SwingScilabAxes) member).getFigureId()));
267                 if (eventEnabled) {
268                     editorEventHandler.setEnable(false);
269                     enableEventHandler();
270                 }
271
272                 layeredPane.add(contentCanvas, JLayeredPane.FRAME_CONTENT_LAYER);
273                 setCanvas(contentCanvas);
274             }
275             return;
276         }
277
278         SwingScilabCommonPanel.addMember(this, member);
279     }
280
281     public String getParentWindowId() {
282         return parentWindowId;
283     }
284
285     public SwingScilabWindow getParentWindow() {
286         return (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, this);
287     }
288
289     public JLayeredPane getWidgetPane() {
290         return uiContentPane;
291     }
292
293     public void setCallback(CommonCallBack callback) {
294         this.callback = callback;
295     }
296
297     public CommonCallBack getCallback() {
298         return callback;
299     }
300     
301     public Container getContentPane() {
302         return this.getAsContainer();
303     }
304
305     public void close() {
306         setMenuBar(null);
307         setToolBar(null);
308         setInfoBar(null);
309         removeAll();
310         // without this children canvas are not released.
311         SwingScilabWindow win = getParentWindow();
312         Container dummyContainer = new Container();
313         win.setContentPane(dummyContainer);
314         win.close();
315         setVisible(false);
316     }
317
318     /**
319      * Remove a SwingViewObject (from SwingView.java)
320      * @param member the member to remove
321      */
322     public void removeMember(SwingViewObject member) {
323         SwingScilabCommonPanel.removeMember(this, member);
324     }
325
326     public void setName(String name) {
327         super.setName(name);
328         getParentWindow().setName(name);
329     }
330
331     public void setHasLayout(boolean hasLayout) {
332         this.hasLayout = hasLayout;
333     }
334
335     public void applyDeltaSize() {
336         if (deltaSize != null) {
337             if (deltaSize.getWidth() != 0 || deltaSize.getHeight() != 0) {
338                 //update view and update model ( from componentResize of Window )
339                 SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
340                 Size oldFigureSize = figure.getDims();
341                 figure.setDims(new Size((int)(oldFigureSize.getWidth() + deltaSize.getWidth()), (int)(oldFigureSize.getHeight() + deltaSize.getHeight())));
342             }
343
344             deltaSize = null;
345         }
346     }
347
348     public void storeSizeDelta() {
349         Dimension axesSize = getContentPane().getSize();
350         SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
351         Size figureSize = figure.getDims();
352         deltaSize = new Dimension((int)(figureSize.getWidth() - axesSize.getWidth()), (int)(figureSize.getHeight() - axesSize.getHeight()));
353     }
354
355     public void disableResizeEvent() {
356         removeComponentListener(componentListener);
357     }
358
359     public void enableResizeEvent() {
360         addComponentListener(componentListener);
361     }
362 }