001: /*
002: * Gruntspud
003: *
004: * Copyright (C) 2002 Brett Smith.
005: *
006: * Written by: Brett Smith <t_magicthize@users.sourceforge.net>
007: *
008: * This program is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Library General Public License
010: * as published by the Free Software Foundation; either version 2 of
011: * the License, or (at your option) any later version.
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU Library General Public License for more details.
016: *
017: * You should have received a copy of the GNU Library General Public
018: * License along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: */
021:
022: package gruntspud.help;
023:
024: import gruntspud.Constants;
025: import gruntspud.GruntspudContext;
026: import gruntspud.actions.AbstractNextAction;
027: import gruntspud.actions.AbstractPreviousAction;
028: import gruntspud.ui.UIUtil;
029:
030: import java.awt.BorderLayout;
031: import java.awt.Dimension;
032: import java.awt.Font;
033: import java.awt.event.ActionEvent;
034: import java.awt.event.WindowAdapter;
035: import java.awt.event.WindowEvent;
036: import java.beans.PropertyChangeEvent;
037: import java.beans.PropertyChangeListener;
038: import java.net.URL;
039: import java.util.Enumeration;
040: import java.util.Locale;
041: import java.util.ResourceBundle;
042: import java.util.Vector;
043:
044: import javax.help.HelpModel;
045: import javax.help.HelpSet;
046: import javax.help.HelpUtilities;
047: import javax.help.JHelp;
048: import javax.help.JHelpNavigator;
049: import javax.help.event.HelpModelEvent;
050: import javax.help.event.HelpModelListener;
051: import javax.help.plaf.HelpUI;
052: import javax.swing.AbstractAction;
053: import javax.swing.BorderFactory;
054: import javax.swing.JComponent;
055: import javax.swing.JFrame;
056: import javax.swing.JPanel;
057: import javax.swing.JSeparator;
058: import javax.swing.JSplitPane;
059: import javax.swing.JTabbedPane;
060: import javax.swing.JToolBar;
061: import javax.swing.SwingUtilities;
062: import javax.swing.UIManager;
063: import javax.swing.plaf.ComponentUI;
064:
065: /**
066: * Description of the Interface
067: *
068: *@author magicthize
069: *@created 26 May 2002
070: */
071: public class GruntspudHelpUI extends HelpUI implements
072: PropertyChangeListener {
073: static ResourceBundle res = ResourceBundle
074: .getBundle("gruntspud.help.ResourceBundle");
075: private int dividerLocation;
076: private final double dividerLocationRatio = 0.29999999999999999D;
077: private JTabbedPane tabbedPane;
078: private JSplitPane splitPane;
079: private JHelp help;
080: private JToolBar toolbar;
081: protected Vector navs;
082: private Vector history;
083: private int historyIndex;
084: private IdChangeListener changeListener;
085: private AbstractAction previous;
086: private AbstractAction next;
087: private GruntspudContext context;
088:
089: /**
090: * Creates a new GruntspudHelpUI object.
091: *
092: * @param jhelp DOCUMENT ME!
093: */
094: public GruntspudHelpUI(JHelp jhelp, GruntspudContext context) {
095: this .context = context;
096: dividerLocation = 0;
097: navs = new Vector();
098: history = new Vector();
099: historyIndex = -1;
100: changeListener = new IdChangeListener();
101: }
102:
103: /**
104: * DOCUMENT ME!
105: *
106: * @param jcomponent DOCUMENT ME!
107: *
108: * @return DOCUMENT ME!
109: public static ComponentUI createUI(JComponent jcomponent) {
110: return new GruntspudHelpUI( (JHelp) jcomponent, context);
111: }
112: */
113:
114: private void discardHistory() {
115: history.setSize(0);
116: historyIndex = -1;
117: previous.setEnabled(false);
118: next.setEnabled(false);
119: }
120:
121: private void rebuild() {
122: HelpModel helpmodel = getModel();
123:
124: if (helpmodel == null) {
125: return;
126: }
127:
128: discardHistory();
129:
130: try {
131: HelpSet helpset = helpmodel.getHelpSet();
132: javax.help.Map.ID id = helpset.getHomeID();
133: helpmodel.setCurrentID(id);
134: } catch (Exception exception) {
135: return;
136: }
137: }
138:
139: /**
140: * DOCUMENT ME!
141: *
142: * @param propertychangeevent DOCUMENT ME!
143: */
144: public void propertyChange(PropertyChangeEvent propertychangeevent) {
145: if (propertychangeevent.getSource() == help) {
146: String s = propertychangeevent.getPropertyName();
147:
148: if (s.equals("helpModel")) {
149: rebuild();
150: } else if (s.equals("font")) {
151: Font font = (Font) propertychangeevent.getNewValue();
152: help.getContentViewer().setFont(font);
153: help.getContentViewer().invalidate();
154:
155: JHelpNavigator jhelpnavigator;
156:
157: for (Enumeration enumeration = help.getHelpNavigators(); enumeration
158: .hasMoreElements(); jhelpnavigator
159: .setFont(font)) {
160: jhelpnavigator = (JHelpNavigator) enumeration
161: .nextElement();
162: }
163: } else if (s.equals("navigatorDisplayed")) {
164: tabbedPane.setVisible(((Boolean) propertychangeevent
165: .getNewValue()).booleanValue());
166: }
167: }
168: }
169:
170: /**
171: * DOCUMENT ME!
172: *
173: * @param jhelpnavigator DOCUMENT ME!
174: */
175: public void addNavigator(JHelpNavigator jhelpnavigator) {
176: navs.addElement(jhelpnavigator);
177:
178: javax.swing.Icon icon = jhelpnavigator.getIcon();
179:
180: if (icon != null) {
181: tabbedPane.addTab("", icon, jhelpnavigator, jhelpnavigator
182: .getNavigatorLabel());
183: } else {
184: String s = jhelpnavigator.getName();
185:
186: if (s == null) {
187: s = "<unknown>";
188:
189: }
190: tabbedPane.addTab(s, icon, jhelpnavigator);
191: }
192:
193: jhelpnavigator.setVisible(false);
194: tabbedPane.setVisible(help.isNavigatorDisplayed());
195: help.invalidate();
196: SwingUtilities.invokeLater(new Runnable() {
197: public void run() {
198: if ((double) dividerLocation == 0.0D) {
199: Dimension dimension = splitPane.getSize();
200:
201: if (dimension.width != 0) {
202: splitPane
203: .setDividerLocation((int) ((double) (dimension.width - splitPane
204: .getDividerSize()) * 0.29999999999999999D));
205:
206: }
207: dividerLocation = splitPane.getDividerLocation();
208: }
209: }
210: });
211: }
212:
213: /**
214: * DOCUMENT ME!
215: *
216: * @param jhelpnavigator DOCUMENT ME!
217: */
218: public void removeNavigator(JHelpNavigator jhelpnavigator) {
219: navs.removeElement(jhelpnavigator);
220: tabbedPane.remove(jhelpnavigator);
221: help.invalidate();
222: }
223:
224: /**
225: * DOCUMENT ME!
226: *
227: * @param jhelpnavigator DOCUMENT ME!
228: */
229: public void setCurrentNavigator(JHelpNavigator jhelpnavigator) {
230: try {
231: tabbedPane.setSelectedComponent(jhelpnavigator);
232: } catch (IllegalArgumentException illegalargumentexception) {
233: throw new IllegalArgumentException(
234: "JHelpNavigator must be added first");
235: }
236: }
237:
238: /**
239: * DOCUMENT ME!
240: *
241: * @return DOCUMENT ME!
242: */
243: public JHelpNavigator getCurrentNavigator() {
244: return (JHelpNavigator) tabbedPane.getSelectedComponent();
245: }
246:
247: protected HelpModel getModel() {
248: if (help == null) {
249: return null;
250: } else {
251:
252: return help.getModel();
253: }
254: }
255:
256: /**
257: * DOCUMENT ME!
258: *
259: * @return DOCUMENT ME!
260: */
261: public Enumeration getHelpNavigators() {
262: return navs.elements();
263: }
264:
265: /**
266: * DOCUMENT ME!
267: *
268: * @param jcomponent DOCUMENT ME!
269: */
270: public void installUI(JComponent jcomponent) {
271: help = (JHelp) jcomponent;
272: help.setLayout(new BorderLayout());
273: help.addPropertyChangeListener(this );
274:
275: HelpModel helpmodel = getModel();
276:
277: if (helpmodel != null) {
278: helpmodel.addHelpModelListener(changeListener);
279:
280: }
281: toolbar = createToolBar(HelpUtilities.getLocale(jcomponent));
282: toolbar.setFloatable(false);
283:
284: JPanel jpanel = new JPanel(new BorderLayout());
285: jpanel.add(toolbar, "North");
286: jpanel.add(new JSeparator(), "South");
287: tabbedPane = new JTabbedPane();
288: tabbedPane.setBorder(BorderFactory
289: .createEmptyBorder(2, 2, 2, 2));
290: tabbedPane.setVisible(false);
291: splitPane = new JSplitPane(1, false, tabbedPane, help
292: .getContentViewer());
293: splitPane.setOneTouchExpandable(true);
294: splitPane.setDividerSize(9);
295: help.add(jpanel, "North");
296: help.add(splitPane, "Center");
297:
298: JHelpNavigator jhelpnavigator = null;
299:
300: for (Enumeration enumeration = help.getHelpNavigators(); enumeration
301: .hasMoreElements();) {
302: JHelpNavigator jhelpnavigator1 = (JHelpNavigator) enumeration
303: .nextElement();
304: addNavigator(jhelpnavigator1);
305:
306: if (jhelpnavigator == null) {
307: jhelpnavigator = jhelpnavigator1;
308: }
309: }
310:
311: if (jhelpnavigator != null) {
312: setCurrentNavigator(jhelpnavigator);
313:
314: }
315: rebuild();
316: }
317:
318: private void gotoHistoryEntry(int i) {
319: HelpModel helpmodel = getModel();
320:
321: if (helpmodel == null) {
322: return;
323: }
324:
325: if ((i < 0) || (i >= history.size())) {
326: discardHistory();
327:
328: return;
329: }
330:
331: HelpModelEvent helpmodelevent = (HelpModelEvent) history
332: .elementAt(i);
333: historyIndex = i - 1;
334:
335: javax.help.Map.ID id = helpmodelevent.getID();
336: URL url = helpmodelevent.getURL();
337:
338: if (id != null) {
339: try {
340: helpmodel.setCurrentID(id);
341:
342: return;
343: } catch (Exception exception) {
344: }
345: }
346:
347: if (url != null) {
348: try {
349: helpmodel.setCurrentURL(url);
350:
351: return;
352: } catch (Exception exception1) {
353: }
354: }
355:
356: discardHistory();
357: }
358:
359: protected JToolBar createToolBar(Locale locale) {
360: previous = new BackAction(locale);
361: previous.setEnabled(false);
362: next = new ForwardAction(locale);
363: next.setEnabled(false);
364: toolbar = new JToolBar();
365: toolbar.setBorderPainted(false);
366: toolbar.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
367: toolbar.setFloatable(false);
368: boolean showSelectiveText = context.getHost()
369: .getBooleanProperty(
370: Constants.TOOL_BAR_SHOW_SELECTIVE_TEXT, true);
371: toolbar.add(UIUtil.createButton(previous, showSelectiveText,
372: false));
373: toolbar
374: .add(UIUtil
375: .createButton(next, showSelectiveText, false));
376:
377: return toolbar;
378: }
379:
380: /**
381: * DOCUMENT ME!
382: *
383: * @param args DOCUMENT ME!
384: *
385: * @throws Exception DOCUMENT ME!
386: */
387: public static void main(String[] args) throws Exception {
388: UIManager.setLookAndFeel(UIManager
389: .getSystemLookAndFeelClassName());
390:
391: JFrame jframe = new JFrame("Test");
392: jframe.addWindowListener(new WindowAdapter() {
393: public void windowClosing(WindowEvent windowevent) {
394: System.exit(0);
395: }
396: });
397:
398: URL url = HelpSet.findHelpSet(null, "help/Gruntspud.hs");
399: HelpSet helpset = new HelpSet(null, url);
400: JHelp jhelp = new JHelp(helpset);
401: jhelp.setUI(new GruntspudHelpUI(jhelp, null));
402: jframe.getContentPane().add(jhelp, "Center");
403: jframe.pack();
404: jframe.setVisible(true);
405: }
406:
407: private void computeHistoryButtons() {
408: previous.setEnabled(historyIndex > 0);
409: next.setEnabled(historyIndex < (history.size() - 1));
410: }
411:
412: class ForwardAction extends AbstractNextAction {
413: ForwardAction(Locale locale) {
414: super ();
415: putValue("LongDescription", HelpUtilities.getString(locale,
416: "tip.next"));
417: }
418:
419: public void actionPerformed(ActionEvent evt) {
420: gotoHistoryEntry(historyIndex + 1);
421: }
422: }
423:
424: class BackAction extends AbstractPreviousAction {
425: BackAction(Locale locale) {
426: super ();
427: putValue("LongDescription", HelpUtilities.getString(locale,
428: "tip.previous"));
429: }
430:
431: public void actionPerformed(ActionEvent evt) {
432: gotoHistoryEntry(historyIndex - 1);
433: }
434: }
435:
436: class IdChangeListener implements HelpModelListener {
437: IdChangeListener() {
438: }
439:
440: public void idChanged(HelpModelEvent helpmodelevent) {
441: if (historyIndex == (history.size() - 1)) {
442: history.addElement(helpmodelevent);
443: historyIndex += 1;
444: computeHistoryButtons();
445:
446: return;
447: }
448:
449: if ((historyIndex >= -1)
450: && (historyIndex < (history.size() - 1))) {
451: historyIndex += 1;
452:
453: HelpModelEvent helpmodelevent1 = (HelpModelEvent) history
454: .elementAt(historyIndex);
455:
456: if (helpmodelevent1 == null) {
457: discardHistory();
458:
459: return;
460: }
461:
462: if ((helpmodelevent1.getID() != null)
463: && (helpmodelevent.getID() != null)
464: && helpmodelevent1.getID().equals(
465: helpmodelevent.getID())) {
466: computeHistoryButtons();
467:
468: return;
469: }
470:
471: if ((helpmodelevent1.getURL() != null)
472: && (helpmodelevent.getURL() != null)
473: && helpmodelevent1.getURL().sameFile(
474: helpmodelevent.getURL())) {
475: computeHistoryButtons();
476:
477: return;
478: }
479:
480: history.setSize(historyIndex);
481: history.addElement(helpmodelevent);
482: computeHistoryButtons();
483: }
484: }
485: }
486: }
|