X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=bbd38ec9010d3c1cabcad85b2d09f1893bc3941b;hb=46b3c4f40c784aa33404c90ecf31b5fe600f20be;hp=a894910e24f05529e75dfc59452e2603a734f6f7;hpb=fa8140d4e0510b5c91284ad38f296cbf14ba29a5;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index a894910..bbd38ec 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -94,6 +94,9 @@ import org.stackoverflowusers.file.WindowsShortcut; 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; @@ -108,6 +111,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; @@ -117,7 +121,6 @@ import jalview.util.BrowserLauncher; import jalview.util.ImageMaker.TYPE; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.util.ShortcutKeyMaskExWrapper; import jalview.util.UrlConstants; import jalview.viewmodel.AlignmentViewport; import jalview.ws.params.ParamManager; @@ -130,9 +133,11 @@ import jalview.ws.utils.UrlDownloadClient; * @author $author$ * @version $Revision: 1.155 $ */ -public class Desktop extends jalview.jbgui.GDesktop +@SuppressWarnings("serial") +public class Desktop extends GDesktop implements DropTargetListener, ClipboardOwner, IProgressIndicator, - jalview.api.StructureSelectionManagerProvider + StructureSelectionManagerProvider, ApplicationSingletonI + { private static final String CITATION = "

Development managed by The Barton Group, University of Dundee, Scotland, UK.
" + "

For help, see the FAQ at www.jalview.org/faq and/or join the jalview-discuss@jalview.org mailing list" @@ -201,26 +206,26 @@ public class Desktop extends jalview.jbgui.GDesktop listener); } - /** Singleton Desktop instance */ - public static Desktop instance; + private MyDesktopPane desktopPane; + + public static MyDesktopPane getDesktopPane() + { + Desktop desktop = getInstance(); + return desktop == null ? null : desktop.desktopPane; + } /** - * BH TEMPORARY ONLY -- should use ApplicationSingleton + * 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 instance; - } - - public static MyDesktopPane desktop; - - public static MyDesktopPane getDesktopPane() - { - // BH 2018 could use currentThread() here as a reference to a - // Hashtable in JavaScript - return desktop; + return Jalview.isHeadlessMode() ? null + : (Desktop) ApplicationSingletonProvider + .getInstance(Desktop.class); } public static StructureSelectionManager getStructureSelectionManager() @@ -229,19 +234,19 @@ public class Desktop extends jalview.jbgui.GDesktop .getStructureSelectionManager(getInstance()); } - static int openFrameCount = 0; + int openFrameCount = 0; - static final int xOffset = 30; + final int xOffset = 30; - static final int yOffset = 30; + final int yOffset = 30; - public static jalview.ws.jws1.Discoverer discoverer; + public jalview.ws.jws1.Discoverer discoverer; - public static Object[] jalviewClipboard; + public Object[] jalviewClipboard; - public static boolean internalCopy = false; + public boolean internalCopy = false; - static int fileLoadingCount = 0; + int fileLoadingCount = 0; class MyDesktopManager implements DesktopManager { @@ -262,7 +267,7 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (NullPointerException npe) { Point p = getMousePosition(); - instance.showPasteMenu(p.x, p.y); + showPasteMenu(p.x, p.y); } } @@ -310,14 +315,14 @@ public class Desktop extends jalview.jbgui.GDesktop public void endDraggingFrame(JComponent f) { delegate.endDraggingFrame(f); - desktop.repaint(); + desktopPane.repaint(); } @Override public void endResizingFrame(JComponent f) { delegate.endResizingFrame(f); - desktop.repaint(); + desktopPane.repaint(); } @Override @@ -367,190 +372,199 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Creates a new Desktop object. + * Private constructor enforces singleton pattern. It is called by reflection + * from ApplicationSingletonProvider.getInstance(). */ - public Desktop() + private Desktop() { - super(); - /** - * 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 = this; - - doConfigureStructurePrefs(); - setTitle("Jalview " + Cache.getProperty("VERSION")); - /* - if (!Platform.isAMac()) - { - // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - } - else - { - this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - } - */ - + Cache.initLogger(); try { - APQHandlers.setAPQHandlers(this); - } catch (Throwable t) - { - System.out.println("Error setting APQHandlers: " + t.toString()); - // t.printStackTrace(); - } - - addWindowListener(new WindowAdapter() - { + /** + * 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. + */ - @Override - public void windowClosing(WindowEvent ev) + doConfigureStructurePrefs(); + setTitle("Jalview " + Cache.getProperty("VERSION")); + /* + if (!Platform.isAMac()) { - quit(); + // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } - }); + else + { + this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + } + */ - boolean selmemusage = Cache.getDefault("SHOW_MEMUSAGE", - false); + try + { + APQHandlers.setAPQHandlers(this); + } catch (Throwable t) + { + System.out.println("Error setting APQHandlers: " + t.toString()); + // t.printStackTrace(); + } - boolean showjconsole = Cache.getDefault("SHOW_JAVA_CONSOLE", - false); - desktop = new MyDesktopPane(selmemusage); + addWindowListener(new WindowAdapter() + { - showMemusage.setSelected(selmemusage); - desktop.setBackground(Color.white); + @Override + public void windowClosing(WindowEvent ev) + { + quit(); + } + }); - 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); + boolean selmemusage = Cache.getDefault("SHOW_MEMUSAGE", false); - // BH 2018 - just an experiment to try unclipped JInternalFrames. - if (Platform.isJS()) - { - getRootPane().putClientProperty("swingjs.overflow.hidden", "false"); - } + boolean showjconsole = Cache.getDefault("SHOW_JAVA_CONSOLE", false); + desktopPane = new MyDesktopPane(selmemusage); - getContentPane().add(desktop, BorderLayout.CENTER); - desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); + showMemusage.setSelected(selmemusage); + desktopPane.setBackground(Color.white); - // This line prevents Windows Look&Feel resizing all new windows to maximum - // if previous window was maximised - desktop.setDesktopManager(new MyDesktopManager( - (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager() - : Platform.isAMacAndNotJS() - ? new AquaInternalFrameManager( - desktop.getDesktopManager()) - : desktop.getDesktopManager()))); + 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); - Rectangle dims = getLastKnownDimensions(""); - if (dims != null) - { - setBounds(dims); - } - else - { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int xPos = Math.max(5, (screenSize.width - 900) / 2); - int yPos = Math.max(5, (screenSize.height - 650) / 2); - setBounds(xPos, yPos, 900, 650); - } + // BH 2018 - just an experiment to try unclipped JInternalFrames. + if (Platform.isJS()) + { + getRootPane().putClientProperty("swingjs.overflow.hidden", "false"); + } - if (!Platform.isJS()) - /** - * Java only - * - * @j2sIgnore - */ - { - jconsole = new Console(this, showjconsole); - jconsole.setHeader(Cache.getVersionDetailsForConsole()); - showConsole(showjconsole); + getContentPane().add(desktopPane, BorderLayout.CENTER); + desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); - showNews.setVisible(false); + // This line prevents Windows Look&Feel resizing all new windows to + // maximum + // if previous window was maximised + desktopPane.setDesktopManager(new MyDesktopManager( + (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager() + : Platform.isAMacAndNotJS() + ? new AquaInternalFrameManager( + desktopPane.getDesktopManager()) + : desktopPane.getDesktopManager()))); - experimentalFeatures.setSelected(showExperimental()); + Rectangle dims = getLastKnownDimensions(""); + if (dims != null) + { + setBounds(dims); + } + else + { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int xPos = Math.max(5, (screenSize.width - 900) / 2); + int yPos = Math.max(5, (screenSize.height - 650) / 2); + setBounds(xPos, yPos, 900, 650); + } getIdentifiersOrgData(); - checkURLLinks(); + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ + { + jconsole = new Console(this, showjconsole); + jconsole.setHeader(Cache.getVersionDetailsForConsole()); + showConsole(showjconsole); - // Spawn a thread that shows the splashscreen + showNews.setVisible(false); - SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - new SplashScreen(true); - } - }); + experimentalFeatures.setSelected(showExperimental()); - // Thread off a new instance of the file chooser - this reduces the time - // it - // takes to open it later on. - new Thread(new Runnable() - { - @Override - public void run() + if (Jalview.isInteractive()) { - Cache.log.debug("Filechooser init thread started."); - String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT"); - JalviewFileChooser.forRead(Cache.getProperty("LAST_DIRECTORY"), - fileFormat); - Cache.log.debug("Filechooser init thread finished."); - } - }).start(); - // Add the service change listener - changeSupport.addJalviewPropertyChangeListener("services", - new PropertyChangeListener() - { + // disabled for SeqCanvasTest + checkURLLinks(); - @Override - public void propertyChange(PropertyChangeEvent evt) - { - Cache.log.debug("Firing service changed event for " - + evt.getNewValue()); - JalviewServicesChanged(evt); - } - }); - } + // Spawn a thread that shows the splashscreen - this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this)); + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + new SplashScreen(true); + } + }); - this.addWindowListener(new WindowAdapter() - { - @Override - public void windowClosing(WindowEvent evt) - { - quit(); + // Thread off a new instance of the file chooser - this reduces the + // time + // it + // takes to open it later on. + new Thread(new Runnable() + { + @Override + public void run() + { + Cache.log.debug("Filechooser init thread started."); + String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT"); + JalviewFileChooser.forRead( + Cache.getProperty("LAST_DIRECTORY"), fileFormat); + Cache.log.debug("Filechooser init thread finished."); + } + }).start(); + // Add the service change listener + changeSupport.addJalviewPropertyChangeListener("services", + new PropertyChangeListener() + { + + @Override + public void propertyChange(PropertyChangeEvent evt) + { + Cache.log.debug("Firing service changed event for " + + evt.getNewValue()); + JalviewServicesChanged(evt); + } + }); + } } - }); + this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this)); - MouseAdapter ma; - this.addMouseListener(ma = new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent evt) + this.addWindowListener(new WindowAdapter() { - if (evt.isPopupTrigger()) // Mac + @Override + public void windowClosing(WindowEvent evt) { - showPasteMenu(evt.getX(), evt.getY()); + quit(); } - } + }); - @Override - public void mouseReleased(MouseEvent evt) + MouseAdapter ma; + this.addMouseListener(ma = new MouseAdapter() { - if (evt.isPopupTrigger()) // Windows + @Override + public void mousePressed(MouseEvent evt) { - showPasteMenu(evt.getX(), evt.getY()); + if (evt.isPopupTrigger()) // Mac + { + showPasteMenu(evt.getX(), evt.getY()); + } } - } - }); - desktop.addMouseListener(ma); + + @Override + public void mouseReleased(MouseEvent evt) + { + if (evt.isPopupTrigger()) // Windows + { + showPasteMenu(evt.getX(), evt.getY()); + } + } + }); + desktopPane.addMouseListener(ma); + } catch (Throwable t) + { + t.printStackTrace(); + } } @@ -574,10 +588,10 @@ public class Desktop extends jalview.jbgui.GDesktop .getStructureSelectionManager(this); if (Cache.getDefault(Preferences.ADD_SS_ANN, true)) { - ssm.setAddTempFacAnnot(Cache - .getDefault(Preferences.ADD_TEMPFACT_ANN, true)); - ssm.setProcessSecondaryStructure(Cache - .getDefault(Preferences.STRUCT_FROM_PDB, true)); + ssm.setAddTempFacAnnot( + Cache.getDefault(Preferences.ADD_TEMPFACT_ANN, true)); + ssm.setProcessSecondaryStructure( + Cache.getDefault(Preferences.STRUCT_FROM_PDB, true)); ssm.setSecStructServices( Cache.getDefault(Preferences.USE_RNAVIEW, true)); } @@ -626,7 +640,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } }).start(); - + } @Override @@ -647,10 +661,10 @@ public class Desktop extends jalview.jbgui.GDesktop public void run() { long now = System.currentTimeMillis(); - Desktop.instance.setProgressBar( - MessageManager.getString("status.refreshing_news"), now); + setProgressBar(MessageManager.getString("status.refreshing_news"), + now); jvnews.refreshNews(); - Desktop.instance.setProgressBar(null, now); + setProgressBar(null, now); jvnews.showNews(); } }).start(); @@ -671,10 +685,8 @@ public class Desktop extends jalview.jbgui.GDesktop Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); String x = Cache.getProperty(windowName + "SCREEN_X"); String y = Cache.getProperty(windowName + "SCREEN_Y"); - String width = Cache - .getProperty(windowName + "SCREEN_WIDTH"); - String height = Cache - .getProperty(windowName + "SCREEN_HEIGHT"); + String width = Cache.getProperty(windowName + "SCREEN_WIDTH"); + String height = Cache.getProperty(windowName + "SCREEN_HEIGHT"); if ((x != null) && (y != null) && (width != null) && (height != null)) { int ix = Integer.parseInt(x), iy = Integer.parseInt(y), @@ -684,10 +696,10 @@ public class Desktop extends jalview.jbgui.GDesktop // attempt #1 - try to cope with change in screen geometry - this // version doesn't preserve original jv aspect ratio. // take ratio of current screen size vs original screen size. - double sw = ((1f * screenSize.width) / (1f * Integer.parseInt( - Cache.getProperty("SCREENGEOMETRY_WIDTH")))); - double sh = ((1f * screenSize.height) / (1f * Integer.parseInt( - Cache.getProperty("SCREENGEOMETRY_HEIGHT")))); + double sw = ((1f * screenSize.width) / (1f * Integer + .parseInt(Cache.getProperty("SCREENGEOMETRY_WIDTH")))); + double sh = ((1f * screenSize.height) / (1f * Integer + .parseInt(Cache.getProperty("SCREENGEOMETRY_HEIGHT")))); // rescale the bounds depending upon the current screen geometry. ix = (int) (ix * sw); iw = (int) (iw * sw); @@ -758,48 +770,60 @@ public class Desktop extends jalview.jbgui.GDesktop } } - /** - * Adds and opens the given frame to the desktop - * - * @param frame - * Frame to show - * @param title - * Visible Title - * @param w - * width - * @param h - * height - */ - public static synchronized void addInternalFrame( - final JInternalFrame frame, String title, int w, int h) - { - addInternalFrame(frame, title, true, w, h, true, false); - } - - /** - * 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 - */ - public static synchronized void addInternalFrame( - final JInternalFrame frame, String title, boolean makeVisible, - int w, int h) - { - addInternalFrame(frame, title, makeVisible, w, h, true, false); - } +// /** +// * Add an internal frame to the Jalview desktop that is allowed to be resized, +// * has a minimum size of 300px and might or might not be visible +// * +// * @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 +// */ +// @Deprecated +// public static synchronized void addInternalFrame( +// final JInternalFrame frame, String title, boolean makeVisible, +// int w, int h) +// { +// // textbox, web services, sequenceFetcher, featureSettings +// getInstance().addFrame(frame, title, makeVisible, w, h, +// FRAME_ALLOW_RESIZE, FRAME_SET_MIN_SIZE_300); +// } +// +// /** +// * Add an internal frame to the Jalview desktop that is visible, has a minimum +// * size of 300px, and may or may not be resizable +// * +// * @param frame +// * Frame to show +// * @param title +// * Visible Title +// * @param w +// * width +// * @param h +// * height +// * @param resizable +// * Allow resize +// */ +// @Deprecated +// public static synchronized void addInternalFrame( +// final JInternalFrame frame, String title, int w, int h, +// boolean resizable) +// { +// // annotation, font, calculation, user-defined colors +// getInstance().addFrame(frame, title, FRAME_MAKE_VISIBLE, w, h, +// resizable, FRAME_SET_MIN_SIZE_300); +// } /** - * Add an internal frame to the Jalview desktop and make it visible + * Adds and opens the given frame to the desktop that is visible, allowed to + * resize, and has a 300px minimum width. * * @param frame * Frame to show @@ -809,18 +833,19 @@ public class Desktop extends jalview.jbgui.GDesktop * width * @param h * height - * @param resizable - * Allow resize */ public static synchronized void addInternalFrame( - final JInternalFrame frame, String title, int w, int h, - boolean resizable) + final JInternalFrame frame, String title, int w, int h) { - addInternalFrame(frame, title, true, w, h, resizable, false); + // 58 classes + + addInternalFrame(frame, title, Desktop.FRAME_MAKE_VISIBLE, w, h, + FRAME_ALLOW_RESIZE, FRAME_SET_MIN_SIZE_300); } /** - * Add an internal frame to the Jalview desktop + * Add an internal frame to the Jalview desktop that may optionally be + * visible, resizable, and allowed to be any size * * @param frame * Frame to show @@ -842,7 +867,8 @@ public class Desktop extends jalview.jbgui.GDesktop final JInternalFrame frame, String title, boolean makeVisible, int w, int h, boolean resizable, boolean ignoreMinSize) { - + // 15 classes call this method directly. + // 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 @@ -853,23 +879,39 @@ public class Desktop extends jalview.jbgui.GDesktop { frame.setSize(w, h); } - // THIS IS A PUBLIC STATIC METHOD, SO IT MAY BE CALLED EVEN IN - // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN - // IF JALVIEW IS RUNNING HEADLESS - // /////////////////////////////////////////////// - if (instance == null || (System.getProperty("java.awt.headless") != null - && System.getProperty("java.awt.headless").equals("true"))) - { - return; - } + if (getInstance() != null) + getInstance().addFrame(frame, makeVisible, resizable, + ignoreMinSize); + } - openFrameCount++; + // These can now by put into a single int flag, if desired: + + public final static boolean FRAME_MAKE_VISIBLE = true; + + public final static boolean FRAME_NOT_VISIBLE = false; + + public final static boolean FRAME_ALLOW_RESIZE = true; + public final static boolean FRAME_NOT_RESIZABLE = false; + + public final static boolean FRAME_ALLOW_ANY_SIZE = true; + + public final static boolean FRAME_SET_MIN_SIZE_300 = false; + + private void addFrame(JInternalFrame frame, + boolean makeVisible, boolean resizable, + boolean ignoreMinSize) + { + + openFrameCount++; + + boolean isEmbedded = (Platform.getEmbeddedAttribute(frame, "id") != null); + boolean hasEmbeddedSize = (Platform.getDimIfEmbedded(frame, -1, -1) != null); + // Web page embedding allows us to ignore minimum size + ignoreMinSize |= hasEmbeddedSize; + if (!ignoreMinSize) { - frame.setMinimumSize( - new Dimension(DEFAULT_MIN_WIDTH, DEFAULT_MIN_HEIGHT)); - // Set default dimension for Alignment Frame window. // The Alignment Frame window could be added from a number of places, // hence, @@ -878,6 +920,10 @@ public class Desktop extends jalview.jbgui.GDesktop { frame.setMinimumSize(new Dimension(ALIGN_FRAME_DEFAULT_MIN_WIDTH, ALIGN_FRAME_DEFAULT_MIN_HEIGHT)); + } else { + frame.setMinimumSize( + new Dimension(DEFAULT_MIN_WIDTH, DEFAULT_MIN_HEIGHT)); + } } @@ -887,7 +933,6 @@ public class Desktop extends jalview.jbgui.GDesktop frame.setMaximizable(resizable); frame.setIconifiable(resizable); frame.setOpaque(Platform.isJS()); - boolean isEmbedded = (Platform.getDimIfEmbedded(frame, -1, -1) != null); if (!isEmbedded && frame.getX() < 1 && frame.getY() < 1) { frame.setLocation(xOffset * openFrameCount, @@ -898,13 +943,13 @@ public class Desktop extends jalview.jbgui.GDesktop * add an entry for the new frame in the Window menu * (and remove it when the frame is closed) */ - final JMenuItem menuItem = new JMenuItem(title); + final JMenuItem menuItem = new JMenuItem(frame.getTitle()); frame.addInternalFrameListener(new InternalFrameAdapter() { @Override public void internalFrameActivated(InternalFrameEvent evt) { - JInternalFrame itf = desktop.getSelectedFrame(); + JInternalFrame itf = getDesktopPane().getSelectedFrame(); if (itf != null) { if (itf instanceof AlignFrame) @@ -936,7 +981,7 @@ public class Desktop extends jalview.jbgui.GDesktop { menuItem.removeActionListener(menuItem.getActionListeners()[0]); } - windowMenu.remove(menuItem); + getInstance().windowMenu.remove(menuItem); } }); @@ -958,9 +1003,9 @@ public class Desktop extends jalview.jbgui.GDesktop setKeyBindings(frame); - desktop.add(frame); + getDesktopPane().add(frame); - windowMenu.add(menuItem); + getInstance().windowMenu.add(menuItem); frame.toFront(); try @@ -978,14 +1023,13 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Add key bindings to a JInternalFrame so that Ctrl-W and Cmd-W will close the - * window + * Add key bindings to a JInternalFrame so that Ctrl-W and Cmd-W will close + * the window * * @param frame */ private static void setKeyBindings(JInternalFrame frame) { - @SuppressWarnings("serial") final Action closeAction = new AbstractAction() { @Override @@ -1001,7 +1045,7 @@ public class Desktop extends jalview.jbgui.GDesktop KeyStroke ctrlWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_DOWN_MASK); KeyStroke cmdWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W, - ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()); + Platform.SHORTCUT_KEY_MASK); InputMap inputMap = frame .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); @@ -1018,7 +1062,7 @@ public class Desktop extends jalview.jbgui.GDesktop { if (!internalCopy) { - Desktop.jalviewClipboard = null; + jalviewClipboard = null; } internalCopy = false; @@ -1063,7 +1107,7 @@ public class Desktop extends jalview.jbgui.GDesktop try { - Desktop.transferFromDropTarget(files, protocols, evt, t); + transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { e.printStackTrace(); @@ -1119,8 +1163,9 @@ public class Desktop extends jalview.jbgui.GDesktop public void inputLocalFileMenuItem_actionPerformed(AlignViewport viewport) { String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT"); - JalviewFileChooser chooser = JalviewFileChooser - .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, BackupFiles.getEnabled()); + JalviewFileChooser chooser = JalviewFileChooser.forRead( + Cache.getProperty("LAST_DIRECTORY"), fileFormat, + BackupFiles.getEnabled()); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( @@ -1253,7 +1298,7 @@ public class Desktop extends jalview.jbgui.GDesktop { String msg = MessageManager .formatMessage("label.couldnt_locate", url); - JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg, + JvOptionPane.showInternalMessageDialog(getDesktopPane(), msg, MessageManager.getString("label.url_not_found"), JvOptionPane.WARNING_MESSAGE); @@ -1274,7 +1319,7 @@ public class Desktop extends jalview.jbgui.GDesktop }; String dialogOption = MessageManager .getString("label.input_alignment_from_url"); - JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action) + JvOptionPane.newOptionDialog(desktopPane).setResponseHandler(0, action) .showInternalDialog(panel, dialogOption, JvOptionPane.YES_NO_CANCEL_OPTION, JvOptionPane.PLAIN_MESSAGE, null, options, @@ -1294,9 +1339,10 @@ public class Desktop extends jalview.jbgui.GDesktop { CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(viewPanel); - Desktop.addInternalFrame(cap, - MessageManager.getString("label.cut_paste_alignmen_file"), true, - 600, 500); + addInternalFrame(cap, + MessageManager.getString("label.cut_paste_alignmen_file"), + FRAME_MAKE_VISIBLE, 600, 500, FRAME_ALLOW_RESIZE, + FRAME_SET_MIN_SIZE_300); } /* @@ -1306,10 +1352,8 @@ public class Desktop extends jalview.jbgui.GDesktop public void quit() { Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - Cache.setProperty("SCREENGEOMETRY_WIDTH", - screen.width + ""); - Cache.setProperty("SCREENGEOMETRY_HEIGHT", - screen.height + ""); + Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + ""); + Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + ""); storeLastKnownDimensions("", new Rectangle(getBounds().x, getBounds().y, getWidth(), getHeight())); @@ -1340,9 +1384,9 @@ public class Desktop extends jalview.jbgui.GDesktop private void storeLastKnownDimensions(String string, Rectangle jc) { - Cache.log.debug("Storing last known dimensions for " - + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width - + " height:" + jc.height); + Cache.log.debug("Storing last known dimensions for " + string + ": x:" + + jc.x + " y:" + jc.y + " width:" + jc.width + " height:" + + jc.height); Cache.setProperty(string + "SCREEN_X", jc.x + ""); Cache.setProperty(string + "SCREEN_Y", jc.y + ""); @@ -1453,7 +1497,7 @@ public class Desktop extends jalview.jbgui.GDesktop public void closeAll_actionPerformed(ActionEvent e) { // TODO show a progress bar while closing? - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); for (int i = 0; i < frames.length; i++) { try @@ -1520,7 +1564,7 @@ public class Desktop extends jalview.jbgui.GDesktop @Override protected void showMemusage_actionPerformed(ActionEvent e) { - desktop.showMemoryUsage(showMemusage.isSelected()); + desktopPane.showMemoryUsage(showMemusage.isSelected()); } /* @@ -1557,7 +1601,7 @@ public class Desktop extends jalview.jbgui.GDesktop void reorderAssociatedWindows(boolean minimize, boolean close) { - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); if (frames == null || frames.length < 1) { return; @@ -1697,16 +1741,17 @@ public class Desktop extends jalview.jbgui.GDesktop setProgressBar(MessageManager.formatMessage( "label.saving_jalview_project", new Object[] { chosenFile.getName() }), chosenFile.hashCode()); - Cache.setProperty("LAST_DIRECTORY", - chosenFile.getParent()); + Cache.setProperty("LAST_DIRECTORY", chosenFile.getParent()); // TODO catch and handle errors for savestate // TODO prevent user from messing with the Desktop whilst we're saving try { - boolean doBackup = BackupFiles.getEnabled(); - BackupFiles backupfiles = doBackup ? new BackupFiles(chosenFile) : null; + boolean doBackup = BackupFiles.getEnabled(); + BackupFiles backupfiles = doBackup ? new BackupFiles(chosenFile) + : null; - new Jalview2XML().saveState(doBackup ? backupfiles.getTempFile() : chosenFile); + new Jalview2XML().saveState( + doBackup ? backupfiles.getTempFile() : chosenFile); if (doBackup) { @@ -1732,7 +1777,7 @@ public class Desktop extends jalview.jbgui.GDesktop setProgressBar(null, chosenFile.hashCode()); } }).start(); - } + } } @Override @@ -1763,8 +1808,10 @@ public class Desktop extends jalview.jbgui.GDesktop "Jalview Project (old)" }; JalviewFileChooser chooser = new JalviewFileChooser( Cache.getProperty("LAST_DIRECTORY"), suffix, desc, - "Jalview Project", true, BackupFiles.getEnabled()); // last two booleans: allFiles, - // allowBackupFiles + "Jalview Project", true, BackupFiles.getEnabled()); // last two + // booleans: + // allFiles, + // allowBackupFiles chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle(MessageManager.getString("label.restore_state")); chooser.setResponseHandler(0, new Runnable() @@ -1781,29 +1828,30 @@ public class Desktop extends jalview.jbgui.GDesktop @Override public void run() { - try + try { new Jalview2XML().loadJalviewAlign(selectedFile); } catch (OutOfMemoryError oom) - { - new OOMWarning("Whilst loading project from " + choice, oom); - } catch (Exception ex) - { - Cache.log.error( - "Problems whilst loading project from " + choice, ex); - JvOptionPane.showMessageDialog(Desktop.desktop, - MessageManager.formatMessage( - "label.error_whilst_loading_project_from", - new Object[] - { choice }), - MessageManager.getString("label.couldnt_load_project"), - JvOptionPane.WARNING_MESSAGE); - } + { + new OOMWarning("Whilst loading project from " + choice, oom); + } catch (Exception ex) + { + Cache.log.error( + "Problems whilst loading project from " + choice, ex); + JvOptionPane.showMessageDialog(getDesktopPane(), + MessageManager.formatMessage( + "label.error_whilst_loading_project_from", + new Object[] + { choice }), + MessageManager + .getString("label.couldnt_load_project"), + JvOptionPane.WARNING_MESSAGE); + } } }).start(); } }); - + chooser.showOpenDialog(this); } @@ -1834,7 +1882,7 @@ public class Desktop extends jalview.jbgui.GDesktop { progressPanel = new JPanel(new GridLayout(1, 1)); totalProgressCount = 0; - instance.getContentPane().add(progressPanel, BorderLayout.SOUTH); + getContentPane().add(progressPanel, BorderLayout.SOUTH); } JPanel thisprogress = new JPanel(new BorderLayout(10, 5)); JProgressBar progressBar = new JProgressBar(); @@ -1847,7 +1895,7 @@ public class Desktop extends jalview.jbgui.GDesktop ((GridLayout) progressPanel.getLayout()).setRows( ((GridLayout) progressPanel.getLayout()).getRows() + 1); ++totalProgressCount; - instance.validate(); + validate(); return thisprogress; } @@ -1901,7 +1949,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static AlignmentPanel[] getAlignmentPanels(String alignmentId) { - if (Desktop.desktop == null) + if (getDesktopPane() == null) { // no frames created and in headless mode // TODO: verify that frames are recoverable when in headless mode @@ -1943,9 +1991,9 @@ public class Desktop extends jalview.jbgui.GDesktop public static AlignmentViewport[] getViewports(String sequenceSetId) { List viewp = new ArrayList<>(); - if (desktop != null) + if (getDesktopPane() != null) { - AlignFrame[] frames = Desktop.getAlignFrames(); + AlignFrame[] frames = getAlignFrames(); for (AlignFrame afr : frames) { @@ -1992,9 +2040,7 @@ public class Desktop extends jalview.jbgui.GDesktop // FIXME: ideally should use UI interface API FeatureSettings viewFeatureSettings = (af.featureSettings != null - && af.featureSettings.isOpen()) - ? af.featureSettings - : null; + && af.featureSettings.isOpen()) ? af.featureSettings : null; Rectangle fsBounds = af.getFeatureSettingsGeometry(); for (int i = 0; i < size; i++) { @@ -2027,7 +2073,8 @@ public class Desktop extends jalview.jbgui.GDesktop addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - // and materialise a new feature settings dialog instance for the new alignframe + // and materialise a new feature settings dialog instance for the new + // alignframe // (closes the old as if 'OK' was pressed) if (ap == af.alignPanel && newaf.featureSettings != null && newaf.featureSettings.isOpen() @@ -2045,9 +2092,9 @@ public class Desktop extends jalview.jbgui.GDesktop /** * Gather expanded views (separate AlignFrame's) with the same sequence set - * identifier back in to this frame as additional views, and close the expanded - * views. Note the expanded frames may themselves have multiple views. We take - * the lot. + * identifier back in to this frame as additional views, and close the + * expanded views. Note the expanded frames may themselves have multiple + * views. We take the lot. * * @param source */ @@ -2055,7 +2102,7 @@ public class Desktop extends jalview.jbgui.GDesktop { source.viewport.setGatherViewsHere(true); source.viewport.setExplodedGeometry(source.getBounds()); - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); String viewId = source.viewport.getSequenceSetId(); for (int t = 0; t < frames.length; t++) { @@ -2099,8 +2146,7 @@ public class Desktop extends jalview.jbgui.GDesktop } // refresh the feature setting UI for the source frame if it exists - if (source.featureSettings != null - && source.featureSettings.isOpen()) + if (source.featureSettings != null && source.featureSettings.isOpen()) { source.showFeatureSettingsUI(); } @@ -2108,7 +2154,7 @@ public class Desktop extends jalview.jbgui.GDesktop public JInternalFrame[] getAllFrames() { - return desktop.getAllFrames(); + return desktopPane.getAllFrames(); } /** @@ -2194,7 +2240,7 @@ public class Desktop extends jalview.jbgui.GDesktop }); msgPanel.add(jcb); - JvOptionPane.showMessageDialog(Desktop.desktop, msgPanel, + JvOptionPane.showMessageDialog(desktopPane, msgPanel, MessageManager .getString("label.SEQUENCE_ID_no_longer_used"), JvOptionPane.WARNING_MESSAGE); @@ -2205,12 +2251,12 @@ public class Desktop extends jalview.jbgui.GDesktop /** * Proxy class for JDesktopPane which optionally displays the current memory - * usage and highlights the desktop area with a red bar if free memory runs low. + * usage and highlights the desktop area with a red bar if free memory runs + * low. * * @author AMW */ - public class MyDesktopPane extends JDesktopPane - implements Runnable + public class MyDesktopPane extends JDesktopPane implements Runnable { private static final float ONE_MB = 1048576f; @@ -2309,11 +2355,10 @@ public class Desktop extends jalview.jbgui.GDesktop { if (Jalview.isHeadlessMode()) { - // Desktop.desktop is null in headless mode - return new AlignFrame[] { Jalview.currentAlignFrame }; + return new AlignFrame[] { Jalview.getInstance().currentAlignFrame }; } - JInternalFrame[] frames = Desktop.desktop.getAllFrames(); + JInternalFrame[] frames = getDesktopPane().getAllFrames(); if (frames == null) { @@ -2358,7 +2403,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public GStructureViewer[] getJmols() { - JInternalFrame[] frames = Desktop.desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); if (frames == null) { @@ -2394,7 +2439,7 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (Exception ex) { Cache.log.error("Groovy Shell Creation failed.", ex); - JvOptionPane.showInternalMessageDialog(Desktop.desktop, + JvOptionPane.showInternalMessageDialog(desktopPane, MessageManager.getString("label.couldnt_create_groovy_shell"), MessageManager.getString("label.groovy_support_failed"), @@ -2447,14 +2492,15 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Bind Ctrl/Cmd-Q to Quit - for reset as Groovy Console takes over this binding - * when opened + * Bind Ctrl/Cmd-Q to Quit - for reset as Groovy Console takes over this + * binding when opened */ protected void addQuitHandler() { + getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, - jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()), + Platform.SHORTCUT_KEY_MASK), "Quit"); getRootPane().getActionMap().put("Quit", new AbstractAction() { @@ -2583,15 +2629,16 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * This will return the first AlignFrame holding the given viewport instance. It - * will break if there are more than one AlignFrames viewing a particular av. + * This will return the first AlignFrame holding the given viewport instance. + * It will break if there are more than one AlignFrames viewing a particular + * av. * * @param viewport * @return alignFrame for viewport */ public static AlignFrame getAlignFrameFor(AlignViewportI viewport) { - if (desktop != null) + if (getDesktopPane() != null) { AlignmentPanel[] aps = getAlignmentPanels( viewport.getSequenceSetId()); @@ -2653,7 +2700,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 = jalview.ws.jws1.Discoverer.getInstance(); // register PCS handler for desktop. discoverer.addPropertyChangeListener(changeSupport); } @@ -2736,7 +2783,7 @@ public class Desktop extends jalview.jbgui.GDesktop * * jd.waitForInput(); */ - JvOptionPane.showConfirmDialog(Desktop.desktop, + JvOptionPane.showConfirmDialog(desktopPane, new JLabel("
" + ermsg + "
" + "

