JAL-3253-applet adds NOMENUBAR, NOSTATUS, NOCALCULATION, SHOWOVERVIEW
[jalview.git] / src / jalview / gui / Desktop.java
index c835248..957fb96 100644 (file)
@@ -22,8 +22,10 @@ package jalview.gui;
 
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.bin.Cache;
-import jalview.bin.Instance;
 import jalview.bin.Jalview;
 import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.io.BackupFiles;
@@ -37,6 +39,7 @@ import jalview.io.FormatAdapter;
 import jalview.io.IdentifyFile;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
+import jalview.jbgui.GDesktop;
 import jalview.jbgui.GSplitFrame;
 import jalview.jbgui.GStructureViewer;
 import jalview.project.Jalview2XML;
@@ -135,10 +138,11 @@ import org.stackoverflowusers.file.WindowsShortcut;
  * @version $Revision: 1.155 $
  */
 @SuppressWarnings("serial")
-public class Desktop extends jalview.jbgui.GDesktop
+public class Desktop extends GDesktop
         implements DropTargetListener, ClipboardOwner, IProgressIndicator,
-        jalview.api.StructureSelectionManagerProvider
+        StructureSelectionManagerProvider, ApplicationSingletonI
 {
+
   private final static int DEFAULT_MIN_WIDTH = 300;
 
   private final static int DEFAULT_MIN_HEIGHT = 250;
@@ -195,7 +199,14 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static MyDesktopPane getDesktopPane()
   {
-    return Instance.getDesktop().desktopPane;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.desktopPane;
+  }
+
+  public static StructureSelectionManager getStructureSelectionManager()
+  {
+    return StructureSelectionManager
+            .getStructureSelectionManager(getInstance());
   }
 
   static int openFrameCount = 0;
@@ -212,7 +223,9 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   private static int fileLoadingCount = 0;
 
-  public JInternalFrame conservationSlider, PIDSlider;
+  public JInternalFrame conservationSlider;
+
+  public JInternalFrame PIDSlider;
 
   /**
    * just an instance (for testng, probably); no actual frames
@@ -344,26 +357,49 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public MyDesktopPane desktopPane;
 
+  /**
+   * Answers an 'application scope' singleton instance of this class. Separate
+   * SwingJS 'applets' running in the same browser page will each have a
+   * distinct instance of Desktop.
+   * 
+   * @return
+   */
+  public static Desktop getInstance()
+  {
+    return Jalview.isHeadlessMode() ? null
+            : (Desktop) ApplicationSingletonProvider
+                    .getInstance(Desktop.class);
+  }
+
+  /**
+   * For testing.
+   * 
+   * @param forInstance
+   */
   public Desktop(boolean forInstance)
   {
     instanceOnly = true;
   }
+  
   /**
-   * Creates a new Desktop object.
+   * Private constructor enforces singleton pattern. It is called by reflection
+   * from ApplicationSingletonProvider.getInstance().
    */
-  public Desktop()
+  @SuppressWarnings("unused")
+  private Desktop()
   {
+    try
+    {
     /**
      * A note to implementors. It is ESSENTIAL that any activities that might
      * block are spawned off as threads rather than waited for during this
      * constructor.
      */
-    Instance.setDesktop(this);
     if (!Platform.isJS())
     {
       doVamsasClientCheck();
     }
-
+    
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -372,7 +408,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
             false);
     desktopPane = new MyDesktopPane(selmemusage);
-
+    
     showMemusage.setSelected(selmemusage);
     desktopPane.setBackground(Color.white);
     getContentPane().setLayout(new BorderLayout());
@@ -380,16 +416,16 @@ public class Desktop extends jalview.jbgui.GDesktop
     // JScrollPane sp = new JScrollPane();
     // sp.getViewport().setView(desktop);
     // getContentPane().add(sp, BorderLayout.CENTER);
-
+    
     // BH 2018 - just an experiment to try unclipped JInternalFrames.
     if (Platform.isJS())
     {
       getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
     }
-
+    
     getContentPane().add(desktopPane, BorderLayout.CENTER);
     desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-
+    
     // This line prevents Windows Look&Feel resizing all new windows to maximum
     // if previous window was maximised
     desktopPane.setDesktopManager(new MyDesktopManager(
@@ -398,7 +434,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                             ? new AquaInternalFrameManager(
                                     desktopPane.getDesktopManager())
                             : desktopPane.getDesktopManager())));
-
+    
     Rectangle dims = getLastKnownDimensions("");
     if (dims != null)
     {
@@ -411,7 +447,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       int yPos = Math.max(5, (screenSize.height - 650) / 2);
       setBounds(xPos, yPos, 900, 650);
     }
-
+    
     if (!Platform.isJS())
     /**
      * Java only
@@ -419,7 +455,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      * @j2sIgnore
      */
     {
-
+    
       jconsole = new Console(this, showjconsole);
       // add essential build information
       jconsole.setHeader("Jalview Version: "
@@ -432,19 +468,19 @@ public class Desktop extends jalview.jbgui.GDesktop
               + System.getProperty("os.arch") + " "
               + System.getProperty("os.name") + " "
               + System.getProperty("os.version"));
-
+    
       showConsole(showjconsole);
-
+    
       showNews.setVisible(false);
-
+    
       experimentalFeatures.setSelected(showExperimental());
-
+    
       getIdentifiersOrgData();
-
+    
       checkURLLinks();
-
+    
       // Spawn a thread that shows the splashscreen
-
+    
       SwingUtilities.invokeLater(new Runnable()
       {
         @Override
@@ -453,7 +489,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           new SplashScreen();
         }
       });
-
+    
       // Thread off a new instance of the file chooser - this reduces the time
       // it
       // takes to open it later on.
@@ -473,7 +509,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       changeSupport.addJalviewPropertyChangeListener("services",
               new PropertyChangeListener()
               {
-
+    
                 @Override
                 public void propertyChange(PropertyChangeEvent evt)
                 {
@@ -481,13 +517,13 @@ public class Desktop extends jalview.jbgui.GDesktop
                           + evt.getNewValue());
                   JalviewServicesChanged(evt);
                 }
-
+    
               });
