2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3 * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
20 import jalview.bin.Cache;
21 import jalview.io.FileLoader;
22 import jalview.io.FormatAdapter;
23 import jalview.io.IdentifyFile;
24 import jalview.io.JalviewFileChooser;
25 import jalview.io.JalviewFileView;
26 import jalview.ws.params.ParamManager;
28 import java.awt.BorderLayout;
29 import java.awt.Color;
30 import java.awt.Dimension;
31 import java.awt.FontMetrics;
32 import java.awt.Graphics;
33 import java.awt.GridLayout;
34 import java.awt.Point;
35 import java.awt.Rectangle;
36 import java.awt.Toolkit;
37 import java.awt.datatransfer.Clipboard;
38 import java.awt.datatransfer.ClipboardOwner;
39 import java.awt.datatransfer.DataFlavor;
40 import java.awt.datatransfer.Transferable;
41 import java.awt.dnd.DnDConstants;
42 import java.awt.dnd.DropTargetDragEvent;
43 import java.awt.dnd.DropTargetDropEvent;
44 import java.awt.dnd.DropTargetEvent;
45 import java.awt.dnd.DropTargetListener;
46 import java.awt.event.ActionEvent;
47 import java.awt.event.ActionListener;
48 import java.awt.event.FocusEvent;
49 import java.awt.event.FocusListener;
50 import java.awt.event.MouseAdapter;
51 import java.awt.event.MouseEvent;
52 import java.awt.event.MouseListener;
53 import java.awt.event.WindowAdapter;
54 import java.awt.event.WindowEvent;
55 import java.beans.PropertyChangeEvent;
56 import java.beans.PropertyChangeListener;
57 import java.beans.PropertyVetoException;
58 import java.io.BufferedInputStream;
60 import java.io.FileOutputStream;
61 import java.lang.reflect.Constructor;
63 import java.util.ArrayList;
64 import java.util.Hashtable;
65 import java.util.StringTokenizer;
66 import java.util.Vector;
68 import javax.swing.DefaultDesktopManager;
69 import javax.swing.DesktopManager;
70 import javax.swing.JButton;
71 import javax.swing.JComboBox;
72 import javax.swing.JComponent;
73 import javax.swing.JDesktopPane;
74 import javax.swing.JFrame;
75 import javax.swing.JInternalFrame;
76 import javax.swing.JLabel;
77 import javax.swing.JMenuItem;
78 import javax.swing.JOptionPane;
79 import javax.swing.JPanel;
80 import javax.swing.JPopupMenu;
81 import javax.swing.JProgressBar;
82 import javax.swing.SwingUtilities;
83 import javax.swing.event.MenuEvent;
84 import javax.swing.event.MenuListener;
91 * @version $Revision: 1.155 $
93 public class Desktop extends jalview.jbgui.GDesktop implements
94 DropTargetListener, ClipboardOwner, IProgressIndicator, jalview.api.StructureSelectionManagerProvider
97 private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
100 * news reader - null if it was never started.
102 private BlogReader jvnews=null;
106 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
108 public void addJalviewPropertyChangeListener(
109 PropertyChangeListener listener)
111 changeSupport.addJalviewPropertyChangeListener(listener);
115 * @param propertyName
117 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String,
118 * java.beans.PropertyChangeListener)
120 public void addJalviewPropertyChangeListener(String propertyName,
121 PropertyChangeListener listener)
123 changeSupport.addJalviewPropertyChangeListener(propertyName, listener);
127 * @param propertyName
129 * @see jalview.gui.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String,
130 * java.beans.PropertyChangeListener)
132 public void removeJalviewPropertyChangeListener(String propertyName,
133 PropertyChangeListener listener)
135 changeSupport.removeJalviewPropertyChangeListener(propertyName,
139 /** Singleton Desktop instance */
140 public static Desktop instance;
142 public static MyDesktopPane desktop;
144 static int openFrameCount = 0;
146 static final int xOffset = 30;
148 static final int yOffset = 30;
150 public static jalview.ws.jws1.Discoverer discoverer;
152 public static Object[] jalviewClipboard;
154 public static boolean internalCopy = false;
156 static int fileLoadingCount = 0;
158 class MyDesktopManager implements DesktopManager
161 private DesktopManager delegate;
163 public MyDesktopManager(DesktopManager delegate)
165 this.delegate = delegate;
168 public void activateFrame(JInternalFrame f)
172 delegate.activateFrame(f);
173 } catch (NullPointerException npe)
175 Point p = getMousePosition();
176 instance.showPasteMenu(p.x, p.y);
180 public void beginDraggingFrame(JComponent f)
182 delegate.beginDraggingFrame(f);
185 public void beginResizingFrame(JComponent f, int direction)
187 delegate.beginResizingFrame(f, direction);
190 public void closeFrame(JInternalFrame f)
192 delegate.closeFrame(f);
195 public void deactivateFrame(JInternalFrame f)
197 delegate.deactivateFrame(f);
200 public void deiconifyFrame(JInternalFrame f)
202 delegate.deiconifyFrame(f);
205 public void dragFrame(JComponent f, int newX, int newY)
211 delegate.dragFrame(f, newX, newY);
214 public void endDraggingFrame(JComponent f)
216 delegate.endDraggingFrame(f);
219 public void endResizingFrame(JComponent f)
221 delegate.endResizingFrame(f);
224 public void iconifyFrame(JInternalFrame f)
226 delegate.iconifyFrame(f);
229 public void maximizeFrame(JInternalFrame f)
231 delegate.maximizeFrame(f);
234 public void minimizeFrame(JInternalFrame f)
236 delegate.minimizeFrame(f);
239 public void openFrame(JInternalFrame f)
241 delegate.openFrame(f);
244 public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
247 Rectangle b=desktop.getBounds();
252 delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
255 public void setBoundsForFrame(JComponent f, int newX, int newY,
256 int newWidth, int newHeight)
258 delegate.setBoundsForFrame(f, newX, newY, newWidth, newHeight);
261 // All other methods, simply delegate
266 * Creates a new Desktop object.
271 * A note to implementors. It is ESSENTIAL that any activities that might
272 * block are spawned off as threads rather than waited for during this
276 doVamsasClientCheck();
279 setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
280 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
281 boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
283 boolean showjconsole = jalview.bin.Cache.getDefault(
284 "SHOW_JAVA_CONSOLE", false);
285 desktop = new MyDesktopPane(selmemusage);
286 showMemusage.setSelected(selmemusage);
287 desktop.setBackground(Color.white);
288 getContentPane().setLayout(new BorderLayout());
289 // alternate config - have scrollbars - see notes in JAL-153
290 //JScrollPane sp = new JScrollPane();
291 //sp.getViewport().setView(desktop);
292 //getContentPane().add(sp, BorderLayout.CENTER);
293 getContentPane().add(desktop, BorderLayout.CENTER);
294 desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
297 // This line prevents Windows Look&Feel resizing all new windows to maximum
298 // if previous window was maximised
299 desktop.setDesktopManager(new MyDesktopManager(
300 new DefaultDesktopManager()));
302 Rectangle dims = getLastKnownDimensions("");
309 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
310 setBounds((int) (screenSize.width - 900) / 2,
311 (int) (screenSize.height - 650) / 2, 900, 650);
313 jconsole = new Console(this, showjconsole);
314 // add essential build information
315 jconsole.setHeader("Jalview Desktop "
316 + jalview.bin.Cache.getProperty("VERSION") + "\n"
318 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + "\n"
319 + "Java version: " + System.getProperty("java.version") + "\n"
320 + System.getProperty("os.arch") + " "
321 + System.getProperty("os.name") + " "
322 + System.getProperty("os.version"));
324 showConsole(showjconsole);
326 showNews.setVisible(false);
327 final Desktop me = this;
328 // Thread off the news reader, in case there are connection problems.
329 new Thread( new Runnable() {
333 Cache.log.debug("Starting news thread.");
335 jvnews = new BlogReader(me);
336 showNews.setVisible(true);
337 Cache.log.debug("Completed news thread.");
341 this.addWindowListener(new WindowAdapter()
343 public void windowClosing(WindowEvent evt)
350 this.addMouseListener(ma=new MouseAdapter()
352 public void mousePressed(MouseEvent evt)
354 if (SwingUtilities.isRightMouseButton(evt))
356 showPasteMenu(evt.getX(), evt.getY());
360 desktop.addMouseListener(ma);
362 this.addFocusListener(new FocusListener()
366 public void focusLost(FocusEvent e)
368 // TODO Auto-generated method stub
373 public void focusGained(FocusEvent e)
375 Cache.log.debug("Relaying windows after focus gain");
376 // make sure that we sort windows properly after we gain focus
377 instance.relayerWindows();
380 this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
381 // Spawn a thread that shows the splashscreen
382 SwingUtilities.invokeLater(new Runnable()
391 // Thread off a new instance of the file chooser - this reduces the time it
392 // takes to open it later on.
393 new Thread(new Runnable()
397 Cache.log.debug("Filechooser init thread started.");
398 JalviewFileChooser chooser = new JalviewFileChooser(
399 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
400 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
401 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
402 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
403 Cache.log.debug("Filechooser init thread finished.");
406 // Add the service change listener
407 changeSupport.addJalviewPropertyChangeListener("services",
408 new PropertyChangeListener()
412 public void propertyChange(PropertyChangeEvent evt)
414 Cache.log.debug("Firing service changed event for "
415 + evt.getNewValue());
416 JalviewServicesChanged(evt);
422 protected void showNews_actionPerformed(ActionEvent e)
424 showNews(showNews.isSelected());
426 void showNews(boolean visible)
429 Cache.log.debug((visible?"Showing":"Hiding")+" news.");
430 showNews.setSelected(visible);
431 if (visible && !jvnews.isVisible())
433 new Thread(new Runnable() {
437 long instance=System.currentTimeMillis();
438 Desktop.instance.setProgressBar("Refreshing news", instance);
439 jvnews.refreshNews();
440 Desktop.instance.setProgressBar(null, instance);
449 * recover the last known dimensions for a jalview window
452 * - empty string is desktop, all other windows have unique prefix
453 * @return null or last known dimensions scaled to current geometry (if last
454 * window geom was known)
456 Rectangle getLastKnownDimensions(String windowName)
458 // TODO: lock aspect ratio for scaling desktop Bug #0058199
459 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
460 String x = jalview.bin.Cache.getProperty(windowName + "SCREEN_X");
461 String y = jalview.bin.Cache.getProperty(windowName + "SCREEN_Y");
462 String width = jalview.bin.Cache.getProperty(windowName
464 String height = jalview.bin.Cache.getProperty(windowName
466 if ((x != null) && (y != null) && (width != null) && (height != null))
468 int ix = Integer.parseInt(x), iy = Integer.parseInt(y), iw = Integer
469 .parseInt(width), ih = Integer.parseInt(height);
470 if (jalview.bin.Cache.getProperty("SCREENGEOMETRY_WIDTH") != null)
472 // attempt #1 - try to cope with change in screen geometry - this
473 // version doesn't preserve original jv aspect ratio.
474 // take ratio of current screen size vs original screen size.
475 double sw = ((1f * screenSize.width) / (1f * Integer
476 .parseInt(jalview.bin.Cache
477 .getProperty("SCREENGEOMETRY_WIDTH"))));
478 double sh = ((1f * screenSize.height) / (1f * Integer
479 .parseInt(jalview.bin.Cache
480 .getProperty("SCREENGEOMETRY_HEIGHT"))));
481 // rescale the bounds depending upon the current screen geometry.
482 ix = (int) (ix * sw);
483 iw = (int) (iw * sw);
484 iy = (int) (iy * sh);
485 ih = (int) (ih * sh);
486 while (ix >= screenSize.width)
488 jalview.bin.Cache.log
489 .debug("Window geometry location recall error: shifting horizontal to within screenbounds.");
490 ix -= screenSize.width;
492 while (iy >= screenSize.height)
494 jalview.bin.Cache.log
495 .debug("Window geometry location recall error: shifting vertical to within screenbounds.");
496 iy -= screenSize.height;
498 jalview.bin.Cache.log.debug("Got last known dimensions for "
499 + windowName + ": x:" + ix + " y:" + iy + " width:" + iw
502 // return dimensions for new instance
503 return new Rectangle(ix, iy, iw, ih);
508 private void doVamsasClientCheck()
510 if (jalview.bin.Cache.vamsasJarsPresent())
512 setupVamsasDisconnectedGui();
513 VamsasMenu.setVisible(true);
514 final Desktop us = this;
515 VamsasMenu.addMenuListener(new MenuListener()
517 // this listener remembers when the menu was first selected, and
518 // doesn't rebuild the session list until it has been cleared and
520 boolean refresh = true;
522 public void menuCanceled(MenuEvent e)
527 public void menuDeselected(MenuEvent e)
532 public void menuSelected(MenuEvent e)
536 us.buildVamsasStMenu();
541 vamsasStart.setVisible(true);
545 void showPasteMenu(int x, int y)
547 JPopupMenu popup = new JPopupMenu();
548 JMenuItem item = new JMenuItem("Paste To New Window");
549 item.addActionListener(new ActionListener()
551 public void actionPerformed(ActionEvent evt)
558 popup.show(this, x, y);
565 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
566 Transferable contents = c.getContents(this);
568 if (contents != null)
570 String file = (String) contents
571 .getTransferData(DataFlavor.stringFlavor);
573 String format = new IdentifyFile().Identify(file,
574 FormatAdapter.PASTE);
576 new FileLoader().LoadFile(file, FormatAdapter.PASTE, format);
579 } catch (Exception ex)
582 .println("Unable to paste alignment from system clipboard:\n"
588 * Adds and opens the given frame to the desktop
599 public static synchronized void addInternalFrame(
600 final JInternalFrame frame, String title, int w, int h)
602 addInternalFrame(frame, title, w, h, true);
619 public static synchronized void addInternalFrame(
620 final JInternalFrame frame, String title, int w, int h,
624 // TODO: allow callers to determine X and Y position of frame (eg. via
626 // TODO: consider fixing method to update entries in the window submenu with
627 // the current window title
629 frame.setTitle(title);
630 if (frame.getWidth() < 1 || frame.getHeight() < 1)
634 // THIS IS A PUBLIC STATIC METHOD, SO IT MAY BE CALLED EVEN IN
635 // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
636 // IF JALVIEW IS RUNNING HEADLESS
637 // ///////////////////////////////////////////////
638 if (System.getProperty("java.awt.headless") != null
639 && System.getProperty("java.awt.headless").equals("true"))
646 frame.setVisible(true);
647 frame.setClosable(true);
648 frame.setResizable(resizable);
649 frame.setMaximizable(resizable);
650 frame.setIconifiable(resizable);
651 frame.setFrameIcon(null);
653 if (frame.getX() < 1 && frame.getY() < 1)
655 frame.setLocation(xOffset * openFrameCount, yOffset
656 * ((openFrameCount - 1) % 10) + yOffset);
659 final JMenuItem menuItem = new JMenuItem(title);
660 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
662 public void internalFrameActivated(
663 javax.swing.event.InternalFrameEvent evt)
665 JInternalFrame itf = desktop.getSelectedFrame();
673 public void internalFrameClosed(
674 javax.swing.event.InternalFrameEvent evt)
676 PaintRefresher.RemoveComponent(frame);
678 windowMenu.remove(menuItem);
679 JInternalFrame itf = desktop.getSelectedFrame();
688 menuItem.addActionListener(new ActionListener()
690 public void actionPerformed(ActionEvent e)
694 frame.setSelected(true);
695 frame.setIcon(false);
696 } catch (java.beans.PropertyVetoException ex)
702 menuItem.addMouseListener(new MouseListener()
706 public void mouseReleased(MouseEvent e)
711 public void mousePressed(MouseEvent e)
716 public void mouseExited(MouseEvent e)
720 frame.setSelected(false);
721 } catch (PropertyVetoException e1)
727 public void mouseEntered(MouseEvent e)
731 frame.setSelected(true);
732 } catch (PropertyVetoException e1)
738 public void mouseClicked(MouseEvent e)
744 windowMenu.add(menuItem);
750 frame.setSelected(true);
751 frame.requestFocus();
752 } catch (java.beans.PropertyVetoException ve)
755 catch (java.lang.ClassCastException cex)
757 Cache.log.warn("Squashed a possible GUI implementation error. If you can recreate this, please look at http://issues.jalview.org/browse/JAL-869",cex);
761 public void lostOwnership(Clipboard clipboard, Transferable contents)
765 Desktop.jalviewClipboard = null;
768 internalCopy = false;
771 public void dragEnter(DropTargetDragEvent evt)
775 public void dragExit(DropTargetEvent evt)
779 public void dragOver(DropTargetDragEvent evt)
783 public void dropActionChanged(DropTargetDragEvent evt)
793 public void drop(DropTargetDropEvent evt)
795 Transferable t = evt.getTransferable();
796 java.util.List files = null;
797 java.util.List protocols = null;
801 DataFlavor uriListFlavor = new DataFlavor(
802 "text/uri-list;class=java.lang.String");
803 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
805 // Works on Windows and MacOSX
806 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
807 files = (java.util.List) t
808 .getTransferData(DataFlavor.javaFileListFlavor);
810 else if (t.isDataFlavorSupported(uriListFlavor))
812 // This is used by Unix drag system
813 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
814 String data = (String) t.getTransferData(uriListFlavor);
815 files = new java.util.ArrayList(1);
816 protocols = new java.util.ArrayList(1);
817 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
818 data, "\r\n"); st.hasMoreTokens();)
820 String s = st.nextToken();
821 if (s.startsWith("#"))
823 // the line is a comment (as per the RFC 2483)
826 java.net.URI uri = new java.net.URI(s);
827 if (uri.getScheme().toLowerCase().startsWith("http"))
829 protocols.add(FormatAdapter.URL);
830 files.add(uri.toString());
834 // otherwise preserve old behaviour: catch all for file objects
835 java.io.File file = new java.io.File(uri);
836 protocols.add(FormatAdapter.FILE);
837 files.add(file.toString());
841 } catch (Exception e)
849 for (int i = 0; i < files.size(); i++)
851 String file = files.get(i).toString();
852 String protocol = (protocols == null) ? FormatAdapter.FILE
853 : (String) protocols.get(i);
854 String format = null;
856 if (file.endsWith(".jar"))
863 format = new IdentifyFile().Identify(file, protocol);
866 new FileLoader().LoadFile(file, protocol, format);
869 } catch (Exception ex)
881 public void inputLocalFileMenuItem_actionPerformed(AlignViewport viewport)
883 JalviewFileChooser chooser = new JalviewFileChooser(
884 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
885 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
886 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
887 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
889 chooser.setFileView(new JalviewFileView());
890 chooser.setDialogTitle("Open local file");
891 chooser.setToolTipText("Open");
893 int value = chooser.showOpenDialog(this);
895 if (value == JalviewFileChooser.APPROVE_OPTION)
897 String choice = chooser.getSelectedFile().getPath();
898 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
899 .getSelectedFile().getParent());
901 String format = null;
902 if (chooser.getSelectedFormat().equals("Jalview"))
908 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
911 if (viewport != null)
913 new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
918 new FileLoader().LoadFile(choice, FormatAdapter.FILE, format);
929 public void inputURLMenuItem_actionPerformed(AlignViewport viewport)
931 // This construct allows us to have a wider textfield
933 JLabel label = new JLabel("Enter URL of Input File");
934 final JComboBox history = new JComboBox();
936 JPanel panel = new JPanel(new GridLayout(2, 1));
939 history.setPreferredSize(new Dimension(400, 20));
940 history.setEditable(true);
941 history.addItem("http://www.");
943 String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
947 if (historyItems != null)
949 st = new StringTokenizer(historyItems, "\t");
951 while (st.hasMoreTokens())
953 history.addItem(st.nextElement());
957 int reply = JOptionPane.showInternalConfirmDialog(desktop, panel,
958 "Input Alignment From URL", JOptionPane.OK_CANCEL_OPTION);
960 if (reply != JOptionPane.OK_OPTION)
965 String url = history.getSelectedItem().toString();
967 if (url.toLowerCase().endsWith(".jar"))
969 if (viewport != null)
971 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL,
976 new FileLoader().LoadFile(url, FormatAdapter.URL, "Jalview");
981 String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
983 if (format.equals("URL NOT FOUND"))
985 JOptionPane.showInternalMessageDialog(Desktop.desktop,
986 "Couldn't locate " + url, "URL not found",
987 JOptionPane.WARNING_MESSAGE);
992 if (viewport != null)
994 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL, format);
998 new FileLoader().LoadFile(url, FormatAdapter.URL, format);
1009 public void inputTextboxMenuItem_actionPerformed(AlignViewport viewport)
1011 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1012 cap.setForInput(viewport);
1013 Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);
1021 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
1023 .setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
1024 jalview.bin.Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height
1026 storeLastKnownDimensions("", new Rectangle(getBounds().x,
1027 getBounds().y, getWidth(), getHeight()));
1029 if (jconsole != null)
1031 storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds());
1032 jconsole.stopConsole();
1036 storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds());
1043 private void storeLastKnownDimensions(String string, Rectangle jc)
1045 jalview.bin.Cache.log.debug("Storing last known dimensions for "
1046 + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width
1047 + " height:" + jc.height);
1049 jalview.bin.Cache.setProperty(string + "SCREEN_X", jc.x + "");
1050 jalview.bin.Cache.setProperty(string + "SCREEN_Y", jc.y + "");
1051 jalview.bin.Cache.setProperty(string + "SCREEN_WIDTH", jc.width + "");
1052 jalview.bin.Cache.setProperty(string + "SCREEN_HEIGHT", jc.height + "");
1061 public void aboutMenuItem_actionPerformed(ActionEvent e)
1063 StringBuffer message = getAboutMessage(false);
1064 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1066 message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
1069 public StringBuffer getAboutMessage(boolean shortv)
1071 StringBuffer message = new StringBuffer();
1072 message.append("<html>");
1075 message.append("<h1><strong>Jalview "
1076 + jalview.bin.Cache.getProperty("VERSION")
1077 + "</strong></h1><br>");
1078 message.append("<strong>Last Updated: <em>"
1079 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")
1080 + "</em></strong>");
1086 message.append("<strong>Jalview version "
1087 + jalview.bin.Cache.getProperty("VERSION")
1088 + "; last updated: "
1089 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"));
1092 if (jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking").equals(
1095 message.append("<br>...Checking latest version...</br>");
1097 else if (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking")
1098 .equals(jalview.bin.Cache.getProperty("VERSION")))
1100 boolean red = false;
1101 if (jalview.bin.Cache.getProperty("VERSION").toLowerCase()
1102 .indexOf("automated build") == -1)
1105 // Displayed when code version and jnlp version do not match and code
1106 // version is not a development build
1107 message.append("<div style=\"color: #FF0000;font-style: bold;\">");
1110 message.append("<br>!! Jalview version "
1111 + jalview.bin.Cache.getDefault("LATEST_VERSION",
1113 + " is available for download from "
1114 + jalview.bin.Cache.getDefault("www.jalview.org",
1115 "http://www.jalview.org") + " !!");
1118 message.append("</div>");
1121 message.append("<br>Authors: "
1125 "Jim Procter, Andrew Waterhouse, Jan Engelhardt, Lauren Lui, Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton")
1126 + "<br>Development managed by The Barton Group, University of Dundee, Scotland, UK.<br>"
1127 + "<br>For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list"
1128 + "<br>If you use Jalview, please cite:"
1129 + "<br>Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
1130 + "<br>Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
1131 + "<br>Bioinformatics doi: 10.1093/bioinformatics/btp033"
1142 public void documentationMenuItem_actionPerformed(ActionEvent e)
1146 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
1147 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
1148 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
1150 javax.help.HelpBroker hb = hs.createHelpBroker();
1151 hb.setCurrentID("home");
1152 hb.setDisplayed(true);
1153 } catch (Exception ex)
1158 public void closeAll_actionPerformed(ActionEvent e)
1160 JInternalFrame[] frames = desktop.getAllFrames();
1161 for (int i = 0; i < frames.length; i++)
1165 frames[i].setClosed(true);
1166 } catch (java.beans.PropertyVetoException ex)
1170 System.out.println("ALL CLOSED");
1171 if (v_client != null)
1173 // TODO clear binding to vamsas document objects on close_all
1178 public void raiseRelated_actionPerformed(ActionEvent e)
1180 reorderAssociatedWindows(false, false);
1183 public void minimizeAssociated_actionPerformed(ActionEvent e)
1185 reorderAssociatedWindows(true, false);
1188 void closeAssociatedWindows()
1190 reorderAssociatedWindows(false, true);
1196 * @seejalview.jbgui.GDesktop#garbageCollect_actionPerformed(java.awt.event.
1199 protected void garbageCollect_actionPerformed(ActionEvent e)
1201 // We simply collect the garbage
1202 jalview.bin.Cache.log.debug("Collecting garbage...");
1204 jalview.bin.Cache.log.debug("Finished garbage collection.");
1211 * jalview.jbgui.GDesktop#showMemusage_actionPerformed(java.awt.event.ActionEvent
1214 protected void showMemusage_actionPerformed(ActionEvent e)
1216 desktop.showMemoryUsage(showMemusage.isSelected());
1223 * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent
1226 protected void showConsole_actionPerformed(ActionEvent e)
1228 showConsole(showConsole.isSelected());
1231 Console jconsole = null;
1234 * control whether the java console is visible or not
1238 void showConsole(boolean selected)
1240 showConsole.setSelected(selected);
1241 // TODO: decide if we should update properties file
1242 Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected)
1244 jconsole.setVisible(selected);
1247 void reorderAssociatedWindows(boolean minimize, boolean close)
1249 JInternalFrame[] frames = desktop.getAllFrames();
1250 if (frames == null || frames.length < 1)
1255 AlignViewport source = null, target = null;
1256 if (frames[0] instanceof AlignFrame)
1258 source = ((AlignFrame) frames[0]).getCurrentView();
1260 else if (frames[0] instanceof TreePanel)
1262 source = ((TreePanel) frames[0]).getViewPort();
1264 else if (frames[0] instanceof PCAPanel)
1266 source = ((PCAPanel) frames[0]).av;
1268 else if (frames[0].getContentPane() instanceof PairwiseAlignPanel)
1270 source = ((PairwiseAlignPanel) frames[0].getContentPane()).av;
1275 for (int i = 0; i < frames.length; i++)
1278 if (frames[i] == null)
1282 if (frames[i] instanceof AlignFrame)
1284 target = ((AlignFrame) frames[i]).getCurrentView();
1286 else if (frames[i] instanceof TreePanel)
1288 target = ((TreePanel) frames[i]).getViewPort();
1290 else if (frames[i] instanceof PCAPanel)
1292 target = ((PCAPanel) frames[i]).av;
1294 else if (frames[i].getContentPane() instanceof PairwiseAlignPanel)
1296 target = ((PairwiseAlignPanel) frames[i].getContentPane()).av;
1299 if (source == target)
1305 frames[i].setClosed(true);
1309 frames[i].setIcon(minimize);
1312 frames[i].toFront();
1316 } catch (java.beans.PropertyVetoException ex)
1330 protected void preferences_actionPerformed(ActionEvent e)
1341 public void saveState_actionPerformed(ActionEvent e)
1343 JalviewFileChooser chooser = new JalviewFileChooser(
1344 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1345 { "jar" }, new String[]
1346 { "Jalview Project" }, "Jalview Project");
1348 chooser.setFileView(new JalviewFileView());
1349 chooser.setDialogTitle("Save State");
1351 int value = chooser.showSaveDialog(this);
1353 if (value == JalviewFileChooser.APPROVE_OPTION)
1355 final Desktop me = this;
1356 final java.io.File choice = chooser.getSelectedFile();
1357 new Thread(new Runnable()
1362 setProgressBar("Saving jalview project " + choice.getName(),
1364 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1365 // TODO catch and handle errors for savestate
1366 // TODO prevent user from messing with the Desktop whilst we're saving
1369 new Jalview2XML().SaveState(choice);
1370 } catch (OutOfMemoryError oom)
1373 "Whilst saving current state to " + choice.getName(), oom);
1374 } catch (Exception ex)
1377 .error("Problems whilst trying to save to "
1378 + choice.getName(), ex);
1379 JOptionPane.showMessageDialog(me,
1380 "Error whilst saving current state to " + choice.getName(),
1381 "Couldn't save project", JOptionPane.WARNING_MESSAGE);
1383 setProgressBar(null, choice.hashCode());
1395 public void loadState_actionPerformed(ActionEvent e)
1397 JalviewFileChooser chooser = new JalviewFileChooser(
1398 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1399 { "jar" }, new String[]
1400 { "Jalview Project" }, "Jalview Project");
1401 chooser.setFileView(new JalviewFileView());
1402 chooser.setDialogTitle("Restore state");
1404 int value = chooser.showOpenDialog(this);
1406 if (value == JalviewFileChooser.APPROVE_OPTION)
1408 final String choice = chooser.getSelectedFile().getAbsolutePath();
1409 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
1410 .getSelectedFile().getParent());
1411 new Thread(new Runnable()
1415 setProgressBar("loading jalview project " + choice,
1419 new Jalview2XML().LoadJalviewAlign(choice);
1420 } catch (OutOfMemoryError oom)
1422 new OOMWarning("Whilst loading project from " + choice, oom);
1423 } catch (Exception ex)
1425 Cache.log.error("Problems whilst loading project from "
1427 JOptionPane.showMessageDialog(Desktop.desktop,
1428 "Error whilst loading project from " + choice,
1429 "Couldn't load project", JOptionPane.WARNING_MESSAGE);
1431 setProgressBar(null, choice.hashCode());
1437 public void inputSequence_actionPerformed(ActionEvent e)
1439 new SequenceFetcher(this);
1442 JPanel progressPanel;
1443 ArrayList<JPanel> fileLoadingPanels=new ArrayList<JPanel>();
1444 public void startLoading(final String fileName)
1446 if (fileLoadingCount == 0)
1448 fileLoadingPanels.add(addProgressPanel("Loading File: " + fileName + " "));
1453 private JPanel addProgressPanel(String string)
1455 if (progressPanel == null)
1457 progressPanel = new JPanel(new GridLayout(1,1));
1458 totalProgressCount = 0;
1459 instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
1461 JPanel thisprogress=new JPanel(new BorderLayout(10,5));
1462 JProgressBar progressBar = new JProgressBar();
1463 progressBar.setIndeterminate(true);
1465 thisprogress.add(new JLabel(string), BorderLayout.WEST);
1467 thisprogress.add(progressBar, BorderLayout.CENTER);
1468 progressPanel.add(thisprogress);
1469 ((GridLayout)progressPanel.getLayout()).setRows(((GridLayout)progressPanel.getLayout()).getRows()+1);
1470 ++totalProgressCount;
1471 instance.validate();
1472 return thisprogress;
1475 int totalProgressCount = 0;
1477 private void removeProgressPanel(JPanel progbar)
1479 if (progressPanel != null)
1481 progressPanel.remove(progbar);
1482 GridLayout gl = (GridLayout) progressPanel.getLayout();
1483 gl.setRows(gl.getRows()-1);
1484 if (--totalProgressCount < 1)
1486 this.getContentPane().remove(progressPanel);
1487 progressPanel = null;
1493 public void stopLoading()
1496 if (fileLoadingCount < 1)
1498 for (JPanel flp : fileLoadingPanels)
1500 removeProgressPanel(flp);
1502 fileLoadingPanels.clear();
1503 fileLoadingCount = 0;
1508 public static int getViewCount(String alignmentId)
1510 AlignViewport[] aps = getViewports(alignmentId);
1511 return (aps == null) ? 0 : aps.length;
1516 * @param alignmentId
1517 * @return all AlignmentPanels concerning the alignmentId sequence set
1519 public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
1522 if (Desktop.desktop == null)
1524 // no frames created and in headless mode
1525 // TODO: verify that frames are recoverable when in headless mode
1528 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
1529 ArrayList aps = new ArrayList();
1530 for (int t = 0; t < frames.length; t++)
1532 if (frames[t] instanceof AlignFrame)
1534 AlignFrame af = (AlignFrame) frames[t];
1535 for (int a = 0; a < af.alignPanels.size(); a++)
1538 .equals(((AlignmentPanel) af.alignPanels.elementAt(a)).av
1539 .getSequenceSetId()))
1541 aps.add(af.alignPanels.elementAt(a));
1546 if (aps.size() == 0)
1550 AlignmentPanel[] vap = new AlignmentPanel[aps.size()];
1551 for (int t = 0; t < vap.length; t++)
1553 vap[t] = (AlignmentPanel) aps.get(t);
1559 * get all the viewports on an alignment.
1561 * @param sequenceSetId
1562 * unique alignment id
1563 * @return all viewports on the alignment bound to sequenceSetId
1565 public static AlignViewport[] getViewports(String sequenceSetId)
1567 Vector viewp = new Vector();
1568 if (desktop != null)
1570 javax.swing.JInternalFrame[] frames = instance.getAllFrames();
1572 for (int t = 0; t < frames.length; t++)
1574 if (frames[t] instanceof AlignFrame)
1576 AlignFrame afr = ((AlignFrame) frames[t]);
1577 if (afr.getViewport().getSequenceSetId().equals(sequenceSetId))
1579 if (afr.alignPanels != null)
1581 for (int a = 0; a < afr.alignPanels.size(); a++)
1583 if (sequenceSetId.equals(((AlignmentPanel) afr.alignPanels
1584 .elementAt(a)).av.getSequenceSetId()))
1586 viewp.addElement(((AlignmentPanel) afr.alignPanels
1593 viewp.addElement(((AlignFrame) frames[t]).getViewport());
1598 if (viewp.size() > 0)
1600 AlignViewport[] vp = new AlignViewport[viewp.size()];
1608 public void explodeViews(AlignFrame af)
1610 int size = af.alignPanels.size();
1616 for (int i = 0; i < size; i++)
1618 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(i);
1619 AlignFrame newaf = new AlignFrame(ap);
1620 if (ap.av.explodedPosition != null
1621 && !ap.av.explodedPosition.equals(af.getBounds()))
1623 newaf.setBounds(ap.av.explodedPosition);
1626 ap.av.gatherViewsHere = false;
1628 addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
1629 AlignFrame.DEFAULT_HEIGHT);
1632 af.alignPanels.clear();
1633 af.closeMenuItem_actionPerformed(true);
1637 public void gatherViews(AlignFrame source)
1639 source.viewport.gatherViewsHere = true;
1640 source.viewport.explodedPosition = source.getBounds();
1641 JInternalFrame[] frames = desktop.getAllFrames();
1642 String viewId = source.viewport.getSequenceSetId();
1644 for (int t = 0; t < frames.length; t++)
1646 if (frames[t] instanceof AlignFrame && frames[t] != source)
1648 AlignFrame af = (AlignFrame) frames[t];
1649 boolean gatherThis = false;
1650 for (int a = 0; a < af.alignPanels.size(); a++)
1652 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(a);
1653 if (viewId.equals(ap.av.getSequenceSetId()))
1656 ap.av.gatherViewsHere = false;
1657 ap.av.explodedPosition = af.getBounds();
1658 source.addAlignmentPanel(ap, false);
1664 af.alignPanels.clear();
1665 af.closeMenuItem_actionPerformed(true);
1672 jalview.gui.VamsasApplication v_client = null;
1674 public void vamsasImport_actionPerformed(ActionEvent e)
1676 if (v_client == null)
1678 // Load and try to start a session.
1679 JalviewFileChooser chooser = new JalviewFileChooser(
1680 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1682 chooser.setFileView(new JalviewFileView());
1683 chooser.setDialogTitle("Open a saved VAMSAS session");
1684 chooser.setToolTipText("select a vamsas session to be opened as a new vamsas session.");
1686 int value = chooser.showOpenDialog(this);
1688 if (value == JalviewFileChooser.APPROVE_OPTION)
1690 String fle = chooser.getSelectedFile().toString();
1691 if (!vamsasImport(chooser.getSelectedFile()))
1693 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1694 "Couldn't import '" + fle + "' as a new vamsas session.",
1695 "Vamsas Document Import Failed",
1696 JOptionPane.ERROR_MESSAGE);
1702 jalview.bin.Cache.log
1703 .error("Implementation error - load session from a running session is not supported.");
1708 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1711 * @return true if import was a success and a session was started.
1713 public boolean vamsasImport(URL url)
1715 // TODO: create progress bar
1716 if (v_client != null)
1719 jalview.bin.Cache.log
1720 .error("Implementation error - load session from a running session is not supported.");
1726 // copy the URL content to a temporary local file
1727 // TODO: be a bit cleverer here with nio (?!)
1728 File file = File.createTempFile("vdocfromurl", ".vdj");
1729 FileOutputStream fos = new FileOutputStream(file);
1730 BufferedInputStream bis = new BufferedInputStream(url.openStream());
1731 byte[] buffer = new byte[2048];
1733 while ((ln = bis.read(buffer)) > -1)
1735 fos.write(buffer, 0, ln);
1739 v_client = new jalview.gui.VamsasApplication(this, file,
1740 url.toExternalForm());
1741 } catch (Exception ex)
1743 jalview.bin.Cache.log.error(
1744 "Failed to create new vamsas session from contents of URL "
1748 setupVamsasConnectedGui();
1749 v_client.initial_update(); // TODO: thread ?
1750 return v_client.inSession();
1754 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1757 * @return true if import was a success and a session was started.
1759 public boolean vamsasImport(File file)
1761 if (v_client != null)
1764 jalview.bin.Cache.log
1765 .error("Implementation error - load session from a running session is not supported.");
1769 setProgressBar("Importing VAMSAS session from " + file.getName(),
1773 v_client = new jalview.gui.VamsasApplication(this, file, null);
1774 } catch (Exception ex)
1776 setProgressBar("Importing VAMSAS session from " + file.getName(),
1778 jalview.bin.Cache.log.error(
1779 "New vamsas session from existing session file failed:", ex);
1782 setupVamsasConnectedGui();
1783 v_client.initial_update(); // TODO: thread ?
1784 setProgressBar("Importing VAMSAS session from " + file.getName(),
1786 return v_client.inSession();
1789 public boolean joinVamsasSession(String mysesid)
1791 if (v_client != null)
1794 "Trying to join a vamsas session when another is already connected.");
1796 if (mysesid == null)
1798 throw new Error("Invalid vamsas session id.");
1800 v_client = new VamsasApplication(this, mysesid);
1801 setupVamsasConnectedGui();
1802 v_client.initial_update();
1803 return (v_client.inSession());
1806 public void vamsasStart_actionPerformed(ActionEvent e)
1808 if (v_client == null)
1811 // we just start a default session for moment.
1813 * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1814 * getProperty("LAST_DIRECTORY"));
1816 * chooser.setFileView(new JalviewFileView());
1817 * chooser.setDialogTitle("Load Vamsas file");
1818 * chooser.setToolTipText("Import");
1820 * int value = chooser.showOpenDialog(this);
1822 * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new
1823 * jalview.gui.VamsasApplication(this, chooser.getSelectedFile());
1825 v_client = new VamsasApplication(this);
1826 setupVamsasConnectedGui();
1827 v_client.initial_update(); // TODO: thread ?
1831 // store current data in session.
1832 v_client.push_update(); // TODO: thread
1836 protected void setupVamsasConnectedGui()
1838 vamsasStart.setText("Session Update");
1839 vamsasSave.setVisible(true);
1840 vamsasStop.setVisible(true);
1841 vamsasImport.setVisible(false); // Document import to existing session is
1842 // not possible for vamsas-client-1.0.
1845 protected void setupVamsasDisconnectedGui()
1847 vamsasSave.setVisible(false);
1848 vamsasStop.setVisible(false);
1849 vamsasImport.setVisible(true);
1850 vamsasStart.setText("New Vamsas Session");
1853 public void vamsasStop_actionPerformed(ActionEvent e)
1855 if (v_client != null)
1857 v_client.end_session();
1859 setupVamsasDisconnectedGui();
1863 protected void buildVamsasStMenu()
1865 if (v_client == null)
1867 String[] sess = null;
1870 sess = VamsasApplication.getSessionList();
1871 } catch (Exception e)
1873 jalview.bin.Cache.log.warn(
1874 "Problem getting current sessions list.", e);
1879 jalview.bin.Cache.log.debug("Got current sessions list: "
1880 + sess.length + " entries.");
1881 VamsasStMenu.removeAll();
1882 for (int i = 0; i < sess.length; i++)
1884 JMenuItem sessit = new JMenuItem();
1885 sessit.setText(sess[i]);
1886 sessit.setToolTipText("Connect to session " + sess[i]);
1887 final Desktop dsktp = this;
1888 final String mysesid = sess[i];
1889 sessit.addActionListener(new ActionListener()
1892 public void actionPerformed(ActionEvent e)
1894 if (dsktp.v_client == null)
1896 Thread rthr = new Thread(new Runnable()
1901 dsktp.v_client = new VamsasApplication(dsktp, mysesid);
1902 dsktp.setupVamsasConnectedGui();
1903 dsktp.v_client.initial_update();
1911 VamsasStMenu.add(sessit);
1913 // don't show an empty menu.
1914 VamsasStMenu.setVisible(sess.length > 0);
1919 jalview.bin.Cache.log.debug("No current vamsas sessions.");
1920 VamsasStMenu.removeAll();
1921 VamsasStMenu.setVisible(false);
1926 // Not interested in the content. Just hide ourselves.
1927 VamsasStMenu.setVisible(false);
1931 public void vamsasSave_actionPerformed(ActionEvent e)
1933 if (v_client != null)
1935 JalviewFileChooser chooser = new JalviewFileChooser(
1936 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1937 { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
1939 { "Vamsas Document" }, "Vamsas Document");
1941 chooser.setFileView(new JalviewFileView());
1942 chooser.setDialogTitle("Save Vamsas Document Archive");
1944 int value = chooser.showSaveDialog(this);
1946 if (value == JalviewFileChooser.APPROVE_OPTION)
1948 java.io.File choice = chooser.getSelectedFile();
1949 JPanel progpanel = addProgressPanel("Saving VAMSAS Document to "
1950 + choice.getName());
1951 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1952 String warnmsg = null;
1953 String warnttl = null;
1956 v_client.vclient.storeDocument(choice);
1959 warnttl = "Serious Problem saving Vamsas Document";
1960 warnmsg = ex.toString();
1961 jalview.bin.Cache.log.error("Error Whilst saving document to "
1964 } catch (Exception ex)
1966 warnttl = "Problem saving Vamsas Document.";
1967 warnmsg = ex.toString();
1968 jalview.bin.Cache.log.warn("Exception Whilst saving document to "
1972 removeProgressPanel(progpanel);
1973 if (warnmsg != null)
1975 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1977 warnmsg, warnttl, JOptionPane.ERROR_MESSAGE);
1983 JPanel vamUpdate = null;
1986 * hide vamsas user gui bits when a vamsas document event is being handled.
1989 * true to hide gui, false to reveal gui
1991 public void setVamsasUpdate(boolean b)
1993 jalview.bin.Cache.log.debug("Setting gui for Vamsas update "
1994 + (b ? "in progress" : "finished"));
1996 if (vamUpdate != null)
1998 this.removeProgressPanel(vamUpdate);
2002 vamUpdate = this.addProgressPanel("Updating vamsas session");
2004 vamsasStart.setVisible(!b);
2005 vamsasStop.setVisible(!b);
2006 vamsasSave.setVisible(!b);
2009 public JInternalFrame[] getAllFrames()
2011 return desktop.getAllFrames();
2015 * Checks the given url to see if it gives a response indicating that the user
2016 * should be informed of a new questionnaire.
2020 public void checkForQuestionnaire(String url)
2022 UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url);
2023 // javax.swing.SwingUtilities.invokeLater(jvq);
2024 new Thread(jvq).start();
2028 * Proxy class for JDesktopPane which optionally displays the current memory
2029 * usage and highlights the desktop area with a red bar if free memory runs
2034 public class MyDesktopPane extends JDesktopPane implements Runnable
2037 boolean showMemoryUsage = false;
2041 java.text.NumberFormat df;
2043 float maxMemory, allocatedMemory, freeMemory, totalFreeMemory,
2046 public MyDesktopPane(boolean showMemoryUsage)
2048 showMemoryUsage(showMemoryUsage);
2051 public void showMemoryUsage(boolean showMemoryUsage)
2053 this.showMemoryUsage = showMemoryUsage;
2054 if (showMemoryUsage)
2056 Thread worker = new Thread(this);
2061 public boolean isShowMemoryUsage()
2063 return showMemoryUsage;
2068 df = java.text.NumberFormat.getNumberInstance();
2069 df.setMaximumFractionDigits(2);
2070 runtime = Runtime.getRuntime();
2072 while (showMemoryUsage)
2076 maxMemory = runtime.maxMemory() / 1048576f;
2077 allocatedMemory = runtime.totalMemory() / 1048576f;
2078 freeMemory = runtime.freeMemory() / 1048576f;
2079 totalFreeMemory = freeMemory + (maxMemory - allocatedMemory);
2081 percentUsage = (totalFreeMemory / maxMemory) * 100;
2083 // if (percentUsage < 20)
2085 // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12,
2087 // instance.set.setBorder(border1);
2090 // sleep after showing usage
2092 } catch (Exception ex)
2094 ex.printStackTrace();
2099 public void paintComponent(Graphics g)
2101 if (showMemoryUsage && g != null && df != null)
2103 if (percentUsage < 20)
2104 g.setColor(Color.red);
2105 FontMetrics fm = g.getFontMetrics();
2109 "Total Free Memory: " + df.format(totalFreeMemory)
2110 + "MB; Max Memory: " + df.format(maxMemory)
2111 + "MB; " + df.format(percentUsage) + "%", 10,
2112 getHeight() - fm.getHeight());
2119 * fixes stacking order after a modal dialog to ensure windows that should be on top actually are
2121 public void relayerWindows()
2126 protected JMenuItem groovyShell;
2128 public void doGroovyCheck()
2130 if (jalview.bin.Cache.groovyJarsPresent())
2132 groovyShell = new JMenuItem();
2133 groovyShell.setText("Groovy Console...");
2134 groovyShell.addActionListener(new ActionListener()
2136 public void actionPerformed(ActionEvent e)
2138 groovyShell_actionPerformed(e);
2141 toolsMenu.add(groovyShell);
2142 groovyShell.setVisible(true);
2147 * Accessor method to quickly get all the AlignmentFrames loaded.
2149 public static AlignFrame[] getAlignframes()
2151 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2157 Vector avp = new Vector();
2161 for (int i = frames.length - 1; i > -1; i--)
2163 if (frames[i] instanceof AlignFrame)
2165 AlignFrame af = (AlignFrame) frames[i];
2169 } catch (Exception ex)
2171 ex.printStackTrace();
2173 if (avp.size() == 0)
2177 AlignFrame afs[] = new AlignFrame[avp.size()];
2178 for (int i = 0, j = avp.size(); i < j; i++)
2180 afs[i] = (AlignFrame) avp.elementAt(i);
2185 public AppJmol[] getJmols()
2187 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2193 Vector avp = new Vector();
2197 for (int i = frames.length - 1; i > -1; i--)
2199 if (frames[i] instanceof AppJmol)
2201 AppJmol af = (AppJmol) frames[i];
2205 } catch (Exception ex)
2207 ex.printStackTrace();
2209 if (avp.size() == 0)
2213 AppJmol afs[] = new AppJmol[avp.size()];
2214 for (int i = 0, j = avp.size(); i < j; i++)
2216 afs[i] = (AppJmol) avp.elementAt(i);
2223 * Add Groovy Support to Jalview
2225 public void groovyShell_actionPerformed(ActionEvent e)
2227 // use reflection to avoid creating compilation dependency.
2228 if (!jalview.bin.Cache.groovyJarsPresent())
2231 "Implementation Error. Cannot create groovyShell without Groovy on the classpath!");
2235 Class gcClass = Desktop.class.getClassLoader().loadClass(
2236 "groovy.ui.Console");
2237 Constructor gccons = gcClass.getConstructor(null);
2238 java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
2240 { String.class, Object.class });
2241 java.lang.reflect.Method run = gcClass.getMethod("run", null);
2242 Object gc = gccons.newInstance(null);
2243 setvar.invoke(gc, new Object[]
2244 { "Jalview", this });
2245 run.invoke(gc, null);
2246 } catch (Exception ex)
2248 jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
2250 .showInternalMessageDialog(
2253 "Couldn't create the groovy Shell. Check the error log for the details of what went wrong.",
2254 "Jalview Groovy Support Failed",
2255 JOptionPane.ERROR_MESSAGE);
2260 * Progress bars managed by the IProgressIndicator method.
2262 private Hashtable<Long,JPanel> progressBars;
2263 private Hashtable<Long,IProgressIndicatorHandler> progressBarHandlers;
2268 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
2270 public void setProgressBar(String message, long id)
2272 if (progressBars == null)
2274 progressBars = new Hashtable<Long,JPanel>();
2275 progressBarHandlers = new Hashtable<Long,IProgressIndicatorHandler>();
2278 if (progressBars.get(new Long(id)) != null)
2280 JPanel progressPanel = progressBars
2281 .remove(new Long(id));
2282 if (progressBarHandlers.contains(new Long(id)))
2284 progressBarHandlers.remove(new Long(id));
2286 removeProgressPanel(progressPanel);
2290 progressBars.put(new Long(id), addProgressPanel(message));
2297 * @see jalview.gui.IProgressIndicator#registerHandler(long,
2298 * jalview.gui.IProgressIndicatorHandler)
2300 public void registerHandler(final long id,
2301 final IProgressIndicatorHandler handler)
2303 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
2306 "call setProgressBar before registering the progress bar's handler.");
2308 progressBarHandlers.put(new Long(id), handler);
2309 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
2310 if (handler.canCancel())
2312 JButton cancel = new JButton("Cancel");
2313 final IProgressIndicator us = this;
2314 cancel.addActionListener(new ActionListener()
2317 public void actionPerformed(ActionEvent e)
2319 handler.cancelActivity(id);
2322 + ((JLabel) progressPanel.getComponent(0))
2326 progressPanel.add(cancel, BorderLayout.EAST);
2331 * This will return the first AlignFrame viewing AlignViewport av. It will
2332 * break if there are more than one AlignFrames viewing a particular av. This
2335 * @return alignFrame for av
2337 public static AlignFrame getAlignFrameFor(AlignViewport av)
2339 if (desktop != null)
2341 AlignmentPanel[] aps = getAlignmentPanels(av.getSequenceSetId());
2342 for (int panel = 0; aps != null && panel < aps.length; panel++)
2344 if (aps[panel] != null && aps[panel].av == av)
2346 return aps[panel].alignFrame;
2353 public VamsasApplication getVamsasApplication()
2360 * flag set if jalview GUI is being operated programmatically
2362 private boolean inBatchMode = false;
2365 * check if jalview GUI is being operated programmatically
2367 * @return inBatchMode
2369 public boolean isInBatchMode()
2375 * set flag if jalview GUI is being operated programmatically
2377 * @param inBatchMode
2379 public void setInBatchMode(boolean inBatchMode)
2381 this.inBatchMode = inBatchMode;
2384 public void startServiceDiscovery()
2386 startServiceDiscovery(false);
2389 public void startServiceDiscovery(boolean blocking)
2391 boolean alive = true;
2392 Thread t0 = null, t1 = null, t2 = null;
2394 // todo: changesupport handlers need to be transferred
2395 if (discoverer == null)
2397 discoverer = new jalview.ws.jws1.Discoverer();
2398 // register PCS handler for desktop.
2399 discoverer.addPropertyChangeListener(changeSupport);
2401 // JAL-940 - disabled JWS1 service configuration - always start discoverer until we phase out completely
2404 (t0 = new Thread(discoverer)).start();
2409 if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
2411 // EnfinEnvision web service menu entries are rebuild every time the
2412 // menu is shown, so no changeSupport events are needed.
2413 jalview.ws.EnfinEnvision2OneWay.getInstance();
2414 (t1 = new Thread(jalview.ws.EnfinEnvision2OneWay.getInstance()))
2417 } catch (Exception e)
2420 .info("Exception when trying to launch Envision2 workflow discovery.",
2422 Cache.log.info(e.getStackTrace());
2424 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
2426 if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
2428 jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
2430 t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
2436 // TODO: do rest service discovery
2445 } catch (Exception e)
2448 alive = (t1 != null && t1.isAlive())
2449 || (t2 != null && t2.isAlive())
2450 || (t3 != null && t3.isAlive())
2451 || (t0 != null && t0.isAlive());
2457 * called to check if the service discovery process completed successfully.
2461 protected void JalviewServicesChanged(PropertyChangeEvent evt)
2463 if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
2465 final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
2466 .getErrorMessages();
2469 if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
2471 if (serviceChangedDialog == null)
2473 // only run if we aren't already displaying one of these.
2474 javax.swing.SwingUtilities
2475 .invokeLater(serviceChangedDialog = new Runnable()
2481 .showInternalMessageDialog(
2484 + "It may be that you have invalid JABA URLs\nin your web service preferences.\n\nGo to the Web services tab of the\nTools->Preferences dialog box to change them.\n",
2485 "Preferences Problem",
2486 JOptionPane.WARNING_MESSAGE);
2487 serviceChangedDialog = null;
2496 .error("Errors reported by JABA discovery service. Check web services preferences.\n"
2503 private Runnable serviceChangedDialog = null;
2506 * start a thread to open a URL in the configured browser. Pops up a warning
2507 * dialog to the user if there is an exception when calling out to the browser
2512 public static void showUrl(final String url)
2514 showUrl(url, Desktop.instance);
2517 * Like showUrl but allows progress handler to be specified
2519 * @param progress (null) or object implementing IProgressIndicator
2521 public static void showUrl(final String url, final IProgressIndicator progress)
2523 new Thread(new Runnable()
2529 if (progress!=null) {
2530 progress.setProgressBar("Opening "+url, this.hashCode());
2532 jalview.util.BrowserLauncher.openURL(url);
2533 } catch (Exception ex)
2536 .showInternalMessageDialog(
2538 "Unixers: Couldn't find default web browser."
2539 + "\nAdd the full path to your browser in Preferences.",
2540 "Web browser not found",
2541 JOptionPane.WARNING_MESSAGE);
2543 ex.printStackTrace();
2545 if (progress!=null) {
2546 progress.setProgressBar(null, this.hashCode());
2552 public static WsParamSetManager wsparamManager = null;
2554 public static ParamManager getUserParameterStore()
2556 if (wsparamManager == null)
2558 wsparamManager = new WsParamSetManager();
2560 return wsparamManager;