It may be that you have invalid JABA URLs
in your web service preferences," @@ -2773,7 +2820,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static void showUrl(final String url) { - showUrl(url, Desktop.instance); + showUrl(url, getInstance()); } /** @@ -2802,7 +2849,7 @@ public class Desktop extends jalview.jbgui.GDesktop jalview.util.BrowserLauncher.openURL(url); } catch (Exception ex) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, + JvOptionPane.showInternalMessageDialog(getDesktopPane(), MessageManager .getString("label.web_browser_not_found_unix"), MessageManager.getString("label.web_browser_not_found"), @@ -2842,7 +2889,7 @@ public class Desktop extends jalview.jbgui.GDesktop try { url = e.getURL().toString(); - Desktop.showUrl(url); + showUrl(url); } catch (Exception x) { if (url != null) @@ -2901,7 +2948,7 @@ public class Desktop extends jalview.jbgui.GDesktop { } } - if (instance == null) + if (Jalview.isHeadlessMode()) { return; } @@ -2961,8 +3008,8 @@ public class Desktop extends jalview.jbgui.GDesktop /** * Explode the views in the given SplitFrame into separate SplitFrame windows. - * This respects (remembers) any previous 'exploded geometry' i.e. the size and - * location last time the view was expanded (if any). However it does not + * This respects (remembers) any previous 'exploded geometry' i.e. the size + * and location last time the view was expanded (if any). However it does not * remember the split pane divider location - this is set to match the * 'exploding' frame. * @@ -3027,7 +3074,7 @@ public class Desktop extends jalview.jbgui.GDesktop { splitFrame.setLocation(geometry.getLocation()); } - Desktop.addInternalFrame(splitFrame, sf.getTitle(), -1, -1); + addInternalFrame(splitFrame, sf.getTitle(), -1, -1); } /* @@ -3065,7 +3112,7 @@ public class Desktop extends jalview.jbgui.GDesktop String topViewId = myTopFrame.viewport.getSequenceSetId(); String bottomViewId = myBottomFrame.viewport.getSequenceSetId(); - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); for (JInternalFrame frame : frames) { if (frame instanceof SplitFrame && frame != source) @@ -3128,12 +3175,14 @@ public class Desktop extends jalview.jbgui.GDesktop * - the payload from the drop event * @throws Exception */ + @SuppressWarnings("unchecked") public static void transferFromDropTarget(List files, List protocols, DropTargetDropEvent evt, Transferable t) throws Exception { - // BH 2018 changed List to List to allow for File from SwingJS + // BH 2018 changed List to List to allow for File from + // SwingJS // DataFlavor[] flavors = t.getTransferDataFlavors(); // for (int i = 0; i < flavors.length; i++) { @@ -3145,7 +3194,8 @@ public class Desktop extends jalview.jbgui.GDesktop // byte[] data = getDroppedFileBytes(file); // fileName.setText(file.getName() + " - " + data.length + " " + // evt.getLocation()); - // JTextArea target = (JTextArea) ((DropTarget) evt.getSource()).getComponent(); + // JTextArea target = (JTextArea) ((DropTarget) + // evt.getSource()).getComponent(); // target.setText(new String(data)); // } // dtde.dropComplete(true); @@ -3197,7 +3247,7 @@ public class Desktop extends jalview.jbgui.GDesktop { // Works on Windows and MacOSX Cache.log.debug("Drop handled as javaFileListFlavor"); - for (Object file : (List) t + for (File file : (List) t .getTransferData(DataFlavor.javaFileListFlavor)) { files.add(file); @@ -3345,10 +3395,10 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Answers a (possibly empty) list of any structure viewer frames (currently for - * either Jmol or Chimera) which are currently open. This may optionally be - * restricted to viewers of a specified class, or viewers linked to a specified - * alignment panel. + * Answers a (possibly empty) list of any structure viewer frames (currently + * for either Jmol or Chimera) which are currently open. This may optionally + * be restricted to viewers of a specified class, or viewers linked to a + * specified alignment panel. * * @param apanel * if not null, only return viewers linked to this panel @@ -3361,7 +3411,7 @@ public class Desktop extends jalview.jbgui.GDesktop Class structureViewerClass) { List result = new ArrayList<>(); - JInternalFrame[] frames = Desktop.instance.getAllFrames(); + JInternalFrame[] frames = getAllFrames(); for (JInternalFrame frame : frames) {