-
+    
     }
-
+    
     this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this));
-
+    
     this.addWindowListener(new WindowAdapter()
     {
       @Override
@@ -496,7 +532,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         quit();
       }
     });
-
+    
     MouseAdapter ma;
     this.addMouseListener(ma = new MouseAdapter()
     {
@@ -508,7 +544,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           showPasteMenu(evt.getX(), evt.getY());
         }
       }
-
+    
       @Override
       public void mouseReleased(MouseEvent evt)
       {
@@ -519,7 +555,10 @@ public class Desktop extends jalview.jbgui.GDesktop
       }
     });
     desktopPane.addMouseListener(ma);
-
+    } catch (Throwable t)
+    {
+      t.printStackTrace();
+    }
   }
 
   /**
@@ -595,7 +634,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         }
       }
     }).start();
-    ;
+    
   }
 
   @Override
@@ -757,7 +796,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         FileFormatI format = new IdentifyFile().identify(file,
                 DataSourceType.PASTE);
 
-        new FileLoader().LoadFile(file, DataSourceType.PASTE, format);
+        new FileLoader().loadFile(file, DataSourceType.PASTE, format);
 
       }
     } catch (Exception ex)
@@ -825,7 +864,34 @@ public class Desktop extends jalview.jbgui.GDesktop
           final JInternalFrame frame, String title, int w, int h,
           boolean resizable)
   {
-    addInternalFrame(frame, title, true, w, h, resizable, false);
+    addInternalFrame(frame, title, true, w, h, resizable, false, null);
+  }
+
+  /**
+   * Add an internal frame to the Jalview desktop
+   * 
+   * @param frame
+   *          Frame to show
+   * @param title
+   *          Visible Title
+   * @param makeVisible
+   *          When true, display frame immediately, otherwise, caller must call
+   *          setVisible themselves.
+   * @param w
+   *          width
+   * @param h
+   *          height
+   * @param resizable
+   *          Allow resize
+   * @param ignoreMinSize
+   *          Do not set the default minimum size for frame
+   */
+  public static synchronized void addInternalFrame(
+          JInternalFrame frame, String title, boolean makeVisible, int w,
+          int h, boolean resizable, boolean ignoreMinSize)
+  {
+    addInternalFrame(frame, title, makeVisible, w, h, resizable,
+            ignoreMinSize, null);
   }
 
   /**
@@ -846,17 +912,26 @@ public class Desktop extends jalview.jbgui.GDesktop
    *          Allow resize
    * @param ignoreMinSize
    *          Do not set the default minimum size for frame
+   * @param name
+   *          for HTML div embedding
    */
   public static synchronized void addInternalFrame(
           final JInternalFrame frame, String title, boolean makeVisible,
-          int w, int h, boolean resizable, boolean ignoreMinSize)
+          int w, int h, boolean resizable, boolean ignoreMinSize,
+          String name)
   {
 
+
     // TODO: allow callers to determine X and Y position of frame (eg. via
     // bounds object).
     // TODO: consider fixing method to update entries in the window submenu with
     // the current window title
 
+    if (name != null)
+    {
+      frame.setName(Jalview.getAppID(name));
+    }
+
     frame.setTitle(title);
     if (frame.getWidth() < 1 || frame.getHeight() < 1)
     {
@@ -866,7 +941,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
     // IF JALVIEW IS RUNNING HEADLESS
     // ///////////////////////////////////////////////
-    if (Instance.getDesktop().instanceOnly || Jalview.isHeadlessMode())
+    if (Desktop.getInstance().instanceOnly || Jalview.isHeadlessMode())
     {
       return;
     }
@@ -944,8 +1019,8 @@ public class Desktop extends jalview.jbgui.GDesktop
         {
           menuItem.removeActionListener(menuItem.getActionListeners()[0]);
         }
-        Instance.getDesktop().windowMenu.remove(menuItem);
-      };
+        Desktop.getInstance().windowMenu.remove(menuItem);
+      }
     });
 
     menuItem.addActionListener(new ActionListener()
@@ -968,7 +1043,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     getDesktopPane().add(frame);
 
-    Instance.getDesktop().windowMenu.add(menuItem);
+    Desktop.getInstance().windowMenu.add(menuItem);
 
     frame.toFront();
     try
@@ -1025,7 +1100,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (!internalCopy)
     {
-      Instance.getDesktop().jalviewClipboard = null;
+      Desktop.getInstance().jalviewClipboard = null;
     }
 
     internalCopy = false;
@@ -1104,7 +1179,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           {
             Platform.cacheFileData((File) file);
           }
-          new FileLoader().LoadFile(null, file, protocol, format);
+          new FileLoader().loadFile(null, file, protocol, format);
 
         }
       } catch (Exception ex)
