X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=6910f280a01abe4a38249c4ceaf7a08179bba7d5;hb=153dd62dc91da13ae732600e6ea55ddbe15eab39;hp=e499326ce28653449c4b9c42fe8e6bf3bf6b7fb1;hpb=53a410e5793bc90790c6d68b1101cf5ffb6b8ecb;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index e499326..6910f28 100755 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -1,29 +1,32 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) + * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.gui; +import jalview.bin.Cache; import jalview.io.*; +import jalview.ws.params.ParamManager; import java.awt.*; import java.awt.datatransfer.*; import java.awt.dnd.*; import java.awt.event.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -40,7 +43,8 @@ import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; /** - * DOCUMENT ME! + * Jalview Desktop + * * * @author $author$ * @version $Revision$ @@ -48,22 +52,123 @@ import javax.swing.event.MenuListener; public class Desktop extends jalview.jbgui.GDesktop implements DropTargetListener, ClipboardOwner, IProgressIndicator { - /** DOCUMENT ME!! */ + + private class JalviewChangeSupport implements PropertyChangeListener + { + public void propertyChange(PropertyChangeEvent evt) + { + // Handle change events - most are simply routed to other sources + changeSupport.firePropertyChange(evt); + } + + /** + * change listeners are notified of changes to resources so they can update + * their state. E.g. - the 'services' property notifies when the available + * set of web service endpoints have changed. + */ + private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport( + this); + + /** + * @param propertyName + * @param listener + * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.lang.String, + * java.beans.PropertyChangeListener) + */ + public void addJalviewPropertyChangeListener(String propertyName, + PropertyChangeListener listener) + { + changeSupport.addPropertyChangeListener(propertyName, listener); + } + + /** + * @param listener + * @see java.beans.PropertyChangeSupport#addPropertyChangeListener( + * java.beans.PropertyChangeListener) + */ + public void addJalviewPropertyChangeListener( + PropertyChangeListener listener) + { + changeSupport.addPropertyChangeListener(listener); + } + + /* + * @param propertyName + * + * @param oldValue + * + * @param newValue + * + * @see + * java.beans.PropertyChangeSupport#firePropertyChange(java.lang.String, + * java.lang.Object, java.lang.Object) public void firePropertyChange(String + * propertyName, Object oldValue, Object newValue) { + * changeSupport.firePropertyChange(propertyName, oldValue, newValue); } + */ + + /** + * @param propertyName + * @param listener + * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(java.lang.String, + * java.beans.PropertyChangeListener) + */ + public void removeJalviewPropertyChangeListener(String propertyName, + PropertyChangeListener listener) + { + changeSupport.removePropertyChangeListener(propertyName, listener); + } + + } + + private JalviewChangeSupport changeSupport = new JalviewChangeSupport(); + + /** + * @param listener + * @see jalview.gui.Desktop.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener) + */ + public void addJalviewPropertyChangeListener( + PropertyChangeListener listener) + { + changeSupport.addJalviewPropertyChangeListener(listener); + } + + /** + * @param propertyName + * @param listener + * @see jalview.gui.Desktop.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String, + * java.beans.PropertyChangeListener) + */ + public void addJalviewPropertyChangeListener(String propertyName, + PropertyChangeListener listener) + { + changeSupport.addJalviewPropertyChangeListener(propertyName, listener); + } + + /** + * @param propertyName + * @param listener + * @see jalview.gui.Desktop.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String, + * java.beans.PropertyChangeListener) + */ + public void removeJalviewPropertyChangeListener(String propertyName, + PropertyChangeListener listener) + { + changeSupport.removeJalviewPropertyChangeListener(propertyName, + listener); + } + + /** Singleton Desktop instance */ public static Desktop instance; - // Need to decide if the Memory Usage is to be included in - // Next release or not. public static MyDesktopPane desktop; - // public static JDesktopPane desktop; - static int openFrameCount = 0; static final int xOffset = 30; static final int yOffset = 30; - public static jalview.ws.Discoverer discoverer; + public static jalview.ws.jws1.Discoverer discoverer; public static Object[] jalviewClipboard; @@ -71,6 +176,104 @@ public class Desktop extends jalview.jbgui.GDesktop implements static int fileLoadingCount = 0; + class MyDesktopManager implements DesktopManager + { + + private DesktopManager delegate; + + public MyDesktopManager(DesktopManager delegate) + { + this.delegate = delegate; + } + + public void activateFrame(JInternalFrame f) + { + try + { + delegate.activateFrame(f); + } catch (NullPointerException npe) + { + Point p = getMousePosition(); + instance.showPasteMenu(p.x, p.y); + } + } + + public void beginDraggingFrame(JComponent f) + { + delegate.beginDraggingFrame(f); + } + + public void beginResizingFrame(JComponent f, int direction) + { + delegate.beginResizingFrame(f, direction); + } + + public void closeFrame(JInternalFrame f) + { + delegate.closeFrame(f); + } + + public void deactivateFrame(JInternalFrame f) + { + delegate.deactivateFrame(f); + } + + public void deiconifyFrame(JInternalFrame f) + { + delegate.deiconifyFrame(f); + } + + public void dragFrame(JComponent f, int newX, int newY) + { + delegate.dragFrame(f, newX, newY); + } + + public void endDraggingFrame(JComponent f) + { + delegate.endDraggingFrame(f); + } + + public void endResizingFrame(JComponent f) + { + delegate.endResizingFrame(f); + } + + public void iconifyFrame(JInternalFrame f) + { + delegate.iconifyFrame(f); + } + + public void maximizeFrame(JInternalFrame f) + { + delegate.maximizeFrame(f); + } + + public void minimizeFrame(JInternalFrame f) + { + delegate.minimizeFrame(f); + } + + public void openFrame(JInternalFrame f) + { + delegate.openFrame(f); + } + + public void resizeFrame(JComponent f, int newX, int newY, int newWidth, + int newHeight) + { + delegate.resizeFrame(f, newX, newY, newWidth, newHeight); + } + + public void setBoundsForFrame(JComponent f, int newX, int newY, + int newWidth, int newHeight) + { + delegate.setBoundsForFrame(f, newX, newY, newWidth, newHeight); + } + + // All other methods, simply delegate + + } + /** * Creates a new Desktop object. */ @@ -89,6 +292,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements 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); @@ -98,24 +303,31 @@ public class Desktop extends jalview.jbgui.GDesktop implements // This line prevents Windows Look&Feel resizing all new windows to maximum // if previous window was maximised - desktop.setDesktopManager(new DefaultDesktopManager()); - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - String x = jalview.bin.Cache.getProperty("SCREEN_X"); - String y = jalview.bin.Cache.getProperty("SCREEN_Y"); - String width = jalview.bin.Cache.getProperty("SCREEN_WIDTH"); - String height = jalview.bin.Cache.getProperty("SCREEN_HEIGHT"); - - if ((x != null) && (y != null) && (width != null) && (height != null)) + desktop.setDesktopManager(new MyDesktopManager( + new DefaultDesktopManager())); + Rectangle dims = getLastKnownDimensions(""); + if (dims != null) { - setBounds(Integer.parseInt(x), Integer.parseInt(y), Integer - .parseInt(width), Integer.parseInt(height)); + setBounds(dims); } else { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds((int) (screenSize.width - 900) / 2, (int) (screenSize.height - 650) / 2, 900, 650); } + jconsole = new Console(this, showjconsole); + // add essential build information + jconsole.setHeader("Jalview Desktop " + + jalview.bin.Cache.getProperty("VERSION") + "\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); this.addWindowListener(new WindowAdapter() { @@ -138,10 +350,86 @@ public class Desktop extends jalview.jbgui.GDesktop implements this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this)); // Spawn a thread that shows the splashscreen - new SplashScreen(); + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + new SplashScreen(); + } + }); - discoverer = new jalview.ws.Discoverer(); // Only gets started if gui is // displayed. + // Thread off a new instance of the file chooser - this reduces the time it + // takes to open it later on. + new Thread(new Runnable() + { + public void run() + { + Cache.log.debug("Filechooser init thread started."); + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY"), + jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS, + jalview.io.AppletFormatAdapter.READABLE_FNAMES, + jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT")); + Cache.log.debug("Filechooser init thread finished."); + } + }).start(); + } + + /** + * recover the last known dimensions for a jalview window + * + * @param windowName + * - empty string is desktop, all other windows have unique prefix + * @return null or last known dimensions scaled to current geometry (if last + * window geom was known) + */ + Rectangle getLastKnownDimensions(String windowName) + { + // TODO: lock aspect ratio for scaling desktop Bug #0058199 + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + String x = jalview.bin.Cache.getProperty(windowName + "SCREEN_X"); + String y = jalview.bin.Cache.getProperty(windowName + "SCREEN_Y"); + String width = jalview.bin.Cache.getProperty(windowName + + "SCREEN_WIDTH"); + String height = jalview.bin.Cache.getProperty(windowName + + "SCREEN_HEIGHT"); + if ((x != null) && (y != null) && (width != null) && (height != null)) + { + int ix = Integer.parseInt(x), iy = Integer.parseInt(y), iw = Integer + .parseInt(width), ih = Integer.parseInt(height); + if (jalview.bin.Cache.getProperty("SCREENGEOMETRY_WIDTH") != null) + { + // 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(jalview.bin.Cache + .getProperty("SCREENGEOMETRY_WIDTH")))); + double sh = ((1f * screenSize.height) / (1f * Integer + .parseInt(jalview.bin.Cache + .getProperty("SCREENGEOMETRY_HEIGHT")))); + // rescale the bounds depending upon the current screen geometry. + ix = (int) (ix * sw); + iw = (int) (iw * sw); + iy = (int) (iy * sh); + ih = (int) (ih * sh); + while (ix>=screenSize.width) { + jalview.bin.Cache.log.debug("Window geometry location recall error: shifting horizontal to within screenbounds."); + ix-=screenSize.width; + } + while (iy>=screenSize.height) { + jalview.bin.Cache.log.debug("Window geometry location recall error: shifting vertical to within screenbounds."); + iy-=screenSize.height; + } + jalview.bin.Cache.log.debug("Got last known dimensions for " + + windowName + ": x:" + ix + " y:" + iy + " width:" + iw + + " height:" + ih); + } + // return dimensions for new instance + return new Rectangle(ix, iy, iw, ih); + } + return null; } private void doVamsasClientCheck() @@ -224,7 +512,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements } /** - * DOCUMENT ME! + * Adds and opens the given frame to the desktop * * @param frame * DOCUMENT ME! @@ -260,6 +548,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements boolean resizable) { + // 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 @@ -442,7 +732,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements for (int i = 0; i < files.size(); i++) { String file = files.get(i).toString(); - String protocol = (protocols==null) ? FormatAdapter.FILE : (String) protocols.get(i); + String protocol = (protocols == null) ? FormatAdapter.FILE + : (String) protocols.get(i); String format = null; if (file.endsWith(".jar")) @@ -610,13 +901,34 @@ public class Desktop extends jalview.jbgui.GDesktop implements */ public void quit() { - jalview.bin.Cache.setProperty("SCREEN_X", getBounds().x + ""); - jalview.bin.Cache.setProperty("SCREEN_Y", getBounds().y + ""); - jalview.bin.Cache.setProperty("SCREEN_WIDTH", getWidth() + ""); - jalview.bin.Cache.setProperty("SCREEN_HEIGHT", getHeight() + ""); + Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); + jalview.bin.Cache + .setProperty("SCREENGEOMETRY_WIDTH", screen.width + ""); + jalview.bin.Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + + ""); + storeLastKnownDimensions("", new Rectangle(getBounds().x, + getBounds().y, getWidth(), getHeight())); + + if (jconsole != null) + { + storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds()); + jconsole.stopConsole(); + } System.exit(0); } + private void storeLastKnownDimensions(String string, Rectangle jc) + { + jalview.bin.Cache.log.debug("Storing last known dimensions for " + + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width + + " height:" + jc.height); + + jalview.bin.Cache.setProperty(string + "SCREEN_X", jc.x + ""); + jalview.bin.Cache.setProperty(string + "SCREEN_Y", jc.y + ""); + jalview.bin.Cache.setProperty(string + "SCREEN_WIDTH", jc.width + ""); + jalview.bin.Cache.setProperty(string + "SCREEN_HEIGHT", jc.height + ""); + } + /** * DOCUMENT ME! * @@ -736,6 +1048,34 @@ public class Desktop extends jalview.jbgui.GDesktop implements desktop.showMemoryUsage(showMemusage.isSelected()); } + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent + * ) + */ + protected void showConsole_actionPerformed(ActionEvent e) + { + showConsole(showConsole.isSelected()); + } + + Console jconsole = null; + + /** + * control whether the java console is visible or not + * + * @param selected + */ + void showConsole(boolean selected) + { + showConsole.setSelected(selected); + // TODO: decide if we should update properties file + Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected) + .toString()); + jconsole.setVisible(selected); + } + void reorderAssociatedWindows(boolean minimize, boolean close) { JInternalFrame[] frames = desktop.getAllFrames(); @@ -845,12 +1185,23 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (value == JalviewFileChooser.APPROVE_OPTION) { java.io.File choice = chooser.getSelectedFile(); - JProgressBar progpanel = addProgressPanel("Saving jalview project "+choice.getName()); + setProgressBar("Saving jalview project " + + choice.getName(), choice.hashCode()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent()); // TODO catch and handle errors for savestate - new Jalview2XML().SaveState(choice); - removeProgressPanel(progpanel); - + try { + new Jalview2XML().SaveState(choice); + } catch (OutOfMemoryError oom) + { + new OOMWarning("Whilst saving current state to "+choice.getName(), oom); + } + catch (Exception ex) + { + Cache.log.error("Problems whilst trying to save to "+choice.getName(),ex); + JOptionPane.showMessageDialog(this, "Error whilst saving current state to "+choice.getName(), "Couldn't save project", JOptionPane.WARNING_MESSAGE); + } + setProgressBar(null, choice.hashCode()); + } } @@ -873,12 +1224,27 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (value == JalviewFileChooser.APPROVE_OPTION) { - String choice = chooser.getSelectedFile().getAbsolutePath(); - setProgressBar("loading jalview project "+chooser.getSelectedFile().getName(),choice.hashCode()); + final String choice = chooser.getSelectedFile().getAbsolutePath(); jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser .getSelectedFile().getParent()); - new Jalview2XML().LoadJalviewAlign(choice); - setProgressBar(null,choice.hashCode()); + new Thread(new Runnable() { + public void run() { + setProgressBar("loading jalview project " + + choice, choice.hashCode()); + try { + 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); + JOptionPane.showMessageDialog(Desktop.desktop, "Error whilst loading project from "+choice, "Couldn't load project", JOptionPane.WARNING_MESSAGE); + } + setProgressBar(null, choice.hashCode()); + } + }).start(); } } @@ -964,7 +1330,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements public static AlignmentPanel[] getAlignmentPanels(String viewId) { int count = 0; - if (Desktop.desktop==null) + if (Desktop.desktop == null) { // no frames created and in headless mode // TODO: verify that frames are recoverable when in headless mode @@ -1151,8 +1517,9 @@ public class Desktop extends jalview.jbgui.GDesktop implements } /** - * import file into a new vamsas session (uses jalview.gui.VamsasApplication) - * @param file + * import file into a new vamsas session (uses jalview.gui.VamsasApplication) + * + * @param file * @return true if import was a success and a session was started. */ public boolean vamsasImport(URL url) @@ -1160,14 +1527,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements // TODO: create progress bar if (v_client != null) { - + jalview.bin.Cache.log - .error("Implementation error - load session from a running session is not supported."); - return false; + .error("Implementation error - load session from a running session is not supported."); + return false; } - + try - { + { // copy the URL content to a temporary local file // TODO: be a bit cleverer here with nio (?!) File file = File.createTempFile("vdocfromurl", ".vdj"); @@ -1175,27 +1542,30 @@ public class Desktop extends jalview.jbgui.GDesktop implements BufferedInputStream bis = new BufferedInputStream(url.openStream()); byte[] buffer = new byte[2048]; int ln; - while ((ln = bis.read(buffer))>-1) + while ((ln = bis.read(buffer)) > -1) { - fos.write(buffer,0,ln); + fos.write(buffer, 0, ln); } bis.close(); fos.close(); - v_client = new jalview.gui.VamsasApplication(this, file, url.toExternalForm()); - } catch (Exception ex) - { - jalview.bin.Cache.log.error( - "Failed to create new vamsas session from contents of URL "+url,ex); - return false; - } - setupVamsasConnectedGui(); - v_client.initial_update(); // TODO: thread ? - return v_client.inSession(); + v_client = new jalview.gui.VamsasApplication(this, file, url + .toExternalForm()); + } catch (Exception ex) + { + jalview.bin.Cache.log.error( + "Failed to create new vamsas session from contents of URL " + + url, ex); + return false; } + setupVamsasConnectedGui(); + v_client.initial_update(); // TODO: thread ? + return v_client.inSession(); + } /** - * import file into a new vamsas session (uses jalview.gui.VamsasApplication) - * @param file + * import file into a new vamsas session (uses jalview.gui.VamsasApplication) + * + * @param file * @return true if import was a success and a session was started. */ public boolean vamsasImport(File file) @@ -1208,28 +1578,34 @@ public class Desktop extends jalview.jbgui.GDesktop implements return false; } - setProgressBar("Importing VAMSAS session from "+file.getName(),file.hashCode()); + setProgressBar("Importing VAMSAS session from " + file.getName(), file + .hashCode()); try { - v_client = new jalview.gui.VamsasApplication(this, file,null); + v_client = new jalview.gui.VamsasApplication(this, file, null); } catch (Exception ex) { - setProgressBar("Importing VAMSAS session from "+file.getName(),file.hashCode()); + setProgressBar("Importing VAMSAS session from " + file.getName(), + file.hashCode()); jalview.bin.Cache.log.error( "New vamsas session from existing session file failed:", ex); return false; } setupVamsasConnectedGui(); v_client.initial_update(); // TODO: thread ? - setProgressBar("Importing VAMSAS session from "+file.getName(),file.hashCode()); + setProgressBar("Importing VAMSAS session from " + file.getName(), file + .hashCode()); return v_client.inSession(); } - public boolean joinVamsasSession(String mysesid) { - if (v_client!=null) + + public boolean joinVamsasSession(String mysesid) + { + if (v_client != null) { - throw new Error("Trying to join a vamsas session when another is already connected."); + throw new Error( + "Trying to join a vamsas session when another is already connected."); } - if (mysesid==null) + if (mysesid == null) { throw new Error("Invalid vamsas session id."); } @@ -1382,7 +1758,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (value == JalviewFileChooser.APPROVE_OPTION) { java.io.File choice = chooser.getSelectedFile(); - JProgressBar progpanel = addProgressPanel("Saving VAMSAS Document to "+choice.getName()); + JProgressBar progpanel = addProgressPanel("Saving VAMSAS Document to " + + choice.getName()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent()); String warnmsg = null; String warnttl = null; @@ -1533,15 +1910,18 @@ public class Desktop extends jalview.jbgui.GDesktop implements public void paintComponent(Graphics g) { - if (showMemoryUsage && g!=null) + if (showMemoryUsage && g != null && df != null) { if (percentUsage < 20) g.setColor(Color.red); - - g.drawString("Total Free Memory: " + df.format(totalFreeMemory) - + "MB; Max Memory: " + df.format(maxMemory) + "MB; " - + df.format(percentUsage) + "%", 10, getHeight() - - g.getFontMetrics().getHeight()); + FontMetrics fm = g.getFontMetrics(); + if (fm != null) + { + g.drawString("Total Free Memory: " + df.format(totalFreeMemory) + + "MB; Max Memory: " + df.format(maxMemory) + "MB; " + + df.format(percentUsage) + "%", 10, getHeight() + - fm.getHeight()); + } } } @@ -1740,4 +2120,127 @@ public class Desktop extends jalview.jbgui.GDesktop implements return v_client; } + /** + * flag set if jalview GUI is being operated programmatically + */ + private boolean inBatchMode=false; + + /** + * check if jalview GUI is being operated programmatically + * @return inBatchMode + */ + public boolean isInBatchMode() + { + return inBatchMode; + } + + /** + * set flag if jalview GUI is being operated programmatically + * @param inBatchMode + */ + public void setInBatchMode(boolean inBatchMode) + { + this.inBatchMode = inBatchMode; + } + + + public void startServiceDiscovery() + { + startServiceDiscovery(false); + } + + public void startServiceDiscovery(boolean blocking) + { + boolean alive = true; + Thread t0 = null, t1 = null, t2 = null; + + // todo: changesupport handlers need to be transferred + if (discoverer == null) + { + discoverer = new jalview.ws.jws1.Discoverer(); + // register PCS handler for desktop. + discoverer.addPropertyChangeListener(changeSupport); + } + if (Cache.getDefault("SHOW_JWS1_SERVICES", true)) + { + (t0 = new Thread(discoverer)).start(); + } + + try + { + if (Cache.getDefault("SHOW_ENFIN_SERVICES", true)) + { + // EnfinEnvision web service menu entries are rebuild every time the + // menu is shown, so no changeSupport events are needed. + jalview.ws.EnfinEnvision2OneWay.getInstance(); + (t1 = new Thread(jalview.ws.EnfinEnvision2OneWay.getInstance())) + .start(); + } + } catch (Exception e) + { + Cache.log + .info( + "Exception when trying to launch Envision2 workflow discovery.", + e); + Cache.log.info(e.getStackTrace()); + } + if (Cache.getDefault("SHOW_JWS2_SERVICES", true)) + { + jalview.ws.jws2.Jws2Discoverer.getDiscoverer() + .addPropertyChangeListener(changeSupport); + (t2 = new Thread(jalview.ws.jws2.Jws2Discoverer.getDiscoverer())) + .start(); + } + if (blocking) + { + while (alive) + { + try + { + Thread.sleep(15); + } catch (Exception e) + { + } + alive = (t1 != null && t1.isAlive()) + || (t2 != null && t2.isAlive()) + || (t0 != null && t0.isAlive()); + } + } + } + + /** + * start a thread to open a URL in the configured browser. Pops up a warning dialog to the user if there is an exception when calling out to the browser to open the URL. + * @param url + */ + public static void showUrl(final String url) + { + new Thread(new Runnable() { + public void run() { + try { + jalview.util.BrowserLauncher.openURL(url); + } catch (Exception ex) + { + JOptionPane + .showInternalMessageDialog( + Desktop.desktop, + "Unixers: Couldn't find default web browser." + + "\nAdd the full path to your browser in Preferences.", + "Web browser not found", JOptionPane.WARNING_MESSAGE); + + ex.printStackTrace(); + } + } + }).start(); + } + + public static WsParamSetManager wsparamManager = null; + public static ParamManager getUserParameterStore() + { + if (wsparamManager==null) + { + wsparamManager = new WsParamSetManager(); + } + return wsparamManager; + } + }