X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=ace752973215601be7c9fd6c45a991af72a8394f;hb=72fb6df14f1ff426bbafa18dcc9a90450da93018;hp=88835c61af1ae22cc0ed74589c9fbae743973880;hpb=208f2c3de82e3327c4f930ab7d04f5b812ccd277;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 88835c6..ace7529 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -22,6 +22,9 @@ 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.Jalview; import jalview.gui.ImageExporter.ImageWriterI; @@ -36,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; @@ -47,6 +51,7 @@ import jalview.util.MessageManager; import jalview.util.Platform; import jalview.util.UrlConstants; import jalview.viewmodel.AlignmentViewport; +import jalview.ws.jws1.Discoverer; import jalview.ws.params.ParamManager; import jalview.ws.utils.UrlDownloadClient; @@ -133,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; @@ -191,47 +197,16 @@ public class Desktop extends jalview.jbgui.GDesktop listener); } - /** - * Singleton Desktop instance only in Java; - */ - private static Desktop instance; - - public static Desktop getInstance() - { - Desktop d; - @SuppressWarnings("unused") - ThreadGroup g = Thread.currentThread().getThreadGroup(); - /** - * @j2sNative d = g._jalviewDesktopInstance; - */ - { - d = instance; - } - return d; - } - - private static void setInstance(Desktop d) - { - @SuppressWarnings("unused") - ThreadGroup g = Thread.currentThread().getThreadGroup(); - /** - * @j2sNative g._jalviewDesktopInstance = d; - */ - { - instance = d; - } - } - - private MyDesktopPane desktopPane; - public static MyDesktopPane getDesktopPane() { - return getInstance().desktopPane; + Desktop desktop = Desktop.getInstance(); + return desktop == null ? null : desktop.desktopPane; } - private void setDesktopPane(MyDesktopPane pane) + public static StructureSelectionManager getStructureSelectionManager() { - getInstance().desktopPane = pane; + return StructureSelectionManager + .getStructureSelectionManager(getInstance()); } static int openFrameCount = 0; @@ -240,7 +215,7 @@ public class Desktop extends jalview.jbgui.GDesktop static final int yOffset = 30; - public jalview.ws.jws1.Discoverer discoverer; + public Discoverer discoverer; public Object[] jalviewClipboard; @@ -248,7 +223,14 @@ 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 + */ + private boolean instanceOnly; class MyDesktopManager implements DesktopManager { @@ -269,7 +251,7 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (NullPointerException npe) { Point p = getMousePosition(); - getInstance().showPasteMenu(p.x, p.y); + showPasteMenu(p.x, p.y); } } @@ -317,14 +299,14 @@ public class Desktop extends jalview.jbgui.GDesktop public void endDraggingFrame(JComponent f) { delegate.endDraggingFrame(f); - getDesktopPane().repaint(); + desktopPane.repaint(); } @Override public void endResizingFrame(JComponent f) { delegate.endResizingFrame(f); - getDesktopPane().repaint(); + desktopPane.repaint(); } @Override @@ -373,23 +355,54 @@ public class Desktop extends jalview.jbgui.GDesktop } + public MyDesktopPane desktopPane; + /** - * Creates a new Desktop object. + * 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 Desktop() + public static Desktop getInstance() + { + return Jalview.isHeadlessMode() ? null + : (Desktop) ApplicationSingletonProvider + .getInstance(Desktop.class); + } + + /** + * For testing. + * + * @param forInstance + */ + public Desktop(boolean forInstance) { - super(); + + Cache.initLogger(); + instanceOnly = true; + } + + /** + * Private constructor enforces singleton pattern. It is called by reflection + * from ApplicationSingletonProvider.getInstance(). + */ + @SuppressWarnings("unused") + private Desktop() + { + Cache.initLogger(); + 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. */ - setInstance(this); if (!Platform.isJS()) { doVamsasClientCheck(); } - + doConfigureStructurePrefs(); setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION")); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -397,34 +410,34 @@ public class Desktop extends jalview.jbgui.GDesktop false); boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE", false); - setDesktopPane(new MyDesktopPane(selmemusage)); - + desktopPane = new MyDesktopPane(selmemusage); + showMemusage.setSelected(selmemusage); - getDesktopPane().setBackground(Color.white); + desktopPane.setBackground(Color.white); getContentPane().setLayout(new BorderLayout()); // alternate config - have scrollbars - see notes in JAL-153 // 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(getDesktopPane(), BorderLayout.CENTER); - getDesktopPane().setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); - + + 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 - getDesktopPane().setDesktopManager(new MyDesktopManager( + desktopPane.setDesktopManager(new MyDesktopManager( (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager() : Platform.isAMacAndNotJS() ? new AquaInternalFrameManager( - getDesktopPane().getDesktopManager()) - : getDesktopPane().getDesktopManager()))); - + desktopPane.getDesktopManager()) + : desktopPane.getDesktopManager()))); + Rectangle dims = getLastKnownDimensions(""); if (dims != null) { @@ -437,7 +450,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 @@ -445,7 +458,7 @@ public class Desktop extends jalview.jbgui.GDesktop * @j2sIgnore */ { - + jconsole = new Console(this, showjconsole); // add essential build information jconsole.setHeader("Jalview Version: " @@ -458,19 +471,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 @@ -479,7 +492,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. @@ -499,7 +512,7 @@ public class Desktop extends jalview.jbgui.GDesktop changeSupport.addJalviewPropertyChangeListener("services", new PropertyChangeListener() { - + @Override public void propertyChange(PropertyChangeEvent evt) { @@ -507,13 +520,13 @@ public class Desktop extends jalview.jbgui.GDesktop + evt.getNewValue()); JalviewServicesChanged(evt); } - + }); - + } - - this.setDropTarget(new java.awt.dnd.DropTarget(getDesktopPane(), this)); - + + this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this)); + this.addWindowListener(new WindowAdapter() { @Override @@ -522,7 +535,7 @@ public class Desktop extends jalview.jbgui.GDesktop quit(); } }); - + MouseAdapter ma; this.addMouseListener(ma = new MouseAdapter() { @@ -534,7 +547,7 @@ public class Desktop extends jalview.jbgui.GDesktop showPasteMenu(evt.getX(), evt.getY()); } } - + @Override public void mouseReleased(MouseEvent evt) { @@ -544,8 +557,11 @@ public class Desktop extends jalview.jbgui.GDesktop } } }); - getDesktopPane().addMouseListener(ma); - + desktopPane.addMouseListener(ma); + } catch (Throwable t) + { + t.printStackTrace(); + } } /** @@ -621,7 +637,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } }).start(); - ; + } @Override @@ -642,10 +658,10 @@ public class Desktop extends jalview.jbgui.GDesktop public void run() { long now = System.currentTimeMillis(); - Desktop.getInstance().setProgressBar( + setProgressBar( MessageManager.getString("status.refreshing_news"), now); jvnews.refreshNews(); - Desktop.getInstance().setProgressBar(null, now); + setProgressBar(null, now); jvnews.showNews(); } }).start(); @@ -783,7 +799,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) @@ -878,13 +894,14 @@ public class Desktop extends jalview.jbgui.GDesktop int w, int h, boolean resizable, boolean ignoreMinSize) { + // 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 frame.setTitle(title); - if (frame.getWidth() < 1 || frame.getHeight() < 1) + if (w > 0 && (frame.getWidth() < 1 || frame.getHeight() < 1)) { frame.setSize(w, h); } @@ -892,7 +909,7 @@ public class Desktop extends jalview.jbgui.GDesktop // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN // IF JALVIEW IS RUNNING HEADLESS // /////////////////////////////////////////////// - if (getInstance() == null || Jalview.isHeadlessMode()) + if (Jalview.isHeadlessMode() || Desktop.getInstance().instanceOnly) { return; } @@ -970,8 +987,8 @@ public class Desktop extends jalview.jbgui.GDesktop { menuItem.removeActionListener(menuItem.getActionListeners()[0]); } - getInstance().windowMenu.remove(menuItem); - }; + Desktop.getInstance().windowMenu.remove(menuItem); + } }); menuItem.addActionListener(new ActionListener() @@ -994,7 +1011,7 @@ public class Desktop extends jalview.jbgui.GDesktop getDesktopPane().add(frame); - getInstance().windowMenu.add(menuItem); + Desktop.getInstance().windowMenu.add(menuItem); frame.toFront(); try @@ -1130,7 +1147,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) @@ -1187,7 +1204,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } - new FileLoader().LoadFile(viewport, selectedFile, + new FileLoader().loadFile(viewport, selectedFile, DataSourceType.FILE, format); } }); @@ -1261,12 +1278,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); } } @@ -1296,12 +1313,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,8 +1521,12 @@ public class Desktop extends jalview.jbgui.GDesktop @Override public void closeAll_actionPerformed(ActionEvent e) { + if (desktopPane == null) + { + return; + } // TODO show a progress bar while closing? - JInternalFrame[] frames = getDesktopPane().getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); for (int i = 0; i < frames.length; i++) { try @@ -1526,12 +1547,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 @@ -1890,7 +1906,7 @@ public class Desktop extends jalview.jbgui.GDesktop { progressPanel = new JPanel(new GridLayout(1, 1)); totalProgressCount = 0; - getInstance().getContentPane().add(progressPanel, BorderLayout.SOUTH); + getContentPane().add(progressPanel, BorderLayout.SOUTH); } JPanel thisprogress = new JPanel(new BorderLayout(10, 5)); JProgressBar progressBar = new JProgressBar(); @@ -1903,7 +1919,7 @@ public class Desktop extends jalview.jbgui.GDesktop ((GridLayout) progressPanel.getLayout()).setRows( ((GridLayout) progressPanel.getLayout()).getRows() + 1); ++totalProgressCount; - getInstance().validate(); + validate(); return thisprogress; } @@ -2085,7 +2101,7 @@ public class Desktop extends jalview.jbgui.GDesktop { source.viewport.setGatherViewsHere(true); source.viewport.setExplodedGeometry(source.getBounds()); - JInternalFrame[] frames = getDesktopPane().getAllFrames(); + JInternalFrame[] frames = getAllFrames(); String viewId = source.viewport.getSequenceSetId(); for (int t = 0; t < frames.length; t++) @@ -2374,7 +2390,7 @@ public class Desktop extends jalview.jbgui.GDesktop }); rthr.start(); } - }; + } }); VamsasStMenu.add(sessit); } @@ -2480,7 +2496,7 @@ public class Desktop extends jalview.jbgui.GDesktop public JInternalFrame[] getAllFrames() { - return getDesktopPane().getAllFrames(); + return desktopPane.getAllFrames(); } /** @@ -2566,7 +2582,7 @@ public class Desktop extends jalview.jbgui.GDesktop }); msgPanel.add(jcb); - JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), msgPanel, + JvOptionPane.showMessageDialog(desktopPane, msgPanel, MessageManager .getString("label.SEQUENCE_ID_no_longer_used"), JvOptionPane.WARNING_MESSAGE); @@ -2766,7 +2782,7 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (Exception ex) { jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex); - JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), + JvOptionPane.showInternalMessageDialog(desktopPane, MessageManager.getString("label.couldnt_create_groovy_shell"), MessageManager.getString("label.groovy_support_failed"), @@ -3024,7 +3040,7 @@ public class Desktop extends jalview.jbgui.GDesktop // todo: changesupport handlers need to be transferred if (discoverer == null) { - discoverer = new jalview.ws.jws1.Discoverer(); + discoverer = Discoverer.getInstance(); // register PCS handler for getDesktop(). discoverer.addPropertyChangeListener(changeSupport); } @@ -3035,7 +3051,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; @@ -3068,7 +3084,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) { @@ -3193,7 +3209,7 @@ public class Desktop extends jalview.jbgui.GDesktop public static ParamManager getUserParameterStore() { - Desktop d = getInstance(); + Desktop d = Desktop.getInstance(); if (d.wsparamManager == null) { d.wsparamManager = new WsParamSetManager(); @@ -3274,9 +3290,8 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (InterruptedException x) { } - ; } - if (getInstance() == null) + if (instanceOnly) { return; } @@ -3440,7 +3455,7 @@ public class Desktop extends jalview.jbgui.GDesktop String topViewId = myTopFrame.viewport.getSequenceSetId(); String bottomViewId = myBottomFrame.viewport.getSequenceSetId(); - JInternalFrame[] frames = getDesktopPane().getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); for (JInternalFrame frame : frames) { if (frame instanceof SplitFrame && frame != source) @@ -3485,7 +3500,8 @@ public class Desktop extends jalview.jbgui.GDesktop public static groovy.ui.Console getGroovyConsole() { - return getInstance().groovyConsole; + Desktop desktop = Desktop.getInstance(); + return desktop == null ? null : desktop.groovyConsole; } /** @@ -3563,7 +3579,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) { @@ -3738,7 +3753,7 @@ public class Desktop extends jalview.jbgui.GDesktop Class structureViewerClass) { List result = new ArrayList<>(); - JInternalFrame[] frames = Desktop.getInstance().getAllFrames(); + JInternalFrame[] frames = getAllFrames(); for (JInternalFrame frame : frames) {