X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FDesktop.java;h=30c37de3a1671057a99b543c039461a0f3f46c9e;hb=9e5d1bced16aa9975692115a964c661cd7897a7c;hp=81aacda1fa6e690988c0e44e69bf2f465c774640;hpb=f9f0b83445a2da848d21614d94a909888484e25e;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 81aacda..30c37de 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -41,11 +41,11 @@ import jalview.jbgui.GSplitFrame; import jalview.jbgui.GStructureViewer; import jalview.structure.StructureSelectionManager; import jalview.urls.IdOrgSettings; +import jalview.util.BrowserLauncher; 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.params.ParamManager; import jalview.ws.utils.UrlDownloadClient; @@ -88,7 +88,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; @@ -114,6 +113,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; @@ -344,12 +344,16 @@ public class Desktop extends jalview.jbgui.GDesktop */ public 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; - doVamsasClientCheck(); + if (!Platform.isJS()) + { + doVamsasClientCheck(); + } doConfigureStructurePrefs(); setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION")); @@ -359,6 +363,8 @@ public class Desktop extends jalview.jbgui.GDesktop 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()); @@ -366,14 +372,21 @@ public class Desktop extends jalview.jbgui.GDesktop // JScrollPane sp = new JScrollPane(); // sp.getViewport().setView(desktop); // getContentPane().add(sp, BorderLayout.CENTER); + + // BH 2018 - just an experiment to try unclipped JInternalFrames. + if (Platform.isJS()) + { + getRootPane().putClientProperty("swingjs.overflow.hidden", "false"); + } + getContentPane().add(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() + (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager() + : Platform.isAMacAndNotJS() ? new AquaInternalFrameManager( desktop.getDesktopManager()) : desktop.getDesktopManager()))); @@ -390,13 +403,11 @@ public class Desktop extends jalview.jbgui.GDesktop int yPos = Math.max(5, (screenSize.height - 650) / 2); setBounds(xPos, yPos, 900, 650); } - /** - * BH 2018 - * - * @j2sNative - */ - { - + + boolean doFullLoad = /** @j2sNative ! */true; + + if (doFullLoad) { + jconsole = new Console(this, showjconsole); // add essential build information jconsole.setHeader("Jalview Version: " @@ -460,7 +471,7 @@ public class Desktop extends jalview.jbgui.GDesktop }); - } // end BH 2018 ignore + } this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this)); @@ -535,34 +546,25 @@ public class Desktop extends jalview.jbgui.GDesktop public void checkForNews() { - - /** - * BH 2018 - * - * @j2sNative - */ + final Desktop me = this; + // Thread off the news reader, in case there are connection problems. + new Thread(new Runnable() { - final Desktop me = this; - // Thread off the news reader, in case there are connection problems. - addDialogThread(new Runnable() + @Override + public void run() { - @Override - public void run() - { - Cache.log.debug("Starting news thread."); - - jvnews = new BlogReader(me); - showNews.setVisible(true); - Cache.log.debug("Completed news thread."); - } - }); - } + Cache.log.debug("Starting news thread."); + jvnews = new BlogReader(me); + 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() @@ -579,7 +581,8 @@ public class Desktop extends jalview.jbgui.GDesktop + e.getMessage()); } } - }); + }).start(); + ; } @Override @@ -590,32 +593,23 @@ public class Desktop extends jalview.jbgui.GDesktop void showNews(boolean visible) { - /** - * BH 2018 - * - * @j2sNative - * - */ + Cache.log.debug((visible ? "Showing" : "Hiding") + " news."); + showNews.setSelected(visible); + if (visible && !jvnews.isVisible()) { - Cache.log.debug((visible ? "Showing" : "Hiding") + " news."); - showNews.setSelected(visible); - if (visible && !jvnews.isVisible()) + new Thread(new Runnable() { - new Thread(new Runnable() + @Override + public void run() { - @Override - public void run() - { - long now = System.currentTimeMillis(); - Desktop.instance.setProgressBar( - MessageManager.getString("status.refreshing_news"), - now); - jvnews.refreshNews(); - Desktop.instance.setProgressBar(null, now); - jvnews.showNews(); - } - }).start(); - } + long now = System.currentTimeMillis(); + Desktop.instance.setProgressBar( + MessageManager.getString("status.refreshing_news"), now); + jvnews.refreshNews(); + Desktop.instance.setProgressBar(null, now); + jvnews.showNews(); + } + }).start(); } } @@ -679,8 +673,7 @@ public class Desktop extends jalview.jbgui.GDesktop private void doVamsasClientCheck() { - if (/** @j2sNative false && */ // BH 2018 - jalview.bin.Cache.vamsasJarsPresent()) + if (Cache.vamsasJarsPresent()) { setupVamsasDisconnectedGui(); VamsasMenu.setVisible(true); @@ -955,7 +948,7 @@ public class Desktop extends jalview.jbgui.GDesktop frame.setIcon(false); } catch (java.beans.PropertyVetoException ex) { - + // System.err.println(ex.toString()); } } }); @@ -1128,9 +1121,8 @@ public class Desktop extends jalview.jbgui.GDesktop 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() { @@ -1159,14 +1151,14 @@ public class Desktop extends jalview.jbgui.GDesktop 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) @@ -1176,46 +1168,101 @@ 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 + { + 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); + + Object[] options = new Object[] { MessageManager.getString("action.ok"), + MessageManager.getString("action.cancel") }; + Runnable action = new Runnable() { + @Override + public void run() + { + String url = Platform.isJS() ? ((JTextField) history).getText() + : ((JComboBox) history).getSelectedItem() + .toString(); - // 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. + 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 + } - 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 (format == null) + { + String msg = MessageManager.formatMessage("label.couldnt_locate", url); + JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg, + MessageManager.getString("label.url_not_found"), + JvOptionPane.WARNING_MESSAGE); - // 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. + 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(desktop).setResponseHandler(0, action) + .showInternalDialog(panel, dialogOption, + JvOptionPane.YES_NO_CANCEL_OPTION, + JvOptionPane.PLAIN_MESSAGE, null, options, + MessageManager.getString("action.ok")); } /** @@ -1377,19 +1424,24 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Action on requesting Help documentation */ @Override - public void documentationMenuItem_actionPerformed(ActionEvent e) + public void documentationMenuItem_actionPerformed() { try { - Help.showHelpWindow(); + if (Platform.isJS()) + { + BrowserLauncher.openURL("http://www.jalview.org/help.html"); + } + else + { + Help.showHelpWindow(); + } } catch (Exception ex) { + System.err.println("Error opening help: " + ex.getMessage()); } } @@ -1593,28 +1645,22 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Prompts the user to choose a file and then saves the Jalview state as a + * Jalview project file */ @Override - public void saveState_actionPerformed(ActionEvent e) + public void saveState_actionPerformed(boolean asCastor) { - // TODO: JAL-3048 not needed for Jalview-JS - - JalviewFileChooser chooser = new JalviewFileChooser("jvp", + JalviewFileChooser chooser = new JalviewFileChooser( + asCastor ? "jvp" : "jvx", "Jalview Project"); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle(MessageManager.getString("label.save_state")); - - int value = chooser.showSaveDialog(this); - - if (value == JalviewFileChooser.APPROVE_OPTION) + int option = chooser.showSaveDialog(this); + if (option == JalviewFileChooser.APPROVE_OPTION) { - final Desktop me = this; - final java.io.File choice = chooser.getSelectedFile(); + File choice = chooser.getSelectedFile(); setProjectFile(choice); new Thread(new Runnable() @@ -1632,7 +1678,14 @@ public class Desktop extends jalview.jbgui.GDesktop // TODO prevent user from messing with the Desktop whilst we're saving try { - new Jalview2XML().saveState(choice); + if (asCastor) + { + new Jalview2XML().saveState(choice); + } + else + { + new jalview.project.Jalview2XML().saveState(choice); + } } catch (OutOfMemoryError oom) { new OOMWarning( @@ -1643,7 +1696,7 @@ public class Desktop extends jalview.jbgui.GDesktop Cache.log.error( "Problems whilst trying to save to " + choice.getName(), ex); - JvOptionPane.showMessageDialog(me, + JvOptionPane.showMessageDialog(Desktop.this, MessageManager.formatMessage( "label.error_whilst_saving_current_state_to", new Object[] @@ -1654,10 +1707,10 @@ public class Desktop extends jalview.jbgui.GDesktop setProgressBar(null, choice.hashCode()); } }).start(); - } + } } - private void setProjectFile(File choice) + void setProjectFile(File choice) { this.projectFile = choice; } @@ -1668,49 +1721,54 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Prompts the user to choose a file and loads in as a Jalview project file */ @Override - public void loadState_actionPerformed(ActionEvent e) - { - // TODO: JAL-3048 not needed for Jalview-JS - + public void loadState_actionPerformed(boolean asCastor) + { + // TODO: GET RID OF .JVX BEFORE RELEASE JIM! + final String[] suffix = asCastor ? new String[] { "jvp", "jar" } + : new String[] + { "jvx" }; + final String[] desc = asCastor + ? new String[] + { "Jalview Project", "Jalview Project (old)" } + : new String[] + { "Jalview Project" }; JalviewFileChooser chooser = new JalviewFileChooser( - Cache.getProperty("LAST_DIRECTORY"), new String[] - { "jvp", "jar" }, - new String[] - { "Jalview Project", "Jalview Project (old)" }, + Cache.getProperty("LAST_DIRECTORY"), suffix, + desc, "Jalview Project"); 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 - { - new Jalview2XML().loadJalviewAlign(choice); - } catch (OutOfMemoryError oom) + @Override + public void run() { + try { + if (asCastor) + { + new Jalview2XML().loadJalviewAlign(choice); + } + else + { + new jalview.project.Jalview2XML().loadJalviewAlign(selectedFile); + } + } catch (OutOfMemoryError oom) + { new OOMWarning("Whilst loading project from " + choice, oom); - } catch (Exception ex) - { + } catch (Exception ex) + { Cache.log.error( "Problems whilst loading project from " + choice, ex); JvOptionPane.showMessageDialog(Desktop.desktop, @@ -1720,11 +1778,13 @@ public class Desktop extends jalview.jbgui.GDesktop { choice }), MessageManager.getString("label.couldnt_load_project"), JvOptionPane.WARNING_MESSAGE); + } } - setProgressBar(null, choice.hashCode()); - } - }).start(); - } + }).start(); + } + }); + + chooser.showOpenDialog(this); } @Override @@ -2368,8 +2428,7 @@ public class Desktop extends jalview.jbgui.GDesktop @Override public void run() { - if (/** @j2sNative false && */ // BH 2018 - Cache.getDefault("CHECKURLLINKS", true)) + if (Cache.getDefault("CHECKURLLINKS", true)) { // check what the actual links are - if it's just the default don't // bother with the warning @@ -2447,149 +2506,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; @@ -2883,6 +2801,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<>(); @@ -3558,7 +3478,7 @@ 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"); @@ -3675,8 +3595,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } } - if (Platform.isWindows()) - + if (Platform.isWindowsAndNotJS()) { Cache.log.debug("Scanning dropped content for Windows Link Files");