X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=e13a63e1a4f6791e1e692f77dd00f52016ca6628;hb=14bfc6fb57f123b815f08dbf5b35544abd33b3af;hp=b8f8eabf5a2e2bf062d6594f26b97188baa7e858;hpb=545a83a3607f98d0a1337cdf5954d6215be8cf94;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index b8f8eab..e13a63e 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -20,13 +20,15 @@ */ package jalview.gui; -import static jalview.util.UrlConstants.SEQUENCE_ID; - 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; +import jalview.io.BackupFiles; import jalview.io.DataSourceType; import jalview.io.FileFormat; import jalview.io.FileFormatException; @@ -37,8 +39,10 @@ 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; import jalview.structure.StructureSelectionManager; import jalview.urls.IdOrgSettings; import jalview.util.BrowserLauncher; @@ -46,8 +50,8 @@ import jalview.util.ImageMaker.TYPE; import jalview.util.MessageManager; import jalview.util.Platform; import jalview.util.UrlConstants; -import jalview.util.dialogrunner.RunResponse; import jalview.viewmodel.AlignmentViewport; +import jalview.ws.jws1.Discoverer; import jalview.ws.params.ParamManager; import jalview.ws.utils.UrlDownloadClient; @@ -89,7 +93,6 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.ListIterator; -import java.util.StringTokenizer; import java.util.Vector; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -115,6 +118,7 @@ import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; +import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; @@ -133,26 +137,28 @@ import org.stackoverflowusers.file.WindowsShortcut; * @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 int DEFAULT_MIN_WIDTH = 300; - private static int DEFAULT_MIN_HEIGHT = 250; + private final static int DEFAULT_MIN_WIDTH = 300; + + private final static int DEFAULT_MIN_HEIGHT = 250; - private static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600; + private final static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600; - private static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70; + private final static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70; - private static final String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES"; + private final static String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES"; private JalviewChangeSupport changeSupport = new JalviewChangeSupport(); /** * news reader - null if it was never started. */ - private BlogReader jvnews = null; + BlogReader jvnews = null; private File projectFile; @@ -191,16 +197,16 @@ public class Desktop extends jalview.jbgui.GDesktop listener); } - /** Singleton Desktop instance */ - public static Desktop instance; - - public static MyDesktopPane desktop; + public static MyDesktopPane getDesktopPane() + { + Desktop desktop = Desktop.getInstance(); + return desktop == null ? null : desktop.desktopPane; + } - public static MyDesktopPane getDesktop() + public static StructureSelectionManager getStructureSelectionManager() { - // BH 2018 could use currentThread() here as a reference to a - // Hashtable in JavaScript - return desktop; + return StructureSelectionManager + .getStructureSelectionManager(getInstance()); } static int openFrameCount = 0; @@ -209,13 +215,17 @@ public class Desktop extends jalview.jbgui.GDesktop static final int yOffset = 30; - public static jalview.ws.jws1.Discoverer discoverer; + public Discoverer discoverer; - public static Object[] jalviewClipboard; + public Object[] jalviewClipboard; - public static boolean internalCopy = false; + public boolean internalCopy = false; - static int fileLoadingCount = 0; + private static int fileLoadingCount = 0; + + public JInternalFrame conservationSlider; + + public JInternalFrame PIDSlider; class MyDesktopManager implements DesktopManager { @@ -236,7 +246,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); } } @@ -284,14 +294,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 @@ -340,166 +350,212 @@ 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() { - /** - * 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; - if (!Jalview.isJS()) - { - doVamsasClientCheck(); - } - - doConfigureStructurePrefs(); - setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION")); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE", - false); - boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE", - false); - desktop = new MyDesktopPane(selmemusage); - showMemusage.setSelected(selmemusage); - desktop.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); - getContentPane().add(desktop, BorderLayout.CENTER); - desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); - - // This line prevents Windows Look&Feel resizing all new windows to maximum - // if previous window was maximised - desktop.setDesktopManager(new MyDesktopManager( - (Platform.isWindows() ? new DefaultDesktopManager() - : Platform.isAMac() - ? new AquaInternalFrameManager( - desktop.getDesktopManager()) - : desktop.getDesktopManager()))); - - 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 - * - * @j2sNative - */ + return Jalview.isHeadlessMode() ? null + : (Desktop) ApplicationSingletonProvider + .getInstance(Desktop.class); + } + + /** + * Private constructor enforces singleton pattern. It is called by reflection + * from ApplicationSingletonProvider.getInstance(). + */ + 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. + */ + if (!Platform.isJS()) + { + doVamsasClientCheck(); + } - jconsole = new Console(this, showjconsole); - // add essential build information - jconsole.setHeader("Jalview Version: " - + jalview.bin.Cache.getProperty("VERSION") + "\n" - + "Jalview Installation: " - + jalview.bin.Cache.getDefault("INSTALLATION", "unknown") - + "\n" + "Build Date: " - + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + "\n" - + "Java version: " + System.getProperty("java.version") + "\n" - + System.getProperty("os.arch") + " " - + System.getProperty("os.name") + " " - + System.getProperty("os.version")); + doConfigureStructurePrefs(); + setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION")); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE", + false); + boolean showjconsole = jalview.bin.Cache + .getDefault("SHOW_JAVA_CONSOLE", false); + desktopPane = new MyDesktopPane(selmemusage); - showConsole(showjconsole); + showMemusage.setSelected(selmemusage); + 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); - showNews.setVisible(false); + // BH 2018 - just an experiment to try unclipped JInternalFrames. + if (Platform.isJS()) + { + getRootPane().putClientProperty("swingjs.overflow.hidden", "false"); + } - experimentalFeatures.setSelected(showExperimental()); + getContentPane().add(desktopPane, BorderLayout.CENTER); + desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); - getIdentifiersOrgData(); + // 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()))); - checkURLLinks(); + 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); + } - // Spawn a thread that shows the splashscreen + // Note that this next syntax, checking for Platform.isJS and also + // escaping the code using @j2sIgnore, serves two purposes. It gives + // us an easily findable tag, Platform.isJS(), to places in the code where + // there is something different about the SwingJS implementation. Second, + // it deletes the unneeded Java-only code form the JavaScript version + // completely (@j2sIgnore), since it will never be used there. - SwingUtilities.invokeLater(new Runnable() + if (!Platform.isJS() && !Jalview.isSynchronous()) + /** + * Java only + * + * @j2sIgnore + */ { - @Override - public void run() - { - new SplashScreen(); - } - }); - // 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() + jconsole = new Console(this, showjconsole); + // add essential build information + jconsole.setHeader("Jalview Version: " + + jalview.bin.Cache.getProperty("VERSION") + "\n" + + "Jalview Installation: " + + jalview.bin.Cache.getDefault("INSTALLATION", "unknown") + + "\n" + "Build Date: " + + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + + "\n" + "Java version: " + + System.getProperty("java.version") + "\n" + + 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() { - 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 run() + { + new SplashScreen(); + } + }); - @Override - public void propertyChange(PropertyChangeEvent evt) + // 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() { - Cache.log.debug("Firing service changed event for " - + evt.getNewValue()); - JalviewServicesChanged(evt); - } - }); - - } // end BH 2018 ignore + @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(desktop, this)); + }); - this.addWindowListener(new WindowAdapter() - { - @Override - public void windowClosing(WindowEvent evt) - { - quit(); } - }); - MouseAdapter ma; - this.addMouseListener(ma = new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent evt) + if (!Jalview.isSynchronous()) { - if (evt.isPopupTrigger()) // Mac + this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this)); + + this.addWindowListener(new WindowAdapter() { - showPasteMenu(evt.getX(), evt.getY()); - } - } + @Override + public void windowClosing(WindowEvent evt) + { + quit(); + } + }); - @Override - public void mouseReleased(MouseEvent evt) - { - if (evt.isPopupTrigger()) // Windows + MouseAdapter ma; + this.addMouseListener(ma = new MouseAdapter() { - showPasteMenu(evt.getX(), evt.getY()); - } - } - }); - desktop.addMouseListener(ma); + @Override + public void mousePressed(MouseEvent evt) + { + if (evt.isPopupTrigger()) // Mac + { + showPasteMenu(evt.getX(), evt.getY()); + } + } + @Override + public void mouseReleased(MouseEvent evt) + { + if (evt.isPopupTrigger()) // Windows + { + showPasteMenu(evt.getX(), evt.getY()); + } + } + }); + desktopPane.addMouseListener(ma); + } + } catch (Throwable t) + { + t.printStackTrace(); + } } /** @@ -541,7 +597,7 @@ public class Desktop extends jalview.jbgui.GDesktop { final Desktop me = this; // Thread off the news reader, in case there are connection problems. - addDialogThread(new Runnable() + new Thread(new Runnable() { @Override public void run() @@ -551,22 +607,22 @@ public class Desktop extends jalview.jbgui.GDesktop showNews.setVisible(true); Cache.log.debug("Completed news thread."); } - }); + }).start(); } public void getIdentifiersOrgData() { // Thread off the identifiers fetcher - addDialogThread(new Runnable() + new Thread(new Runnable() { @Override public void run() { Cache.log.debug("Downloading data from identifiers.org"); - UrlDownloadClient client = new UrlDownloadClient(); + // UrlDownloadClient client = new UrlDownloadClient(); try { - client.download(IdOrgSettings.getUrl(), + UrlDownloadClient.download(IdOrgSettings.getUrl(), IdOrgSettings.getDownloadLocation()); } catch (IOException e) { @@ -574,7 +630,8 @@ public class Desktop extends jalview.jbgui.GDesktop + e.getMessage()); } } - }); + }).start(); + } @Override @@ -583,7 +640,7 @@ public class Desktop extends jalview.jbgui.GDesktop showNews(showNews.isSelected()); } - void showNews(boolean visible) + protected void showNews(boolean visible) { Cache.log.debug((visible ? "Showing" : "Hiding") + " news."); showNews.setSelected(visible); @@ -595,10 +652,10 @@ public class Desktop extends jalview.jbgui.GDesktop public void run() { long now = System.currentTimeMillis(); - Desktop.instance.setProgressBar( + setProgressBar( MessageManager.getString("status.refreshing_news"), now); jvnews.refreshNews(); - Desktop.instance.setProgressBar(null, now); + setProgressBar(null, now); jvnews.showNews(); } }).start(); @@ -703,7 +760,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } - void showPasteMenu(int x, int y) + protected void showPasteMenu(int x, int y) { JPopupMenu popup = new JPopupMenu(); JMenuItem item = new JMenuItem( @@ -736,7 +793,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) @@ -831,13 +888,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); } @@ -845,8 +903,7 @@ public class Desktop extends jalview.jbgui.GDesktop // 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"))) + if (Jalview.isHeadlessMode()) { return; } @@ -874,10 +931,10 @@ public class Desktop extends jalview.jbgui.GDesktop frame.setResizable(resizable); frame.setMaximizable(resizable); frame.setIconifiable(resizable); - frame.setOpaque(/** @j2sNative true || */ - false); + frame.setOpaque(Platform.isJS()); - if (frame.getX() < 1 && frame.getY() < 1) + boolean isEmbedded = (Platform.getDimIfEmbedded(frame, -1, -1) != null); + if (!isEmbedded && frame.getX() < 1 && frame.getY() < 1) { frame.setLocation(xOffset * openFrameCount, yOffset * ((openFrameCount - 1) % 10) + yOffset); @@ -887,13 +944,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); + JMenuItem menuItem = new JMenuItem(title); 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) @@ -925,8 +982,8 @@ public class Desktop extends jalview.jbgui.GDesktop { menuItem.removeActionListener(menuItem.getActionListeners()[0]); } - windowMenu.remove(menuItem); - }; + Desktop.getInstance().windowMenu.remove(menuItem); + } }); menuItem.addActionListener(new ActionListener() @@ -947,9 +1004,9 @@ public class Desktop extends jalview.jbgui.GDesktop setKeyBindings(frame); - desktop.add(frame); + getDesktopPane().add(frame); - windowMenu.add(menuItem); + Desktop.getInstance().windowMenu.add(menuItem); frame.toFront(); try @@ -974,7 +1031,6 @@ public class Desktop extends jalview.jbgui.GDesktop */ private static void setKeyBindings(JInternalFrame frame) { - @SuppressWarnings("serial") final Action closeAction = new AbstractAction() { @Override @@ -1007,7 +1063,7 @@ public class Desktop extends jalview.jbgui.GDesktop { if (!internalCopy) { - Desktop.jalviewClipboard = null; + Desktop.getInstance().jalviewClipboard = null; } internalCopy = false; @@ -1082,8 +1138,11 @@ public class Desktop extends jalview.jbgui.GDesktop { format = new IdentifyFile().identify(file, protocol); } - - new FileLoader().LoadFile(null, file, protocol, format); + if (file instanceof File) + { + Platform.cacheFileData((File) file); + } + new FileLoader().loadFile(null, file, protocol, format); } } catch (Exception ex) @@ -1106,16 +1165,15 @@ public class Desktop extends jalview.jbgui.GDesktop { String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT"); JalviewFileChooser chooser = JalviewFileChooser - .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat); + .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, true); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.open_local_file")); chooser.setToolTipText(MessageManager.getString("action.open")); - chooser.response(new RunResponse(JalviewFileChooser.APPROVE_OPTION) + chooser.setResponseHandler(0, new Runnable() { - @Override public void run() { @@ -1141,17 +1199,17 @@ public class Desktop extends jalview.jbgui.GDesktop } } - new FileLoader().LoadFile(viewport, selectedFile, + new FileLoader().loadFile(viewport, selectedFile, DataSourceType.FILE, format); } - }).openDialog(this); + }); + chooser.showOpenDialog(this); } /** - * DOCUMENT ME! + * Shows a dialog for input of a URL at which to retrieve alignment data * - * @param e - * DOCUMENT ME! + * @param viewport */ @Override public void inputURLMenuItem_actionPerformed(AlignViewport viewport) @@ -1161,46 +1219,113 @@ public class Desktop extends jalview.jbgui.GDesktop JLabel label = new JLabel( MessageManager.getString("label.input_file_url")); - JComboBox history = new JComboBox(); JPanel panel = new JPanel(new GridLayout(2, 1)); panel.add(label); - panel.add(history); - history.setPreferredSize(new Dimension(400, 20)); - history.setEditable(true); - history.addItem("http://www."); - - String historyItems = jalview.bin.Cache.getProperty("RECENT_URL"); - StringTokenizer st; - - if (historyItems != null) + /* + * the URL to fetch is + * Java: an editable combobox with history + * JS: (pending JAL-3038) a plain text field + */ + JComponent history; + String urlBase = "http://www."; + if (Platform.isJS()) { - st = new StringTokenizer(historyItems, "\t"); - - while (st.hasMoreTokens()) + history = new JTextField(urlBase, 35); + } + else + /** + * Java only + * + * @j2sIgnore + */ + { + JComboBox asCombo = new JComboBox<>(); + asCombo.setPreferredSize(new Dimension(400, 20)); + asCombo.setEditable(true); + asCombo.addItem(urlBase); + String historyItems = Cache.getProperty("RECENT_URL"); + if (historyItems != null) { - history.addItem(st.nextElement()); + for (String token : historyItems.split("\\t")) + { + asCombo.addItem(token); + } } + history = asCombo; } + panel.add(history); - // BH 2018 -- providing a callback for SwingJS - // dialogOption is just a simple way to provide - // context for the modal-like response. - // The only requirement is that desktop implement - // PropertyChangeListener, which is used already in Java - // for changes in input value and such within the dialogs. + Object[] options = new Object[] { MessageManager.getString("action.ok"), + MessageManager.getString("action.cancel") }; + Runnable action = new Runnable() + { + @Override + public void run() + { + @SuppressWarnings("unchecked") + String url = (history instanceof JTextField + ? ((JTextField) history).getText() + : ((JComboBox) history).getSelectedItem() + .toString()); - String dialogOption = "label.input_alignment_from_url"; - desktop.dialogData = new Object[] { dialogOption, viewport, history }; - desktop.onDialogReturn(JvOptionPane.showInternalConfirmDialog(desktop, - panel, MessageManager.getString(dialogOption), - JvOptionPane.OK_CANCEL_OPTION)); + if (url.toLowerCase().endsWith(".jar")) + { + if (viewport != null) + { + new FileLoader().loadFile(viewport, url, DataSourceType.URL, + FileFormat.Jalview); + } + else + { + new FileLoader().loadFile(url, DataSourceType.URL, + FileFormat.Jalview); + } + } + else + { + FileFormatI format = null; + try + { + format = new IdentifyFile().identify(url, DataSourceType.URL); + } catch (FileFormatException e) + { + // TODO revise error handling, distinguish between + // URL not found and response not valid + } - // no code may follow this, as SwingJS will not block - // callback in JavaScript comes via a property change event, - // thus going into desktop.onDialogReturn(int) just the same as - // in Java. + if (format == null) + { + String msg = MessageManager + .formatMessage("label.couldnt_locate", url); + JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), + msg, + MessageManager.getString("label.url_not_found"), + JvOptionPane.WARNING_MESSAGE); + return; + } + + if (viewport != null) + { + new FileLoader().loadFile(viewport, url, DataSourceType.URL, + format); + } + else + { + new FileLoader().loadFile(url, DataSourceType.URL, format); + } + } + } + }; + String dialogOption = MessageManager + .getString("label.input_alignment_from_url"); + JvOptionPane.newOptionDialog(getDesktopPane()) + .setResponseHandler(0, action) + .showInternalDialog(panel, dialogOption, + JvOptionPane.YES_NO_CANCEL_OPTION, + JvOptionPane.PLAIN_MESSAGE, null, options, + MessageManager.getString("action.ok")); } /** @@ -1282,7 +1407,7 @@ public class Desktop extends jalview.jbgui.GDesktop public void aboutMenuItem_actionPerformed(ActionEvent e) { // StringBuffer message = getAboutMessage(false); - // JvOptionPane.showInternalMessageDialog(Desktop.desktop, + // JvOptionPane.showInternalMessageDialog(Desktop.getDesktop(), // // message.toString(), "About Jalview", JvOptionPane.INFORMATION_MESSAGE); new Thread(new Runnable() @@ -1369,11 +1494,16 @@ public class Desktop extends jalview.jbgui.GDesktop { try { - if (Jalview.isJS()) + if (Platform.isJS()) { BrowserLauncher.openURL("http://www.jalview.org/help.html"); } else + /** + * Java only + * + * @j2sIgnore + */ { Help.showHelpWindow(); } @@ -1386,8 +1516,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 = desktop.getAllFrames(); + JInternalFrame[] frames = desktopPane.getAllFrames(); for (int i = 0; i < frames.length; i++) { try @@ -1408,12 +1542,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 @@ -1458,7 +1587,7 @@ public class Desktop extends jalview.jbgui.GDesktop @Override protected void showMemusage_actionPerformed(ActionEvent e) { - desktop.showMemoryUsage(showMemusage.isSelected()); + getDesktopPane().showMemoryUsage(showMemusage.isSelected()); } /* @@ -1495,7 +1624,7 @@ public class Desktop extends jalview.jbgui.GDesktop void reorderAssociatedWindows(boolean minimize, boolean close) { - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = getDesktopPane().getAllFrames(); if (frames == null || frames.length < 1) { return; @@ -1589,20 +1718,43 @@ public class Desktop extends jalview.jbgui.GDesktop @Override public void saveState_actionPerformed() { - JalviewFileChooser chooser = new JalviewFileChooser("jvp", - "Jalview Project"); + saveState_actionPerformed(false); + } - chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle(MessageManager.getString("label.save_state")); + public void saveState_actionPerformed(boolean saveAs) + { + java.io.File projectFile = getProjectFile(); + // autoSave indicates we already have a file and don't need to ask + boolean autoSave = projectFile != null && !saveAs + && BackupFiles.getEnabled(); - int value = chooser.showSaveDialog(this); + // System.out.println("autoSave="+autoSave+", projectFile='"+projectFile+"', + // saveAs="+saveAs+", Backups + // "+(BackupFiles.getEnabled()?"enabled":"disabled")); - if (value == JalviewFileChooser.APPROVE_OPTION) + boolean approveSave = false; + if (!autoSave) { - final Desktop me = this; - final java.io.File choice = chooser.getSelectedFile(); - setProjectFile(choice); + JalviewFileChooser chooser = new JalviewFileChooser("jvp", + "Jalview Project"); + + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle(MessageManager.getString("label.save_state")); + + int value = chooser.showSaveDialog(this); + + if (value == JalviewFileChooser.APPROVE_OPTION) + { + projectFile = chooser.getSelectedFile(); + setProjectFile(projectFile); + approveSave = true; + } + } + if (approveSave || autoSave) + { + final Desktop me = this; + final java.io.File chosenFile = projectFile; new Thread(new Runnable() { @Override @@ -1611,39 +1763,52 @@ public class Desktop extends jalview.jbgui.GDesktop // TODO: refactor to Jalview desktop session controller action. setProgressBar(MessageManager.formatMessage( "label.saving_jalview_project", new Object[] - { choice.getName() }), choice.hashCode()); + { chosenFile.getName() }), chosenFile.hashCode()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", - choice.getParent()); + chosenFile.getParent()); // TODO catch and handle errors for savestate // TODO prevent user from messing with the Desktop whilst we're saving try { - new Jalview2XML().saveState(choice); + boolean doBackup = BackupFiles.getEnabled(); + BackupFiles backupfiles = doBackup ? new BackupFiles(chosenFile) : null; + + new Jalview2XML().saveState(doBackup ? backupfiles.getTempFile() : chosenFile); + + if (doBackup) + { + backupfiles.setWriteSuccess(true); + backupfiles.rollBackupsAndRenameTempFile(); + } } catch (OutOfMemoryError oom) { - new OOMWarning( - "Whilst saving current state to " + choice.getName(), - oom); + new OOMWarning("Whilst saving current state to " + + chosenFile.getName(), oom); } catch (Exception ex) { - Cache.log.error( - "Problems whilst trying to save to " + choice.getName(), - ex); + Cache.log.error("Problems whilst trying to save to " + + chosenFile.getName(), ex); JvOptionPane.showMessageDialog(me, MessageManager.formatMessage( "label.error_whilst_saving_current_state_to", new Object[] - { choice.getName() }), + { chosenFile.getName() }), MessageManager.getString("label.couldnt_save_project"), JvOptionPane.WARNING_MESSAGE); } - setProgressBar(null, choice.hashCode()); + setProgressBar(null, chosenFile.hashCode()); } }).start(); - } + } + } + + @Override + public void saveAsState_actionPerformed(ActionEvent e) + { + saveState_actionPerformed(true); } - private void setProjectFile(File choice) + protected void setProjectFile(File choice) { this.projectFile = choice; } @@ -1654,58 +1819,59 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Prompts the user to choose a file and loads in as a Jalview project file + * Shows a file chooser dialog and tries to read in the selected file as a + * Jalview project */ @Override public void loadState_actionPerformed() { + final String[] suffix = new String[] { "jvp", "jar" }; + final String[] desc = new String[] { "Jalview Project", + "Jalview Project (old)" }; JalviewFileChooser chooser = new JalviewFileChooser( - Cache.getProperty("LAST_DIRECTORY"), new String[] - { "jvp", "jar" }, - new String[] - { "Jalview Project", "Jalview Project (old)" }, - "Jalview Project"); + Cache.getProperty("LAST_DIRECTORY"), suffix, desc, + "Jalview Project", true, true); // last two booleans: allFiles, + // allowBackupFiles chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle(MessageManager.getString("label.restore_state")); - - int value = chooser.showOpenDialog(this); - - if (value == JalviewFileChooser.APPROVE_OPTION) + chooser.setResponseHandler(0, new Runnable() { - final File selectedFile = chooser.getSelectedFile(); - setProjectFile(selectedFile); - final String choice = selectedFile.getAbsolutePath(); - Cache.setProperty("LAST_DIRECTORY", selectedFile.getParent()); - new Thread(new Runnable() + @Override + public void run() { - @Override - public void run() + File selectedFile = chooser.getSelectedFile(); + setProjectFile(selectedFile); + String choice = selectedFile.getAbsolutePath(); + Cache.setProperty("LAST_DIRECTORY", selectedFile.getParent()); + new Thread(new Runnable() { - setProgressBar(MessageManager.formatMessage( - "label.loading_jalview_project", new Object[] - { choice }), choice.hashCode()); - try + @Override + public void run() { - new Jalview2XML().loadJalviewAlign(choice); - } 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); + 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.getDesktopPane(), + MessageManager.formatMessage( + "label.error_whilst_loading_project_from", + new Object[] + { choice }), + MessageManager.getString("label.couldnt_load_project"), + JvOptionPane.WARNING_MESSAGE); + } } - setProgressBar(null, choice.hashCode()); - } - }).start(); - } + }).start(); + } + }); + + chooser.showOpenDialog(this); } @Override @@ -1735,7 +1901,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(); @@ -1748,7 +1914,7 @@ public class Desktop extends jalview.jbgui.GDesktop ((GridLayout) progressPanel.getLayout()).setRows( ((GridLayout) progressPanel.getLayout()).getRows() + 1); ++totalProgressCount; - instance.validate(); + validate(); return thisprogress; } @@ -1802,7 +1968,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static AlignmentPanel[] getAlignmentPanels(String alignmentId) { - if (Desktop.desktop == null) + if (Desktop.getDesktopPane() == null) { // no frames created and in headless mode // TODO: verify that frames are recoverable when in headless mode @@ -1844,7 +2010,7 @@ 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(); @@ -1930,7 +2096,7 @@ public class Desktop extends jalview.jbgui.GDesktop { source.viewport.setGatherViewsHere(true); source.viewport.setExplodedGeometry(source.getBounds()); - JInternalFrame[] frames = desktop.getAllFrames(); + JInternalFrame[] frames = getAllFrames(); String viewId = source.viewport.getSequenceSetId(); for (int t = 0; t < frames.length; t++) @@ -1987,7 +2153,7 @@ public class Desktop extends jalview.jbgui.GDesktop String fle = chooser.getSelectedFile().toString(); if (!vamsasImport(chooser.getSelectedFile())) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, + JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), MessageManager.formatMessage( "label.couldnt_import_as_vamsas_session", new Object[] @@ -2219,7 +2385,7 @@ public class Desktop extends jalview.jbgui.GDesktop }); rthr.start(); } - }; + } }); VamsasStMenu.add(sessit); } @@ -2288,7 +2454,7 @@ public class Desktop extends jalview.jbgui.GDesktop removeProgressPanel(progpanel); if (warnmsg != null) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, + JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), warnmsg, warnttl, JvOptionPane.ERROR_MESSAGE); } @@ -2325,7 +2491,7 @@ public class Desktop extends jalview.jbgui.GDesktop public JInternalFrame[] getAllFrames() { - return desktop.getAllFrames(); + return desktopPane.getAllFrames(); } /** @@ -2364,7 +2530,7 @@ public class Desktop extends jalview.jbgui.GDesktop while (li.hasNext()) { String link = li.next(); - if (link.contains(SEQUENCE_ID) + if (link.contains(UrlConstants.SEQUENCE_ID) && !UrlConstants.isDefaultString(link)) { check = true; @@ -2411,7 +2577,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); @@ -2427,149 +2593,8 @@ public class Desktop extends jalview.jbgui.GDesktop * @author AMW */ public class MyDesktopPane extends JDesktopPane - implements Runnable, PropertyChangeListener + implements Runnable { - - public Object[] dialogData; - - // @Override - @Override - public void propertyChange(PropertyChangeEvent event) - { - // TODO this is obsolete with JAL-3048 - delete? - Object val = event.getNewValue(); - String name = event.getPropertyName(); - System.out.println(name); - switch (event.getSource().getClass().getName()) - { - case "javax.swing.JOptionPane": - switch (name) - { - case "inputValue": - onDialogReturn(val); - return; - case "value": - if (val instanceof Integer) - { - onDialogReturn(((Integer) val).intValue()); - } - else - { - onDialogReturn(val); - } - return; - } - break; - case "javax.swing.JFileChooser": - switch (name) - { - case "SelectedFile": - // in JavaScript, this File object will have a _bytes property, - // because the file data has already been loaded - onDialogReturn(new Object[] { (File) val }); - return; - } - break; - } - System.out.println(event.getSource().getClass().getName() + " " - + event.getPropertyName() + ": " + event.getNewValue()); - } - - // JSCOmponent.DialogCaller interface - void onDialogReturn(Object value) - { - switch ((String) dialogData[0]) - { - case "SelectedFile": - case "runnable": - dialogData[0] = value; - ((Runnable) dialogData[1]).run(); - break; - default: - } - } - - // JSCOmponent.DialogCaller interface - void onDialogReturn(int value) - { - if (value != Math.floor(value)) - { - // in JavaScript, this will be NaN, oddly enough - return; - } - - switch ((String) dialogData[0]) - { - case "runnable": - dialogData[0] = Integer.valueOf(value); - ((Runnable) dialogData[1]).run(); - break; - case "label.input_alignment_from_url": - // reconstruct the parameter data - int reply = value; - AlignViewport viewport = (AlignViewport) dialogData[1]; - JComboBox history = (JComboBox) dialogData[2]; - // the rest of this is unchangaed - if (reply != JvOptionPane.OK_OPTION) - { - return; - } - - String url = history.getSelectedItem().toString(); - - if (url.toLowerCase().endsWith(".jar")) - { - if (viewport != null) - { - new FileLoader().LoadFile(viewport, url, DataSourceType.URL, - FileFormat.Jalview); - } - else - { - new FileLoader().LoadFile(url, DataSourceType.URL, - FileFormat.Jalview); - } - } - else - { - FileFormatI format = null; - try - { - format = new IdentifyFile().identify(url, DataSourceType.URL); - } catch (FileFormatException e) - { - // TODO revise error handling, distinguish between - // URL not found and response not valid - } - - if (format == null) - { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, - MessageManager.formatMessage("label.couldnt_locate", - new Object[] - { url }), - MessageManager.getString("label.url_not_found"), - JvOptionPane.WARNING_MESSAGE); - - return; - } - - if (viewport != null) - { - new FileLoader().LoadFile(viewport, url, DataSourceType.URL, - format); - } - else - { - new FileLoader().LoadFile(url, DataSourceType.URL, format); - } - } - - break; - } - - } - private static final float ONE_MB = 1048576f; boolean showMemoryUsage = false; @@ -2667,11 +2692,11 @@ public class Desktop extends jalview.jbgui.GDesktop { if (Jalview.isHeadlessMode()) { - // Desktop.desktop is null in headless mode - return new AlignFrame[] { Jalview.currentAlignFrame }; + // Desktop.getDesktop() is null in headless mode + return new AlignFrame[] { Jalview.getCurrentAlignFrame() }; } - JInternalFrame[] frames = Desktop.desktop.getAllFrames(); + JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames(); if (frames == null) { @@ -2716,7 +2741,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public GStructureViewer[] getJmols() { - JInternalFrame[] frames = Desktop.desktop.getAllFrames(); + JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames(); if (frames == null) { @@ -2752,7 +2777,7 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (Exception ex) { jalview.bin.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"), @@ -2763,7 +2788,7 @@ public class Desktop extends jalview.jbgui.GDesktop /** * Open the Groovy console */ - void openGroovyConsole() + private void openGroovyConsole() { if (groovyConsole == null) { @@ -2863,6 +2888,8 @@ public class Desktop extends jalview.jbgui.GDesktop @Override public void setProgressBar(String message, long id) { + Platform.timeCheck("Desktop " + message, Platform.TIME_MARK); + if (progressBars == null) { progressBars = new Hashtable<>(); @@ -2947,7 +2974,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static AlignFrame getAlignFrameFor(AlignViewportI viewport) { - if (desktop != null) + if (getDesktopPane() != null) { AlignmentPanel[] aps = getAlignmentPanels( viewport.getSequenceSetId()); @@ -3008,8 +3035,8 @@ public class Desktop extends jalview.jbgui.GDesktop // todo: changesupport handlers need to be transferred if (discoverer == null) { - discoverer = new jalview.ws.jws1.Discoverer(); - // register PCS handler for desktop. + discoverer = Discoverer.getInstance(); + // register PCS handler for getDesktop(). discoverer.addPropertyChangeListener(changeSupport); } // JAL-940 - disabled JWS1 service configuration - always start discoverer @@ -3019,7 +3046,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; @@ -3052,7 +3079,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) { @@ -3091,7 +3118,7 @@ public class Desktop extends jalview.jbgui.GDesktop * * jd.waitForInput(); */ - JvOptionPane.showConfirmDialog(Desktop.desktop, + JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(), new JLabel("
" + ermsg + "
" + "

It may be that you have invalid JABA URLs
in your web service preferences," @@ -3117,7 +3144,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } - private Runnable serviceChangedDialog = null; + Runnable serviceChangedDialog = null; /** * start a thread to open a URL in the configured browser. Pops up a warning @@ -3128,7 +3155,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static void showUrl(final String url) { - showUrl(url, Desktop.instance); + showUrl(url, Desktop.getInstance()); } /** @@ -3154,10 +3181,10 @@ public class Desktop extends jalview.jbgui.GDesktop .formatMessage("status.opening_params", new Object[] { url }), this.hashCode()); } - jalview.util.BrowserLauncher.openURL(url); + BrowserLauncher.openURL(url); } catch (Exception ex) { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, + JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), MessageManager .getString("label.web_browser_not_found_unix"), MessageManager.getString("label.web_browser_not_found"), @@ -3173,15 +3200,16 @@ public class Desktop extends jalview.jbgui.GDesktop }).start(); } - public static WsParamSetManager wsparamManager = null; + private WsParamSetManager wsparamManager = null; public static ParamManager getUserParameterStore() { - if (wsparamManager == null) + Desktop d = Desktop.getInstance(); + if (d.wsparamManager == null) { - wsparamManager = new WsParamSetManager(); + d.wsparamManager = new WsParamSetManager(); } - return wsparamManager; + return d.wsparamManager; } /** @@ -3226,14 +3254,16 @@ public class Desktop extends jalview.jbgui.GDesktop /** * flag indicating if dialogExecutor should try to acquire a permit */ - private volatile boolean dialogPause = true; + volatile boolean dialogPause = true; /** * pause the queue */ - private java.util.concurrent.Semaphore block = new Semaphore(0); + java.util.concurrent.Semaphore block = new Semaphore(0); + + private groovy.ui.Console groovyConsole; - private static groovy.ui.Console groovyConsole; + public StructureViewer lastTargetedView; /** * add another dialog thread to the queue @@ -3255,9 +3285,8 @@ public class Desktop extends jalview.jbgui.GDesktop } catch (InterruptedException x) { } - ; } - if (instance == null) + if (Jalview.isHeadlessMode()) { return; } @@ -3421,7 +3450,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) @@ -3466,7 +3495,8 @@ public class Desktop extends jalview.jbgui.GDesktop public static groovy.ui.Console getGroovyConsole() { - return groovyConsole; + Desktop desktop = Desktop.getInstance(); + return desktop == null ? null : desktop.groovyConsole; } /** @@ -3484,6 +3514,7 @@ 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 @@ -3538,12 +3569,11 @@ public class Desktop extends jalview.jbgui.GDesktop } else { - if (Platform.isAMac()) + if (Platform.isAMacAndNotJS()) { System.err.println( "Please ignore plist error - occurs due to problem with java 8 on OSX"); } - ; } } catch (Throwable ex) { @@ -3554,7 +3584,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 (Object file : (List) t .getTransferData(DataFlavor.javaFileListFlavor)) { files.add(file); @@ -3655,8 +3685,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } } - if (Platform.isWindows()) - + if (Platform.isWindowsAndNotJS()) { Cache.log.debug("Scanning dropped content for Windows Link Files"); @@ -3719,7 +3748,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) { @@ -3738,4 +3767,5 @@ public class Desktop extends jalview.jbgui.GDesktop } return result; } + }