JAL-3253-applet adds NOMENUBAR, NOSTATUS, NOCALCULATION, SHOWOVERVIEW
[jalview.git] / src / jalview / gui / Desktop.java
index 826a869..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,9 +138,9 @@ 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;
@@ -196,13 +199,14 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static MyDesktopPane getDesktopPane()
   {
-    return Desktop.getInstance().desktopPane;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.desktopPane;
   }
 
   public static StructureSelectionManager getStructureSelectionManager()
   {
     return StructureSelectionManager
-            .getStructureSelectionManager(Desktop.getInstance());
+            .getStructureSelectionManager(getInstance());
   }
 
   static int openFrameCount = 0;
@@ -219,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
@@ -351,11 +357,18 @@ 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()
   {
-    Instance i = Instance.getInstance();
-    return (i.desktop == null ? (i.desktop = new Desktop(true))
-            : i.desktop);
+    return Jalview.isHeadlessMode() ? null
+            : (Desktop) ApplicationSingletonProvider
+                    .getInstance(Desktop.class);
   }
 
   /**
@@ -367,23 +380,26 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     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.getInstance().desktop = this;
-
     if (!Platform.isJS())
     {
       doVamsasClientCheck();
     }
-
+    
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -392,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());
@@ -400,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(
@@ -418,7 +434,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                             ? new AquaInternalFrameManager(
                                     desktopPane.getDesktopManager())
                             : desktopPane.getDesktopManager())));
-
+    
     Rectangle dims = getLastKnownDimensions("");
     if (dims != null)
     {
@@ -431,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
@@ -439,7 +455,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      * @j2sIgnore
      */
     {
-
+    
       jconsole = new Console(this, showjconsole);
       // add essential build information
       jconsole.setHeader("Jalview Version: "
@@ -452,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
@@ -473,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.
@@ -493,7 +509,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       changeSupport.addJalviewPropertyChangeListener("services",
               new PropertyChangeListener()
               {
-
+    
                 @Override
                 public void propertyChange(PropertyChangeEvent evt)
                 {
@@ -501,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
@@ -516,7 +532,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         quit();
       }
     });
-
+    
     MouseAdapter ma;
     this.addMouseListener(ma = new MouseAdapter()
     {
@@ -528,7 +544,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           showPasteMenu(evt.getX(), evt.getY());
         }
       }
-
+    
       @Override
       public void mouseReleased(MouseEvent evt)
       {
@@ -539,7 +555,10 @@ public class Desktop extends jalview.jbgui.GDesktop
       }
     });
     desktopPane.addMouseListener(ma);
-
+    } catch (Throwable t)
+    {
+      t.printStackTrace();
+    }
   }
 
   /**
@@ -558,7 +577,8 @@ public class Desktop extends jalview.jbgui.GDesktop
   public void doConfigureStructurePrefs()
   {
     // configure services
-    StructureSelectionManager ssm = getStructureSelectionManager();
+    StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(this);
     if (jalview.bin.Cache.getDefault(Preferences.ADD_SS_ANN, true))
     {
       ssm.setAddTempFacAnnot(jalview.bin.Cache
@@ -614,7 +634,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         }
       }
     }).start();
-    ;
+    
   }
 
   @Override
@@ -776,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)
@@ -844,7 +864,7 @@ 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);
   }
 
   /**
@@ -867,15 +887,51 @@ public class Desktop extends jalview.jbgui.GDesktop
    *          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);
+  }
+
+  /**
+   * 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
+   * @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)
     {
@@ -964,7 +1020,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           menuItem.removeActionListener(menuItem.getActionListeners()[0]);
         }
         Desktop.getInstance().windowMenu.remove(menuItem);
-      };
+      }
     });
 
     menuItem.addActionListener(new ActionListener()
@@ -1123,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)
@@ -1180,7 +1236,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           }
         }
 
-        new FileLoader().LoadFile(viewport, selectedFile,
+        new FileLoader().loadFile(viewport, selectedFile,
                 DataSourceType.FILE, format);
       }
     });
@@ -1254,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);
           }
         }
@@ -1289,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);
           }
         }
       }
@@ -2366,7 +2422,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                 });
                 rthr.start();
               }
-            };
+            }
           });
           VamsasStMenu.add(sessit);
         }
@@ -3266,7 +3322,6 @@ public class Desktop extends jalview.jbgui.GDesktop
           } catch (InterruptedException x)
           {
           }
-          ;
         }
         if (instanceOnly)
         {
@@ -3477,7 +3532,8 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static groovy.ui.Console getGroovyConsole()
   {
-    return Desktop.getInstance().groovyConsole;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.groovyConsole;
   }
 
   /**
@@ -3555,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)
       {