2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
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
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.api.AlignViewportI;
24 import jalview.api.AlignmentViewPanel;
25 import jalview.bin.Cache;
26 import jalview.io.FileLoader;
27 import jalview.io.FormatAdapter;
28 import jalview.io.IdentifyFile;
29 import jalview.io.JalviewFileChooser;
30 import jalview.io.JalviewFileView;
31 import jalview.jbgui.GSplitFrame;
32 import jalview.jbgui.GStructureViewer;
33 import jalview.structure.StructureSelectionManager;
34 import jalview.util.ImageMaker;
35 import jalview.util.MessageManager;
36 import jalview.viewmodel.AlignmentViewport;
37 import jalview.ws.params.ParamManager;
39 import java.awt.BorderLayout;
40 import java.awt.Color;
41 import java.awt.Dimension;
42 import java.awt.FontMetrics;
43 import java.awt.Graphics;
44 import java.awt.GridLayout;
45 import java.awt.Point;
46 import java.awt.Rectangle;
47 import java.awt.Toolkit;
48 import java.awt.datatransfer.Clipboard;
49 import java.awt.datatransfer.ClipboardOwner;
50 import java.awt.datatransfer.DataFlavor;
51 import java.awt.datatransfer.Transferable;
52 import java.awt.dnd.DnDConstants;
53 import java.awt.dnd.DropTargetDragEvent;
54 import java.awt.dnd.DropTargetDropEvent;
55 import java.awt.dnd.DropTargetEvent;
56 import java.awt.dnd.DropTargetListener;
57 import java.awt.event.ActionEvent;
58 import java.awt.event.ActionListener;
59 import java.awt.event.FocusEvent;
60 import java.awt.event.FocusListener;
61 import java.awt.event.MouseAdapter;
62 import java.awt.event.MouseEvent;
63 import java.awt.event.MouseListener;
64 import java.awt.event.WindowAdapter;
65 import java.awt.event.WindowEvent;
66 import java.beans.PropertyChangeEvent;
67 import java.beans.PropertyChangeListener;
68 import java.beans.PropertyVetoException;
69 import java.io.BufferedInputStream;
71 import java.io.FileOutputStream;
72 import java.lang.reflect.Constructor;
74 import java.util.ArrayList;
75 import java.util.Hashtable;
76 import java.util.List;
77 import java.util.StringTokenizer;
78 import java.util.Vector;
79 import java.util.concurrent.ExecutorService;
80 import java.util.concurrent.Executors;
81 import java.util.concurrent.Semaphore;
83 import javax.swing.DefaultDesktopManager;
84 import javax.swing.DesktopManager;
85 import javax.swing.JButton;
86 import javax.swing.JComboBox;
87 import javax.swing.JComponent;
88 import javax.swing.JDesktopPane;
89 import javax.swing.JFrame;
90 import javax.swing.JInternalFrame;
91 import javax.swing.JLabel;
92 import javax.swing.JMenuItem;
93 import javax.swing.JOptionPane;
94 import javax.swing.JPanel;
95 import javax.swing.JPopupMenu;
96 import javax.swing.JProgressBar;
97 import javax.swing.SwingUtilities;
98 import javax.swing.event.HyperlinkEvent;
99 import javax.swing.event.HyperlinkEvent.EventType;
100 import javax.swing.event.MenuEvent;
101 import javax.swing.event.MenuListener;
108 * @version $Revision: 1.155 $
110 public class Desktop extends jalview.jbgui.GDesktop implements
111 DropTargetListener, ClipboardOwner, IProgressIndicator,
112 jalview.api.StructureSelectionManagerProvider
115 private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
118 * news reader - null if it was never started.
120 private BlogReader jvnews = null;
122 private File projectFile;
126 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
128 public void addJalviewPropertyChangeListener(
129 PropertyChangeListener listener)
131 changeSupport.addJalviewPropertyChangeListener(listener);
135 * @param propertyName
137 * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String,
138 * java.beans.PropertyChangeListener)
140 public void addJalviewPropertyChangeListener(String propertyName,
141 PropertyChangeListener listener)
143 changeSupport.addJalviewPropertyChangeListener(propertyName, listener);
147 * @param propertyName
149 * @see jalview.gui.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String,
150 * java.beans.PropertyChangeListener)
152 public void removeJalviewPropertyChangeListener(String propertyName,
153 PropertyChangeListener listener)
155 changeSupport.removeJalviewPropertyChangeListener(propertyName,
159 /** Singleton Desktop instance */
160 public static Desktop instance;
162 public static MyDesktopPane desktop;
164 static int openFrameCount = 0;
166 static final int xOffset = 30;
168 static final int yOffset = 30;
170 private static final int THREE = 3;
172 private static AlignFrame currentAlignFrame;
174 public static jalview.ws.jws1.Discoverer discoverer;
176 public static Object[] jalviewClipboard;
178 public static boolean internalCopy = false;
180 static int fileLoadingCount = 0;
182 class MyDesktopManager implements DesktopManager
185 private DesktopManager delegate;
187 public MyDesktopManager(DesktopManager delegate)
189 this.delegate = delegate;
192 public void activateFrame(JInternalFrame f)
196 delegate.activateFrame(f);
197 } catch (NullPointerException npe)
199 Point p = getMousePosition();
200 instance.showPasteMenu(p.x, p.y);
204 public void beginDraggingFrame(JComponent f)
206 delegate.beginDraggingFrame(f);
209 public void beginResizingFrame(JComponent f, int direction)
211 delegate.beginResizingFrame(f, direction);
214 public void closeFrame(JInternalFrame f)
216 delegate.closeFrame(f);
219 public void deactivateFrame(JInternalFrame f)
221 delegate.deactivateFrame(f);
224 public void deiconifyFrame(JInternalFrame f)
226 delegate.deiconifyFrame(f);
229 public void dragFrame(JComponent f, int newX, int newY)
235 delegate.dragFrame(f, newX, newY);
238 public void endDraggingFrame(JComponent f)
240 delegate.endDraggingFrame(f);
243 public void endResizingFrame(JComponent f)
245 delegate.endResizingFrame(f);
248 public void iconifyFrame(JInternalFrame f)
250 delegate.iconifyFrame(f);
253 public void maximizeFrame(JInternalFrame f)
255 delegate.maximizeFrame(f);
258 public void minimizeFrame(JInternalFrame f)
260 delegate.minimizeFrame(f);
263 public void openFrame(JInternalFrame f)
265 delegate.openFrame(f);
268 public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
271 Rectangle b = desktop.getBounds();
276 delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
279 public void setBoundsForFrame(JComponent f, int newX, int newY,
280 int newWidth, int newHeight)
282 delegate.setBoundsForFrame(f, newX, newY, newWidth, newHeight);
285 // All other methods, simply delegate
290 * Creates a new Desktop object.
295 * A note to implementors. It is ESSENTIAL that any activities that might
296 * block are spawned off as threads rather than waited for during this
300 doVamsasClientCheck();
302 doConfigureStructurePrefs();
303 setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
304 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
305 boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
307 boolean showjconsole = jalview.bin.Cache.getDefault(
308 "SHOW_JAVA_CONSOLE", false);
309 desktop = new MyDesktopPane(selmemusage);
310 showMemusage.setSelected(selmemusage);
311 desktop.setBackground(Color.white);
312 getContentPane().setLayout(new BorderLayout());
313 // alternate config - have scrollbars - see notes in JAL-153
314 // JScrollPane sp = new JScrollPane();
315 // sp.getViewport().setView(desktop);
316 // getContentPane().add(sp, BorderLayout.CENTER);
317 getContentPane().add(desktop, BorderLayout.CENTER);
318 desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
320 // This line prevents Windows Look&Feel resizing all new windows to maximum
321 // if previous window was maximised
322 desktop.setDesktopManager(new MyDesktopManager(
323 new DefaultDesktopManager()));
325 Rectangle dims = getLastKnownDimensions("");
332 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
333 setBounds((screenSize.width - 900) / 2,
334 (screenSize.height - 650) / 2, 900, 650);
336 jconsole = new Console(this, showjconsole);
337 // add essential build information
338 jconsole.setHeader("Jalview Version: "
339 + jalview.bin.Cache.getProperty("VERSION") + "\n"
340 + "Jalview Installation: "
341 + jalview.bin.Cache.getDefault("INSTALLATION", "unknown")
342 + "\n" + "Build Date: "
343 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + "\n"
344 + "Java version: " + System.getProperty("java.version") + "\n"
345 + System.getProperty("os.arch") + " "
346 + System.getProperty("os.name") + " "
347 + System.getProperty("os.version"));
349 showConsole(showjconsole);
351 showNews.setVisible(false);
353 this.addWindowListener(new WindowAdapter()
355 public void windowClosing(WindowEvent evt)
362 this.addMouseListener(ma = new MouseAdapter()
364 public void mousePressed(MouseEvent evt)
366 if (SwingUtilities.isRightMouseButton(evt))
368 showPasteMenu(evt.getX(), evt.getY());
372 desktop.addMouseListener(ma);
374 this.addFocusListener(new FocusListener()
378 public void focusLost(FocusEvent e)
380 // TODO Auto-generated method stub
385 public void focusGained(FocusEvent e)
387 Cache.log.debug("Relaying windows after focus gain");
388 // make sure that we sort windows properly after we gain focus
389 instance.relayerWindows();
392 this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
393 // Spawn a thread that shows the splashscreen
394 SwingUtilities.invokeLater(new Runnable()
403 // Thread off a new instance of the file chooser - this reduces the time it
404 // takes to open it later on.
405 new Thread(new Runnable()
409 Cache.log.debug("Filechooser init thread started.");
410 JalviewFileChooser chooser = new JalviewFileChooser(
411 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
412 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
413 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
414 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
415 Cache.log.debug("Filechooser init thread finished.");
418 // Add the service change listener
419 changeSupport.addJalviewPropertyChangeListener("services",
420 new PropertyChangeListener()
424 public void propertyChange(PropertyChangeEvent evt)
426 Cache.log.debug("Firing service changed event for "
427 + evt.getNewValue());
428 JalviewServicesChanged(evt);
434 public void doConfigureStructurePrefs()
436 // configure services
437 StructureSelectionManager ssm = StructureSelectionManager
438 .getStructureSelectionManager(this);
439 if (jalview.bin.Cache.getDefault(Preferences.ADD_SS_ANN, true))
441 ssm.setAddTempFacAnnot(jalview.bin.Cache.getDefault(
442 Preferences.ADD_TEMPFACT_ANN, true));
443 ssm.setProcessSecondaryStructure(jalview.bin.Cache.getDefault(
444 Preferences.STRUCT_FROM_PDB, true));
445 ssm.setSecStructServices(jalview.bin.Cache.getDefault(
446 Preferences.USE_RNAVIEW, true));
450 ssm.setAddTempFacAnnot(false);
451 ssm.setProcessSecondaryStructure(false);
452 ssm.setSecStructServices(false);
456 public void checkForNews()
458 final Desktop me = this;
459 // Thread off the news reader, in case there are connection problems.
460 addDialogThread(new Runnable()
465 Cache.log.debug("Starting news thread.");
467 jvnews = new BlogReader(me);
468 showNews.setVisible(true);
469 Cache.log.debug("Completed news thread.");
474 protected void showNews_actionPerformed(ActionEvent e)
476 showNews(showNews.isSelected());
479 void showNews(boolean visible)
482 Cache.log.debug((visible ? "Showing" : "Hiding") + " news.");
483 showNews.setSelected(visible);
484 if (visible && !jvnews.isVisible())
486 new Thread(new Runnable()
491 long instance = System.currentTimeMillis();
492 Desktop.instance.setProgressBar(
493 MessageManager.getString("status.refreshing_news"),
495 jvnews.refreshNews();
496 Desktop.instance.setProgressBar(null, instance);
505 * recover the last known dimensions for a jalview window
508 * - empty string is desktop, all other windows have unique prefix
509 * @return null or last known dimensions scaled to current geometry (if last
510 * window geom was known)
512 Rectangle getLastKnownDimensions(String windowName)
514 // TODO: lock aspect ratio for scaling desktop Bug #0058199
515 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
516 String x = jalview.bin.Cache.getProperty(windowName + "SCREEN_X");
517 String y = jalview.bin.Cache.getProperty(windowName + "SCREEN_Y");
518 String width = jalview.bin.Cache.getProperty(windowName
520 String height = jalview.bin.Cache.getProperty(windowName
522 if ((x != null) && (y != null) && (width != null) && (height != null))
524 int ix = Integer.parseInt(x), iy = Integer.parseInt(y), iw = Integer
525 .parseInt(width), ih = Integer.parseInt(height);
526 if (jalview.bin.Cache.getProperty("SCREENGEOMETRY_WIDTH") != null)
528 // attempt #1 - try to cope with change in screen geometry - this
529 // version doesn't preserve original jv aspect ratio.
530 // take ratio of current screen size vs original screen size.
531 double sw = ((1f * screenSize.width) / (1f * Integer
532 .parseInt(jalview.bin.Cache
533 .getProperty("SCREENGEOMETRY_WIDTH"))));
534 double sh = ((1f * screenSize.height) / (1f * Integer
535 .parseInt(jalview.bin.Cache
536 .getProperty("SCREENGEOMETRY_HEIGHT"))));
537 // rescale the bounds depending upon the current screen geometry.
538 ix = (int) (ix * sw);
539 iw = (int) (iw * sw);
540 iy = (int) (iy * sh);
541 ih = (int) (ih * sh);
542 while (ix >= screenSize.width)
544 jalview.bin.Cache.log
545 .debug("Window geometry location recall error: shifting horizontal to within screenbounds.");
546 ix -= screenSize.width;
548 while (iy >= screenSize.height)
550 jalview.bin.Cache.log
551 .debug("Window geometry location recall error: shifting vertical to within screenbounds.");
552 iy -= screenSize.height;
554 jalview.bin.Cache.log.debug("Got last known dimensions for "
555 + windowName + ": x:" + ix + " y:" + iy + " width:" + iw
558 // return dimensions for new instance
559 return new Rectangle(ix, iy, iw, ih);
564 private void doVamsasClientCheck()
566 if (jalview.bin.Cache.vamsasJarsPresent())
568 setupVamsasDisconnectedGui();
569 VamsasMenu.setVisible(true);
570 final Desktop us = this;
571 VamsasMenu.addMenuListener(new MenuListener()
573 // this listener remembers when the menu was first selected, and
574 // doesn't rebuild the session list until it has been cleared and
576 boolean refresh = true;
578 public void menuCanceled(MenuEvent e)
583 public void menuDeselected(MenuEvent e)
588 public void menuSelected(MenuEvent e)
592 us.buildVamsasStMenu();
597 vamsasStart.setVisible(true);
601 void showPasteMenu(int x, int y)
603 JPopupMenu popup = new JPopupMenu();
604 JMenuItem item = new JMenuItem(
605 MessageManager.getString("label.paste_new_window"));
606 item.addActionListener(new ActionListener()
608 public void actionPerformed(ActionEvent evt)
615 popup.show(this, x, y);
622 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
623 Transferable contents = c.getContents(this);
625 if (contents != null)
627 String file = (String) contents
628 .getTransferData(DataFlavor.stringFlavor);
630 String format = new IdentifyFile().Identify(file,
631 FormatAdapter.PASTE);
633 new FileLoader().LoadFile(file, FormatAdapter.PASTE, format);
636 } catch (Exception ex)
639 .println("Unable to paste alignment from system clipboard:\n"
645 * Adds and opens the given frame to the desktop
656 public static synchronized void addInternalFrame(
657 final JInternalFrame frame, String title, int w, int h)
659 addInternalFrame(frame, title, true, w, h, true);
663 * Add an internal frame to the Jalview desktop
670 * When true, display frame immediately, otherwise, caller must call
671 * setVisible themselves.
677 public static synchronized void addInternalFrame(
678 final JInternalFrame frame, String title, boolean makeVisible,
681 addInternalFrame(frame, title, makeVisible, w, h, true);
685 * Add an internal frame to the Jalview desktop and make it visible
698 public static synchronized void addInternalFrame(
699 final JInternalFrame frame, String title, int w, int h,
702 addInternalFrame(frame, title, true, w, h, resizable);
706 * Add an internal frame to the Jalview desktop
713 * When true, display frame immediately, otherwise, caller must call
714 * setVisible themselves.
722 public static synchronized void addInternalFrame(
723 final JInternalFrame frame, String title, boolean makeVisible,
724 int w, int h, boolean resizable)
727 // TODO: allow callers to determine X and Y position of frame (eg. via
729 // TODO: consider fixing method to update entries in the window submenu with
730 // the current window title
732 frame.setTitle(title);
733 if (frame.getWidth() < 1 || frame.getHeight() < 1)
737 // THIS IS A PUBLIC STATIC METHOD, SO IT MAY BE CALLED EVEN IN
738 // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
739 // IF JALVIEW IS RUNNING HEADLESS
740 // ///////////////////////////////////////////////
742 || (System.getProperty("java.awt.headless") != null && System
743 .getProperty("java.awt.headless").equals("true")))
750 frame.setVisible(makeVisible);
751 frame.setClosable(true);
752 frame.setResizable(resizable);
753 frame.setMaximizable(resizable);
754 frame.setIconifiable(resizable);
755 frame.setFrameIcon(null);
757 if (frame.getX() < 1 && frame.getY() < 1)
759 frame.setLocation(xOffset * openFrameCount, yOffset
760 * ((openFrameCount - 1) % 10) + yOffset);
763 final JMenuItem menuItem = new JMenuItem(title);
764 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
766 public void internalFrameActivated(
767 javax.swing.event.InternalFrameEvent evt)
769 JInternalFrame itf = desktop.getSelectedFrame();
777 public void internalFrameClosed(
778 javax.swing.event.InternalFrameEvent evt)
780 PaintRefresher.RemoveComponent(frame);
782 windowMenu.remove(menuItem);
783 JInternalFrame itf = desktop.getSelectedFrame();
792 menuItem.addActionListener(new ActionListener()
794 public void actionPerformed(ActionEvent e)
798 frame.setSelected(true);
799 frame.setIcon(false);
800 } catch (java.beans.PropertyVetoException ex)
806 menuItem.addMouseListener(new MouseListener()
810 public void mouseReleased(MouseEvent e)
815 public void mousePressed(MouseEvent e)
820 public void mouseExited(MouseEvent e)
824 frame.setSelected(false);
825 } catch (PropertyVetoException e1)
831 public void mouseEntered(MouseEvent e)
835 frame.setSelected(true);
836 } catch (PropertyVetoException e1)
842 public void mouseClicked(MouseEvent e)
848 windowMenu.add(menuItem);
854 frame.setSelected(true);
855 frame.requestFocus();
856 } catch (java.beans.PropertyVetoException ve)
858 } catch (java.lang.ClassCastException cex)
861 .warn("Squashed a possible GUI implementation error. If you can recreate this, please look at http://issues.jalview.org/browse/JAL-869",
866 public void lostOwnership(Clipboard clipboard, Transferable contents)
870 Desktop.jalviewClipboard = null;
873 internalCopy = false;
876 public void dragEnter(DropTargetDragEvent evt)
880 public void dragExit(DropTargetEvent evt)
884 public void dragOver(DropTargetDragEvent evt)
888 public void dropActionChanged(DropTargetDragEvent evt)
898 public void drop(DropTargetDropEvent evt)
900 boolean success = true;
901 Transferable t = evt.getTransferable();
902 java.util.List files = null;
903 java.util.List protocols = null;
907 DataFlavor uriListFlavor = new DataFlavor(
908 "text/uri-list;class=java.lang.String");
909 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
911 // Works on Windows and MacOSX
912 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
913 files = (java.util.List) t
914 .getTransferData(DataFlavor.javaFileListFlavor);
916 else if (t.isDataFlavorSupported(uriListFlavor))
918 // This is used by Unix drag system
919 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
920 String data = (String) t.getTransferData(uriListFlavor);
921 files = new java.util.ArrayList(1);
922 protocols = new java.util.ArrayList(1);
923 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
924 data, "\r\n"); st.hasMoreTokens();)
926 String s = st.nextToken();
927 if (s.startsWith("#"))
929 // the line is a comment (as per the RFC 2483)
932 java.net.URI uri = new java.net.URI(s);
933 if (uri.getScheme().toLowerCase().startsWith("http"))
935 protocols.add(FormatAdapter.URL);
936 files.add(uri.toString());
940 // otherwise preserve old behaviour: catch all for file objects
941 java.io.File file = new java.io.File(uri);
942 protocols.add(FormatAdapter.FILE);
943 files.add(file.toString());
947 } catch (Exception e)
956 for (int i = 0; i < files.size(); i++)
958 String file = files.get(i).toString();
959 String protocol = (protocols == null) ? FormatAdapter.FILE
960 : (String) protocols.get(i);
961 String format = null;
963 if (file.endsWith(".jar"))
970 format = new IdentifyFile().Identify(file, protocol);
973 new FileLoader().LoadFile(file, protocol, format);
976 } catch (Exception ex)
981 evt.dropComplete(success); // need this to ensure input focus is properly
982 // transfered to any new windows created
991 public void inputLocalFileMenuItem_actionPerformed(AlignViewport viewport)
993 JalviewFileChooser chooser = new JalviewFileChooser(
994 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
995 jalview.io.AppletFormatAdapter.READABLE_EXTENSIONS,
996 jalview.io.AppletFormatAdapter.READABLE_FNAMES,
997 jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
999 chooser.setFileView(new JalviewFileView());
1000 chooser.setDialogTitle(MessageManager
1001 .getString("label.open_local_file"));
1002 chooser.setToolTipText(MessageManager.getString("action.open"));
1004 int value = chooser.showOpenDialog(this);
1006 if (value == JalviewFileChooser.APPROVE_OPTION)
1008 String choice = chooser.getSelectedFile().getPath();
1009 jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
1010 .getSelectedFile().getParent());
1012 String format = null;
1013 if (chooser.getSelectedFormat() != null
1014 && chooser.getSelectedFormat().equals("Jalview"))
1020 format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
1023 if (viewport != null)
1025 new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
1027 // viewport.setShowSequenceFeatures(JSONFile.isSeqFeaturesEnabled());
1028 // AlignFrame af = viewport.getAlignPanel().alignFrame;
1031 // af.changeColour(JSONFile.getColourScheme());
1032 // af.setMenusForViewport();
1037 new FileLoader().LoadFile(choice, FormatAdapter.FILE, format);
1048 public void inputURLMenuItem_actionPerformed(AlignViewport viewport)
1050 // This construct allows us to have a wider textfield
1052 JLabel label = new JLabel(
1053 MessageManager.getString("label.input_file_url"));
1054 final JComboBox history = new JComboBox();
1056 JPanel panel = new JPanel(new GridLayout(2, 1));
1059 history.setPreferredSize(new Dimension(400, 20));
1060 history.setEditable(true);
1061 history.addItem("http://www.");
1063 String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
1067 if (historyItems != null)
1069 st = new StringTokenizer(historyItems, "\t");
1071 while (st.hasMoreTokens())
1073 history.addItem(st.nextElement());
1077 int reply = JOptionPane.showInternalConfirmDialog(desktop, panel,
1078 MessageManager.getString("label.input_alignment_from_url"),
1079 JOptionPane.OK_CANCEL_OPTION);
1081 if (reply != JOptionPane.OK_OPTION)
1086 String url = history.getSelectedItem().toString();
1088 if (url.toLowerCase().endsWith(".jar"))
1090 if (viewport != null)
1092 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL,
1097 new FileLoader().LoadFile(url, FormatAdapter.URL, "Jalview");
1102 String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
1104 if (format.equals("URL NOT FOUND"))
1106 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1107 MessageManager.formatMessage("label.couldnt_locate",
1109 { url }), MessageManager
1110 .getString("label.url_not_found"),
1111 JOptionPane.WARNING_MESSAGE);
1116 if (viewport != null)
1118 new FileLoader().LoadFile(viewport, url, FormatAdapter.URL, format);
1122 new FileLoader().LoadFile(url, FormatAdapter.URL, format);
1133 public void inputTextboxMenuItem_actionPerformed(AlignViewport viewport)
1135 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1136 // cap.setForInput(viewport.getAlignPanel());
1137 cap.setForInput(null);
1138 Desktop.addInternalFrame(cap,
1139 MessageManager.getString("label.cut_paste_alignmen_file"),
1148 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
1150 .setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
1151 jalview.bin.Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height
1153 storeLastKnownDimensions("", new Rectangle(getBounds().x,
1154 getBounds().y, getWidth(), getHeight()));
1156 if (jconsole != null)
1158 storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds());
1159 jconsole.stopConsole();
1163 storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds());
1166 if (dialogExecutor != null)
1168 dialogExecutor.shutdownNow();
1170 closeAll_actionPerformed(null);
1174 private void storeLastKnownDimensions(String string, Rectangle jc)
1176 jalview.bin.Cache.log.debug("Storing last known dimensions for "
1177 + string + ": x:" + jc.x + " y:" + jc.y + " width:" + jc.width
1178 + " height:" + jc.height);
1180 jalview.bin.Cache.setProperty(string + "SCREEN_X", jc.x + "");
1181 jalview.bin.Cache.setProperty(string + "SCREEN_Y", jc.y + "");
1182 jalview.bin.Cache.setProperty(string + "SCREEN_WIDTH", jc.width + "");
1183 jalview.bin.Cache.setProperty(string + "SCREEN_HEIGHT", jc.height + "");
1192 public void aboutMenuItem_actionPerformed(ActionEvent e)
1194 // StringBuffer message = getAboutMessage(false);
1195 // JOptionPane.showInternalMessageDialog(Desktop.desktop,
1197 // message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
1198 new Thread(new Runnable()
1202 new SplashScreen(true);
1207 public StringBuffer getAboutMessage(boolean shortv)
1209 StringBuffer message = new StringBuffer();
1210 message.append("<html>");
1213 message.append("<h1><strong>Version: "
1214 + jalview.bin.Cache.getProperty("VERSION") + "</strong></h1>");
1215 message.append("<strong>Last Updated: <em>"
1216 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")
1217 + "</em></strong>");
1223 message.append("<strong>Version "
1224 + jalview.bin.Cache.getProperty("VERSION")
1225 + "; last updated: "
1226 + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"));
1229 if (jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking").equals(
1232 message.append("<br>...Checking latest version...</br>");
1234 else if (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking")
1235 .equals(jalview.bin.Cache.getProperty("VERSION")))
1237 boolean red = false;
1238 if (jalview.bin.Cache.getProperty("VERSION").toLowerCase()
1239 .indexOf("automated build") == -1)
1242 // Displayed when code version and jnlp version do not match and code
1243 // version is not a development build
1244 message.append("<div style=\"color: #FF0000;font-style: bold;\">");
1247 message.append("<br>!! Version "
1248 + jalview.bin.Cache.getDefault("LATEST_VERSION",
1250 + " is available for download from "
1251 + jalview.bin.Cache.getDefault("www.jalview.org",
1252 "http://www.jalview.org") + " !!");
1255 message.append("</div>");
1258 message.append("<br>Authors: "
1260 .getDefault("AUTHORFNAMES",
1261 "The Jalview Authors (See AUTHORS file for current list)")
1262 + "<br><br>Development managed by The Barton Group, University of Dundee, Scotland, UK.<br>"
1263 + "<br><br>For help, see the FAQ at <a href=\"http://www.jalview.org/faq\">www.jalview.org/faq</a> and/or join the jalview-discuss@jalview.org mailing list"
1264 + "<br><br>If you use Jalview, please cite:"
1265 + "<br>Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
1266 + "<br>Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
1267 + "<br>Bioinformatics doi: 10.1093/bioinformatics/btp033"
1278 public void documentationMenuItem_actionPerformed(ActionEvent e)
1282 Help.showHelpWindow();
1283 } catch (Exception ex)
1288 public void closeAll_actionPerformed(ActionEvent e)
1290 JInternalFrame[] frames = desktop.getAllFrames();
1291 for (int i = 0; i < frames.length; i++)
1295 frames[i].setClosed(true);
1296 } catch (java.beans.PropertyVetoException ex)
1300 System.out.println("ALL CLOSED");
1301 if (v_client != null)
1303 // TODO clear binding to vamsas document objects on close_all
1308 public void raiseRelated_actionPerformed(ActionEvent e)
1310 reorderAssociatedWindows(false, false);
1313 public void minimizeAssociated_actionPerformed(ActionEvent e)
1315 reorderAssociatedWindows(true, false);
1318 void closeAssociatedWindows()
1320 reorderAssociatedWindows(false, true);
1326 * @seejalview.jbgui.GDesktop#garbageCollect_actionPerformed(java.awt.event.
1329 protected void garbageCollect_actionPerformed(ActionEvent e)
1331 // We simply collect the garbage
1332 jalview.bin.Cache.log.debug("Collecting garbage...");
1334 jalview.bin.Cache.log.debug("Finished garbage collection.");
1341 * jalview.jbgui.GDesktop#showMemusage_actionPerformed(java.awt.event.ActionEvent
1344 protected void showMemusage_actionPerformed(ActionEvent e)
1346 desktop.showMemoryUsage(showMemusage.isSelected());
1353 * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent
1356 protected void showConsole_actionPerformed(ActionEvent e)
1358 showConsole(showConsole.isSelected());
1361 Console jconsole = null;
1364 * control whether the java console is visible or not
1368 void showConsole(boolean selected)
1370 showConsole.setSelected(selected);
1371 // TODO: decide if we should update properties file
1372 Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected)
1374 jconsole.setVisible(selected);
1377 void reorderAssociatedWindows(boolean minimize, boolean close)
1379 JInternalFrame[] frames = desktop.getAllFrames();
1380 if (frames == null || frames.length < 1)
1385 AlignmentViewport source = null, target = null;
1386 if (frames[0] instanceof AlignFrame)
1388 source = ((AlignFrame) frames[0]).getCurrentView();
1390 else if (frames[0] instanceof TreePanel)
1392 source = ((TreePanel) frames[0]).getViewPort();
1394 else if (frames[0] instanceof PCAPanel)
1396 source = ((PCAPanel) frames[0]).av;
1398 else if (frames[0].getContentPane() instanceof PairwiseAlignPanel)
1400 source = ((PairwiseAlignPanel) frames[0].getContentPane()).av;
1405 for (int i = 0; i < frames.length; i++)
1408 if (frames[i] == null)
1412 if (frames[i] instanceof AlignFrame)
1414 target = ((AlignFrame) frames[i]).getCurrentView();
1416 else if (frames[i] instanceof TreePanel)
1418 target = ((TreePanel) frames[i]).getViewPort();
1420 else if (frames[i] instanceof PCAPanel)
1422 target = ((PCAPanel) frames[i]).av;
1424 else if (frames[i].getContentPane() instanceof PairwiseAlignPanel)
1426 target = ((PairwiseAlignPanel) frames[i].getContentPane()).av;
1429 if (source == target)
1435 frames[i].setClosed(true);
1439 frames[i].setIcon(minimize);
1442 frames[i].toFront();
1446 } catch (java.beans.PropertyVetoException ex)
1460 protected void preferences_actionPerformed(ActionEvent e)
1471 public void saveState_actionPerformed(ActionEvent e)
1473 JalviewFileChooser chooser = new JalviewFileChooser(
1474 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1475 { "jvp" }, new String[]
1476 { "Jalview Project" }, "Jalview Project");
1478 chooser.setFileView(new JalviewFileView());
1479 chooser.setDialogTitle(MessageManager.getString("label.save_state"));
1481 int value = chooser.showSaveDialog(this);
1483 if (value == JalviewFileChooser.APPROVE_OPTION)
1485 final Desktop me = this;
1486 final java.io.File choice = chooser.getSelectedFile();
1487 setProjectFile(choice);
1489 new Thread(new Runnable()
1494 setProgressBar(MessageManager.formatMessage(
1495 "label.saving_jalview_project", new Object[]
1496 { choice.getName() }), choice.hashCode());
1497 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
1498 choice.getParent());
1499 // TODO catch and handle errors for savestate
1500 // TODO prevent user from messing with the Desktop whilst we're saving
1503 new Jalview2XML().saveState(choice);
1504 } catch (OutOfMemoryError oom)
1506 new OOMWarning("Whilst saving current state to "
1507 + choice.getName(), oom);
1508 } catch (Exception ex)
1511 "Problems whilst trying to save to " + choice.getName(),
1513 JOptionPane.showMessageDialog(me, MessageManager.formatMessage(
1514 "label.error_whilst_saving_current_state_to",
1516 { choice.getName() }), MessageManager
1517 .getString("label.couldnt_save_project"),
1518 JOptionPane.WARNING_MESSAGE);
1520 setProgressBar(null, choice.hashCode());
1526 private void setProjectFile(File choice)
1528 this.projectFile = choice;
1531 public File getProjectFile()
1533 return this.projectFile;
1542 public void loadState_actionPerformed(ActionEvent e)
1544 JalviewFileChooser chooser = new JalviewFileChooser(
1545 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1546 { "jvp", "jar" }, new String[]
1547 { "Jalview Project", "Jalview Project (old)" },
1549 chooser.setFileView(new JalviewFileView());
1550 chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
1552 int value = chooser.showOpenDialog(this);
1554 if (value == JalviewFileChooser.APPROVE_OPTION)
1556 final File selectedFile = chooser.getSelectedFile();
1557 setProjectFile(selectedFile);
1558 final String choice = selectedFile.getAbsolutePath();
1559 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
1560 selectedFile.getParent());
1561 new Thread(new Runnable()
1565 setProgressBar(MessageManager.formatMessage(
1566 "label.loading_jalview_project", new Object[]
1567 { choice }), choice.hashCode());
1570 new Jalview2XML().loadJalviewAlign(choice);
1571 } catch (OutOfMemoryError oom)
1573 new OOMWarning("Whilst loading project from " + choice, oom);
1574 } catch (Exception ex)
1576 Cache.log.error("Problems whilst loading project from "
1578 JOptionPane.showMessageDialog(Desktop.desktop, MessageManager
1580 "label.error_whilst_loading_project_from",
1582 { choice }), MessageManager
1583 .getString("label.couldnt_load_project"),
1584 JOptionPane.WARNING_MESSAGE);
1586 setProgressBar(null, choice.hashCode());
1592 public void inputSequence_actionPerformed(ActionEvent e)
1594 new SequenceFetcher(this);
1597 JPanel progressPanel;
1599 ArrayList<JPanel> fileLoadingPanels = new ArrayList<JPanel>();
1601 public void startLoading(final String fileName)
1603 if (fileLoadingCount == 0)
1605 fileLoadingPanels.add(addProgressPanel(MessageManager.formatMessage(
1606 "label.loading_file", new Object[]
1612 private JPanel addProgressPanel(String string)
1614 if (progressPanel == null)
1616 progressPanel = new JPanel(new GridLayout(1, 1));
1617 totalProgressCount = 0;
1618 instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
1620 JPanel thisprogress = new JPanel(new BorderLayout(10, 5));
1621 JProgressBar progressBar = new JProgressBar();
1622 progressBar.setIndeterminate(true);
1624 thisprogress.add(new JLabel(string), BorderLayout.WEST);
1626 thisprogress.add(progressBar, BorderLayout.CENTER);
1627 progressPanel.add(thisprogress);
1628 ((GridLayout) progressPanel.getLayout())
1629 .setRows(((GridLayout) progressPanel.getLayout()).getRows() + 1);
1630 ++totalProgressCount;
1631 instance.validate();
1632 return thisprogress;
1635 int totalProgressCount = 0;
1637 private void removeProgressPanel(JPanel progbar)
1639 if (progressPanel != null)
1641 synchronized (progressPanel)
1643 progressPanel.remove(progbar);
1644 GridLayout gl = (GridLayout) progressPanel.getLayout();
1645 gl.setRows(gl.getRows() - 1);
1646 if (--totalProgressCount < 1)
1648 this.getContentPane().remove(progressPanel);
1649 progressPanel = null;
1656 public void stopLoading()
1659 if (fileLoadingCount < 1)
1661 while (fileLoadingPanels.size() > 0)
1663 removeProgressPanel(fileLoadingPanels.remove(0));
1665 fileLoadingPanels.clear();
1666 fileLoadingCount = 0;
1671 public static int getViewCount(String alignmentId)
1673 AlignmentViewport[] aps = getViewports(alignmentId);
1674 return (aps == null) ? 0 : aps.length;
1679 * @param alignmentId
1680 * - if null, all sets are returned
1681 * @return all AlignmentPanels concerning the alignmentId sequence set
1683 public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
1685 if (Desktop.desktop == null)
1687 // no frames created and in headless mode
1688 // TODO: verify that frames are recoverable when in headless mode
1691 List<AlignmentPanel> aps = new ArrayList<AlignmentPanel>();
1692 AlignFrame[] frames = getAlignFrames();
1697 for (AlignFrame af : frames)
1699 for (AlignmentPanel ap : af.alignPanels)
1701 if (alignmentId==null || alignmentId.equals(ap.av.getSequenceSetId()))
1707 if (aps.size() == 0)
1711 AlignmentPanel[] vap = aps.toArray(new AlignmentPanel[aps.size()]);
1716 * get all the viewports on an alignment.
1718 * @param sequenceSetId
1719 * unique alignment id (may be null - all viewports returned in that
1721 * @return all viewports on the alignment bound to sequenceSetId
1723 public static AlignmentViewport[] getViewports(String sequenceSetId)
1725 List<AlignmentViewport> viewp = new ArrayList<AlignmentViewport>();
1726 if (desktop != null)
1728 AlignFrame[] frames = Desktop.getAlignFrames();
1730 for (AlignFrame afr : frames)
1732 if (sequenceSetId==null || afr.getViewport().getSequenceSetId().equals(sequenceSetId))
1734 if (afr.alignPanels != null)
1736 for (AlignmentPanel ap : afr.alignPanels)
1738 if (sequenceSetId == null
1739 || sequenceSetId.equals(ap.av.getSequenceSetId()))
1747 viewp.add(afr.getViewport());
1751 if (viewp.size() > 0)
1753 return viewp.toArray(new AlignmentViewport[viewp.size()]);
1760 * Explode the views in the given frame into separate AlignFrame
1764 public void explodeViews(AlignFrame af)
1766 int size = af.alignPanels.size();
1772 for (int i = 0; i < size; i++)
1774 AlignmentPanel ap = af.alignPanels.get(i);
1775 AlignFrame newaf = new AlignFrame(ap);
1778 * Restore the view's last exploded frame geometry if known. Multiple
1779 * views from one exploded frame share and restore the same (frame)
1780 * position and size.
1782 Rectangle geometry = ap.av.getExplodedGeometry();
1783 if (geometry != null)
1785 newaf.setBounds(geometry);
1788 ap.av.setGatherViewsHere(false);
1790 addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
1791 AlignFrame.DEFAULT_HEIGHT);
1794 af.alignPanels.clear();
1795 af.closeMenuItem_actionPerformed(true);
1800 * Gather expanded views (separate AlignFrame's) with the same sequence set
1801 * identifier back in to this frame as additional views, and close the
1802 * expanded views. Note the expanded frames may themselves have multiple
1803 * views. We take the lot.
1807 public void gatherViews(AlignFrame source)
1809 source.viewport.setGatherViewsHere(true);
1810 source.viewport.setExplodedGeometry(source.getBounds());
1811 JInternalFrame[] frames = desktop.getAllFrames();
1812 String viewId = source.viewport.getSequenceSetId();
1814 for (int t = 0; t < frames.length; t++)
1816 if (frames[t] instanceof AlignFrame && frames[t] != source)
1818 AlignFrame af = (AlignFrame) frames[t];
1819 boolean gatherThis = false;
1820 for (int a = 0; a < af.alignPanels.size(); a++)
1822 AlignmentPanel ap = af.alignPanels.get(a);
1823 if (viewId.equals(ap.av.getSequenceSetId()))
1826 ap.av.setGatherViewsHere(false);
1827 ap.av.setExplodedGeometry(af.getBounds());
1828 source.addAlignmentPanel(ap, false);
1834 af.alignPanels.clear();
1835 af.closeMenuItem_actionPerformed(true);
1842 jalview.gui.VamsasApplication v_client = null;
1844 public void vamsasImport_actionPerformed(ActionEvent e)
1846 if (v_client == null)
1848 // Load and try to start a session.
1849 JalviewFileChooser chooser = new JalviewFileChooser(
1850 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1852 chooser.setFileView(new JalviewFileView());
1853 chooser.setDialogTitle(MessageManager
1854 .getString("label.open_saved_vamsas_session"));
1855 chooser.setToolTipText(MessageManager
1856 .getString("label.select_vamsas_session_opened_as_new_vamsas_session"));
1858 int value = chooser.showOpenDialog(this);
1860 if (value == JalviewFileChooser.APPROVE_OPTION)
1862 String fle = chooser.getSelectedFile().toString();
1863 if (!vamsasImport(chooser.getSelectedFile()))
1866 .showInternalMessageDialog(
1868 MessageManager.formatMessage(
1869 "label.couldnt_import_as_vamsas_session",
1873 .getString("label.vamsas_document_import_failed"),
1874 JOptionPane.ERROR_MESSAGE);
1880 jalview.bin.Cache.log
1881 .error("Implementation error - load session from a running session is not supported.");
1886 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1889 * @return true if import was a success and a session was started.
1891 public boolean vamsasImport(URL url)
1893 // TODO: create progress bar
1894 if (v_client != null)
1897 jalview.bin.Cache.log
1898 .error("Implementation error - load session from a running session is not supported.");
1904 // copy the URL content to a temporary local file
1905 // TODO: be a bit cleverer here with nio (?!)
1906 File file = File.createTempFile("vdocfromurl", ".vdj");
1907 FileOutputStream fos = new FileOutputStream(file);
1908 BufferedInputStream bis = new BufferedInputStream(url.openStream());
1909 byte[] buffer = new byte[2048];
1911 while ((ln = bis.read(buffer)) > -1)
1913 fos.write(buffer, 0, ln);
1917 v_client = new jalview.gui.VamsasApplication(this, file,
1918 url.toExternalForm());
1919 } catch (Exception ex)
1921 jalview.bin.Cache.log.error(
1922 "Failed to create new vamsas session from contents of URL "
1926 setupVamsasConnectedGui();
1927 v_client.initial_update(); // TODO: thread ?
1928 return v_client.inSession();
1932 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1935 * @return true if import was a success and a session was started.
1937 public boolean vamsasImport(File file)
1939 if (v_client != null)
1942 jalview.bin.Cache.log
1943 .error("Implementation error - load session from a running session is not supported.");
1947 setProgressBar(MessageManager.formatMessage(
1948 "status.importing_vamsas_session_from", new Object[]
1949 { file.getName() }), file.hashCode());
1952 v_client = new jalview.gui.VamsasApplication(this, file, null);
1953 } catch (Exception ex)
1955 setProgressBar(MessageManager.formatMessage(
1956 "status.importing_vamsas_session_from", new Object[]
1957 { file.getName() }), file.hashCode());
1958 jalview.bin.Cache.log.error(
1959 "New vamsas session from existing session file failed:", ex);
1962 setupVamsasConnectedGui();
1963 v_client.initial_update(); // TODO: thread ?
1964 setProgressBar(MessageManager.formatMessage(
1965 "status.importing_vamsas_session_from", new Object[]
1966 { file.getName() }), file.hashCode());
1967 return v_client.inSession();
1970 public boolean joinVamsasSession(String mysesid)
1972 if (v_client != null)
1976 .getString("error.try_join_vamsas_session_another"));
1978 if (mysesid == null)
1981 MessageManager.getString("error.invalid_vamsas_session_id"));
1983 v_client = new VamsasApplication(this, mysesid);
1984 setupVamsasConnectedGui();
1985 v_client.initial_update();
1986 return (v_client.inSession());
1989 public void vamsasStart_actionPerformed(ActionEvent e)
1991 if (v_client == null)
1994 // we just start a default session for moment.
1996 * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1997 * getProperty("LAST_DIRECTORY"));
1999 * chooser.setFileView(new JalviewFileView());
2000 * chooser.setDialogTitle("Load Vamsas file");
2001 * chooser.setToolTipText("Import");
2003 * int value = chooser.showOpenDialog(this);
2005 * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new
2006 * jalview.gui.VamsasApplication(this, chooser.getSelectedFile());
2008 v_client = new VamsasApplication(this);
2009 setupVamsasConnectedGui();
2010 v_client.initial_update(); // TODO: thread ?
2014 // store current data in session.
2015 v_client.push_update(); // TODO: thread
2019 protected void setupVamsasConnectedGui()
2021 vamsasStart.setText(MessageManager.getString("label.session_update"));
2022 vamsasSave.setVisible(true);
2023 vamsasStop.setVisible(true);
2024 vamsasImport.setVisible(false); // Document import to existing session is
2025 // not possible for vamsas-client-1.0.
2028 protected void setupVamsasDisconnectedGui()
2030 vamsasSave.setVisible(false);
2031 vamsasStop.setVisible(false);
2032 vamsasImport.setVisible(true);
2033 vamsasStart.setText(MessageManager
2034 .getString("label.new_vamsas_session"));
2037 public void vamsasStop_actionPerformed(ActionEvent e)
2039 if (v_client != null)
2041 v_client.end_session();
2043 setupVamsasDisconnectedGui();
2047 protected void buildVamsasStMenu()
2049 if (v_client == null)
2051 String[] sess = null;
2054 sess = VamsasApplication.getSessionList();
2055 } catch (Exception e)
2057 jalview.bin.Cache.log.warn(
2058 "Problem getting current sessions list.", e);
2063 jalview.bin.Cache.log.debug("Got current sessions list: "
2064 + sess.length + " entries.");
2065 VamsasStMenu.removeAll();
2066 for (int i = 0; i < sess.length; i++)
2068 JMenuItem sessit = new JMenuItem();
2069 sessit.setText(sess[i]);
2070 sessit.setToolTipText(MessageManager.formatMessage(
2071 "label.connect_to_session", new Object[]
2073 final Desktop dsktp = this;
2074 final String mysesid = sess[i];
2075 sessit.addActionListener(new ActionListener()
2078 public void actionPerformed(ActionEvent e)
2080 if (dsktp.v_client == null)
2082 Thread rthr = new Thread(new Runnable()
2087 dsktp.v_client = new VamsasApplication(dsktp, mysesid);
2088 dsktp.setupVamsasConnectedGui();
2089 dsktp.v_client.initial_update();
2097 VamsasStMenu.add(sessit);
2099 // don't show an empty menu.
2100 VamsasStMenu.setVisible(sess.length > 0);
2105 jalview.bin.Cache.log.debug("No current vamsas sessions.");
2106 VamsasStMenu.removeAll();
2107 VamsasStMenu.setVisible(false);
2112 // Not interested in the content. Just hide ourselves.
2113 VamsasStMenu.setVisible(false);
2117 public void vamsasSave_actionPerformed(ActionEvent e)
2119 if (v_client != null)
2121 JalviewFileChooser chooser = new JalviewFileChooser(
2122 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
2123 { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
2125 { "Vamsas Document" }, "Vamsas Document");
2127 chooser.setFileView(new JalviewFileView());
2128 chooser.setDialogTitle(MessageManager
2129 .getString("label.save_vamsas_document_archive"));
2131 int value = chooser.showSaveDialog(this);
2133 if (value == JalviewFileChooser.APPROVE_OPTION)
2135 java.io.File choice = chooser.getSelectedFile();
2136 JPanel progpanel = addProgressPanel(MessageManager.formatMessage(
2137 "label.saving_vamsas_doc", new Object[]
2138 { choice.getName() }));
2139 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
2140 String warnmsg = null;
2141 String warnttl = null;
2144 v_client.vclient.storeDocument(choice);
2147 warnttl = "Serious Problem saving Vamsas Document";
2148 warnmsg = ex.toString();
2149 jalview.bin.Cache.log.error("Error Whilst saving document to "
2152 } catch (Exception ex)
2154 warnttl = "Problem saving Vamsas Document.";
2155 warnmsg = ex.toString();
2156 jalview.bin.Cache.log.warn("Exception Whilst saving document to "
2160 removeProgressPanel(progpanel);
2161 if (warnmsg != null)
2163 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2165 warnmsg, warnttl, JOptionPane.ERROR_MESSAGE);
2171 JPanel vamUpdate = null;
2174 * hide vamsas user gui bits when a vamsas document event is being handled.
2177 * true to hide gui, false to reveal gui
2179 public void setVamsasUpdate(boolean b)
2181 jalview.bin.Cache.log.debug("Setting gui for Vamsas update "
2182 + (b ? "in progress" : "finished"));
2184 if (vamUpdate != null)
2186 this.removeProgressPanel(vamUpdate);
2190 vamUpdate = this.addProgressPanel(MessageManager
2191 .getString("label.updating_vamsas_session"));
2193 vamsasStart.setVisible(!b);
2194 vamsasStop.setVisible(!b);
2195 vamsasSave.setVisible(!b);
2198 public JInternalFrame[] getAllFrames()
2200 return desktop.getAllFrames();
2204 * Checks the given url to see if it gives a response indicating that the user
2205 * should be informed of a new questionnaire.
2209 public void checkForQuestionnaire(String url)
2211 UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url);
2212 // javax.swing.SwingUtilities.invokeLater(jvq);
2213 new Thread(jvq).start();
2217 * Proxy class for JDesktopPane which optionally displays the current memory
2218 * usage and highlights the desktop area with a red bar if free memory runs
2223 public class MyDesktopPane extends JDesktopPane implements Runnable
2226 private static final float ONE_MB = 1048576f;
2228 boolean showMemoryUsage = false;
2232 java.text.NumberFormat df;
2234 float maxMemory, allocatedMemory, freeMemory, totalFreeMemory,
2237 public MyDesktopPane(boolean showMemoryUsage)
2239 showMemoryUsage(showMemoryUsage);
2242 public void showMemoryUsage(boolean showMemoryUsage)
2244 this.showMemoryUsage = showMemoryUsage;
2245 if (showMemoryUsage)
2247 Thread worker = new Thread(this);
2252 public boolean isShowMemoryUsage()
2254 return showMemoryUsage;
2259 df = java.text.NumberFormat.getNumberInstance();
2260 df.setMaximumFractionDigits(2);
2261 runtime = Runtime.getRuntime();
2263 while (showMemoryUsage)
2267 maxMemory = runtime.maxMemory() / ONE_MB;
2268 allocatedMemory = runtime.totalMemory() / ONE_MB;
2269 freeMemory = runtime.freeMemory() / ONE_MB;
2270 totalFreeMemory = freeMemory + (maxMemory - allocatedMemory);
2272 percentUsage = (totalFreeMemory / maxMemory) * 100;
2274 // if (percentUsage < 20)
2276 // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12,
2278 // instance.set.setBorder(border1);
2281 // sleep after showing usage
2283 } catch (Exception ex)
2285 ex.printStackTrace();
2290 public void paintComponent(Graphics g)
2292 if (showMemoryUsage && g != null && df != null)
2294 if (percentUsage < 20)
2296 g.setColor(Color.red);
2298 FontMetrics fm = g.getFontMetrics();
2301 g.drawString(MessageManager.formatMessage(
2302 "label.memory_stats",
2304 { df.format(totalFreeMemory), df.format(maxMemory),
2305 df.format(percentUsage) }), 10,
2306 getHeight() - fm.getHeight());
2313 * fixes stacking order after a modal dialog to ensure windows that should be
2314 * on top actually are
2316 public void relayerWindows()
2321 protected JMenuItem groovyShell;
2323 public void doGroovyCheck()
2325 if (jalview.bin.Cache.groovyJarsPresent())
2327 groovyShell = new JMenuItem();
2328 groovyShell.setText(MessageManager.getString("label.groovy_console"));
2329 groovyShell.addActionListener(new ActionListener()
2331 public void actionPerformed(ActionEvent e)
2333 groovyShell_actionPerformed(e);
2336 toolsMenu.add(groovyShell);
2337 groovyShell.setVisible(true);
2342 * Accessor method to quickly get all the AlignmentFrames loaded.
2344 * @return an array of AlignFrame, or null if none found
2346 public static AlignFrame[] getAlignFrames()
2348 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2354 List<AlignFrame> avp = new ArrayList<AlignFrame>();
2356 for (int i = frames.length - 1; i > -1; i--)
2358 if (frames[i] instanceof AlignFrame)
2360 avp.add((AlignFrame) frames[i]);
2362 else if (frames[i] instanceof SplitFrame)
2365 * Also check for a split frame containing an AlignFrame
2367 GSplitFrame sf = (GSplitFrame) frames[i];
2368 if (sf.getTopFrame() instanceof AlignFrame)
2370 avp.add((AlignFrame) sf.getTopFrame());
2372 if (sf.getBottomFrame() instanceof AlignFrame)
2374 avp.add((AlignFrame) sf.getBottomFrame());
2378 if (avp.size() == 0)
2382 AlignFrame afs[] = avp.toArray(new AlignFrame[avp.size()]);
2387 * Returns an array of any AppJmol frames in the Desktop (or null if none).
2391 public GStructureViewer[] getJmols()
2393 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2399 List<GStructureViewer> avp = new ArrayList<GStructureViewer>();
2401 for (int i = frames.length - 1; i > -1; i--)
2403 if (frames[i] instanceof AppJmol)
2405 GStructureViewer af = (GStructureViewer) frames[i];
2409 if (avp.size() == 0)
2413 GStructureViewer afs[] = avp.toArray(new GStructureViewer[avp.size()]);
2418 * Add Groovy Support to Jalview
2420 public void groovyShell_actionPerformed(ActionEvent e)
2422 // use reflection to avoid creating compilation dependency.
2423 if (!jalview.bin.Cache.groovyJarsPresent())
2427 .getString("error.implementation_error_cannot_create_groovyshell"));
2431 Class<?> gcClass = Desktop.class.getClassLoader().loadClass(
2432 "groovy.ui.Console");
2433 Constructor<?> gccons = gcClass.getConstructor();
2434 java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
2436 { String.class, Object.class });
2437 java.lang.reflect.Method run = gcClass.getMethod("run");
2438 Object gc = gccons.newInstance();
2439 setvar.invoke(gc, new Object[]
2440 { "Jalview", this });
2442 } catch (Exception ex)
2444 jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
2445 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2447 MessageManager.getString("label.couldnt_create_groovy_shell"),
2448 MessageManager.getString("label.groovy_support_failed"),
2449 JOptionPane.ERROR_MESSAGE);
2454 * Progress bars managed by the IProgressIndicator method.
2456 private Hashtable<Long, JPanel> progressBars;
2458 private Hashtable<Long, IProgressIndicatorHandler> progressBarHandlers;
2463 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
2465 public void setProgressBar(String message, long id)
2467 if (progressBars == null)
2469 progressBars = new Hashtable<Long, JPanel>();
2470 progressBarHandlers = new Hashtable<Long, IProgressIndicatorHandler>();
2473 if (progressBars.get(new Long(id)) != null)
2475 JPanel progressPanel = progressBars.remove(new Long(id));
2476 if (progressBarHandlers.contains(new Long(id)))
2478 progressBarHandlers.remove(new Long(id));
2480 removeProgressPanel(progressPanel);
2484 progressBars.put(new Long(id), addProgressPanel(message));
2491 * @see jalview.gui.IProgressIndicator#registerHandler(long,
2492 * jalview.gui.IProgressIndicatorHandler)
2494 public void registerHandler(final long id,
2495 final IProgressIndicatorHandler handler)
2497 if (progressBarHandlers == null
2498 || !progressBars.containsKey(new Long(id)))
2502 .getString("error.call_setprogressbar_before_registering_handler"));
2504 progressBarHandlers.put(new Long(id), handler);
2505 final JPanel progressPanel = progressBars.get(new Long(id));
2506 if (handler.canCancel())
2508 JButton cancel = new JButton(
2509 MessageManager.getString("action.cancel"));
2510 final IProgressIndicator us = this;
2511 cancel.addActionListener(new ActionListener()
2514 public void actionPerformed(ActionEvent e)
2516 handler.cancelActivity(id);
2517 us.setProgressBar(MessageManager.formatMessage(
2518 "label.cancelled_params", new Object[]
2519 { ((JLabel) progressPanel.getComponent(0)).getText() }),
2523 progressPanel.add(cancel, BorderLayout.EAST);
2529 * @return true if any progress bars are still active
2532 public boolean operationInProgress()
2534 if (progressBars != null && progressBars.size() > 0)
2542 * This will return the first AlignFrame holding the given viewport instance. It
2543 * will break if there are more than one AlignFrames viewing a particular av.
2546 * @return alignFrame for viewport
2548 public static AlignFrame getAlignFrameFor(AlignViewportI viewport)
2550 if (desktop != null)
2552 AlignmentPanel[] aps = getAlignmentPanels(viewport
2553 .getSequenceSetId());
2554 for (int panel = 0; aps != null && panel < aps.length; panel++)
2556 if (aps[panel] != null && aps[panel].av == viewport)
2558 return aps[panel].alignFrame;
2565 public VamsasApplication getVamsasApplication()
2572 * flag set if jalview GUI is being operated programmatically
2574 private boolean inBatchMode = false;
2577 * check if jalview GUI is being operated programmatically
2579 * @return inBatchMode
2581 public boolean isInBatchMode()
2587 * set flag if jalview GUI is being operated programmatically
2589 * @param inBatchMode
2591 public void setInBatchMode(boolean inBatchMode)
2593 this.inBatchMode = inBatchMode;
2596 public void startServiceDiscovery()
2598 startServiceDiscovery(false);
2601 public void startServiceDiscovery(boolean blocking)
2603 boolean alive = true;
2604 Thread t0 = null, t1 = null, t2 = null;
2605 // JAL-940 - JALVIEW 1 services are now being EOLed as of JABA 2.1 release
2608 // todo: changesupport handlers need to be transferred
2609 if (discoverer == null)
2611 discoverer = new jalview.ws.jws1.Discoverer();
2612 // register PCS handler for desktop.
2613 discoverer.addPropertyChangeListener(changeSupport);
2615 // JAL-940 - disabled JWS1 service configuration - always start discoverer
2616 // until we phase out completely
2617 (t0 = new Thread(discoverer)).start();
2620 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
2622 if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
2624 jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
2626 t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
2632 // TODO: do rest service discovery
2641 } catch (Exception e)
2644 alive = (t1 != null && t1.isAlive())
2645 || (t2 != null && t2.isAlive())
2646 || (t3 != null && t3.isAlive())
2647 || (t0 != null && t0.isAlive());
2653 * called to check if the service discovery process completed successfully.
2657 protected void JalviewServicesChanged(PropertyChangeEvent evt)
2659 if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
2661 final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
2662 .getErrorMessages();
2665 if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
2667 if (serviceChangedDialog == null)
2669 // only run if we aren't already displaying one of these.
2670 addDialogThread(serviceChangedDialog = new Runnable()
2676 * JalviewDialog jd =new JalviewDialog() {
2678 * @Override protected void cancelPressed() { // TODO
2679 * Auto-generated method stub
2681 * }@Override protected void okPressed() { // TODO
2682 * Auto-generated method stub
2684 * }@Override protected void raiseClosed() { // TODO
2685 * Auto-generated method stub
2687 * } }; jd.initDialogFrame(new
2688 * JLabel("<html><table width=\"450\"><tr><td>" + ermsg +
2689 * "<br/>It may be that you have invalid JABA URLs in your web service preferences,"
2690 * + " or mis-configured HTTP proxy settings.<br/>" +
2691 * "Check the <em>Connections</em> and <em>Web services</em> tab of the"
2693 * " Tools->Preferences dialog box to change them.</td></tr></table></html>"
2694 * ), true, true, "Web Service Configuration Problem", 450,
2697 * jd.waitForInput();
2703 "<html><table width=\"450\"><tr><td>"
2705 + "</td></tr></table>"
2706 + "<p>It may be that you have invalid JABA URLs<br/>in your web service preferences,"
2707 + "<br>or as a command-line argument, or mis-configured HTTP proxy settings.</p>"
2708 + "<p>Check the <em>Connections</em> and <em>Web services</em> tab<br/>of the"
2709 + " Tools->Preferences dialog box to change them.</p></html>"),
2710 "Web Service Configuration Problem",
2711 JOptionPane.DEFAULT_OPTION,
2712 JOptionPane.ERROR_MESSAGE);
2713 serviceChangedDialog = null;
2722 .error("Errors reported by JABA discovery service. Check web services preferences.\n"
2729 private Runnable serviceChangedDialog = null;
2732 * start a thread to open a URL in the configured browser. Pops up a warning
2733 * dialog to the user if there is an exception when calling out to the browser
2738 public static void showUrl(final String url)
2740 showUrl(url, Desktop.instance);
2744 * Like showUrl but allows progress handler to be specified
2748 * (null) or object implementing IProgressIndicator
2750 public static void showUrl(final String url,
2751 final IProgressIndicator progress)
2753 new Thread(new Runnable()
2759 if (progress != null)
2761 progress.setProgressBar(MessageManager.formatMessage(
2762 "status.opening_params", new Object[]
2763 { url }), this.hashCode());
2765 jalview.util.BrowserLauncher.openURL(url);
2766 } catch (Exception ex)
2768 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2770 .getString("label.web_browser_not_found_unix"),
2771 MessageManager.getString("label.web_browser_not_found"),
2772 JOptionPane.WARNING_MESSAGE);
2774 ex.printStackTrace();
2776 if (progress != null)
2778 progress.setProgressBar(null, this.hashCode());
2784 public static WsParamSetManager wsparamManager = null;
2786 public static ParamManager getUserParameterStore()
2788 if (wsparamManager == null)
2790 wsparamManager = new WsParamSetManager();
2792 return wsparamManager;
2796 * static hyperlink handler proxy method for use by Jalview's internal windows
2800 public static void hyperlinkUpdate(HyperlinkEvent e)
2802 if (e.getEventType() == EventType.ACTIVATED)
2807 url = e.getURL().toString();
2808 Desktop.showUrl(url);
2809 } catch (Exception x)
2813 if (Cache.log != null)
2815 Cache.log.error("Couldn't handle string " + url + " as a URL.");
2819 System.err.println("Couldn't handle string " + url
2823 // ignore any exceptions due to dud links.
2830 * single thread that handles display of dialogs to user.
2832 ExecutorService dialogExecutor = Executors.newSingleThreadExecutor();
2835 * flag indicating if dialogExecutor should try to acquire a permit
2837 private volatile boolean dialogPause = true;
2842 private java.util.concurrent.Semaphore block = new Semaphore(0);
2845 * add another dialog thread to the queue
2849 public void addDialogThread(final Runnable prompter)
2851 dialogExecutor.submit(new Runnable()
2860 } catch (InterruptedException x)
2865 if (instance == null)
2871 SwingUtilities.invokeAndWait(prompter);
2872 } catch (Exception q)
2874 Cache.log.warn("Unexpected Exception in dialog thread.", q);
2880 public void startDialogQueue()
2882 // set the flag so we don't pause waiting for another permit and semaphore
2883 // the current task to begin
2884 dialogPause = false;
2889 protected void snapShotWindow_actionPerformed(ActionEvent e)
2893 ImageMaker im = new jalview.util.ImageMaker(this, ImageMaker.TYPE.EPS,
2894 "View of Desktop", getWidth(), getHeight(), of = new File(
2895 "Jalview_snapshot" + System.currentTimeMillis()
2896 + ".eps"), "View of desktop");
2899 paintAll(im.getGraphics());
2901 } catch (Exception q)
2903 Cache.log.error("Couldn't write snapshot to " + of.getAbsolutePath(),
2907 Cache.log.info("Successfully written snapshot to file "
2908 + of.getAbsolutePath());
2912 * Explode the views in the given frame into separate AlignFrame windows.
2916 public void explodeViews(SplitFrame sf)
2918 AlignFrame oldTopFrame = (AlignFrame) sf.getTopFrame();
2919 AlignFrame oldBottomFrame = (AlignFrame) sf.getBottomFrame();
2920 List<? extends AlignmentViewPanel> topPanels = oldTopFrame
2922 List<? extends AlignmentViewPanel> bottomPanels = oldBottomFrame
2924 int viewCount = topPanels.size();
2931 * Processing in reverse order works, forwards order leaves the first panels
2932 * not visible. I don't know why!
2934 for (int i = viewCount - 1; i >= 0; i--)
2937 * Make new top and bottom frames. These take over the respective
2938 * AlignmentPanel objects, including their AlignmentViewports, so the
2939 * cdna/protein relationships between the viewports is carried over to the
2942 AlignmentPanel topPanel = (AlignmentPanel) topPanels.get(i);
2943 AlignFrame newTopFrame = new AlignFrame(topPanel);
2944 newTopFrame.setSize(new Dimension(AlignFrame.DEFAULT_WIDTH,
2945 AlignFrame.DEFAULT_HEIGHT));
2946 newTopFrame.setVisible(true);
2947 AlignmentPanel bottomPanel = (AlignmentPanel) bottomPanels.get(i);
2948 AlignFrame newBottomFrame = new AlignFrame(bottomPanel);
2949 newBottomFrame.setSize(new Dimension(AlignFrame.DEFAULT_WIDTH,
2950 AlignFrame.DEFAULT_HEIGHT));
2951 newBottomFrame.setVisible(true);
2952 topPanel.av.setGatherViewsHere(false);
2953 bottomPanel.av.setGatherViewsHere(false);
2954 JInternalFrame splitFrame = new SplitFrame(newTopFrame,
2956 // either panel may hold previous exploded frame geometry
2957 Rectangle geometry = ((AlignViewport) topPanel.getAlignViewport())
2958 .getExplodedGeometry();
2959 if (geometry != null)
2961 splitFrame.setBounds(geometry);
2963 Desktop.addInternalFrame(splitFrame, sf.getTitle(), -1, -1);
2967 * Clear references to the panels (now relocated in the new SplitFrames)
2968 * before closing the old SplitFrame.
2971 bottomPanels.clear();
2976 * Gather expanded split frames, sharing the same pairs of sequence set ids,
2977 * back into the given SplitFrame as additional views. Note that the gathered
2978 * frames may themselves have multiple views.
2982 public void gatherViews(GSplitFrame source)
2984 AlignFrame myTopFrame = (AlignFrame) source.getTopFrame();
2985 AlignFrame myBottomFrame = (AlignFrame) source.getBottomFrame();
2986 myTopFrame.viewport.setExplodedGeometry(source.getBounds());
2987 myBottomFrame.viewport.setExplodedGeometry(source.getBounds());
2988 myTopFrame.viewport.setGatherViewsHere(true);
2989 myBottomFrame.viewport.setGatherViewsHere(true);
2990 String topViewId = myTopFrame.viewport.getSequenceSetId();
2991 String bottomViewId = myBottomFrame.viewport.getSequenceSetId();
2993 JInternalFrame[] frames = desktop.getAllFrames();
2994 for (JInternalFrame frame : frames)
2996 if (frame instanceof SplitFrame && frame != source)
2998 SplitFrame sf = (SplitFrame) frame;
2999 AlignFrame topFrame = (AlignFrame) sf.getTopFrame();
3000 AlignFrame bottomFrame = (AlignFrame) sf.getBottomFrame();
3001 boolean gatherThis = false;
3002 for (int a = 0; a < topFrame.alignPanels.size(); a++)
3004 AlignmentPanel topPanel = topFrame.alignPanels.get(a);
3005 AlignmentPanel bottomPanel = bottomFrame.alignPanels.get(a);
3006 if (topViewId.equals(topPanel.av.getSequenceSetId())
3007 && bottomViewId.equals(bottomPanel.av.getSequenceSetId()))
3010 topPanel.av.setGatherViewsHere(false);
3011 bottomPanel.av.setGatherViewsHere(false);
3012 // both panels refer to the same split frame geometry
3013 Rectangle position = sf.getBounds();
3014 topPanel.av.setExplodedGeometry(position);
3015 bottomPanel.av.setExplodedGeometry(position);
3016 myTopFrame.addAlignmentPanel(topPanel, false);
3017 myBottomFrame.addAlignmentPanel(bottomPanel, false);
3023 topFrame.getAlignPanels().clear();
3024 bottomFrame.getAlignPanels().clear();
3031 * The dust settles...give focus to the tab we did this from.
3033 myTopFrame.setDisplayedView(myTopFrame.alignPanel);
3037 // public static AlignFrame getCurrentAlignFrame()
3039 // return currentAlignFrame;
3042 // public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
3044 // Desktop.currentAlignFrame = currentAlignFrame;