/* * @(#)HelpInterfaceImpl.java */ package jas.util; import java.awt.Window; import java.net.URL; import java.util.Enumeration; import javax.help.DefaultHelpBroker; import javax.help.HelpSet; import javax.help.HelpSetException; import javax.help.Map.ID; import javax.swing.SwingUtilities; /** * HelpInterfaceImpl implements the HelpInterface. It is the only class which contains * references to javax.help.* Since it is only referred to as a String in a Class.forName * call, this allows the system to function if the help system is missing. * * @author Peter Armstrong * */ class HelpInterfaceImpl implements HelpInterface { HelpInterfaceImpl() throws HelpException { createHelpSet(); } public void showHelpTopic(String helpTopicTarget, Window owner) { showHelpTopic(helpTopicTarget, "TOC", owner); } public void showHelpTopic(String helpTopicTarget, String navigatorView, Window owner) { try { ID id = ID.create(helpTopicTarget, mainHS); if (id == null) { id = mainHS.getHomeID(); } mainHB.setActivationWindow(owner); mainHB.setCurrentView(navigatorView); mainHB.setCurrentID(id); mainHB.setDisplayed(true); } catch (Exception eek) { Application.getApplication().error("Sorry, the help topic could not be found."); } } public void modalDialogOpening(final java.awt.Dialog dlg) { if (debugHelp) System.out.println("modelDialogOpening "+mainHB.isDisplayed()); // It turns out that the modal dialog workaround must be done AFTER the dialog // has become modal. This code seems to do the trick, but how robust is it?? // TODO: If we were smarter, we could keep track of who owned the help broker // before the dialog was opened, and put things back afterwards. // If java were smarter (and allowed multiple independent GUI apps within one // JVM), this would all be unnecessary. if (mainHB.isDisplayed()) SwingUtilities.invokeLater(new Runnable() { public void run() { mainHB.setActivationWindow(dlg); mainHB.setDisplayed(true); } }); } public void modalDialogClosing(java.awt.Dialog dlg) { if (debugHelp) System.out.println("modelDialogClosing "+mainHB.isDisplayed()); mainHB.setActivationWindow(null); } /** * Find the HelpSet and initialize the main HelpBroker (mainHB). */ private void createHelpSet() throws HelpException { Enumeration e = Application.getApplication().getHelpLocations(); while (e.hasMoreElements()) { try { URL u = (URL) e.nextElement(); if (debugHelp) System.out.print("Looking for hs at: "+u+" ... "); mainHS = new HelpSet(null, u); if (debugHelp) System.out.println("Success"); break; } catch (HelpSetException e1) { if (debugHelp) System.out.println("Failed"); } } if (mainHS == null) throw new HelpException("No HelpSet found"); try { mainHB = (DefaultHelpBroker) mainHS.createHelpBroker(); } catch (Throwable x) { throw new HelpException("Could not create Help Broker",x); } } private HelpSet mainHS; private DefaultHelpBroker mainHB; private final boolean debugHelp = System.getProperty("debugHelp") != null; } class HelpException extends NestedException { HelpException(String s) { super(s); } HelpException(String s, Throwable t) { super(s,t); } }