1f65cfaf55fa59b2592f61d63e25dd0598d9ced3
[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  *
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-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.helpbrowser;
14
15 import java.awt.Component;
16 import java.awt.Container;
17 import java.awt.KeyEventDispatcher;
18 import java.awt.KeyboardFocusManager;
19 import java.awt.Toolkit;
20 import java.awt.event.KeyEvent;
21
22 import javax.swing.SwingUtilities;
23
24 import org.scilab.modules.commons.ScilabConstants;
25 import org.scilab.modules.gui.bridge.ScilabBridge;
26 import org.scilab.modules.gui.bridge.helpbrowser.SwingScilabHelpBrowser;
27 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
28 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
29 import org.scilab.modules.gui.console.ScilabConsole;
30 import org.scilab.modules.gui.dockable.ScilabDockable;
31 import org.scilab.modules.gui.events.callback.ScilabCallBack;
32 import org.scilab.modules.gui.menubar.MenuBar;
33 import org.scilab.modules.gui.tab.ScilabTab;
34 import org.scilab.modules.gui.tab.Tab;
35 import org.scilab.modules.gui.textbox.ScilabTextBox;
36 import org.scilab.modules.gui.textbox.TextBox;
37 import org.scilab.modules.gui.utils.ConfigManager;
38 import org.scilab.modules.gui.utils.MenuBarBuilder;
39 import org.scilab.modules.gui.utils.Position;
40 import org.scilab.modules.gui.utils.Size;
41 import org.scilab.modules.gui.window.ScilabWindow;
42 import org.scilab.modules.gui.window.Window;
43 import org.scilab.modules.localization.Messages;
44
45 /**
46  * Class for Scilab Help Browser in GUIs
47  * @author Vincent COUVERT
48  */
49 public class ScilabHelpBrowser extends ScilabDockable implements HelpBrowser {
50
51     private static final String SCI = ScilabConstants.SCI.getPath();
52     private static final String MENUBARXMLFILE = SCI + "/modules/gui/etc/helpbrowser_menubar.xml";
53     private static final boolean isMac = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1;
54
55     private static HelpBrowser instance;
56
57     private static Tab helpTab;
58
59     private SimpleHelpBrowser component;
60
61     /**
62      * Constructor
63      * @param helps help chapters and directories
64      * @param language Scilab current language
65      */
66     protected ScilabHelpBrowser(String[] helps, String language) {
67         component = ScilabBridge.createHelpBrowser(helps, language);
68     }
69
70     /**
71      * Creates a Scilab Help Browser
72      * @param helps help chapters and directories
73      * @param language Scilab current language
74      * @return the created Help Browser
75      */
76     public static HelpBrowser createHelpBrowser(String[] helps, String language) {
77         if (instance == null) {
78
79             instance = new ScilabHelpBrowser(helps, language);
80
81             if (ScilabConsole.isExistingConsole() && ScilabConsole.getConsole().getInfoBar() != null) {
82                 if (ScilabConsole.getConsole().getInfoBar().getText().equals(Messages.gettext("Loading help browser..."))) {
83                     // An error occured
84                     ScilabConsole.getConsole().getInfoBar().setText("");
85                     return null;
86                 }
87             }
88
89             helpTab = ScilabTab.createTab(Messages.gettext("Help Browser"));
90             helpTab.addMember(instance);
91             /* Action when the Browser tab is closed */
92             helpTab.setCallback(ScilabCallBack
93                                 .createCallback("org.scilab.modules.gui.bridge.CallScilabBridge.closeHelpBrowser", ScilabCallBack.JAVA_OUT_OF_XCLICK_AND_XGETMOUSE));
94
95             MenuBar menubar = MenuBarBuilder.buildMenuBar(MENUBARXMLFILE);
96             helpTab.addMenuBar(menubar);
97
98             TextBox infobar = ScilabTextBox.createTextBox();
99             helpTab.addInfoBar(infobar);
100
101             Window helpWindow = ScilabWindow.createWindow();
102             helpWindow.addTab(helpTab);
103
104             KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
105             manager.addKeyEventDispatcher(new KeyEventDispatcher() {
106                     // This is a workaround for Mac OS X where e.getKeyCode() sometimes returns a bad value
107                     public boolean dispatchKeyEvent(KeyEvent e) {
108                         if (e.getID() == KeyEvent.KEY_PRESSED) {
109                             Container c = SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (SwingScilabTab) helpTab.getAsSimpleTab());
110                             if (e.getSource() instanceof Component) {
111                                 Container cs = SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (Component) e.getSource());
112                                 char chr = e.getKeyChar();
113
114                                 if (cs == c && ((chr == '-' || chr == '_' || chr == '=' || chr == '+')
115                                                 && (e.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0)) {
116                                     if (chr == '-' || chr == '_') {
117                                         ((SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component).decreaseFont();
118                                     } else {
119                                         ((SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component).increaseFont();
120                                     }
121                                     return true;
122                                 }
123                             }
124                         }
125                         return false;
126                     }
127                 });
128
129             /* Set the dimension / position of the help window */
130             helpWindow.setPosition(ConfigManager.getHelpWindowPosition());
131             helpWindow.setDims(ConfigManager.getHelpWindowSize());
132
133             helpWindow.draw();
134         } else {
135             SwingScilabWindow window = (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (SwingScilabTab) helpTab.getAsSimpleTab());
136             window.setVisible(true);
137             window.toFront();
138         }
139
140         return instance;
141     }
142
143     /**
144      * Display the home page
145      */
146     public static void startHomePage() {
147         if (instance != null) {
148             SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
149             try {
150                 browser.displayHomePage();
151             } catch (Exception e) {
152                 System.err.println("This error should not occured, please report it at bugzilla.scilab.org\n" + e);
153             }
154         }
155     }
156
157     /**
158      * Increase the font of the help viewer
159      */
160     public void increaseFont() {
161         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
162         browser.increaseFont();
163     }
164
165     /**
166      * Decrease the font of the help viewer
167      */
168     public void decreaseFont() {
169         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
170         browser.decreaseFont();
171     }
172
173     /**
174      * Display the home page
175      */
176     public void showSearchField() {
177         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
178         browser.showSearchField();
179     }
180
181     /**
182      * Display the home page
183      */
184     public void hideSearchField() {
185         SwingScilabHelpBrowser browser = (SwingScilabHelpBrowser) ((ScilabHelpBrowser) instance).component;
186         browser.hideSearchField();
187     }
188
189     /**
190      * Get the Scilab Help Browser
191      * @return the console
192      */
193     public static HelpBrowser getHelpBrowser() {
194         if (instance == null) {
195             instance = new ScilabHelpBrowser(null, "en_US");
196         }
197         return instance;
198     }
199
200     /**
201      * Get the Scilab Help Browser (does not create it is not existing)
202      * @return the console
203      */
204     public static HelpBrowser getHelpBrowserWithoutCreation() {
205         return instance;
206     }
207
208     /**
209      * Display the Help Browser
210      */
211     public void display() {
212         ScilabBridge.display(this);
213     }
214
215     /**
216      * Display the help page for a specified keyword
217      * @param keyword the keyword
218      */
219     public void searchKeywork(String keyword) {
220         ScilabBridge.searchKeywork(this, keyword);
221     }
222
223     /**
224      * Display the result of a full-text search for a specified word
225      * @param keyword the keyword
226      */
227     public void fullTextSearch(String keyword) {
228         ScilabBridge.fullTextSearch(this, keyword);
229     }
230
231     /**
232      * Close the HelpBrowser
233      */
234     public void close() {
235         ScilabBridge.close(this);
236         helpTab.close();
237         instance = null;
238     }
239
240     /**
241      * Not used
242      */
243     public void draw() {
244         throw new UnsupportedOperationException();
245     }
246
247     /**
248      * Gets this Bridge component object
249      * @return this Bridge component object
250      */
251     public SimpleHelpBrowser getAsSimpleHelpBrowser() {
252         return component;
253     }
254
255     /**
256      * Not used
257      * @return nothing
258      */
259     public Size getDims() {
260         throw new UnsupportedOperationException();
261     }
262
263     /**
264      * Not used
265      * @return nothing
266      */
267     public Position getPosition() {
268         throw new UnsupportedOperationException();
269     }
270
271     /**
272      * Not used
273      * @return nothing
274      */
275     public boolean isVisible() {
276         throw new UnsupportedOperationException();
277     }
278
279     /**
280      * Not used
281      * @param newSize not used
282      */
283     public void setDims(Size newSize) {
284         throw new UnsupportedOperationException();
285     }
286
287     /**
288      * Not used
289      * @param newPosition not used
290      */
291     public void setPosition(Position newPosition) {
292         throw new UnsupportedOperationException();
293     }
294
295     /**
296      * Not used
297      * @param newVisibleState not used
298      */
299     public void setVisible(boolean newVisibleState) {
300         throw new UnsupportedOperationException();
301     }
302
303     /**
304      * Get associated InfoBar
305      * @return the infobar of the parent tab
306      * @see org.scilab.modules.gui.uielement.ScilabUIElement#getInfoBar()
307      */
308     public TextBox getInfoBar() {
309         return helpTab.getInfoBar();
310     }
311 }