X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=1b24694657e1157f59d740b0961294acf4600f9f;hb=4e1cb9b8b058d9b633af223b1cdb7b220d5d2ccd;hp=d79f4728faf281ca747a6f8ecdc2beda8d30a33d;hpb=e83f899e879e04af8f9baa9a495e2918a67f6a4f;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index d79f472..1b24694 100755 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -1,256 +1,1743 @@ -/******************** - * 2004 Jalview Reengineered - * Barton Group - * Dundee University - * - * AM Waterhouse - *******************/ - - -package jalview.gui; - -import jalview.gui.*; -import jalview.io.*; -import jalview.datamodel.*; -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; - - -public class Desktop extends jalview.jbgui.GDesktop -{ - public static JDesktopPane desktop; - static int openFrameCount = 0; - static final int xOffset = 30, yOffset = 30; - - public Desktop() - { - Image image =null; - try{ - java.net.URL url = getClass().getResource("/BartonGroupBanner.gif"); - if(url!=null) - { - image = java.awt.Toolkit.getDefaultToolkit().createImage(url); - MediaTracker mt = new MediaTracker(this); - mt.addImage(image, 0); - mt.waitForID(0); - setIconImage(image); - } - - }catch(Exception ex){} - - setTitle("Jalview 2005"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setVisible(true); - desktop = new JDesktopPane(); - setContentPane(desktop); - desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - int width = 1200, height = 800; - if(screenSize.getWidth() 0) + { + AlignViewport[] vp = new AlignViewport[viewp.size()]; + viewp.copyInto(vp); + return vp; + } + } + return null; + } + + public void explodeViews(AlignFrame af) + { + int size = af.alignPanels.size(); + if (size < 2) + { + return; + } + + for (int i = 0; i < size; i++) + { + AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(i); + AlignFrame newaf = new AlignFrame(ap); + if (ap.av.explodedPosition != null + && !ap.av.explodedPosition.equals(af.getBounds())) + { + newaf.setBounds(ap.av.explodedPosition); + } + + ap.av.gatherViewsHere = false; + + addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + } + + af.alignPanels.clear(); + af.closeMenuItem_actionPerformed(true); + + } + + public void gatherViews(AlignFrame source) + { + source.viewport.gatherViewsHere = true; + source.viewport.explodedPosition = source.getBounds(); + JInternalFrame[] frames = desktop.getAllFrames(); + String viewId = source.viewport.sequenceSetID; + + for (int t = 0; t < frames.length; t++) + { + if (frames[t] instanceof AlignFrame && frames[t] != source) + { + AlignFrame af = (AlignFrame) frames[t]; + boolean gatherThis = false; + for (int a = 0; a < af.alignPanels.size(); a++) + { + AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(a); + if (viewId.equals(ap.av.getSequenceSetId())) + { + gatherThis = true; + ap.av.gatherViewsHere = false; + ap.av.explodedPosition = af.getBounds(); + source.addAlignmentPanel(ap, false); + } + } + + if (gatherThis) + { + af.alignPanels.clear(); + af.closeMenuItem_actionPerformed(true); + } + } + } + + } + + jalview.gui.VamsasApplication v_client = null; + + public void vamsasImport_actionPerformed(ActionEvent e) + { + if (v_client == null) + { + // Load and try to start a session. + JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache + .getProperty("LAST_DIRECTORY")); + + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle("Open a saved VAMSAS session"); + chooser + .setToolTipText("select a vamsas session to be opened as a new vamsas session."); + + int value = chooser.showOpenDialog(this); + + if (value == JalviewFileChooser.APPROVE_OPTION) + { + String fle = chooser.getSelectedFile().toString(); + if (!vamsasImport(chooser.getSelectedFile())) + { + JOptionPane.showInternalMessageDialog(Desktop.desktop, + "Couldn't import '" + fle + "' as a new vamsas session.", + "Vamsas Document Import Failed", + JOptionPane.ERROR_MESSAGE); + } + } + } + else + { + jalview.bin.Cache.log + .error("Implementation error - load session from a running session is not supported."); + } + } + + /** + * 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) + { + if (v_client != null) + { + + jalview.bin.Cache.log + .error("Implementation error - load session from a running session is not supported."); + return false; + } + + setProgressBar("Importing VAMSAS session from "+file.getName(),file.hashCode()); + try + { + 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) + { + throw new Error("Trying to join a vamsas session when another is already connected."); + } + if (mysesid==null) + { + throw new Error("Invalid vamsas session id."); + } + v_client = new VamsasApplication(this, mysesid); + setupVamsasConnectedGui(); + v_client.initial_update(); + return (v_client.inSession()); + } + + public void vamsasStart_actionPerformed(ActionEvent e) + { + if (v_client == null) + { + // Start a session. + // we just start a default session for moment. + /* + * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache. + * getProperty("LAST_DIRECTORY")); + * + * chooser.setFileView(new JalviewFileView()); + * chooser.setDialogTitle("Load Vamsas file"); + * chooser.setToolTipText("Import"); + * + * int value = chooser.showOpenDialog(this); + * + * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new + * jalview.gui.VamsasApplication(this, chooser.getSelectedFile()); + */ + v_client = new VamsasApplication(this); + setupVamsasConnectedGui(); + v_client.initial_update(); // TODO: thread ? + } + else + { + // store current data in session. + v_client.push_update(); // TODO: thread + } + } + + protected void setupVamsasConnectedGui() + { + vamsasStart.setText("Session Update"); + vamsasSave.setVisible(true); + vamsasStop.setVisible(true); + vamsasImport.setVisible(false); // Document import to existing session is + // not possible for vamsas-client-1.0. + } + + protected void setupVamsasDisconnectedGui() + { + vamsasSave.setVisible(false); + vamsasStop.setVisible(false); + vamsasImport.setVisible(true); + vamsasStart.setText("New Vamsas Session"); + } + + public void vamsasStop_actionPerformed(ActionEvent e) + { + if (v_client != null) + { + v_client.end_session(); + v_client = null; + setupVamsasDisconnectedGui(); + } + } + + protected void buildVamsasStMenu() + { + if (v_client == null) + { + String[] sess = null; + try + { + sess = VamsasApplication.getSessionList(); + } catch (Exception e) + { + jalview.bin.Cache.log.warn( + "Problem getting current sessions list.", e); + sess = null; + } + if (sess != null) + { + jalview.bin.Cache.log.debug("Got current sessions list: " + + sess.length + " entries."); + VamsasStMenu.removeAll(); + for (int i = 0; i < sess.length; i++) + { + JMenuItem sessit = new JMenuItem(); + sessit.setText(sess[i]); + sessit.setToolTipText("Connect to session " + sess[i]); + final Desktop dsktp = this; + final String mysesid = sess[i]; + sessit.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + if (dsktp.v_client == null) + { + Thread rthr = new Thread(new Runnable() + { + + public void run() + { + dsktp.v_client = new VamsasApplication(dsktp, mysesid); + dsktp.setupVamsasConnectedGui(); + dsktp.v_client.initial_update(); + } + + }); + rthr.start(); + } + }; + }); + VamsasStMenu.add(sessit); + } + // don't show an empty menu. + VamsasStMenu.setVisible(sess.length > 0); + + } + else + { + jalview.bin.Cache.log.debug("No current vamsas sessions."); + VamsasStMenu.removeAll(); + VamsasStMenu.setVisible(false); + } + } + else + { + // Not interested in the content. Just hide ourselves. + VamsasStMenu.setVisible(false); + } + } + + public void vamsasSave_actionPerformed(ActionEvent e) + { + if (v_client != null) + { + JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache + .getProperty("LAST_DIRECTORY"), new String[] + { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ + new String[] + { "Vamsas Document" }, "Vamsas Document"); + + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle("Save Vamsas Document Archive"); + + int value = chooser.showSaveDialog(this); + + 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; + try + { + v_client.vclient.storeDocument(choice); + } catch (Error ex) + { + warnttl = "Serious Problem saving Vamsas Document"; + warnmsg = ex.toString(); + jalview.bin.Cache.log.error("Error Whilst saving document to " + + choice, ex); + + } catch (Exception ex) + { + warnttl = "Problem saving Vamsas Document."; + warnmsg = ex.toString(); + jalview.bin.Cache.log.warn("Exception Whilst saving document to " + + choice, ex); + + } + removeProgressPanel(progpanel); + if (warnmsg != null) + { + JOptionPane.showInternalMessageDialog(Desktop.desktop, + + warnmsg, warnttl, JOptionPane.ERROR_MESSAGE); + } + } + } + } + + JProgressBar vamUpdate = null; + + /** + * hide vamsas user gui bits when a vamsas document event is being handled. + * + * @param b + * true to hide gui, false to reveal gui + */ + public void setVamsasUpdate(boolean b) + { + jalview.bin.Cache.log.debug("Setting gui for Vamsas update " + + (b ? "in progress" : "finished")); + + if (vamUpdate != null) + { + this.removeProgressPanel(vamUpdate); + } + if (b) + { + vamUpdate = this.addProgressPanel("Updating vamsas session"); + } + vamsasStart.setVisible(!b); + vamsasStop.setVisible(!b); + vamsasSave.setVisible(!b); + } + + public JInternalFrame[] getAllFrames() + { + return desktop.getAllFrames(); + } + + /** + * Checks the given url to see if it gives a response indicating that the user + * should be informed of a new questionnaire. + * + * @param url + */ + public void checkForQuestionnaire(String url) + { + UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url); + // javax.swing.SwingUtilities.invokeLater(jvq); + new Thread(jvq).start(); + } + + /** + * Proxy class for JDesktopPane which optionally displays the current memory + * usage and highlights the desktop area with a red bar if free memory runs + * low. + * + * @author AMW + */ + public class MyDesktopPane extends JDesktopPane implements Runnable + { + + boolean showMemoryUsage = false; + + Runtime runtime; + + java.text.NumberFormat df; + + float maxMemory, allocatedMemory, freeMemory, totalFreeMemory, + percentUsage; + + public MyDesktopPane(boolean showMemoryUsage) + { + showMemoryUsage(showMemoryUsage); + } + + public void showMemoryUsage(boolean showMemoryUsage) + { + this.showMemoryUsage = showMemoryUsage; + if (showMemoryUsage) + { + Thread worker = new Thread(this); + worker.start(); + } + } + + public boolean isShowMemoryUsage() + { + return showMemoryUsage; + } + + public void run() + { + df = java.text.NumberFormat.getNumberInstance(); + df.setMaximumFractionDigits(2); + runtime = Runtime.getRuntime(); + + while (showMemoryUsage) + { + try + { + Thread.sleep(3000); + maxMemory = runtime.maxMemory() / 1048576f; + allocatedMemory = runtime.totalMemory() / 1048576f; + freeMemory = runtime.freeMemory() / 1048576f; + totalFreeMemory = freeMemory + (maxMemory - allocatedMemory); + + percentUsage = (totalFreeMemory / maxMemory) * 100; + + // if (percentUsage < 20) + { + // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12, + // Color.red); + // instance.set.setBorder(border1); + } + repaint(); + + } catch (Exception ex) + { + ex.printStackTrace(); + } + } + } + + public void paintComponent(Graphics g) + { + if (showMemoryUsage) + { + 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()); + } + } + + } + + protected JMenuItem groovyShell; + + public void doGroovyCheck() + { + if (jalview.bin.Cache.groovyJarsPresent()) + { + groovyShell = new JMenuItem(); + groovyShell.setText("Groovy Console..."); + groovyShell.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + groovyShell_actionPerformed(e); + } + }); + toolsMenu.add(groovyShell); + groovyShell.setVisible(true); + } + } + + /** + * Accessor method to quickly get all the AlignmentFrames loaded. + */ + public static AlignFrame[] getAlignframes() + { + JInternalFrame[] frames = Desktop.desktop.getAllFrames(); + + if (frames == null) + { + return null; + } + Vector avp = new Vector(); + try + { + // REVERSE ORDER + for (int i = frames.length - 1; i > -1; i--) + { + if (frames[i] instanceof AlignFrame) + { + AlignFrame af = (AlignFrame) frames[i]; + avp.addElement(af); + } + } + } catch (Exception ex) + { + ex.printStackTrace(); + } + if (avp.size() == 0) + { + return null; + } + AlignFrame afs[] = new AlignFrame[avp.size()]; + for (int i = 0, j = avp.size(); i < j; i++) + { + afs[i] = (AlignFrame) avp.elementAt(i); + } + avp.clear(); + return afs; + } + + /** + * Add Groovy Support to Jalview + */ + public void groovyShell_actionPerformed(ActionEvent e) + { + // use reflection to avoid creating compilation dependency. + if (!jalview.bin.Cache.groovyJarsPresent()) + { + throw new Error( + "Implementation Error. Cannot create groovyShell without Groovy on the classpath!"); + } + try + { + Class gcClass = Desktop.class.getClassLoader().loadClass( + "groovy.ui.Console"); + Constructor gccons = gcClass.getConstructor(null); + java.lang.reflect.Method setvar = gcClass.getMethod("setVariable", + new Class[] + { String.class, Object.class }); + java.lang.reflect.Method run = gcClass.getMethod("run", null); + Object gc = gccons.newInstance(null); + setvar.invoke(gc, new Object[] + { "Jalview", this }); + run.invoke(gc, null); + } catch (Exception ex) + { + jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex); + JOptionPane + .showInternalMessageDialog( + Desktop.desktop, + + "Couldn't create the groovy Shell. Check the error log for the details of what went wrong.", + "Jalview Groovy Support Failed", + JOptionPane.ERROR_MESSAGE); + } + } + + /** + * Progress bars managed by the IProgressIndicator method. + */ + private Hashtable progressBars, progressBarHandlers; + + /* + * (non-Javadoc) + * + * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long) + */ + public void setProgressBar(String message, long id) + { + if (progressBars == null) + { + progressBars = new Hashtable(); + progressBarHandlers = new Hashtable(); + } + + if (progressBars.get(new Long(id)) != null) + { + JProgressBar progressPanel = (JProgressBar) progressBars + .remove(new Long(id)); + if (progressBarHandlers.contains(new Long(id))) + { + progressBarHandlers.remove(new Long(id)); + } + removeProgressPanel(progressPanel); + } + else + { + progressBars.put(new Long(id), addProgressPanel(message)); + } + } + + /* + * (non-Javadoc) + * + * @see jalview.gui.IProgressIndicator#registerHandler(long, + * jalview.gui.IProgressIndicatorHandler) + */ + public void registerHandler(final long id, + final IProgressIndicatorHandler handler) + { + if (progressBarHandlers == null || !progressBars.contains(new Long(id))) + { + throw new Error( + "call setProgressBar before registering the progress bar's handler."); + } + progressBarHandlers.put(new Long(id), handler); + final JPanel progressPanel = (JPanel) progressBars.get(new Long(id)); + if (handler.canCancel()) + { + JButton cancel = new JButton("Cancel"); + final IProgressIndicator us = this; + cancel.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + handler.cancelActivity(id); + us.setProgressBar("Cancelled " + + ((JLabel) progressPanel.getComponent(0)).getText(), id); + } + }); + progressPanel.add(cancel, BorderLayout.EAST); + } + } + + /** + * This will return the first AlignFrame viewing AlignViewport av. It will + * break if there are more than one AlignFrames viewing a particular av. This + * + * @param av + * @return alignFrame for av + */ + public static AlignFrame getAlignFrameFor(AlignViewport av) + { + if (desktop != null) + { + AlignmentPanel[] aps = getAlignmentPanels(av.getSequenceSetId()); + for (int panel = 0; aps != null && panel < aps.length; panel++) + { + if (aps[panel] != null && aps[panel].av == av) + { + return aps[panel].alignFrame; + } + } + } + return null; + } + + public VamsasApplication getVamsasApplication() + { + return v_client; + + } +}