2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, 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;
22 import jalview.ws.params.ParamManager;
25 import java.awt.datatransfer.*;
26 import java.awt.dnd.*;
27 import java.awt.event.*;
28 import java.beans.PropertyChangeEvent;
29 import java.beans.PropertyChangeListener;
30 import java.beans.PropertyVetoException;
31 import java.io.BufferedInputStream;
32 import java.io.BufferedOutputStream;
34 import java.io.FileOutputStream;
35 import java.io.InputStream;
36 import java.lang.reflect.Constructor;
38 import java.net.URLConnection;
39 import java.nio.channels.ReadableByteChannel;
43 import javax.swing.event.MenuEvent;
44 import javax.swing.event.MenuListener;
51 * @version $Revision: 1.155 $
53 public class Desktop extends jalview.jbgui.GDesktop implements
54 DropTargetListener, ClipboardOwner, IProgressIndicator, jalview.api.StructureSelectionManagerProvider
57 private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
61 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
63 public void addJalviewPropertyChangeListener(
64 PropertyChangeListener listener)
66 changeSupport.addJalviewPropertyChangeListener(listener);
72 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String,
73 * java.beans.PropertyChangeListener)
75 public void addJalviewPropertyChangeListener(String propertyName,
76 PropertyChangeListener listener)
78 changeSupport.addJalviewPropertyChangeListener(propertyName, listener);
84 * @see jalview.gui.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String,
85 * java.beans.PropertyChangeListener)
87 public void removeJalviewPropertyChangeListener(String propertyName,
88 PropertyChangeListener listener)
90 changeSupport.removeJalviewPropertyChangeListener(propertyName,
94 /** Singleton Desktop instance */
95 public static Desktop instance;
97 public static MyDesktopPane desktop;
99 static int openFrameCount = 0;
101 static final int xOffset = 30;
103 static final int yOffset = 30;
105 public static jalview.ws.jws1.Discoverer discoverer;
107 public static Object[] jalviewClipboard;
109 public static boolean internalCopy = false;
111 static int fileLoadingCount = 0;
113 class MyDesktopManager implements DesktopManager
116 private DesktopManager delegate;
118 public MyDesktopManager(DesktopManager delegate)
120 this.delegate = delegate;
123 public void activateFrame(JInternalFrame f)
127 delegate.activateFrame(f);
128 } catch (NullPointerException npe)
130 Point p = getMousePosition();
131 instance.showPasteMenu(p.x, p.y);
135 public void beginDraggingFrame(JComponent f)
137 delegate.beginDraggingFrame(f);
140 public void beginResizingFrame(JComponent f, int direction)
142 delegate.beginResizingFrame(f, direction);
145 public void closeFrame(JInternalFrame f)
147 delegate.closeFrame(f);
150 public void deactivateFrame(JInternalFrame f)
152 delegate.deactivateFrame(f);
155 public void deiconifyFrame(JInternalFrame f)
157 delegate.deiconifyFrame(f);
160 public void dragFrame(JComponent f, int newX, int newY)
162 delegate.dragFrame(f, newX, newY);
165 public void endDraggingFrame(JComponent f)
167 delegate.endDraggingFrame(f);
170 public void endResizingFrame(JComponent f)
172 delegate.endResizingFrame(f);
175 public void iconifyFrame(JInternalFrame f)
177 delegate.iconifyFrame(f);
180 public void maximizeFrame(JInternalFrame f)
182 delegate.maximizeFrame(f);
185 public void minimizeFrame(JInternalFrame f)
187 delegate.minimizeFrame(f);
190 public void openFrame(JInternalFrame f)
192 delegate.openFrame(f);
195 public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
198 delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
201 public void setBoundsForFrame(JComponent f, int newX, int newY,
202 int newWidth, int newHeight)
204 delegate.setBoundsForFrame(f, newX, newY, newWidth, newHeight);
207 // All other methods, simply delegate
212 * Creates a new Desktop object.
217 * A note to implementors. It is ESSENTIAL that any activities that might
218 * block are spawned off as threads rather than waited for during this
222 doVamsasClientCheck();
225 setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
226 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
227 boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
229 boolean showjconsole = jalview.bin.Cache.getDefault(
230 "SHOW_JAVA_CONSOLE", false);
231 desktop = new MyDesktopPane(selmemusage);
232 showMemusage.setSelected(selmemusage);
233 desktop.setBackground(Color.white);
234 getContentPane().setLayout(new BorderLayout());
235 // alternate config - have scrollbars - see notes in JAL-153
236 //JScrollPane sp = new JScrollPane();
237 //sp.getViewport().setView(desktop);
238 //getContentPane().add(sp, BorderLayout.CENTER);
239 getContentPane().add(desktop, BorderLayout.CENTER);
240 desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
242 // This line prevents Windows Look&Feel resizing all new windows to maximum
243 // if previous window was maximised
244 desktop.setDesktopManager(new MyDesktopManager(
245 new DefaultDesktopManager()));
246 Rectangle dims = getLastKnownDimensions("");
253 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
254 setBounds((int) (screenSize.width - 900) / 2,
255 (int) (screenSize.height - 650) / 2, 900, 650);
257 jconsole = new Console(this, showjconsole);
258 // add essential build information
259 jconsole.setHeader("Jalview Desktop "
260 + jalview.bin.Cache.getProperty("VERSION") + "\n"
262 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + "\n"
263 + "Java version: " + System.getProperty("java.version") + "\n"
264 + System.getProperty("os.arch") + " "
265 + System.getProperty("os.name") + " "
266 + System.getProperty("os.version"));
268 showConsole(showjconsole);
270 this.addWindowListener(new WindowAdapter()
272 public void windowClosing(WindowEvent evt)
278 this.addMouseListener(new MouseAdapter()
280 public void mousePressed(MouseEvent evt)
282 if (SwingUtilities.isRightMouseButton(evt))
284 showPasteMenu(evt.getX(), evt.getY());
289 this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
290 // Spawn a thread that shows the splashscreen
291 SwingUtilities.invokeLater(new Runnable()
300 // Thread off a new instance of the file chooser - this reduces the time it
301 // takes to open it later on.
302 new Thread(new Runnable()
306 Cache.log.debug("Filechooser init thread started.");
307 JalviewFileChooser chooser = new JalviewFileChooser(
308 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
309 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
310 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
311 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
312 Cache.log.debug("Filechooser init thread finished.");
315 // Add the service change listener
316 changeSupport.addJalviewPropertyChangeListener("services",
317 new PropertyChangeListener()
321 public void propertyChange(PropertyChangeEvent evt)
323 Cache.log.debug("Firing service changed event for "
324 + evt.getNewValue());
325 JalviewServicesChanged(evt);
332 * recover the last known dimensions for a jalview window
335 * - empty string is desktop, all other windows have unique prefix
336 * @return null or last known dimensions scaled to current geometry (if last
337 * window geom was known)
339 Rectangle getLastKnownDimensions(String windowName)
341 // TODO: lock aspect ratio for scaling desktop Bug #0058199
342 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
343 String x = jalview.bin.Cache.getProperty(windowName + "SCREEN_X");
344 String y = jalview.bin.Cache.getProperty(windowName + "SCREEN_Y");
345 String width = jalview.bin.Cache.getProperty(windowName
347 String height = jalview.bin.Cache.getProperty(windowName
349 if ((x != null) && (y != null) && (width != null) && (height != null))
351 int ix = Integer.parseInt(x), iy = Integer.parseInt(y), iw = Integer
352 .parseInt(width), ih = Integer.parseInt(height);
353 if (jalview.bin.Cache.getProperty("SCREENGEOMETRY_WIDTH") != null)
355 // attempt #1 - try to cope with change in screen geometry - this
356 // version doesn't preserve original jv aspect ratio.
357 // take ratio of current screen size vs original screen size.
358 double sw = ((1f * screenSize.width) / (1f * Integer
359 .parseInt(jalview.bin.Cache
360 .getProperty("SCREENGEOMETRY_WIDTH"))));
361 double sh = ((1f * screenSize.height) / (1f * Integer
362 .parseInt(jalview.bin.Cache
363 .getProperty("SCREENGEOMETRY_HEIGHT"))));
364 // rescale the bounds depending upon the current screen geometry.
365 ix = (int) (ix * sw);
366 iw = (int) (iw * sw);
367 iy = (int) (iy * sh);
368 ih = (int) (ih * sh);
369 while (ix >= screenSize.width)
371 jalview.bin.Cache.log
372 .debug("Window geometry location recall error: shifting horizontal to within screenbounds.");
373 ix -= screenSize.width;
375 while (iy >= screenSize.height)
377 jalview.bin.Cache.log
378 .debug("Window geometry location recall error: shifting vertical to within screenbounds.");
379 iy -= screenSize.height;
381 jalview.bin.Cache.log.debug("Got last known dimensions for "
382 + windowName + ": x:" + ix + " y:" + iy + " width:" + iw
385 // return dimensions for new instance
386 return new Rectangle(ix, iy, iw, ih);
391 private void doVamsasClientCheck()
393 if (jalview.bin.Cache.vamsasJarsPresent())
395 setupVamsasDisconnectedGui();
396 VamsasMenu.setVisible(true);
397 final Desktop us = this;
398 VamsasMenu.addMenuListener(new MenuListener()
400 // this listener remembers when the menu was first selected, and
401 // doesn't rebuild the session list until it has been cleared and
403 boolean refresh = true;
405 public void menuCanceled(MenuEvent e)
410 public void menuDeselected(MenuEvent e)
415 public void menuSelected(MenuEvent e)
419 us.buildVamsasStMenu();
424 vamsasStart.setVisible(true);
428 void showPasteMenu(int x, int y)
430 JPopupMenu popup = new JPopupMenu();
431 JMenuItem item = new JMenuItem("Paste To New Window");
432 item.addActionListener(new ActionListener()
434 public void actionPerformed(ActionEvent evt)
441 popup.show(this, x, y);
448 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
449 Transferable contents = c.getContents(this);
451 if (contents != null)
453 String file = (String) contents
454 .getTransferData(DataFlavor.stringFlavor);
456 String format = new IdentifyFile().Identify(file,
457 FormatAdapter.PASTE);
459 new FileLoader().LoadFile(file, FormatAdapter.PASTE, format);
462 } catch (Exception ex)
465 .println("Unable to paste alignment from system clipboard:\n"
471 * Adds and opens the given frame to the desktop
482 public static synchronized void addInternalFrame(
483 final JInternalFrame frame, String title, int w, int h)
485 addInternalFrame(frame, title, w, h, true);
502 public static synchronized void addInternalFrame(
503 final JInternalFrame frame, String title, int w, int h,
507 // TODO: allow callers to determine X and Y position of frame (eg. via
509 // TODO: consider fixing method to update entries in the window submenu with
510 // the current window title
512 frame.setTitle(title);
513 if (frame.getWidth() < 1 || frame.getHeight() < 1)
517 // THIS IS A PUBLIC STATIC METHOD, SO IT MAY BE CALLED EVEN IN
518 // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
519 // IF JALVIEW IS RUNNING HEADLESS
520 // ///////////////////////////////////////////////
521 if (System.getProperty("java.awt.headless") != null
522 && System.getProperty("java.awt.headless").equals("true"))
529 frame.setVisible(true);
530 frame.setClosable(true);
531 frame.setResizable(resizable);
532 frame.setMaximizable(resizable);
533 frame.setIconifiable(resizable);
534 frame.setFrameIcon(null);
536 if (frame.getX() < 1 && frame.getY() < 1)
538 frame.setLocation(xOffset * openFrameCount, yOffset
539 * ((openFrameCount - 1) % 10) + yOffset);
542 final JMenuItem menuItem = new JMenuItem(title);
543 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
545 public void internalFrameActivated(
546 javax.swing.event.InternalFrameEvent evt)
548 JInternalFrame itf = desktop.getSelectedFrame();
556 public void internalFrameClosed(
557 javax.swing.event.InternalFrameEvent evt)
559 PaintRefresher.RemoveComponent(frame);
561 windowMenu.remove(menuItem);
562 JInternalFrame itf = desktop.getSelectedFrame();
571 menuItem.addActionListener(new ActionListener()
573 public void actionPerformed(ActionEvent e)
577 frame.setSelected(true);
578 frame.setIcon(false);
579 } catch (java.beans.PropertyVetoException ex)
585 menuItem.addMouseListener(new MouseListener()
589 public void mouseReleased(MouseEvent e)
594 public void mousePressed(MouseEvent e)
599 public void mouseExited(MouseEvent e)
603 frame.setSelected(false);
604 } catch (PropertyVetoException e1)
610 public void mouseEntered(MouseEvent e)
614 frame.setSelected(true);
615 } catch (PropertyVetoException e1)
621 public void mouseClicked(MouseEvent e)
627 windowMenu.add(menuItem);
633 frame.setSelected(true);
634 frame.requestFocus();
635 } catch (java.beans.PropertyVetoException ve)
638 catch (java.lang.ClassCastException cex)
640 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);
644 public void lostOwnership(Clipboard clipboard, Transferable contents)
648 Desktop.jalviewClipboard = null;
651 internalCopy = false;
654 public void dragEnter(DropTargetDragEvent evt)
658 public void dragExit(DropTargetEvent evt)
662 public void dragOver(DropTargetDragEvent evt)
666 public void dropActionChanged(DropTargetDragEvent evt)
676 public void drop(DropTargetDropEvent evt)
678 Transferable t = evt.getTransferable();
679 java.util.List files = null;
680 java.util.List protocols = null;
684 DataFlavor uriListFlavor = new DataFlavor(
685 "text/uri-list;class=java.lang.String");
686 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
688 // Works on Windows and MacOSX
689 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
690 files = (java.util.List) t
691 .getTransferData(DataFlavor.javaFileListFlavor);
693 else if (t.isDataFlavorSupported(uriListFlavor))
695 // This is used by Unix drag system
696 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
697 String data = (String) t.getTransferData(uriListFlavor);
698 files = new java.util.ArrayList(1);
699 protocols = new java.util.ArrayList(1);
700 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
701 data, "\r\n"); st.hasMoreTokens();)
703 String s = st.nextToken();
704 if (s.startsWith("#"))
706 // the line is a comment (as per the RFC 2483)
709 java.net.URI uri = new java.net.URI(s);
710 if (uri.getScheme().toLowerCase().startsWith("http"))
712 protocols.add(FormatAdapter.URL);
713 files.add(uri.toString());
717 // otherwise preserve old behaviour: catch all for file objects
718 java.io.File file = new java.io.File(uri);
719 protocols.add(FormatAdapter.FILE);
720 files.add(file.toString());
724 } catch (Exception e)
732 for (int i = 0; i < files.size(); i++)
734 String file = files.get(i).toString();
735 String protocol = (protocols == null) ? FormatAdapter.FILE
736 : (String) protocols.get(i);
737 String format = null;
739 if (file.endsWith(".jar"))
746 format = new IdentifyFile().Identify(file, protocol);
749 new FileLoader().LoadFile(file, protocol, format);
752 } catch (Exception ex)
764 public void inputLocalFileMenuItem_actionPerformed(AlignViewport viewport)
766 JalviewFileChooser chooser = new JalviewFileChooser(
767 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
768 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
769 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
770 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
772 chooser.setFileView(new JalviewFileView());
773 chooser.setDialogTitle("Open local file");
774 chooser.setToolTipText("Open");
776 int value = chooser.showOpenDialog(this);
778 if (value == JalviewFileChooser.APPROVE_OPTION)
780 String choice = chooser.getSelectedFile().getPath();
781 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
782 .getSelectedFile().getParent());
784 String format = null;
785 if (chooser.getSelectedFormat().equals("Jalview"))
791 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
794 if (viewport != null)
796 new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
801 new FileLoader().LoadFile(choice, FormatAdapter.FILE, format);
812 public void inputURLMenuItem_actionPerformed(AlignViewport viewport)
814 // This construct allows us to have a wider textfield
816 JLabel label = new JLabel("Enter URL of Input File");
817 final JComboBox history = new JComboBox();
819 JPanel panel = new JPanel(new GridLayout(2, 1));
822 history.setPreferredSize(new Dimension(400, 20));
823 history.setEditable(true);
824 history.addItem("http://www.");
826 String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
830 if (historyItems != null)
832 st = new StringTokenizer(historyItems, "\t");
834 while (st.hasMoreTokens())
836 history.addItem(st.nextElement());
840 int reply = JOptionPane.showInternalConfirmDialog(desktop, panel,
841 "Input Alignment From URL", JOptionPane.OK_CANCEL_OPTION);
843 if (reply != JOptionPane.OK_OPTION)
848 String url = history.getSelectedItem().toString();
850 if (url.toLowerCase().endsWith(".jar"))
852 if (viewport != null)
854 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL,
859 new FileLoader().LoadFile(url, FormatAdapter.URL, "Jalview");
864 String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
866 if (format.equals("URL NOT FOUND"))
868 JOptionPane.showInternalMessageDialog(Desktop.desktop,
869 "Couldn't locate " + url, "URL not found",
870 JOptionPane.WARNING_MESSAGE);
875 if (viewport != null)
877 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL, format);
881 new FileLoader().LoadFile(url, FormatAdapter.URL, format);
892 public void inputTextboxMenuItem_actionPerformed(AlignViewport viewport)
894 CutAndPasteTransfer cap = new CutAndPasteTransfer();
895 cap.setForInput(viewport);
896 Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);
904 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
906 .setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
907 jalview.bin.Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height
909 storeLastKnownDimensions("", new Rectangle(getBounds().x,
910 getBounds().y, getWidth(), getHeight()));
912 if (jconsole != null)
914 storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds());
915 jconsole.stopConsole();
920 private void storeLastKnownDimensions(String string, Rectangle jc)
922 jalview.bin.Cache.log.debug("Storing last known dimensions for "
923 + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width
924 + " height:" + jc.height);
926 jalview.bin.Cache.setProperty(string + "SCREEN_X", jc.x + "");
927 jalview.bin.Cache.setProperty(string + "SCREEN_Y", jc.y + "");
928 jalview.bin.Cache.setProperty(string + "SCREEN_WIDTH", jc.width + "");
929 jalview.bin.Cache.setProperty(string + "SCREEN_HEIGHT", jc.height + "");
938 public void aboutMenuItem_actionPerformed(ActionEvent e)
940 StringBuffer message = new StringBuffer("Jalview version "
941 + jalview.bin.Cache.getProperty("VERSION") + "; last updated: "
942 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"));
944 if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals(
945 jalview.bin.Cache.getProperty("VERSION")))
947 message.append("\n\n!! Jalview version "
948 + jalview.bin.Cache.getProperty("LATEST_VERSION")
949 + " is available for download from "+jalview.bin.Cache.getDefault("www.jalview.org","http://www.jalview.org")+" !!\n");
952 // TODO: update this text for each release or centrally store it for lite
954 message.append("\nAuthors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,\n David Martin & Geoff Barton."
955 + "\nDevelopment managed by The Barton Group, University of Dundee, Scotland, UK.\n"
956 + "\nFor help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list\n"
957 + "\nIf you use Jalview, please cite:"
958 + "\nWaterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
959 + "\nJalview Version 2 - a multiple sequence alignment editor and analysis workbench"
960 + "\nBioinformatics doi: 10.1093/bioinformatics/btp033");
961 JOptionPane.showInternalMessageDialog(Desktop.desktop,
963 message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
972 public void documentationMenuItem_actionPerformed(ActionEvent e)
976 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
977 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
978 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
980 javax.help.HelpBroker hb = hs.createHelpBroker();
981 hb.setCurrentID("home");
982 hb.setDisplayed(true);
983 } catch (Exception ex)
988 public void closeAll_actionPerformed(ActionEvent e)
990 JInternalFrame[] frames = desktop.getAllFrames();
991 for (int i = 0; i < frames.length; i++)
995 frames[i].setClosed(true);
996 } catch (java.beans.PropertyVetoException ex)
1000 System.out.println("ALL CLOSED");
1001 if (v_client != null)
1003 // TODO clear binding to vamsas document objects on close_all
1008 public void raiseRelated_actionPerformed(ActionEvent e)
1010 reorderAssociatedWindows(false, false);
1013 public void minimizeAssociated_actionPerformed(ActionEvent e)
1015 reorderAssociatedWindows(true, false);
1018 void closeAssociatedWindows()
1020 reorderAssociatedWindows(false, true);
1026 * @seejalview.jbgui.GDesktop#garbageCollect_actionPerformed(java.awt.event.
1029 protected void garbageCollect_actionPerformed(ActionEvent e)
1031 // We simply collect the garbage
1032 jalview.bin.Cache.log.debug("Collecting garbage...");
1034 jalview.bin.Cache.log.debug("Finished garbage collection.");
1041 * jalview.jbgui.GDesktop#showMemusage_actionPerformed(java.awt.event.ActionEvent
1044 protected void showMemusage_actionPerformed(ActionEvent e)
1046 desktop.showMemoryUsage(showMemusage.isSelected());
1053 * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent
1056 protected void showConsole_actionPerformed(ActionEvent e)
1058 showConsole(showConsole.isSelected());
1061 Console jconsole = null;
1064 * control whether the java console is visible or not
1068 void showConsole(boolean selected)
1070 showConsole.setSelected(selected);
1071 // TODO: decide if we should update properties file
1072 Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected)
1074 jconsole.setVisible(selected);
1077 void reorderAssociatedWindows(boolean minimize, boolean close)
1079 JInternalFrame[] frames = desktop.getAllFrames();
1080 if (frames == null || frames.length < 1)
1085 AlignViewport source = null, target = null;
1086 if (frames[0] instanceof AlignFrame)
1088 source = ((AlignFrame) frames[0]).getCurrentView();
1090 else if (frames[0] instanceof TreePanel)
1092 source = ((TreePanel) frames[0]).getViewPort();
1094 else if (frames[0] instanceof PCAPanel)
1096 source = ((PCAPanel) frames[0]).av;
1098 else if (frames[0].getContentPane() instanceof PairwiseAlignPanel)
1100 source = ((PairwiseAlignPanel) frames[0].getContentPane()).av;
1105 for (int i = 0; i < frames.length; i++)
1108 if (frames[i] == null)
1112 if (frames[i] instanceof AlignFrame)
1114 target = ((AlignFrame) frames[i]).getCurrentView();
1116 else if (frames[i] instanceof TreePanel)
1118 target = ((TreePanel) frames[i]).getViewPort();
1120 else if (frames[i] instanceof PCAPanel)
1122 target = ((PCAPanel) frames[i]).av;
1124 else if (frames[i].getContentPane() instanceof PairwiseAlignPanel)
1126 target = ((PairwiseAlignPanel) frames[i].getContentPane()).av;
1129 if (source == target)
1135 frames[i].setClosed(true);
1139 frames[i].setIcon(minimize);
1142 frames[i].toFront();
1146 } catch (java.beans.PropertyVetoException ex)
1160 protected void preferences_actionPerformed(ActionEvent e)
1171 public void saveState_actionPerformed(ActionEvent e)
1173 JalviewFileChooser chooser = new JalviewFileChooser(
1174 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1175 { "jar" }, new String[]
1176 { "Jalview Project" }, "Jalview Project");
1178 chooser.setFileView(new JalviewFileView());
1179 chooser.setDialogTitle("Save State");
1181 int value = chooser.showSaveDialog(this);
1183 if (value == JalviewFileChooser.APPROVE_OPTION)
1185 final Desktop me = this;
1186 final java.io.File choice = chooser.getSelectedFile();
1187 new Thread(new Runnable()
1192 setProgressBar("Saving jalview project " + choice.getName(),
1194 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1195 // TODO catch and handle errors for savestate
1196 // TODO prevent user from messing with the Desktop whilst we're saving
1199 new Jalview2XML().SaveState(choice);
1200 } catch (OutOfMemoryError oom)
1203 "Whilst saving current state to " + choice.getName(), oom);
1204 } catch (Exception ex)
1207 .error("Problems whilst trying to save to "
1208 + choice.getName(), ex);
1209 JOptionPane.showMessageDialog(me,
1210 "Error whilst saving current state to " + choice.getName(),
1211 "Couldn't save project", JOptionPane.WARNING_MESSAGE);
1213 setProgressBar(null, choice.hashCode());
1225 public void loadState_actionPerformed(ActionEvent e)
1227 JalviewFileChooser chooser = new JalviewFileChooser(
1228 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1229 { "jar" }, new String[]
1230 { "Jalview Project" }, "Jalview Project");
1231 chooser.setFileView(new JalviewFileView());
1232 chooser.setDialogTitle("Restore state");
1234 int value = chooser.showOpenDialog(this);
1236 if (value == JalviewFileChooser.APPROVE_OPTION)
1238 final String choice = chooser.getSelectedFile().getAbsolutePath();
1239 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
1240 .getSelectedFile().getParent());
1241 new Thread(new Runnable()
1245 setProgressBar("loading jalview project " + choice,
1249 new Jalview2XML().LoadJalviewAlign(choice);
1250 } catch (OutOfMemoryError oom)
1252 new OOMWarning("Whilst loading project from " + choice, oom);
1253 } catch (Exception ex)
1255 Cache.log.error("Problems whilst loading project from "
1257 JOptionPane.showMessageDialog(Desktop.desktop,
1258 "Error whilst loading project from " + choice,
1259 "Couldn't load project", JOptionPane.WARNING_MESSAGE);
1261 setProgressBar(null, choice.hashCode());
1267 public void inputSequence_actionPerformed(ActionEvent e)
1269 new SequenceFetcher(this);
1272 JPanel progressPanel;
1273 ArrayList<JPanel> fileLoadingPanels=new ArrayList<JPanel>();
1274 public void startLoading(final String fileName)
1276 if (fileLoadingCount == 0)
1278 fileLoadingPanels.add(addProgressPanel("Loading File: " + fileName + " "));
1283 private JPanel addProgressPanel(String string)
1285 if (progressPanel == null)
1287 progressPanel = new JPanel(new GridLayout(1,1));
1288 totalProgressCount = 0;
1289 instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
1291 JPanel thisprogress=new JPanel(new BorderLayout(10,5));
1292 JProgressBar progressBar = new JProgressBar();
1293 progressBar.setIndeterminate(true);
1295 thisprogress.add(new JLabel(string), BorderLayout.WEST);
1297 thisprogress.add(progressBar, BorderLayout.CENTER);
1298 progressPanel.add(thisprogress);
1299 ((GridLayout)progressPanel.getLayout()).setRows(((GridLayout)progressPanel.getLayout()).getRows()+1);
1300 ++totalProgressCount;
1301 instance.validate();
1302 return thisprogress;
1305 int totalProgressCount = 0;
1307 private void removeProgressPanel(JPanel progbar)
1309 if (progressPanel != null)
1311 progressPanel.remove(progbar);
1312 GridLayout gl = (GridLayout) progressPanel.getLayout();
1313 gl.setRows(gl.getRows()-1);
1314 if (--totalProgressCount < 1)
1316 this.getContentPane().remove(progressPanel);
1317 progressPanel = null;
1323 public void stopLoading()
1326 if (fileLoadingCount < 1)
1328 for (JPanel flp : fileLoadingPanels)
1330 removeProgressPanel(flp);
1332 fileLoadingPanels.clear();
1333 fileLoadingCount = 0;
1338 public static int getViewCount(String alignmentId)
1340 AlignViewport[] aps = getViewports(alignmentId);
1341 return (aps == null) ? 0 : aps.length;
1346 * @param alignmentId
1347 * @return all AlignmentPanels concerning the alignmentId sequence set
1349 public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
1352 if (Desktop.desktop == null)
1354 // no frames created and in headless mode
1355 // TODO: verify that frames are recoverable when in headless mode
1358 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
1359 ArrayList aps = new ArrayList();
1360 for (int t = 0; t < frames.length; t++)
1362 if (frames[t] instanceof AlignFrame)
1364 AlignFrame af = (AlignFrame) frames[t];
1365 for (int a = 0; a < af.alignPanels.size(); a++)
1368 .equals(((AlignmentPanel) af.alignPanels.elementAt(a)).av
1369 .getSequenceSetId()))
1371 aps.add(af.alignPanels.elementAt(a));
1376 if (aps.size() == 0)
1380 AlignmentPanel[] vap = new AlignmentPanel[aps.size()];
1381 for (int t = 0; t < vap.length; t++)
1383 vap[t] = (AlignmentPanel) aps.get(t);
1389 * get all the viewports on an alignment.
1391 * @param sequenceSetId
1392 * unique alignment id
1393 * @return all viewports on the alignment bound to sequenceSetId
1395 public static AlignViewport[] getViewports(String sequenceSetId)
1397 Vector viewp = new Vector();
1398 if (desktop != null)
1400 javax.swing.JInternalFrame[] frames = instance.getAllFrames();
1402 for (int t = 0; t < frames.length; t++)
1404 if (frames[t] instanceof AlignFrame)
1406 AlignFrame afr = ((AlignFrame) frames[t]);
1407 if (afr.getViewport().getSequenceSetId().equals(sequenceSetId))
1409 if (afr.alignPanels != null)
1411 for (int a = 0; a < afr.alignPanels.size(); a++)
1413 if (sequenceSetId.equals(((AlignmentPanel) afr.alignPanels
1414 .elementAt(a)).av.getSequenceSetId()))
1416 viewp.addElement(((AlignmentPanel) afr.alignPanels
1423 viewp.addElement(((AlignFrame) frames[t]).getViewport());
1428 if (viewp.size() > 0)
1430 AlignViewport[] vp = new AlignViewport[viewp.size()];
1438 public void explodeViews(AlignFrame af)
1440 int size = af.alignPanels.size();
1446 for (int i = 0; i < size; i++)
1448 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(i);
1449 AlignFrame newaf = new AlignFrame(ap);
1450 if (ap.av.explodedPosition != null
1451 && !ap.av.explodedPosition.equals(af.getBounds()))
1453 newaf.setBounds(ap.av.explodedPosition);
1456 ap.av.gatherViewsHere = false;
1458 addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
1459 AlignFrame.DEFAULT_HEIGHT);
1462 af.alignPanels.clear();
1463 af.closeMenuItem_actionPerformed(true);
1467 public void gatherViews(AlignFrame source)
1469 source.viewport.gatherViewsHere = true;
1470 source.viewport.explodedPosition = source.getBounds();
1471 JInternalFrame[] frames = desktop.getAllFrames();
1472 String viewId = source.viewport.sequenceSetID;
1474 for (int t = 0; t < frames.length; t++)
1476 if (frames[t] instanceof AlignFrame && frames[t] != source)
1478 AlignFrame af = (AlignFrame) frames[t];
1479 boolean gatherThis = false;
1480 for (int a = 0; a < af.alignPanels.size(); a++)
1482 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(a);
1483 if (viewId.equals(ap.av.getSequenceSetId()))
1486 ap.av.gatherViewsHere = false;
1487 ap.av.explodedPosition = af.getBounds();
1488 source.addAlignmentPanel(ap, false);
1494 af.alignPanels.clear();
1495 af.closeMenuItem_actionPerformed(true);
1502 jalview.gui.VamsasApplication v_client = null;
1504 public void vamsasImport_actionPerformed(ActionEvent e)
1506 if (v_client == null)
1508 // Load and try to start a session.
1509 JalviewFileChooser chooser = new JalviewFileChooser(
1510 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1512 chooser.setFileView(new JalviewFileView());
1513 chooser.setDialogTitle("Open a saved VAMSAS session");
1514 chooser.setToolTipText("select a vamsas session to be opened as a new vamsas session.");
1516 int value = chooser.showOpenDialog(this);
1518 if (value == JalviewFileChooser.APPROVE_OPTION)
1520 String fle = chooser.getSelectedFile().toString();
1521 if (!vamsasImport(chooser.getSelectedFile()))
1523 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1524 "Couldn't import '" + fle + "' as a new vamsas session.",
1525 "Vamsas Document Import Failed",
1526 JOptionPane.ERROR_MESSAGE);
1532 jalview.bin.Cache.log
1533 .error("Implementation error - load session from a running session is not supported.");
1538 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1541 * @return true if import was a success and a session was started.
1543 public boolean vamsasImport(URL url)
1545 // TODO: create progress bar
1546 if (v_client != null)
1549 jalview.bin.Cache.log
1550 .error("Implementation error - load session from a running session is not supported.");
1556 // copy the URL content to a temporary local file
1557 // TODO: be a bit cleverer here with nio (?!)
1558 File file = File.createTempFile("vdocfromurl", ".vdj");
1559 FileOutputStream fos = new FileOutputStream(file);
1560 BufferedInputStream bis = new BufferedInputStream(url.openStream());
1561 byte[] buffer = new byte[2048];
1563 while ((ln = bis.read(buffer)) > -1)
1565 fos.write(buffer, 0, ln);
1569 v_client = new jalview.gui.VamsasApplication(this, file,
1570 url.toExternalForm());
1571 } catch (Exception ex)
1573 jalview.bin.Cache.log.error(
1574 "Failed to create new vamsas session from contents of URL "
1578 setupVamsasConnectedGui();
1579 v_client.initial_update(); // TODO: thread ?
1580 return v_client.inSession();
1584 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1587 * @return true if import was a success and a session was started.
1589 public boolean vamsasImport(File file)
1591 if (v_client != null)
1594 jalview.bin.Cache.log
1595 .error("Implementation error - load session from a running session is not supported.");
1599 setProgressBar("Importing VAMSAS session from " + file.getName(),
1603 v_client = new jalview.gui.VamsasApplication(this, file, null);
1604 } catch (Exception ex)
1606 setProgressBar("Importing VAMSAS session from " + file.getName(),
1608 jalview.bin.Cache.log.error(
1609 "New vamsas session from existing session file failed:", ex);
1612 setupVamsasConnectedGui();
1613 v_client.initial_update(); // TODO: thread ?
1614 setProgressBar("Importing VAMSAS session from " + file.getName(),
1616 return v_client.inSession();
1619 public boolean joinVamsasSession(String mysesid)
1621 if (v_client != null)
1624 "Trying to join a vamsas session when another is already connected.");
1626 if (mysesid == null)
1628 throw new Error("Invalid vamsas session id.");
1630 v_client = new VamsasApplication(this, mysesid);
1631 setupVamsasConnectedGui();
1632 v_client.initial_update();
1633 return (v_client.inSession());
1636 public void vamsasStart_actionPerformed(ActionEvent e)
1638 if (v_client == null)
1641 // we just start a default session for moment.
1643 * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1644 * getProperty("LAST_DIRECTORY"));
1646 * chooser.setFileView(new JalviewFileView());
1647 * chooser.setDialogTitle("Load Vamsas file");
1648 * chooser.setToolTipText("Import");
1650 * int value = chooser.showOpenDialog(this);
1652 * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new
1653 * jalview.gui.VamsasApplication(this, chooser.getSelectedFile());
1655 v_client = new VamsasApplication(this);
1656 setupVamsasConnectedGui();
1657 v_client.initial_update(); // TODO: thread ?
1661 // store current data in session.
1662 v_client.push_update(); // TODO: thread
1666 protected void setupVamsasConnectedGui()
1668 vamsasStart.setText("Session Update");
1669 vamsasSave.setVisible(true);
1670 vamsasStop.setVisible(true);
1671 vamsasImport.setVisible(false); // Document import to existing session is
1672 // not possible for vamsas-client-1.0.
1675 protected void setupVamsasDisconnectedGui()
1677 vamsasSave.setVisible(false);
1678 vamsasStop.setVisible(false);
1679 vamsasImport.setVisible(true);
1680 vamsasStart.setText("New Vamsas Session");
1683 public void vamsasStop_actionPerformed(ActionEvent e)
1685 if (v_client != null)
1687 v_client.end_session();
1689 setupVamsasDisconnectedGui();
1693 protected void buildVamsasStMenu()
1695 if (v_client == null)
1697 String[] sess = null;
1700 sess = VamsasApplication.getSessionList();
1701 } catch (Exception e)
1703 jalview.bin.Cache.log.warn(
1704 "Problem getting current sessions list.", e);
1709 jalview.bin.Cache.log.debug("Got current sessions list: "
1710 + sess.length + " entries.");
1711 VamsasStMenu.removeAll();
1712 for (int i = 0; i < sess.length; i++)
1714 JMenuItem sessit = new JMenuItem();
1715 sessit.setText(sess[i]);
1716 sessit.setToolTipText("Connect to session " + sess[i]);
1717 final Desktop dsktp = this;
1718 final String mysesid = sess[i];
1719 sessit.addActionListener(new ActionListener()
1722 public void actionPerformed(ActionEvent e)
1724 if (dsktp.v_client == null)
1726 Thread rthr = new Thread(new Runnable()
1731 dsktp.v_client = new VamsasApplication(dsktp, mysesid);
1732 dsktp.setupVamsasConnectedGui();
1733 dsktp.v_client.initial_update();
1741 VamsasStMenu.add(sessit);
1743 // don't show an empty menu.
1744 VamsasStMenu.setVisible(sess.length > 0);
1749 jalview.bin.Cache.log.debug("No current vamsas sessions.");
1750 VamsasStMenu.removeAll();
1751 VamsasStMenu.setVisible(false);
1756 // Not interested in the content. Just hide ourselves.
1757 VamsasStMenu.setVisible(false);
1761 public void vamsasSave_actionPerformed(ActionEvent e)
1763 if (v_client != null)
1765 JalviewFileChooser chooser = new JalviewFileChooser(
1766 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1767 { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
1769 { "Vamsas Document" }, "Vamsas Document");
1771 chooser.setFileView(new JalviewFileView());
1772 chooser.setDialogTitle("Save Vamsas Document Archive");
1774 int value = chooser.showSaveDialog(this);
1776 if (value == JalviewFileChooser.APPROVE_OPTION)
1778 java.io.File choice = chooser.getSelectedFile();
1779 JPanel progpanel = addProgressPanel("Saving VAMSAS Document to "
1780 + choice.getName());
1781 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1782 String warnmsg = null;
1783 String warnttl = null;
1786 v_client.vclient.storeDocument(choice);
1789 warnttl = "Serious Problem saving Vamsas Document";
1790 warnmsg = ex.toString();
1791 jalview.bin.Cache.log.error("Error Whilst saving document to "
1794 } catch (Exception ex)
1796 warnttl = "Problem saving Vamsas Document.";
1797 warnmsg = ex.toString();
1798 jalview.bin.Cache.log.warn("Exception Whilst saving document to "
1802 removeProgressPanel(progpanel);
1803 if (warnmsg != null)
1805 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1807 warnmsg, warnttl, JOptionPane.ERROR_MESSAGE);
1813 JPanel vamUpdate = null;
1816 * hide vamsas user gui bits when a vamsas document event is being handled.
1819 * true to hide gui, false to reveal gui
1821 public void setVamsasUpdate(boolean b)
1823 jalview.bin.Cache.log.debug("Setting gui for Vamsas update "
1824 + (b ? "in progress" : "finished"));
1826 if (vamUpdate != null)
1828 this.removeProgressPanel(vamUpdate);
1832 vamUpdate = this.addProgressPanel("Updating vamsas session");
1834 vamsasStart.setVisible(!b);
1835 vamsasStop.setVisible(!b);
1836 vamsasSave.setVisible(!b);
1839 public JInternalFrame[] getAllFrames()
1841 return desktop.getAllFrames();
1845 * Checks the given url to see if it gives a response indicating that the user
1846 * should be informed of a new questionnaire.
1850 public void checkForQuestionnaire(String url)
1852 UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url);
1853 // javax.swing.SwingUtilities.invokeLater(jvq);
1854 new Thread(jvq).start();
1858 * Proxy class for JDesktopPane which optionally displays the current memory
1859 * usage and highlights the desktop area with a red bar if free memory runs
1864 public class MyDesktopPane extends JDesktopPane implements Runnable
1867 boolean showMemoryUsage = false;
1871 java.text.NumberFormat df;
1873 float maxMemory, allocatedMemory, freeMemory, totalFreeMemory,
1876 public MyDesktopPane(boolean showMemoryUsage)
1878 showMemoryUsage(showMemoryUsage);
1881 public void showMemoryUsage(boolean showMemoryUsage)
1883 this.showMemoryUsage = showMemoryUsage;
1884 if (showMemoryUsage)
1886 Thread worker = new Thread(this);
1891 public boolean isShowMemoryUsage()
1893 return showMemoryUsage;
1898 df = java.text.NumberFormat.getNumberInstance();
1899 df.setMaximumFractionDigits(2);
1900 runtime = Runtime.getRuntime();
1902 while (showMemoryUsage)
1906 maxMemory = runtime.maxMemory() / 1048576f;
1907 allocatedMemory = runtime.totalMemory() / 1048576f;
1908 freeMemory = runtime.freeMemory() / 1048576f;
1909 totalFreeMemory = freeMemory + (maxMemory - allocatedMemory);
1911 percentUsage = (totalFreeMemory / maxMemory) * 100;
1913 // if (percentUsage < 20)
1915 // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12,
1917 // instance.set.setBorder(border1);
1920 // sleep after showing usage
1922 } catch (Exception ex)
1924 ex.printStackTrace();
1929 public void paintComponent(Graphics g)
1931 if (showMemoryUsage && g != null && df != null)
1933 if (percentUsage < 20)
1934 g.setColor(Color.red);
1935 FontMetrics fm = g.getFontMetrics();
1939 "Total Free Memory: " + df.format(totalFreeMemory)
1940 + "MB; Max Memory: " + df.format(maxMemory)
1941 + "MB; " + df.format(percentUsage) + "%", 10,
1942 getHeight() - fm.getHeight());
1949 protected JMenuItem groovyShell;
1951 public void doGroovyCheck()
1953 if (jalview.bin.Cache.groovyJarsPresent())
1955 groovyShell = new JMenuItem();
1956 groovyShell.setText("Groovy Console...");
1957 groovyShell.addActionListener(new ActionListener()
1959 public void actionPerformed(ActionEvent e)
1961 groovyShell_actionPerformed(e);
1964 toolsMenu.add(groovyShell);
1965 groovyShell.setVisible(true);
1970 * Accessor method to quickly get all the AlignmentFrames loaded.
1972 public static AlignFrame[] getAlignframes()
1974 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
1980 Vector avp = new Vector();
1984 for (int i = frames.length - 1; i > -1; i--)
1986 if (frames[i] instanceof AlignFrame)
1988 AlignFrame af = (AlignFrame) frames[i];
1992 } catch (Exception ex)
1994 ex.printStackTrace();
1996 if (avp.size() == 0)
2000 AlignFrame afs[] = new AlignFrame[avp.size()];
2001 for (int i = 0, j = avp.size(); i < j; i++)
2003 afs[i] = (AlignFrame) avp.elementAt(i);
2008 public AppJmol[] getJmols()
2010 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2016 Vector avp = new Vector();
2020 for (int i = frames.length - 1; i > -1; i--)
2022 if (frames[i] instanceof AppJmol)
2024 AppJmol af = (AppJmol) frames[i];
2028 } catch (Exception ex)
2030 ex.printStackTrace();
2032 if (avp.size() == 0)
2036 AppJmol afs[] = new AppJmol[avp.size()];
2037 for (int i = 0, j = avp.size(); i < j; i++)
2039 afs[i] = (AppJmol) avp.elementAt(i);
2046 * Add Groovy Support to Jalview
2048 public void groovyShell_actionPerformed(ActionEvent e)
2050 // use reflection to avoid creating compilation dependency.
2051 if (!jalview.bin.Cache.groovyJarsPresent())
2054 "Implementation Error. Cannot create groovyShell without Groovy on the classpath!");
2058 Class gcClass = Desktop.class.getClassLoader().loadClass(
2059 "groovy.ui.Console");
2060 Constructor gccons = gcClass.getConstructor(null);
2061 java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
2063 { String.class, Object.class });
2064 java.lang.reflect.Method run = gcClass.getMethod("run", null);
2065 Object gc = gccons.newInstance(null);
2066 setvar.invoke(gc, new Object[]
2067 { "Jalview", this });
2068 run.invoke(gc, null);
2069 } catch (Exception ex)
2071 jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
2073 .showInternalMessageDialog(
2076 "Couldn't create the groovy Shell. Check the error log for the details of what went wrong.",
2077 "Jalview Groovy Support Failed",
2078 JOptionPane.ERROR_MESSAGE);
2083 * Progress bars managed by the IProgressIndicator method.
2085 private Hashtable<Long,JPanel> progressBars;
2086 private Hashtable<Long,IProgressIndicatorHandler> progressBarHandlers;
2091 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
2093 public void setProgressBar(String message, long id)
2095 if (progressBars == null)
2097 progressBars = new Hashtable<Long,JPanel>();
2098 progressBarHandlers = new Hashtable<Long,IProgressIndicatorHandler>();
2101 if (progressBars.get(new Long(id)) != null)
2103 JPanel progressPanel = progressBars
2104 .remove(new Long(id));
2105 if (progressBarHandlers.contains(new Long(id)))
2107 progressBarHandlers.remove(new Long(id));
2109 removeProgressPanel(progressPanel);
2113 progressBars.put(new Long(id), addProgressPanel(message));
2120 * @see jalview.gui.IProgressIndicator#registerHandler(long,
2121 * jalview.gui.IProgressIndicatorHandler)
2123 public void registerHandler(final long id,
2124 final IProgressIndicatorHandler handler)
2126 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
2129 "call setProgressBar before registering the progress bar's handler.");
2131 progressBarHandlers.put(new Long(id), handler);
2132 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
2133 if (handler.canCancel())
2135 JButton cancel = new JButton("Cancel");
2136 final IProgressIndicator us = this;
2137 cancel.addActionListener(new ActionListener()
2140 public void actionPerformed(ActionEvent e)
2142 handler.cancelActivity(id);
2145 + ((JLabel) progressPanel.getComponent(0))
2149 progressPanel.add(cancel, BorderLayout.EAST);
2154 * This will return the first AlignFrame viewing AlignViewport av. It will
2155 * break if there are more than one AlignFrames viewing a particular av. This
2158 * @return alignFrame for av
2160 public static AlignFrame getAlignFrameFor(AlignViewport av)
2162 if (desktop != null)
2164 AlignmentPanel[] aps = getAlignmentPanels(av.getSequenceSetId());
2165 for (int panel = 0; aps != null && panel < aps.length; panel++)
2167 if (aps[panel] != null && aps[panel].av == av)
2169 return aps[panel].alignFrame;
2176 public VamsasApplication getVamsasApplication()
2183 * flag set if jalview GUI is being operated programmatically
2185 private boolean inBatchMode = false;
2188 * check if jalview GUI is being operated programmatically
2190 * @return inBatchMode
2192 public boolean isInBatchMode()
2198 * set flag if jalview GUI is being operated programmatically
2200 * @param inBatchMode
2202 public void setInBatchMode(boolean inBatchMode)
2204 this.inBatchMode = inBatchMode;
2207 public void startServiceDiscovery()
2209 startServiceDiscovery(false);
2212 public void startServiceDiscovery(boolean blocking)
2214 boolean alive = true;
2215 Thread t0 = null, t1 = null, t2 = null;
2217 // todo: changesupport handlers need to be transferred
2218 if (discoverer == null)
2220 discoverer = new jalview.ws.jws1.Discoverer();
2221 // register PCS handler for desktop.
2222 discoverer.addPropertyChangeListener(changeSupport);
2224 if (Cache.getDefault("SHOW_JWS1_SERVICES", true))
2226 (t0 = new Thread(discoverer)).start();
2231 if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
2233 // EnfinEnvision web service menu entries are rebuild every time the
2234 // menu is shown, so no changeSupport events are needed.
2235 jalview.ws.EnfinEnvision2OneWay.getInstance();
2236 (t1 = new Thread(jalview.ws.EnfinEnvision2OneWay.getInstance()))
2239 } catch (Exception e)
2242 .info("Exception when trying to launch Envision2 workflow discovery.",
2244 Cache.log.info(e.getStackTrace());
2246 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
2248 if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
2250 jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
2252 t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
2258 // TODO: do rest service discovery
2267 } catch (Exception e)
2270 alive = (t1 != null && t1.isAlive())
2271 || (t2 != null && t2.isAlive())
2272 || (t3 != null && t3.isAlive())
2273 || (t0 != null && t0.isAlive());
2279 * called to check if the service discovery process completed successfully.
2283 protected void JalviewServicesChanged(PropertyChangeEvent evt)
2285 if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
2287 final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
2288 .getErrorMessages();
2291 if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
2293 if (serviceChangedDialog == null)
2295 // only run if we aren't already displaying one of these.
2296 javax.swing.SwingUtilities
2297 .invokeLater(serviceChangedDialog = new Runnable()
2303 .showInternalMessageDialog(
2306 + "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",
2307 "Preferences Problem",
2308 JOptionPane.WARNING_MESSAGE);
2309 serviceChangedDialog = null;
2318 .error("Errors reported by JABA discovery service. Check web services preferences.\n"
2325 private Runnable serviceChangedDialog = null;
2328 * start a thread to open a URL in the configured browser. Pops up a warning
2329 * dialog to the user if there is an exception when calling out to the browser
2334 public static void showUrl(final String url)
2336 showUrl(url, Desktop.instance);
2339 * Like showUrl but allows progress handler to be specified
2341 * @param progress (null) or object implementing IProgressIndicator
2343 public static void showUrl(final String url, final IProgressIndicator progress)
2345 new Thread(new Runnable()
2351 if (progress!=null) {
2352 progress.setProgressBar("Opening "+url, this.hashCode());
2354 jalview.util.BrowserLauncher.openURL(url);
2355 } catch (Exception ex)
2358 .showInternalMessageDialog(
2360 "Unixers: Couldn't find default web browser."
2361 + "\nAdd the full path to your browser in Preferences.",
2362 "Web browser not found",
2363 JOptionPane.WARNING_MESSAGE);
2365 ex.printStackTrace();
2367 if (progress!=null) {
2368 progress.setProgressBar(null, this.hashCode());
2374 public static WsParamSetManager wsparamManager = null;
2376 public static ParamManager getUserParameterStore()
2378 if (wsparamManager == null)
2380 wsparamManager = new WsParamSetManager();
2382 return wsparamManager;