Enable event_handler on Frame component
[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(), false);
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                 contentCanvas.addEventHandlerKeyListener(editorEventHandler);
268                 contentCanvas.addEventHandlerMouseListener(editorEventHandler);
269                 contentCanvas.addEventHandlerMouseMotionListener(editorEventHandler);
270                 if (eventEnabled) {
271                     editorEventHandler.setEnable(false);
272                     enableEventHandler();
273                 }
274
275                 layeredPane.add(contentCanvas, JLayeredPane.FRAME_CONTENT_LAYER);
276                 setCanvas(contentCanvas);
277             }
278             return;
279         }
280
281         SwingScilabCommonPanel.addMember(this, member);
282     }
283
284     public String getParentWindowId() {
285         return parentWindowId;
286     }
287
288     public SwingScilabWindow getParentWindow() {
289         return (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, this);
290     }
291
292     public JLayeredPane getWidgetPane() {
293         return uiContentPane;
294     }
295
296     public void setCallback(CommonCallBack callback) {
297         this.callback = callback;
298     }
299
300     public CommonCallBack getCallback() {
301         return callback;
302     }
303
304     public Container getContentPane() {
305         return this.getAsContainer();
306     }
307
308     public void close() {
309         setMenuBar(null);
310         setToolBar(null);
311         setInfoBar(null);
312         removeAll();
313         // without this children canvas are not released.
314         SwingScilabWindow win = getParentWindow();
315         Container dummyContainer = new Container();
316         win.setContentPane(dummyContainer);
317         win.close();
318         setVisible(false);
319     }
320
321     /**
322      * Remove a SwingViewObject (from SwingView.java)
323      * @param member the member to remove
324      */
325     public void removeMember(SwingViewObject member) {
326         SwingScilabCommonPanel.removeMember(this, member);
327     }
328
329     public void setName(String name) {
330         super.setName(name);
331         getParentWindow().setName(name);
332     }
333
334     public void setHasLayout(boolean hasLayout) {
335         this.hasLayout = hasLayout;
336     }
337
338     public void applyDeltaSize() {
339         if (deltaSize != null) {
340             if (deltaSize.getWidth() != 0 || deltaSize.getHeight() != 0) {
341                 //update view and update model ( from componentResize of Window )
342                 SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
343                 Size oldFigureSize = figure.getDims();
344                 figure.setDims(new Size((int)(oldFigureSize.getWidth() + deltaSize.getWidth()), (int)(oldFigureSize.getHeight() + deltaSize.getHeight())));
345             }
346
347             deltaSize = null;
348         }
349     }
350
351     public void storeSizeDelta() {
352         Dimension axesSize = getContentPane().getSize();
353         SwingScilabWindow figure = SwingScilabWindow.allScilabWindows.get(getParentWindowId());
354         Size figureSize = figure.getDims();
355         deltaSize = new Dimension((int)(figureSize.getWidth() - axesSize.getWidth()), (int)(figureSize.getHeight() - axesSize.getHeight()));
356     }
357
358     public void disableResizeEvent() {
359         removeComponentListener(componentListener);
360     }
361
362     public void enableResizeEvent() {
363         addComponentListener(componentListener);
364     }
365 }