New Java Help Browser for Scilab.
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / window / SwingScilabWindow.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent Couvert
4  * Copyright (C) 2007 - INRIA - Bruno JOFRET
5  * Copyright (C) 2007 - INRIA - Marouane BEN JELLOUL
6  * 
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at    
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 package org.scilab.modules.gui.bridge.window;
16
17 import java.awt.event.WindowAdapter;
18 import java.awt.event.WindowEvent;
19
20 import javax.swing.ImageIcon;
21 import javax.swing.JFrame;
22
23 import org.flexdock.docking.DockingConstants;
24 import org.flexdock.docking.DockingManager;
25 import org.flexdock.docking.DockingPort;
26 import org.flexdock.docking.defaults.DefaultDockingPort;
27 import org.flexdock.view.View;
28
29 import org.scilab.modules.gui.bridge.menubar.SwingScilabMenuBar;
30 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
31 import org.scilab.modules.gui.bridge.textbox.SwingScilabTextBox;
32 import org.scilab.modules.gui.bridge.toolbar.SwingScilabToolBar;
33 import org.scilab.modules.gui.menubar.MenuBar;
34 import org.scilab.modules.gui.menubar.SimpleMenuBar;
35 import org.scilab.modules.gui.tab.Tab;
36 import org.scilab.modules.gui.textbox.SimpleTextBox;
37 import org.scilab.modules.gui.textbox.TextBox;
38 import org.scilab.modules.gui.toolbar.SimpleToolBar;
39 import org.scilab.modules.gui.toolbar.ToolBar;
40 import org.scilab.modules.gui.utils.Position;
41 import org.scilab.modules.gui.utils.SciDockingListener;
42 import org.scilab.modules.gui.utils.Size;
43 import org.scilab.modules.gui.window.SimpleWindow;
44
45 /**
46  * Swing implementation for Scilab windows in GUIs
47  * This implementation uses FlexDock package
48  * @author Vincent COUVERT
49  * @author Bruno JOFRET
50  * @author Marouane BEN JELLOUL
51  */
52 public class SwingScilabWindow extends JFrame implements SimpleWindow {
53
54         private static final long serialVersionUID = -5661926417765805660L;
55
56         private static final int DEFAULTWIDTH = 500;
57         private static final int DEFAULTHEIGHT = 500;
58
59         private DefaultDockingPort sciDockingPort;
60         private SciDockingListener sciDockingListener;
61         private SimpleMenuBar menuBar;
62         private SimpleToolBar toolBar;
63         private SimpleTextBox infoBar;
64         
65         private int elementId; // the id of the Window which contains this SimpleWindow
66         
67         /**
68          * Constructor
69          */
70         public SwingScilabWindow() {
71                 super();
72
73                 // TODO : Only for testing : Must be removed
74                 this.setDims(new Size(DEFAULTWIDTH, DEFAULTHEIGHT));
75                 this.setTitle("Scilab");
76                 setIconImage(new ImageIcon(System.getenv("SCI") + "/modules/gui/images/icons/scilab.png").getImage());
77                 
78                 /* defining the Layout */
79                 super.setLayout(new java.awt.BorderLayout());
80                 
81                 /* Create automatically a docking port associated to the window */
82                 sciDockingPort = new DefaultDockingPort();
83                 /* The docking port is the center of the Layout of the Window */
84                 super.add(sciDockingPort, java.awt.BorderLayout.CENTER);
85                 
86                 /* there is no menuBar, no toolBar and no infoBar at creation */
87                 this.menuBar = null;
88                 this.toolBar = null;
89                 this.infoBar = null;
90                 
91                 sciDockingListener = new SciDockingListener();
92                 sciDockingPort.addDockingListener(sciDockingListener);
93                 
94                 addWindowListener(new WindowAdapter() {
95                         public void windowClosing(WindowEvent e) {
96                                 Object[] dockArray = sciDockingPort.getDockables().toArray();
97                                 for (int i = 0; i < dockArray.length; i++) {
98                                         ((View) dockArray[i]).getActionButton(DockingConstants.CLOSE_ACTION).getAction().actionPerformed(null);
99                                 }
100                         }
101                 });
102         }
103
104         /**
105          * Creates a swing Scilab window
106          * @return the created window
107          */
108         public static SimpleWindow createWindow() {
109                 return new SwingScilabWindow();
110         }
111
112         /**
113          * Draws a swing Scilab window
114          * @see org.scilab.modules.gui.UIElement#draw()
115          */
116         public void draw() {
117                 this.setVisible(true);
118                 this.doLayout();
119         }
120
121         /**
122          * Gets the dimensions (width and height) of a swing Scilab window
123          * @return the dimensions of the window
124          * @see org.scilab.modules.gui.UIElement#getDims()
125          */
126         public Size getDims() {
127                 return new Size(getSize().width, getSize().height);
128         }
129
130         /**
131          * Sets the dimensions (width and height) of a swing Scilab window
132          * @param newWindowSize the dimensions to set to the window
133          * @see org.scilab.modules.gui.UIElement#setDims(org.scilab.modules.gui.utils.Size)
134          */
135         public void setDims(Size newWindowSize) {
136                 this.setSize(newWindowSize.getWidth(), newWindowSize.getHeight());
137         }
138
139         /**
140          * Gets the position (X-coordinate and Y-coordinate) of a swing Scilab window
141          * @return the position of the window
142          * @see org.scilab.modules.gui.UIElement#getPosition()
143          */
144         public Position getPosition() {
145                 return new Position(this.getX(), this.getY());
146         }
147
148         /**
149          * Sets the position (X-coordinate and Y-coordinate) of a swing Scilab window
150          * @param newWindowPosition the position to set to the window
151          * @see org.scilab.modules.gui.UIElement#setPosition(org.scilab.modules.gui.utils.Position)
152          */
153         public void setPosition(Position newWindowPosition) {
154                 this.setLocation(newWindowPosition.getX(), newWindowPosition.getY());
155         }
156
157         /**
158          * Gets the title of a swing Scilab window
159          * @return the title of the window
160          * @see java.awt.Frame#getTitle(java.lang.String)
161          */
162         public String getTitle() {
163                 return super.getTitle();
164         }
165
166         /**
167          * Sets the title of a swing Scilab window
168          * @param newWindowTitle the title to set to the window
169          * @see java.awt.Frame#setTitle(java.lang.String)
170          */
171         public void setTitle(String newWindowTitle) {
172                 super.setTitle(newWindowTitle);
173         }
174
175         /**
176          * Gets the docking port associated to the window (created by default at window creation)
177          * @return the docking port associated to the window
178          */
179         private DockingPort getDockingPort() {
180                 //return (DockingPort) centerFrame.getContentPane();
181                 return (DockingPort) sciDockingPort;
182         }
183
184         /**
185          * Add a Scilab tab to a Scilab window
186          * @param newTab the Scilab tab to add to the Scilab window
187          * @see org.scilab.modules.gui.window.Window#addTab(org.scilab.modules.gui.tab.Tab)
188          */
189         public void addTab(Tab newTab) {
190                 ((SwingScilabTab) newTab.getAsSimpleTab()).setParentWindowId(this.elementId);
191                 DockingManager.dock((SwingScilabTab) newTab.getAsSimpleTab(), this.getDockingPort());
192                 // Adding the MenuBar of the last added Tab
193                 this.addMenuBar(newTab.getMenuBar());
194                 this.addToolBar(newTab.getToolBar());
195                 this.addInfoBar(newTab.getInfoBar());
196         }
197         
198         /**
199          * Remove a Scilab tab from a Scilab window
200          * @param tab the Scilab tab to remove from the Scilab window
201          * @see org.scilab.modules.gui.window.Window#removeTab(org.scilab.modules.gui.tab.Tab)
202          */
203         public void removeTab(Tab tab) {
204                 DockingManager.close((SwingScilabTab) tab.getAsSimpleTab());
205         }
206         
207         
208         
209         /**
210          * Sets a Scilab MenuBar to a Scilab window
211          * @param newMenuBar the Scilab MenuBar to add to the Scilab window
212          * @see org.scilab.modules.gui.window.Window#setMenuBar(org.scilab.modules.gui.menubar.MenuBar)
213          */
214         public void addMenuBar(MenuBar newMenuBar) {
215                 if (newMenuBar != null) {
216                         this.menuBar = newMenuBar.getAsSimpleMenuBar();
217                         super.setJMenuBar((SwingScilabMenuBar) newMenuBar.getAsSimpleMenuBar());
218                 } else {
219                         this.menuBar = null;
220                         super.setJMenuBar(null);
221                 }
222                 this.repaint();
223         }
224
225         /**
226          * Sets a Scilab ToolBar to a Scilab window
227          * @param newToolBar the Scilab ToolBar to set to the Scilab window
228          * @see org.scilab.modules.gui.window.Window#setToolBar(org.scilab.modules.gui.toolbar.ToolBar)
229          */
230         public void addToolBar(ToolBar newToolBar) {
231                 // Remove old toolbar if already set
232                 if (this.toolBar != null) {
233                         super.remove((SwingScilabToolBar) this.toolBar);
234                 }
235                 if (newToolBar != null) {
236                         this.toolBar = newToolBar.getAsSimpleToolBar();
237                         super.add((SwingScilabToolBar) this.toolBar, java.awt.BorderLayout.PAGE_START);
238                 } else {
239                         this.toolBar = null;
240                 }
241                 this.repaint();
242         }
243
244         /**
245          * Sets a Scilab InfoBar to a Scilab window
246          * @param newInfoBar the Scilab InfoBar to set to the Scilab window
247          * @see org.scilab.modules.gui.window.Window#setInfoBar(org.scilab.modules.gui.textbox.TextBox)
248          */
249         public void addInfoBar(TextBox newInfoBar) {
250                 // Remove old InfoBar if already set
251                 if (this.infoBar != null) {
252                         super.remove((SwingScilabTextBox) this.infoBar);
253                 }
254                 if (newInfoBar != null) {
255                         this.infoBar = newInfoBar.getAsSimpleTextBox();
256                         super.add((SwingScilabTextBox) this.infoBar, java.awt.BorderLayout.PAGE_END);
257                 } else {
258                         this.infoBar = null;
259                 }
260                 this.repaint();
261         }
262
263         /**
264          * Get the element id for this window
265          * @return id the id of the corresponding window object
266          */
267         public int getElementId() {
268                 return elementId;
269         }
270
271         /**
272          * Set the element id for this window
273          * @param id the id of the corresponding window object
274          */
275         public void setElementId(int id) {
276                 this.elementId = id;
277                 sciDockingListener.setAssociatedWindowId(id);
278         }
279         
280         /**
281          * Close the window
282          * @see org.scilab.modules.gui.window.SimpleWindow#close()
283          */
284         public void close() {
285                 dispose();
286         }
287 }