X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=90af8816d33faf59d7c45c469d13c4ece2df623b;hb=17c8e30466e7a52708ed95465151dd254617a7e4;hp=f9689dbc7c0b5cf7227ef5e5efb1d767ecc88ba0;hpb=02110a2094efc43c0f876555b31653f3265ac1ac;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index f9689db..90af881 100755 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -18,14 +18,22 @@ */ package jalview.gui; +import jalview.bin.Cache; import jalview.io.*; import java.awt.*; import java.awt.datatransfer.*; import java.awt.dnd.*; import java.awt.event.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLConnection; +import java.nio.channels.ReadableByteChannel; import java.util.*; import javax.swing.*; @@ -82,6 +90,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); @@ -93,22 +103,19 @@ public class Desktop extends jalview.jbgui.GDesktop implements // 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)) - { - setBounds(Integer.parseInt(x), Integer.parseInt(y), Integer - .parseInt(width), Integer.parseInt(height)); + Rectangle dims = getLastKnownDimensions(""); + if (dims!=null) + { + 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); + showConsole(showjconsole); this.addWindowListener(new WindowAdapter() { @@ -131,12 +138,63 @@ 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. } + /** + * 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) + { + 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); + 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() { if (jalview.bin.Cache.vamsasJarsPresent()) @@ -380,6 +438,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements { Transferable t = evt.getTransferable(); java.util.List files = null; + java.util.List protocols = null; try { @@ -398,6 +457,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); String data = (String) t.getTransferData(uriListFlavor); files = new java.util.ArrayList(1); + protocols = new java.util.ArrayList(1); for (java.util.StringTokenizer st = new java.util.StringTokenizer( data, "\r\n"); st.hasMoreTokens();) { @@ -407,10 +467,19 @@ public class Desktop extends jalview.jbgui.GDesktop implements // the line is a comment (as per the RFC 2483) continue; } - java.net.URI uri = new java.net.URI(s); - java.io.File file = new java.io.File(uri); - files.add(file); + if (uri.getScheme().toLowerCase().startsWith("http")) + { + protocols.add(FormatAdapter.URL); + files.add(uri.toString()); + } + else + { + // otherwise preserve old behaviour: catch all for file objects + java.io.File file = new java.io.File(uri); + protocols.add(FormatAdapter.FILE); + files.add(file.toString()); + } } } } catch (Exception e) @@ -424,7 +493,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 = FormatAdapter.FILE; + String protocol = (protocols == null) ? FormatAdapter.FILE + : (String) protocols.get(i); String format = null; if (file.endsWith(".jar")) @@ -592,13 +662,32 @@ 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! * @@ -718,6 +807,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(); @@ -827,8 +944,13 @@ 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()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent()); + // TODO catch and handle errors for savestate new Jalview2XML().SaveState(choice); + removeProgressPanel(progpanel); + } } @@ -852,9 +974,12 @@ 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()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser .getSelectedFile().getParent()); new Jalview2XML().LoadJalviewAlign(choice); + setProgressBar(null, choice.hashCode()); } } @@ -940,6 +1065,12 @@ public class Desktop extends jalview.jbgui.GDesktop implements public static AlignmentPanel[] getAlignmentPanels(String viewId) { int count = 0; + if (Desktop.desktop == null) + { + // no frames created and in headless mode + // TODO: verify that frames are recoverable when in headless mode + return null; + } JInternalFrame[] frames = Desktop.desktop.getAllFrames(); ArrayList aps = new ArrayList(); for (int t = 0; t < frames.length; t++) @@ -1121,8 +1252,55 @@ 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) + { + // 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; + } + + try + { + // copy the URL content to a temporary local file + // TODO: be a bit cleverer here with nio (?!) + File file = File.createTempFile("vdocfromurl", ".vdj"); + FileOutputStream fos = new FileOutputStream(file); + BufferedInputStream bis = new BufferedInputStream(url.openStream()); + byte[] buffer = new byte[2048]; + int ln; + while ((ln = bis.read(buffer)) > -1) + { + 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(); + } + + /** + * 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) @@ -1135,25 +1313,34 @@ public class Desktop extends jalview.jbgui.GDesktop implements return false; } + setProgressBar("Importing VAMSAS session from " + file.getName(), file + .hashCode()); try { - v_client = new jalview.gui.VamsasApplication(this, file); + v_client = new jalview.gui.VamsasApplication(this, file, null); } catch (Exception ex) { + 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()); 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."); } @@ -1306,6 +1493,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()); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent()); String warnmsg = null; String warnttl = null; @@ -1327,6 +1516,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements + choice, ex); } + removeProgressPanel(progpanel); if (warnmsg != null) { JOptionPane.showInternalMessageDialog(Desktop.desktop, @@ -1430,7 +1620,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements { try { - Thread.sleep(3000); maxMemory = runtime.maxMemory() / 1048576f; allocatedMemory = runtime.totalMemory() / 1048576f; freeMemory = runtime.freeMemory() / 1048576f; @@ -1445,7 +1634,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements // instance.set.setBorder(border1); } repaint(); - + // sleep after showing usage + Thread.sleep(3000); } catch (Exception ex) { ex.printStackTrace(); @@ -1455,7 +1645,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements public void paintComponent(Graphics g) { - if (showMemoryUsage) + if (showMemoryUsage && g != null) { if (percentUsage < 20) g.setColor(Color.red);