@@ -1161,7 +1236,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           }
         }
 
-        new FileLoader().LoadFile(viewport, selectedFile,
+        new FileLoader().loadFile(viewport, selectedFile,
                 DataSourceType.FILE, format);
       }
     });
@@ -1235,12 +1310,12 @@ public class Desktop extends jalview.jbgui.GDesktop
         {
           if (viewport != null)
           {
-            new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+            new FileLoader().loadFile(viewport, url, DataSourceType.URL,
                     FileFormat.Jalview);
           }
           else
           {
-            new FileLoader().LoadFile(url, DataSourceType.URL,
+            new FileLoader().loadFile(url, DataSourceType.URL,
                     FileFormat.Jalview);
           }
         }
@@ -1270,12 +1345,12 @@ public class Desktop extends jalview.jbgui.GDesktop
 
           if (viewport != null)
           {
-            new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+            new FileLoader().loadFile(viewport, url, DataSourceType.URL,
                     format);
           }
           else
           {
-            new FileLoader().LoadFile(url, DataSourceType.URL, format);
+            new FileLoader().loadFile(url, DataSourceType.URL, format);
           }
         }
       }
@@ -1504,12 +1579,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      * reset state of singleton objects as appropriate (clear down session state
      * when all windows are closed)
      */
-    StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(this);
-    if (ssm != null)
-    {
-      ssm.resetAll();
-    }
+    getStructureSelectionManager().resetAll();
   }
 
   @Override
@@ -2352,7 +2422,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                 });
                 rthr.start();
               }
-            };
+            }
           });
           VamsasStMenu.add(sessit);
         }
@@ -3013,7 +3083,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
     {
-      t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+      t2 = jalview.ws.jws2.Jws2Discoverer.getInstance()
               .startDiscoverer(changeSupport);
     }
     Thread t3 = null;
@@ -3046,7 +3116,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
     {
-      final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+      final String ermsg = jalview.ws.jws2.Jws2Discoverer.getInstance()
               .getErrorMessages();
       if (ermsg != null)
       {
@@ -3122,7 +3192,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public static void showUrl(final String url)
   {
-    showUrl(url, Instance.getDesktop());
+    showUrl(url, Desktop.getInstance());
   }
 
   /**
@@ -3171,7 +3241,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static ParamManager getUserParameterStore()
   {
-    Desktop d = Instance.getDesktop();
+    Desktop d = Desktop.getInstance();
     if (d.wsparamManager == null)
     {
       d.wsparamManager = new WsParamSetManager();
@@ -3252,7 +3322,6 @@ public class Desktop extends jalview.jbgui.GDesktop
           } catch (InterruptedException x)
           {
           }
-          ;
         }
         if (instanceOnly)
         {
@@ -3463,7 +3532,8 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static groovy.ui.Console getGroovyConsole()
   {
-    return Instance.getDesktop().groovyConsole;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.groovyConsole;
   }
 
   /**
@@ -3541,7 +3611,6 @@ public class Desktop extends jalview.jbgui.GDesktop
             System.err.println(
                     "Please ignore plist error - occurs due to problem with java 8 on OSX");
           }
-          ;
         }
       } catch (Throwable ex)
       {