Docking restoration: work in progress... (near the end)
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / helpbrowser / ScilabHelpBrowser.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent Couvert
4  * Copyright (C) 2011 - Calixte DENIZET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.helpbrowser;
15
16 import java.awt.Component;
17 import java.awt.Container;
18 import java.awt.KeyEventDispatcher;
19 import java.awt.KeyboardFocusManager;
20 import java.awt.Toolkit;
21 import java.awt.event.KeyEvent;
22
23 import javax.swing.SwingUtilities;
24
25 import org.scilab.modules.commons.ScilabConstants;
26 import org.scilab.modules.commons.gui.ScilabGUIUtilities;
27 import org.scilab.modules.gui.bridge.ScilabBridge;
28 import org.scilab.modules.gui.bridge.helpbrowser.SwingScilabHelpBrowser;
29 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
30 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
31 import org.scilab.modules.gui.console.ScilabConsole;
32 import org.scilab.modules.gui.dockable.ScilabDockable;
33 import org.scilab.modules.gui.events.callback.ScilabCallBack;
34 import org.scilab.modules.gui.menubar.MenuBar;
35 import org.scilab.modules.gui.tab.ScilabTab;
36 import org.scilab.modules.gui.tab.Tab;
37 import org.scilab.modules.gui.tabfactory.HelpBrowserTab;
38 import org.scilab.modules.gui.tabfactory.HelpBrowserTabFactory;
39 import org.scilab.modules.gui.tabfactory.ScilabTabFactory;
40 import org.scilab.modules.gui.textbox.ScilabTextBox;
41 import org.scilab.modules.gui.textbox.TextBox;
42 import org.scilab.modules.gui.utils.ConfigManager;
43 import org.scilab.modules.gui.utils.MenuBarBuilder;
44 import org.scilab.modules.gui.utils.Position;
45 import org.scilab.modules.gui.utils.Size;
46 import org.scilab.modules.gui.utils.WindowsConfigurationManager;
47 import org.scilab.modules.gui.window.ScilabWindow;
48 import org.scilab.modules.gui.window.Window;
49 import org.scilab.modules.localization.Messages;
50
51 /**
52  * Class for Scilab Help Browser in GUIs
53  * @author Vincent COUVERT
54  * @author Calixte DENIZET
55  */
56 public class ScilabHelpBrowser extends ScilabDockable implements HelpBrowser {
57
58     public static final String HELPUUID = "d1ef5062-533e-4aee-b12a-66740820d6d1";
59
60     private static final String SCI = ScilabConstants.SCI.getPath();
61     private static final String MENUBARXMLFILE = SCI + "/modules/gui/etc/helpbrowser_menubar.xml";
62     private static final boolean isMac = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1;
63
64     private static HelpBrowser instance;
65     private static Tab helpTab;
66
67     private static String language;
68     private static String[] helps;
69
70     static {
71         ScilabTabFactory.getInstance().addTabFactory(HelpBrowserTabFactory.getInstance());
72     }
73
74     private SimpleHelpBrowser component;
75     private Window parentWindow;
76
77     /**
78      * Constructor
79      * @param helps help chapters and directories
80      * @param language Scilab current language
81      */
82     protected ScilabHelpBrowser(String[] helps, String language) {
83         component = ScilabBridge.createHelpBrowser(helps, language);
84     }
85
86     /**
87      * Creates a SwingScilabTab containing the help browser
88      * @return the corresponding SwingScilabTab
89      */
90     public static SwingScilabTab createHelpBrowserTab() {
91         helpTab = ScilabTab.createTab(Messages.gettext("Help Browser"), HELPUUID);
92         String url = restoreHelpBrowserState();
93
94         instance = new ScilabHelpBrowser(helps, language);
95         helpTab.addMember(instance);
96
97         MenuBar menubar = MenuBarBuilder.buildMenuBar(MENUBARXMLFILE);
98         helpTab.addMenuBar(menubar);
99
100         TextBox infobar = ScilabTextBox.createTextBox();
101         helpTab.addInfoBar(infobar);
102
103         KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
104         manager.addKeyEventDispatcher(new KeyEventDispatcher() {
105                 // This is a workaround for Mac OS X where e.getKeyCode() sometimes returns a bad value
106                 public boolean dispatchKeyEvent(KeyEvent e) {
107                     if (e.getID() == KeyEvent.KEY_PRESSED) {
108                         Container c = SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (SwingScilabTab) helpTab.getAsSimpleTab());
109                         if (e.getSource() instanceof Component) {
110                             Container cs = SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (Component) e.getSource());
111                             char chr = e.getKeyChar();
112
113                             if (cs == c && ((chr == '-' || chr == '_' || chr == '=' || chr == '+')
114                                             && (e.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0)) {
115                                 if (chr == '-' || chr == '_') {
116                                     ((SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component).decreaseFont();
117                                 } else {
118                                     ((SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component).increaseFont();
119                                 }
120                                 return true;
121                             }
122                         }
123                     }
124                     return false;
125                 }
126             });
127
128         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
129         browser.setCurrentURL(url);
130
131         return (SwingScilabTab) helpTab.getAsSimpleTab();
132     }
133
134     /**
135      * Creates a Scilab Help Browser
136      * @param helps help chapters and directories
137      * @param language Scilab current language
138      * @return the created Help Browser
139      */
140     public static HelpBrowser createHelpBrowser(String[] helps, String language) {
141         if (instance == null) {
142             ScilabHelpBrowser.language = language;
143             ScilabHelpBrowser.helps = helps;
144             boolean success = WindowsConfigurationManager.restoreUUID(HELPUUID);
145             if (!success) {
146                 HelpBrowserTabFactory.getInstance().getTab(HELPUUID);
147                 ((ScilabHelpBrowser) instance).setParentWindow();
148                 ((ScilabHelpBrowser) instance).parentWindow.addTab(helpTab);
149                 ((ScilabHelpBrowser) instance).parentWindow.setVisible(true);
150             }
151
152             if (ScilabConsole.isExistingConsole() && ScilabConsole.getConsole().getInfoBar() != null) {
153                 if (ScilabConsole.getConsole().getInfoBar().getText().equals(Messages.gettext("Loading help browser..."))) {
154                     // An error occured
155                     ScilabConsole.getConsole().getInfoBar().setText("");
156                     return null;
157                 }
158             }
159         }
160
161         SwingScilabWindow window = (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (SwingScilabTab) helpTab.getAsSimpleTab());
162         ScilabGUIUtilities.toFront(window);
163
164         return instance;
165     }
166
167     /**
168      * Set a default parent window
169      */
170     public void setParentWindow() {
171         this.parentWindow = ScilabWindow.createWindow();
172         SwingScilabWindow window = (SwingScilabWindow) parentWindow.getAsSimpleWindow();
173         window.setLocation(0, 0);
174         window.setSize(500, 500);
175     }
176
177     /**
178      * Display the home page
179      */
180     public static void startHomePage() {
181         if (instance != null) {
182             SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
183             try {
184                 browser.displayHomePage();
185             } catch (Exception e) {
186                 System.err.println("This error should not occured, please report it at bugzilla.scilab.org\n" + e);
187             }
188         }
189     }
190
191     /**
192      * @return the current displayed url as String
193      */
194     public String getCurrentURL() {
195         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
196         return browser.getCurrentURL();
197     }
198
199     /**
200      * Increase the font of the help viewer
201      */
202     public void increaseFont() {
203         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
204         browser.increaseFont();
205     }
206
207     /**
208      * Decrease the font of the help viewer
209      */
210     public void decreaseFont() {
211         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
212         browser.decreaseFont();
213     }
214
215     /**
216      * Display the home page
217      */
218     public void showSearchField() {
219         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
220         browser.showSearchField();
221     }
222
223     /**
224      * Display the home page
225      */
226     public void hideSearchField() {
227         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
228         browser.hideSearchField();
229     }
230
231     /**
232      * Get the Scilab Help Browser
233      * @return the console
234      */
235     public static HelpBrowser getHelpBrowser() {
236         if (instance == null) {
237             instance = new ScilabHelpBrowser(null, "en_US");
238         }
239         return instance;
240     }
241
242     /**
243      * Get the Scilab Help Browser (does not create it is not existing)
244      * @return the console
245      */
246     public static HelpBrowser getHelpBrowserWithoutCreation() {
247         return instance;
248     }
249
250     /**
251      * Display the Help Browser
252      */
253     public void display() {
254         ScilabBridge.display(this);
255     }
256
257     /**
258      * Display the help page for a specified keyword
259      * @param keyword the keyword
260      */
261     public void searchKeywork(String keyword) {
262         ScilabBridge.searchKeywork(this, keyword);
263     }
264
265     /**
266      * Display the result of a full-text search for a specified word
267      * @param keyword the keyword
268      */
269     public void fullTextSearch(String keyword) {
270         ScilabBridge.fullTextSearch(this, keyword);
271     }
272
273     public static void closeHelpBrowser() {
274         instance.close();
275     }
276
277     /**
278      * Close the HelpBrowser
279      */
280     public void close() {
281         saveHelpBrowserState();
282         instance = null;
283     }
284
285     /**
286      * Not used
287      */
288     public void draw() {
289         throw new UnsupportedOperationException();
290     }
291
292     /**
293      * Gets this Bridge component object
294      * @return this Bridge component object
295      */
296     public SimpleHelpBrowser getAsSimpleHelpBrowser() {
297         return component;
298     }
299
300     /**
301      * Not used
302      * @return nothing
303      */
304     public Size getDims() {
305         throw new UnsupportedOperationException();
306     }
307
308     /**
309      * Not used
310      * @return nothing
311      */
312     public Position getPosition() {
313         throw new UnsupportedOperationException();
314     }
315
316     /**
317      * Not used
318      * @return nothing
319      */
320     public boolean isVisible() {
321         throw new UnsupportedOperationException();
322     }
323
324     /**
325      * Not used
326      * @param newSize not used
327      */
328     public void setDims(Size newSize) {
329         throw new UnsupportedOperationException();
330     }
331
332     /**
333      * Not used
334      * @param newPosition not used
335      */
336     public void setPosition(Position newPosition) {
337         throw new UnsupportedOperationException();
338     }
339
340     /**
341      * Not used
342      * @param newVisibleState not used
343      */
344     public void setVisible(boolean newVisibleState) {
345         throw new UnsupportedOperationException();
346     }
347
348     /**
349      * Get associated InfoBar
350      * @return the infobar of the parent tab
351      * @see org.scilab.modules.gui.uielement.ScilabUIElement#getInfoBar()
352      */
353     public TextBox getInfoBar() {
354         return helpTab.getInfoBar();
355     }
356
357
358     /**
359      * Save the state of this help browser
360      */
361     public void saveHelpBrowserState() {
362         ConfigManager.saveHelpBrowserState(getCurrentURL());
363     }
364
365     /**
366      * Restore the state of this help browser
367      * @return the last id displayed in the browser
368      */
369     public static String restoreHelpBrowserState() {
370         return ConfigManager.getHelpBrowserState();
371     }
372 }