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)
640 public void lostOwnership(Clipboard clipboard, Transferable contents)
644 Desktop.jalviewClipboard = null;
647 internalCopy = false;
650 public void dragEnter(DropTargetDragEvent evt)
654 public void dragExit(DropTargetEvent evt)
658 public void dragOver(DropTargetDragEvent evt)
662 public void dropActionChanged(DropTargetDragEvent evt)
672 public void drop(DropTargetDropEvent evt)
674 Transferable t = evt.getTransferable();
675 java.util.List files = null;
676 java.util.List protocols = null;
680 DataFlavor uriListFlavor = new DataFlavor(
681 "text/uri-list;class=java.lang.String");
682 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
684 // Works on Windows and MacOSX
685 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
686 files = (java.util.List) t
687 .getTransferData(DataFlavor.javaFileListFlavor);
689 else if (t.isDataFlavorSupported(uriListFlavor))
691 // This is used by Unix drag system
692 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
693 String data = (String) t.getTransferData(uriListFlavor);
694 files = new java.util.ArrayList(1);
695 protocols = new java.util.ArrayList(1);
696 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
697 data, "\r\n"); st.hasMoreTokens();)
699 String s = st.nextToken();
700 if (s.startsWith("#"))
702 // the line is a comment (as per the RFC 2483)
705 java.net.URI uri = new java.net.URI(s);
706 if (uri.getScheme().toLowerCase().startsWith("http"))
708 protocols.add(FormatAdapter.URL);
709 files.add(uri.toString());
713 // otherwise preserve old behaviour: catch all for file objects
714 java.io.File file = new java.io.File(uri);
715 protocols.add(FormatAdapter.FILE);
716 files.add(file.toString());
720 } catch (Exception e)
728 for (int i = 0; i < files.size(); i++)
730 String file = files.get(i).toString();
731 String protocol = (protocols == null) ? FormatAdapter.FILE
732 : (String) protocols.get(i);
733 String format = null;
735 if (file.endsWith(".jar"))
742 format = new IdentifyFile().Identify(file, protocol);
745 new FileLoader().LoadFile(file, protocol, format);
748 } catch (Exception ex)
760 public void inputLocalFileMenuItem_actionPerformed(AlignViewport viewport)
762 JalviewFileChooser chooser = new JalviewFileChooser(
763 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
764 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
765 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
766 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
768 chooser.setFileView(new JalviewFileView());
769 chooser.setDialogTitle("Open local file");
770 chooser.setToolTipText("Open");
772 int value = chooser.showOpenDialog(this);
774 if (value == JalviewFileChooser.APPROVE_OPTION)
776 String choice = chooser.getSelectedFile().getPath();
777 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
778 .getSelectedFile().getParent());
780 String format = null;
781 if (chooser.getSelectedFormat().equals("Jalview"))
787 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
790 if (viewport != null)
792 new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
797 new FileLoader().LoadFile(choice, FormatAdapter.FILE, format);
808 public void inputURLMenuItem_actionPerformed(AlignViewport viewport)
810 // This construct allows us to have a wider textfield
812 JLabel label = new JLabel("Enter URL of Input File");
813 final JComboBox history = new JComboBox();
815 JPanel panel = new JPanel(new GridLayout(2, 1));
818 history.setPreferredSize(new Dimension(400, 20));
819 history.setEditable(true);
820 history.addItem("http://www.");
822 String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
826 if (historyItems != null)
828 st = new StringTokenizer(historyItems, "\t");
830 while (st.hasMoreTokens())
832 history.addItem(st.nextElement());
836 int reply = JOptionPane.showInternalConfirmDialog(desktop, panel,
837 "Input Alignment From URL", JOptionPane.OK_CANCEL_OPTION);
839 if (reply != JOptionPane.OK_OPTION)
844 String url = history.getSelectedItem().toString();
846 if (url.toLowerCase().endsWith(".jar"))
848 if (viewport != null)
850 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL,
855 new FileLoader().LoadFile(url, FormatAdapter.URL, "Jalview");
860 String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
862 if (format.equals("URL NOT FOUND"))
864 JOptionPane.showInternalMessageDialog(Desktop.desktop,
865 "Couldn't locate " + url, "URL not found",
866 JOptionPane.WARNING_MESSAGE);
871 if (viewport != null)
873 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL, format);
877 new FileLoader().LoadFile(url, FormatAdapter.URL, format);
888 public void inputTextboxMenuItem_actionPerformed(AlignViewport viewport)
890 CutAndPasteTransfer cap = new CutAndPasteTransfer();
891 cap.setForInput(viewport);
892 Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);
900 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
902 .setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
903 jalview.bin.Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height
905 storeLastKnownDimensions("", new Rectangle(getBounds().x,
906 getBounds().y, getWidth(), getHeight()));
908 if (jconsole != null)
910 storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds());
911 jconsole.stopConsole();
916 private void storeLastKnownDimensions(String string, Rectangle jc)
918 jalview.bin.Cache.log.debug("Storing last known dimensions for "
919 + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width
920 + " height:" + jc.height);
922 jalview.bin.Cache.setProperty(string + "SCREEN_X", jc.x + "");
923 jalview.bin.Cache.setProperty(string + "SCREEN_Y", jc.y + "");
924 jalview.bin.Cache.setProperty(string + "SCREEN_WIDTH", jc.width + "");
925 jalview.bin.Cache.setProperty(string + "SCREEN_HEIGHT", jc.height + "");
934 public void aboutMenuItem_actionPerformed(ActionEvent e)
936 StringBuffer message = new StringBuffer("Jalview version "
937 + jalview.bin.Cache.getProperty("VERSION") + "; last updated: "
938 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"));
940 if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals(
941 jalview.bin.Cache.getProperty("VERSION")))
943 message.append("\n\n!! Jalview version "
944 + jalview.bin.Cache.getProperty("LATEST_VERSION")
945 + " is available for download from http://www.jalview.org !!\n");
948 // TODO: update this text for each release or centrally store it for lite
950 message.append("\nAuthors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,\n David Martin & Geoff Barton."
951 + "\nDevelopment managed by The Barton Group, University of Dundee, Scotland, UK.\n"
952 + "\nFor help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list\n"
953 + "\nIf you use Jalview, please cite:"
954 + "\nWaterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
955 + "\nJalview Version 2 - a multiple sequence alignment editor and analysis workbench"
956 + "\nBioinformatics doi: 10.1093/bioinformatics/btp033");
957 JOptionPane.showInternalMessageDialog(Desktop.desktop,
959 message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
968 public void documentationMenuItem_actionPerformed(ActionEvent e)
972 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
973 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
974 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
976 javax.help.HelpBroker hb = hs.createHelpBroker();
977 hb.setCurrentID("home");
978 hb.setDisplayed(true);
979 } catch (Exception ex)
984 public void closeAll_actionPerformed(ActionEvent e)
986 JInternalFrame[] frames = desktop.getAllFrames();
987 for (int i = 0; i < frames.length; i++)
991 frames[i].setClosed(true);
992 } catch (java.beans.PropertyVetoException ex)
996 System.out.println("ALL CLOSED");
997 if (v_client != null)
999 // TODO clear binding to vamsas document objects on close_all
1004 public void raiseRelated_actionPerformed(ActionEvent e)
1006 reorderAssociatedWindows(false, false);
1009 public void minimizeAssociated_actionPerformed(ActionEvent e)
1011 reorderAssociatedWindows(true, false);
1014 void closeAssociatedWindows()
1016 reorderAssociatedWindows(false, true);
1022 * @seejalview.jbgui.GDesktop#garbageCollect_actionPerformed(java.awt.event.
1025 protected void garbageCollect_actionPerformed(ActionEvent e)
1027 // We simply collect the garbage
1028 jalview.bin.Cache.log.debug("Collecting garbage...");
1030 jalview.bin.Cache.log.debug("Finished garbage collection.");
1037 * jalview.jbgui.GDesktop#showMemusage_actionPerformed(java.awt.event.ActionEvent
1040 protected void showMemusage_actionPerformed(ActionEvent e)
1042 desktop.showMemoryUsage(showMemusage.isSelected());
1049 * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent
1052 protected void showConsole_actionPerformed(ActionEvent e)
1054 showConsole(showConsole.isSelected());
1057 Console jconsole = null;
1060 * control whether the java console is visible or not
1064 void showConsole(boolean selected)
1066 showConsole.setSelected(selected);
1067 // TODO: decide if we should update properties file
1068 Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected)
1070 jconsole.setVisible(selected);
1073 void reorderAssociatedWindows(boolean minimize, boolean close)
1075 JInternalFrame[] frames = desktop.getAllFrames();
1076 if (frames == null || frames.length < 1)
1081 AlignViewport source = null, target = null;
1082 if (frames[0] instanceof AlignFrame)
1084 source = ((AlignFrame) frames[0]).getCurrentView();
1086 else if (frames[0] instanceof TreePanel)
1088 source = ((TreePanel) frames[0]).getViewPort();
1090 else if (frames[0] instanceof PCAPanel)
1092 source = ((PCAPanel) frames[0]).av;
1094 else if (frames[0].getContentPane() instanceof PairwiseAlignPanel)
1096 source = ((PairwiseAlignPanel) frames[0].getContentPane()).av;
1101 for (int i = 0; i < frames.length; i++)
1104 if (frames[i] == null)
1108 if (frames[i] instanceof AlignFrame)
1110 target = ((AlignFrame) frames[i]).getCurrentView();
1112 else if (frames[i] instanceof TreePanel)
1114 target = ((TreePanel) frames[i]).getViewPort();
1116 else if (frames[i] instanceof PCAPanel)
1118 target = ((PCAPanel) frames[i]).av;
1120 else if (frames[i].getContentPane() instanceof PairwiseAlignPanel)
1122 target = ((PairwiseAlignPanel) frames[i].getContentPane()).av;
1125 if (source == target)
1131 frames[i].setClosed(true);
1135 frames[i].setIcon(minimize);
1138 frames[i].toFront();
1142 } catch (java.beans.PropertyVetoException ex)
1156 protected void preferences_actionPerformed(ActionEvent e)
1167 public void saveState_actionPerformed(ActionEvent e)
1169 JalviewFileChooser chooser = new JalviewFileChooser(
1170 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1171 { "jar" }, new String[]
1172 { "Jalview Project" }, "Jalview Project");
1174 chooser.setFileView(new JalviewFileView());
1175 chooser.setDialogTitle("Save State");
1177 int value = chooser.showSaveDialog(this);
1179 if (value == JalviewFileChooser.APPROVE_OPTION)
1181 java.io.File choice = chooser.getSelectedFile();
1182 setProgressBar("Saving jalview project " + choice.getName(),
1184 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1185 // TODO catch and handle errors for savestate
1188 new Jalview2XML().SaveState(choice);
1189 } catch (OutOfMemoryError oom)
1192 "Whilst saving current state to " + choice.getName(), oom);
1193 } catch (Exception ex)
1196 .error("Problems whilst trying to save to "
1197 + choice.getName(), ex);
1198 JOptionPane.showMessageDialog(this,
1199 "Error whilst saving current state to " + choice.getName(),
1200 "Couldn't save project", JOptionPane.WARNING_MESSAGE);
1202 setProgressBar(null, choice.hashCode());
1213 public void loadState_actionPerformed(ActionEvent e)
1215 JalviewFileChooser chooser = new JalviewFileChooser(
1216 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1217 { "jar" }, new String[]
1218 { "Jalview Project" }, "Jalview Project");
1219 chooser.setFileView(new JalviewFileView());
1220 chooser.setDialogTitle("Restore state");
1222 int value = chooser.showOpenDialog(this);
1224 if (value == JalviewFileChooser.APPROVE_OPTION)
1226 final String choice = chooser.getSelectedFile().getAbsolutePath();
1227 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
1228 .getSelectedFile().getParent());
1229 new Thread(new Runnable()
1233 setProgressBar("loading jalview project " + choice,
1237 new Jalview2XML().LoadJalviewAlign(choice);
1238 } catch (OutOfMemoryError oom)
1240 new OOMWarning("Whilst loading project from " + choice, oom);
1241 } catch (Exception ex)
1243 Cache.log.error("Problems whilst loading project from "
1245 JOptionPane.showMessageDialog(Desktop.desktop,
1246 "Error whilst loading project from " + choice,
1247 "Couldn't load project", JOptionPane.WARNING_MESSAGE);
1249 setProgressBar(null, choice.hashCode());
1255 public void inputSequence_actionPerformed(ActionEvent e)
1257 new SequenceFetcher(this);
1260 JPanel progressPanel;
1262 public void startLoading(final String fileName)
1264 if (fileLoadingCount == 0)
1266 addProgressPanel("Loading File: " + fileName + " ");
1272 private JProgressBar addProgressPanel(String string)
1274 if (progressPanel == null)
1276 progressPanel = new JPanel(new BorderLayout());
1277 totalProgressCount = 0;
1279 JProgressBar progressBar = new JProgressBar();
1280 progressBar.setIndeterminate(true);
1282 progressPanel.add(new JLabel(string), BorderLayout.WEST);
1284 progressPanel.add(progressBar, BorderLayout.CENTER);
1286 instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
1287 totalProgressCount++;
1292 int totalProgressCount = 0;
1294 private void removeProgressPanel(JProgressBar progbar)
1296 if (progressPanel != null)
1298 progressPanel.remove(progbar);
1299 if (--totalProgressCount < 1)
1301 this.getContentPane().remove(progressPanel);
1302 progressPanel = null;
1308 public void stopLoading()
1311 if (fileLoadingCount < 1)
1313 if (progressPanel != null)
1315 this.getContentPane().remove(progressPanel);
1316 progressPanel = null;
1318 fileLoadingCount = 0;
1323 public static int getViewCount(String alignmentId)
1325 AlignViewport[] aps = getViewports(alignmentId);
1326 return (aps == null) ? 0 : aps.length;
1331 * @param alignmentId
1332 * @return all AlignmentPanels concerning the alignmentId sequence set
1334 public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
1337 if (Desktop.desktop == null)
1339 // no frames created and in headless mode
1340 // TODO: verify that frames are recoverable when in headless mode
1343 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
1344 ArrayList aps = new ArrayList();
1345 for (int t = 0; t < frames.length; t++)
1347 if (frames[t] instanceof AlignFrame)
1349 AlignFrame af = (AlignFrame) frames[t];
1350 for (int a = 0; a < af.alignPanels.size(); a++)
1353 .equals(((AlignmentPanel) af.alignPanels.elementAt(a)).av
1354 .getSequenceSetId()))
1356 aps.add(af.alignPanels.elementAt(a));
1361 if (aps.size() == 0)
1365 AlignmentPanel[] vap = new AlignmentPanel[aps.size()];
1366 for (int t = 0; t < vap.length; t++)
1368 vap[t] = (AlignmentPanel) aps.get(t);
1374 * get all the viewports on an alignment.
1376 * @param sequenceSetId
1377 * unique alignment id
1378 * @return all viewports on the alignment bound to sequenceSetId
1380 public static AlignViewport[] getViewports(String sequenceSetId)
1382 Vector viewp = new Vector();
1383 if (desktop != null)
1385 javax.swing.JInternalFrame[] frames = instance.getAllFrames();
1387 for (int t = 0; t < frames.length; t++)
1389 if (frames[t] instanceof AlignFrame)
1391 AlignFrame afr = ((AlignFrame) frames[t]);
1392 if (afr.getViewport().getSequenceSetId().equals(sequenceSetId))
1394 if (afr.alignPanels != null)
1396 for (int a = 0; a < afr.alignPanels.size(); a++)
1398 if (sequenceSetId.equals(((AlignmentPanel) afr.alignPanels
1399 .elementAt(a)).av.getSequenceSetId()))
1401 viewp.addElement(((AlignmentPanel) afr.alignPanels
1408 viewp.addElement(((AlignFrame) frames[t]).getViewport());
1413 if (viewp.size() > 0)
1415 AlignViewport[] vp = new AlignViewport[viewp.size()];
1423 public void explodeViews(AlignFrame af)
1425 int size = af.alignPanels.size();
1431 for (int i = 0; i < size; i++)
1433 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(i);
1434 AlignFrame newaf = new AlignFrame(ap);
1435 if (ap.av.explodedPosition != null
1436 && !ap.av.explodedPosition.equals(af.getBounds()))
1438 newaf.setBounds(ap.av.explodedPosition);
1441 ap.av.gatherViewsHere = false;
1443 addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
1444 AlignFrame.DEFAULT_HEIGHT);
1447 af.alignPanels.clear();
1448 af.closeMenuItem_actionPerformed(true);
1452 public void gatherViews(AlignFrame source)
1454 source.viewport.gatherViewsHere = true;
1455 source.viewport.explodedPosition = source.getBounds();
1456 JInternalFrame[] frames = desktop.getAllFrames();
1457 String viewId = source.viewport.sequenceSetID;
1459 for (int t = 0; t < frames.length; t++)
1461 if (frames[t] instanceof AlignFrame && frames[t] != source)
1463 AlignFrame af = (AlignFrame) frames[t];
1464 boolean gatherThis = false;
1465 for (int a = 0; a < af.alignPanels.size(); a++)
1467 AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(a);
1468 if (viewId.equals(ap.av.getSequenceSetId()))
1471 ap.av.gatherViewsHere = false;
1472 ap.av.explodedPosition = af.getBounds();
1473 source.addAlignmentPanel(ap, false);
1479 af.alignPanels.clear();
1480 af.closeMenuItem_actionPerformed(true);
1487 jalview.gui.VamsasApplication v_client = null;
1489 public void vamsasImport_actionPerformed(ActionEvent e)
1491 if (v_client == null)
1493 // Load and try to start a session.
1494 JalviewFileChooser chooser = new JalviewFileChooser(
1495 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1497 chooser.setFileView(new JalviewFileView());
1498 chooser.setDialogTitle("Open a saved VAMSAS session");
1499 chooser.setToolTipText("select a vamsas session to be opened as a new vamsas session.");
1501 int value = chooser.showOpenDialog(this);
1503 if (value == JalviewFileChooser.APPROVE_OPTION)
1505 String fle = chooser.getSelectedFile().toString();
1506 if (!vamsasImport(chooser.getSelectedFile()))
1508 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1509 "Couldn't import '" + fle + "' as a new vamsas session.",
1510 "Vamsas Document Import Failed",
1511 JOptionPane.ERROR_MESSAGE);
1517 jalview.bin.Cache.log
1518 .error("Implementation error - load session from a running session is not supported.");
1523 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1526 * @return true if import was a success and a session was started.
1528 public boolean vamsasImport(URL url)
1530 // TODO: create progress bar
1531 if (v_client != null)
1534 jalview.bin.Cache.log
1535 .error("Implementation error - load session from a running session is not supported.");
1541 // copy the URL content to a temporary local file
1542 // TODO: be a bit cleverer here with nio (?!)
1543 File file = File.createTempFile("vdocfromurl", ".vdj");
1544 FileOutputStream fos = new FileOutputStream(file);
1545 BufferedInputStream bis = new BufferedInputStream(url.openStream());
1546 byte[] buffer = new byte[2048];
1548 while ((ln = bis.read(buffer)) > -1)
1550 fos.write(buffer, 0, ln);
1554 v_client = new jalview.gui.VamsasApplication(this, file,
1555 url.toExternalForm());
1556 } catch (Exception ex)
1558 jalview.bin.Cache.log.error(
1559 "Failed to create new vamsas session from contents of URL "
1563 setupVamsasConnectedGui();
1564 v_client.initial_update(); // TODO: thread ?
1565 return v_client.inSession();
1569 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1572 * @return true if import was a success and a session was started.
1574 public boolean vamsasImport(File file)
1576 if (v_client != null)
1579 jalview.bin.Cache.log
1580 .error("Implementation error - load session from a running session is not supported.");
1584 setProgressBar("Importing VAMSAS session from " + file.getName(),
1588 v_client = new jalview.gui.VamsasApplication(this, file, null);
1589 } catch (Exception ex)
1591 setProgressBar("Importing VAMSAS session from " + file.getName(),
1593 jalview.bin.Cache.log.error(
1594 "New vamsas session from existing session file failed:", ex);
1597 setupVamsasConnectedGui();
1598 v_client.initial_update(); // TODO: thread ?
1599 setProgressBar("Importing VAMSAS session from " + file.getName(),
1601 return v_client.inSession();
1604 public boolean joinVamsasSession(String mysesid)
1606 if (v_client != null)
1609 "Trying to join a vamsas session when another is already connected.");
1611 if (mysesid == null)
1613 throw new Error("Invalid vamsas session id.");
1615 v_client = new VamsasApplication(this, mysesid);
1616 setupVamsasConnectedGui();
1617 v_client.initial_update();
1618 return (v_client.inSession());
1621 public void vamsasStart_actionPerformed(ActionEvent e)
1623 if (v_client == null)
1626 // we just start a default session for moment.
1628 * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1629 * getProperty("LAST_DIRECTORY"));
1631 * chooser.setFileView(new JalviewFileView());
1632 * chooser.setDialogTitle("Load Vamsas file");
1633 * chooser.setToolTipText("Import");
1635 * int value = chooser.showOpenDialog(this);
1637 * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new
1638 * jalview.gui.VamsasApplication(this, chooser.getSelectedFile());
1640 v_client = new VamsasApplication(this);
1641 setupVamsasConnectedGui();
1642 v_client.initial_update(); // TODO: thread ?
1646 // store current data in session.
1647 v_client.push_update(); // TODO: thread
1651 protected void setupVamsasConnectedGui()
1653 vamsasStart.setText("Session Update");
1654 vamsasSave.setVisible(true);
1655 vamsasStop.setVisible(true);
1656 vamsasImport.setVisible(false); // Document import to existing session is
1657 // not possible for vamsas-client-1.0.
1660 protected void setupVamsasDisconnectedGui()
1662 vamsasSave.setVisible(false);
1663 vamsasStop.setVisible(false);
1664 vamsasImport.setVisible(true);
1665 vamsasStart.setText("New Vamsas Session");
1668 public void vamsasStop_actionPerformed(ActionEvent e)
1670 if (v_client != null)
1672 v_client.end_session();
1674 setupVamsasDisconnectedGui();
1678 protected void buildVamsasStMenu()
1680 if (v_client == null)
1682 String[] sess = null;
1685 sess = VamsasApplication.getSessionList();
1686 } catch (Exception e)
1688 jalview.bin.Cache.log.warn(
1689 "Problem getting current sessions list.", e);
1694 jalview.bin.Cache.log.debug("Got current sessions list: "
1695 + sess.length + " entries.");
1696 VamsasStMenu.removeAll();
1697 for (int i = 0; i < sess.length; i++)
1699 JMenuItem sessit = new JMenuItem();
1700 sessit.setText(sess[i]);
1701 sessit.setToolTipText("Connect to session " + sess[i]);
1702 final Desktop dsktp = this;
1703 final String mysesid = sess[i];
1704 sessit.addActionListener(new ActionListener()
1707 public void actionPerformed(ActionEvent e)
1709 if (dsktp.v_client == null)
1711 Thread rthr = new Thread(new Runnable()
1716 dsktp.v_client = new VamsasApplication(dsktp, mysesid);
1717 dsktp.setupVamsasConnectedGui();
1718 dsktp.v_client.initial_update();
1726 VamsasStMenu.add(sessit);
1728 // don't show an empty menu.
1729 VamsasStMenu.setVisible(sess.length > 0);
1734 jalview.bin.Cache.log.debug("No current vamsas sessions.");
1735 VamsasStMenu.removeAll();
1736 VamsasStMenu.setVisible(false);
1741 // Not interested in the content. Just hide ourselves.
1742 VamsasStMenu.setVisible(false);
1746 public void vamsasSave_actionPerformed(ActionEvent e)
1748 if (v_client != null)
1750 JalviewFileChooser chooser = new JalviewFileChooser(
1751 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1752 { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
1754 { "Vamsas Document" }, "Vamsas Document");
1756 chooser.setFileView(new JalviewFileView());
1757 chooser.setDialogTitle("Save Vamsas Document Archive");
1759 int value = chooser.showSaveDialog(this);
1761 if (value == JalviewFileChooser.APPROVE_OPTION)
1763 java.io.File choice = chooser.getSelectedFile();
1764 JProgressBar progpanel = addProgressPanel("Saving VAMSAS Document to "
1765 + choice.getName());
1766 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
1767 String warnmsg = null;
1768 String warnttl = null;
1771 v_client.vclient.storeDocument(choice);
1774 warnttl = "Serious Problem saving Vamsas Document";
1775 warnmsg = ex.toString();
1776 jalview.bin.Cache.log.error("Error Whilst saving document to "
1779 } catch (Exception ex)
1781 warnttl = "Problem saving Vamsas Document.";
1782 warnmsg = ex.toString();
1783 jalview.bin.Cache.log.warn("Exception Whilst saving document to "
1787 removeProgressPanel(progpanel);
1788 if (warnmsg != null)
1790 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1792 warnmsg, warnttl, JOptionPane.ERROR_MESSAGE);
1798 JProgressBar vamUpdate = null;
1801 * hide vamsas user gui bits when a vamsas document event is being handled.
1804 * true to hide gui, false to reveal gui
1806 public void setVamsasUpdate(boolean b)
1808 jalview.bin.Cache.log.debug("Setting gui for Vamsas update "
1809 + (b ? "in progress" : "finished"));
1811 if (vamUpdate != null)
1813 this.removeProgressPanel(vamUpdate);
1817 vamUpdate = this.addProgressPanel("Updating vamsas session");
1819 vamsasStart.setVisible(!b);
1820 vamsasStop.setVisible(!b);
1821 vamsasSave.setVisible(!b);
1824 public JInternalFrame[] getAllFrames()
1826 return desktop.getAllFrames();
1830 * Checks the given url to see if it gives a response indicating that the user
1831 * should be informed of a new questionnaire.
1835 public void checkForQuestionnaire(String url)
1837 UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url);
1838 // javax.swing.SwingUtilities.invokeLater(jvq);
1839 new Thread(jvq).start();
1843 * Proxy class for JDesktopPane which optionally displays the current memory
1844 * usage and highlights the desktop area with a red bar if free memory runs
1849 public class MyDesktopPane extends JDesktopPane implements Runnable
1852 boolean showMemoryUsage = false;
1856 java.text.NumberFormat df;
1858 float maxMemory, allocatedMemory, freeMemory, totalFreeMemory,
1861 public MyDesktopPane(boolean showMemoryUsage)
1863 showMemoryUsage(showMemoryUsage);
1866 public void showMemoryUsage(boolean showMemoryUsage)
1868 this.showMemoryUsage = showMemoryUsage;
1869 if (showMemoryUsage)
1871 Thread worker = new Thread(this);
1876 public boolean isShowMemoryUsage()
1878 return showMemoryUsage;
1883 df = java.text.NumberFormat.getNumberInstance();
1884 df.setMaximumFractionDigits(2);
1885 runtime = Runtime.getRuntime();
1887 while (showMemoryUsage)
1891 maxMemory = runtime.maxMemory() / 1048576f;
1892 allocatedMemory = runtime.totalMemory() / 1048576f;
1893 freeMemory = runtime.freeMemory() / 1048576f;
1894 totalFreeMemory = freeMemory + (maxMemory - allocatedMemory);
1896 percentUsage = (totalFreeMemory / maxMemory) * 100;
1898 // if (percentUsage < 20)
1900 // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12,
1902 // instance.set.setBorder(border1);
1905 // sleep after showing usage
1907 } catch (Exception ex)
1909 ex.printStackTrace();
1914 public void paintComponent(Graphics g)
1916 if (showMemoryUsage && g != null && df != null)
1918 if (percentUsage < 20)
1919 g.setColor(Color.red);
1920 FontMetrics fm = g.getFontMetrics();
1924 "Total Free Memory: " + df.format(totalFreeMemory)
1925 + "MB; Max Memory: " + df.format(maxMemory)
1926 + "MB; " + df.format(percentUsage) + "%", 10,
1927 getHeight() - fm.getHeight());
1934 protected JMenuItem groovyShell;
1936 public void doGroovyCheck()
1938 if (jalview.bin.Cache.groovyJarsPresent())
1940 groovyShell = new JMenuItem();
1941 groovyShell.setText("Groovy Console...");
1942 groovyShell.addActionListener(new ActionListener()
1944 public void actionPerformed(ActionEvent e)
1946 groovyShell_actionPerformed(e);
1949 toolsMenu.add(groovyShell);
1950 groovyShell.setVisible(true);
1955 * Accessor method to quickly get all the AlignmentFrames loaded.
1957 public static AlignFrame[] getAlignframes()
1959 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
1965 Vector avp = new Vector();
1969 for (int i = frames.length - 1; i > -1; i--)
1971 if (frames[i] instanceof AlignFrame)
1973 AlignFrame af = (AlignFrame) frames[i];
1977 } catch (Exception ex)
1979 ex.printStackTrace();
1981 if (avp.size() == 0)
1985 AlignFrame afs[] = new AlignFrame[avp.size()];
1986 for (int i = 0, j = avp.size(); i < j; i++)
1988 afs[i] = (AlignFrame) avp.elementAt(i);
1993 public AppJmol[] getJmols()
1995 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2001 Vector avp = new Vector();
2005 for (int i = frames.length - 1; i > -1; i--)
2007 if (frames[i] instanceof AppJmol)
2009 AppJmol af = (AppJmol) frames[i];
2013 } catch (Exception ex)
2015 ex.printStackTrace();
2017 if (avp.size() == 0)
2021 AppJmol afs[] = new AppJmol[avp.size()];
2022 for (int i = 0, j = avp.size(); i < j; i++)
2024 afs[i] = (AppJmol) avp.elementAt(i);
2031 * Add Groovy Support to Jalview
2033 public void groovyShell_actionPerformed(ActionEvent e)
2035 // use reflection to avoid creating compilation dependency.
2036 if (!jalview.bin.Cache.groovyJarsPresent())
2039 "Implementation Error. Cannot create groovyShell without Groovy on the classpath!");
2043 Class gcClass = Desktop.class.getClassLoader().loadClass(
2044 "groovy.ui.Console");
2045 Constructor gccons = gcClass.getConstructor(null);
2046 java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
2048 { String.class, Object.class });
2049 java.lang.reflect.Method run = gcClass.getMethod("run", null);
2050 Object gc = gccons.newInstance(null);
2051 setvar.invoke(gc, new Object[]
2052 { "Jalview", this });
2053 run.invoke(gc, null);
2054 } catch (Exception ex)
2056 jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
2058 .showInternalMessageDialog(
2061 "Couldn't create the groovy Shell. Check the error log for the details of what went wrong.",
2062 "Jalview Groovy Support Failed",
2063 JOptionPane.ERROR_MESSAGE);
2068 * Progress bars managed by the IProgressIndicator method.
2070 private Hashtable progressBars, progressBarHandlers;
2075 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
2077 public void setProgressBar(String message, long id)
2079 if (progressBars == null)
2081 progressBars = new Hashtable();
2082 progressBarHandlers = new Hashtable();
2085 if (progressBars.get(new Long(id)) != null)
2087 JProgressBar progressPanel = (JProgressBar) progressBars
2088 .remove(new Long(id));
2089 if (progressBarHandlers.contains(new Long(id)))
2091 progressBarHandlers.remove(new Long(id));
2093 removeProgressPanel(progressPanel);
2097 progressBars.put(new Long(id), addProgressPanel(message));
2104 * @see jalview.gui.IProgressIndicator#registerHandler(long,
2105 * jalview.gui.IProgressIndicatorHandler)
2107 public void registerHandler(final long id,
2108 final IProgressIndicatorHandler handler)
2110 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
2113 "call setProgressBar before registering the progress bar's handler.");
2115 progressBarHandlers.put(new Long(id), handler);
2116 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
2117 if (handler.canCancel())
2119 JButton cancel = new JButton("Cancel");
2120 final IProgressIndicator us = this;
2121 cancel.addActionListener(new ActionListener()
2124 public void actionPerformed(ActionEvent e)
2126 handler.cancelActivity(id);
2129 + ((JLabel) progressPanel.getComponent(0))
2133 progressPanel.add(cancel, BorderLayout.EAST);
2138 * This will return the first AlignFrame viewing AlignViewport av. It will
2139 * break if there are more than one AlignFrames viewing a particular av. This
2142 * @return alignFrame for av
2144 public static AlignFrame getAlignFrameFor(AlignViewport av)
2146 if (desktop != null)
2148 AlignmentPanel[] aps = getAlignmentPanels(av.getSequenceSetId());
2149 for (int panel = 0; aps != null && panel < aps.length; panel++)
2151 if (aps[panel] != null && aps[panel].av == av)
2153 return aps[panel].alignFrame;
2160 public VamsasApplication getVamsasApplication()
2167 * flag set if jalview GUI is being operated programmatically
2169 private boolean inBatchMode = false;
2172 * check if jalview GUI is being operated programmatically
2174 * @return inBatchMode
2176 public boolean isInBatchMode()
2182 * set flag if jalview GUI is being operated programmatically
2184 * @param inBatchMode
2186 public void setInBatchMode(boolean inBatchMode)
2188 this.inBatchMode = inBatchMode;
2191 public void startServiceDiscovery()
2193 startServiceDiscovery(false);
2196 public void startServiceDiscovery(boolean blocking)
2198 boolean alive = true;
2199 Thread t0 = null, t1 = null, t2 = null;
2201 // todo: changesupport handlers need to be transferred
2202 if (discoverer == null)
2204 discoverer = new jalview.ws.jws1.Discoverer();
2205 // register PCS handler for desktop.
2206 discoverer.addPropertyChangeListener(changeSupport);
2208 if (Cache.getDefault("SHOW_JWS1_SERVICES", true))
2210 (t0 = new Thread(discoverer)).start();
2215 if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
2217 // EnfinEnvision web service menu entries are rebuild every time the
2218 // menu is shown, so no changeSupport events are needed.
2219 jalview.ws.EnfinEnvision2OneWay.getInstance();
2220 (t1 = new Thread(jalview.ws.EnfinEnvision2OneWay.getInstance()))
2223 } catch (Exception e)
2226 .info("Exception when trying to launch Envision2 workflow discovery.",
2228 Cache.log.info(e.getStackTrace());
2230 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
2232 if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
2234 jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
2236 t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
2242 // TODO: do rest service discovery
2251 } catch (Exception e)
2254 alive = (t1 != null && t1.isAlive())
2255 || (t2 != null && t2.isAlive())
2256 || (t3 != null && t3.isAlive())
2257 || (t0 != null && t0.isAlive());
2263 * called to check if the service discovery process completed successfully.
2267 protected void JalviewServicesChanged(PropertyChangeEvent evt)
2269 if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
2271 final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
2272 .getErrorMessages();
2275 if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
2277 if (serviceChangedDialog == null)
2279 // only run if we aren't already displaying one of these.
2280 javax.swing.SwingUtilities
2281 .invokeLater(serviceChangedDialog = new Runnable()
2287 .showInternalMessageDialog(
2290 + "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",
2291 "Preferences Problem",
2292 JOptionPane.WARNING_MESSAGE);
2293 serviceChangedDialog = null;
2302 .error("Errors reported by JABA discovery service. Check web services preferences.\n"
2309 private Runnable serviceChangedDialog = null;
2312 * start a thread to open a URL in the configured browser. Pops up a warning
2313 * dialog to the user if there is an exception when calling out to the browser
2318 public static void showUrl(final String url)
2320 showUrl(url, Desktop.instance);
2323 * Like showUrl but allows progress handler to be specified
2325 * @param progress (null) or object implementing IProgressIndicator
2327 public static void showUrl(final String url, final IProgressIndicator progress)
2329 new Thread(new Runnable()
2335 if (progress!=null) {
2336 progress.setProgressBar("Opening "+url, this.hashCode());
2338 jalview.util.BrowserLauncher.openURL(url);
2339 } catch (Exception ex)
2342 .showInternalMessageDialog(
2344 "Unixers: Couldn't find default web browser."
2345 + "\nAdd the full path to your browser in Preferences.",
2346 "Web browser not found",
2347 JOptionPane.WARNING_MESSAGE);
2349 ex.printStackTrace();
2351 if (progress!=null) {
2352 progress.setProgressBar(null, this.hashCode());
2358 public static WsParamSetManager wsparamManager = null;
2360 public static ParamManager getUserParameterStore()
2362 if (wsparamManager == null)
2364 wsparamManager = new WsParamSetManager();
2366 return wsparamManager;