JAL-3103 Put jalview.jar first in getdown for .properties files. Remove now-not-neede...
[jalview.git] / src / jalview / gui / Help.java
index 001b372..658b34f 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b2)
- * Copyright (C) 2015 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -20,6 +20,7 @@
  */
 package jalview.gui;
 
+import java.awt.Point;
 import java.net.URL;
 
 import javax.help.BadIDException;
@@ -27,36 +28,55 @@ import javax.help.HelpBroker;
 import javax.help.HelpSet;
 import javax.help.HelpSetException;
 
+import jalview.util.BrowserLauncher;
+import jalview.util.Platform;
+
 /**
- * Utility class to show the help documentation window.
+ * Utility class to show the help documentation window
  * 
  * @author gmcarstairs
- *
  */
 public class Help
 {
+  private static final String HELP_PAGE_ROOT = "http://www.jalview.org/help/";
+
+  /**
+   * Defines selected help targets with links to inbuilt (Java) help page
+   * target, and externally hosted help page. Will need to be maintained
+   * manually if help pages are reorganised in future.
+   */
   public enum HelpId
   {
-    Home("home"), SequenceFeatureSettings("seqfeatures.settings"),
-    StructureViewer("viewingpdbs");
+    Home("home", "help.html"),
+    SequenceFeatureSettings("seqfeatures.settings",
+            "html/features/featuresettings.html"),
+    StructureViewer("viewingpdbs", "html/features/viewingpdbs.html"),
+    PdbFts("pdbfts", "html/features/pdbsequencefetcher.html#pdbfts"),
+    UniprotFts("uniprotfts",
+            "html/features/uniprotsequencefetcher.html#uniprotfts");
 
     private String id;
 
-    private HelpId(String loc)
+    private String path;
+
+    private HelpId(String hepLoc, String htmlPath)
     {
-      this.id = loc;
+      this.id = hepLoc;
+      this.path = htmlPath;
     }
 
-    @Override
-    public String toString()
+    String getId()
     {
       return this.id;
     }
-  }
 
-  private static final long HALF_A_MO = 500; // half a second
+    String getPath()
+    {
+      return this.path;
+    }
+  }
 
-  private static long lastOpenedTime = 0L;
+  private static HelpBroker hb;
 
   /**
    * Not instantiable
@@ -67,42 +87,72 @@ public class Help
   }
 
   /**
-   * Show help text in a new window. But do nothing if within half a second of
-   * the last invocation.
-   * 
-   * This is a workaround for issue JAL-914 - both Desktop and AlignFrame
-   * responding to F1 key, resulting in duplicate help windows opened.
+   * Shows the help window, at the entry specified by the given helpId
    * 
    * @param id
-   *          TODO
    * 
    * @throws HelpSetException
    */
   public static void showHelpWindow(HelpId id) throws HelpSetException
   {
-    long timeNow = System.currentTimeMillis();
-
-    if (timeNow - lastOpenedTime > HALF_A_MO)
+    if (Platform.isJS())
+    {
+      /*
+      try
+      {
+      */
+      BrowserLauncher.openURL(HELP_PAGE_ROOT + id.getPath());
+      /*
+      } catch (IOException e)
+      {
+      }
+      */
+    }
+    else
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
     {
-      lastOpenedTime = timeNow;
+
       ClassLoader cl = Desktop.class.getClassLoader();
       URL url = HelpSet.findHelpSet(cl, "help/help"); // $NON-NLS-$
       HelpSet hs = new HelpSet(cl, url);
 
-      HelpBroker hb = hs.createHelpBroker();
+      if (hb == null)
+      {
+        /*
+         * create help broker first time (only)
+         */
+        hb = hs.createHelpBroker();
+      }
+
       try
       {
-        hb.setCurrentID(id.toString());
+        hb.setCurrentID(id.getId());
       } catch (BadIDException bad)
       {
-        System.out.println("Bad help link: " + id.toString()
+        System.out.println("Bad help link: " + id.getId()
                 + ": must match a target in help.jhm");
         throw bad;
       }
+
+      /*
+       * set Help visible - at its current location if it is already shown,
+       * else at a location as determined by the window manager
+       */
+      Point p = hb.getLocation();
+      hb.setLocation(p);
       hb.setDisplayed(true);
     }
   }
 
+  /**
+   * Show the Help window at the root entry
+   * 
+   * @throws HelpSetException
+   */
   public static void showHelpWindow() throws HelpSetException
   {
     showHelpWindow(HelpId.Home);