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);
269 public void resizeFrame(JComponent f, int newX, int newY, int newWidth,
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
1307 * reset state of singleton objects as appropriate (clear down session state
1308 * when all windows are closed)
1310 StructureSelectionManager ssm = StructureSelectionManager
1311 .getStructureSelectionManager(this);
1318 public void raiseRelated_actionPerformed(ActionEvent e)
1320 reorderAssociatedWindows(false, false);
1323 public void minimizeAssociated_actionPerformed(ActionEvent e)
1325 reorderAssociatedWindows(true, false);
1328 void closeAssociatedWindows()
1330 reorderAssociatedWindows(false, true);
1336 * @seejalview.jbgui.GDesktop#garbageCollect_actionPerformed(java.awt.event.
1339 protected void garbageCollect_actionPerformed(ActionEvent e)
1341 // We simply collect the garbage
1342 jalview.bin.Cache.log.debug("Collecting garbage...");
1344 jalview.bin.Cache.log.debug("Finished garbage collection.");
1351 * jalview.jbgui.GDesktop#showMemusage_actionPerformed(java.awt.event.ActionEvent
1354 protected void showMemusage_actionPerformed(ActionEvent e)
1356 desktop.showMemoryUsage(showMemusage.isSelected());
1363 * jalview.jbgui.GDesktop#showConsole_actionPerformed(java.awt.event.ActionEvent
1366 protected void showConsole_actionPerformed(ActionEvent e)
1368 showConsole(showConsole.isSelected());
1371 Console jconsole = null;
1374 * control whether the java console is visible or not
1378 void showConsole(boolean selected)
1380 showConsole.setSelected(selected);
1381 // TODO: decide if we should update properties file
1382 Cache.setProperty("SHOW_JAVA_CONSOLE", Boolean.valueOf(selected)
1384 jconsole.setVisible(selected);
1387 void reorderAssociatedWindows(boolean minimize, boolean close)
1389 JInternalFrame[] frames = desktop.getAllFrames();
1390 if (frames == null || frames.length < 1)
1395 AlignmentViewport source = null, target = null;
1396 if (frames[0] instanceof AlignFrame)
1398 source = ((AlignFrame) frames[0]).getCurrentView();
1400 else if (frames[0] instanceof TreePanel)
1402 source = ((TreePanel) frames[0]).getViewPort();
1404 else if (frames[0] instanceof PCAPanel)
1406 source = ((PCAPanel) frames[0]).av;
1408 else if (frames[0].getContentPane() instanceof PairwiseAlignPanel)
1410 source = ((PairwiseAlignPanel) frames[0].getContentPane()).av;
1415 for (int i = 0; i < frames.length; i++)
1418 if (frames[i] == null)
1422 if (frames[i] instanceof AlignFrame)
1424 target = ((AlignFrame) frames[i]).getCurrentView();
1426 else if (frames[i] instanceof TreePanel)
1428 target = ((TreePanel) frames[i]).getViewPort();
1430 else if (frames[i] instanceof PCAPanel)
1432 target = ((PCAPanel) frames[i]).av;
1434 else if (frames[i].getContentPane() instanceof PairwiseAlignPanel)
1436 target = ((PairwiseAlignPanel) frames[i].getContentPane()).av;
1439 if (source == target)
1445 frames[i].setClosed(true);
1449 frames[i].setIcon(minimize);
1452 frames[i].toFront();
1456 } catch (java.beans.PropertyVetoException ex)
1470 protected void preferences_actionPerformed(ActionEvent e)
1481 public void saveState_actionPerformed(ActionEvent e)
1483 JalviewFileChooser chooser = new JalviewFileChooser(
1484 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1485 { "jvp" }, new String[]
1486 { "Jalview Project" }, "Jalview Project");
1488 chooser.setFileView(new JalviewFileView());
1489 chooser.setDialogTitle(MessageManager.getString("label.save_state"));
1491 int value = chooser.showSaveDialog(this);
1493 if (value == JalviewFileChooser.APPROVE_OPTION)
1495 final Desktop me = this;
1496 final java.io.File choice = chooser.getSelectedFile();
1497 setProjectFile(choice);
1499 new Thread(new Runnable()
1504 setProgressBar(MessageManager.formatMessage(
1505 "label.saving_jalview_project", new Object[]
1506 { choice.getName() }), choice.hashCode());
1507 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
1508 choice.getParent());
1509 // TODO catch and handle errors for savestate
1510 // TODO prevent user from messing with the Desktop whilst we're saving
1513 new Jalview2XML().saveState(choice);
1514 } catch (OutOfMemoryError oom)
1516 new OOMWarning("Whilst saving current state to "
1517 + choice.getName(), oom);
1518 } catch (Exception ex)
1521 "Problems whilst trying to save to " + choice.getName(),
1523 JOptionPane.showMessageDialog(me, MessageManager.formatMessage(
1524 "label.error_whilst_saving_current_state_to",
1526 { choice.getName() }), MessageManager
1527 .getString("label.couldnt_save_project"),
1528 JOptionPane.WARNING_MESSAGE);
1530 setProgressBar(null, choice.hashCode());
1536 private void setProjectFile(File choice)
1538 this.projectFile = choice;
1541 public File getProjectFile()
1543 return this.projectFile;
1552 public void loadState_actionPerformed(ActionEvent e)
1554 JalviewFileChooser chooser = new JalviewFileChooser(
1555 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
1556 { "jvp", "jar" }, new String[]
1557 { "Jalview Project", "Jalview Project (old)" },
1559 chooser.setFileView(new JalviewFileView());
1560 chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
1562 int value = chooser.showOpenDialog(this);
1564 if (value == JalviewFileChooser.APPROVE_OPTION)
1566 final File selectedFile = chooser.getSelectedFile();
1567 setProjectFile(selectedFile);
1568 final String choice = selectedFile.getAbsolutePath();
1569 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
1570 selectedFile.getParent());
1571 new Thread(new Runnable()
1575 setProgressBar(MessageManager.formatMessage(
1576 "label.loading_jalview_project", new Object[]
1577 { choice }), choice.hashCode());
1580 new Jalview2XML().loadJalviewAlign(choice);
1581 } catch (OutOfMemoryError oom)
1583 new OOMWarning("Whilst loading project from " + choice, oom);
1584 } catch (Exception ex)
1586 Cache.log.error("Problems whilst loading project from "
1588 JOptionPane.showMessageDialog(Desktop.desktop, MessageManager
1590 "label.error_whilst_loading_project_from",
1592 { choice }), MessageManager
1593 .getString("label.couldnt_load_project"),
1594 JOptionPane.WARNING_MESSAGE);
1596 setProgressBar(null, choice.hashCode());
1602 public void inputSequence_actionPerformed(ActionEvent e)
1604 new SequenceFetcher(this);
1607 JPanel progressPanel;
1609 ArrayList<JPanel> fileLoadingPanels = new ArrayList<JPanel>();
1611 public void startLoading(final String fileName)
1613 if (fileLoadingCount == 0)
1615 fileLoadingPanels.add(addProgressPanel(MessageManager.formatMessage(
1616 "label.loading_file", new Object[]
1622 private JPanel addProgressPanel(String string)
1624 if (progressPanel == null)
1626 progressPanel = new JPanel(new GridLayout(1, 1));
1627 totalProgressCount = 0;
1628 instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
1630 JPanel thisprogress = new JPanel(new BorderLayout(10, 5));
1631 JProgressBar progressBar = new JProgressBar();
1632 progressBar.setIndeterminate(true);
1634 thisprogress.add(new JLabel(string), BorderLayout.WEST);
1636 thisprogress.add(progressBar, BorderLayout.CENTER);
1637 progressPanel.add(thisprogress);
1638 ((GridLayout) progressPanel.getLayout())
1639 .setRows(((GridLayout) progressPanel.getLayout()).getRows() + 1);
1640 ++totalProgressCount;
1641 instance.validate();
1642 return thisprogress;
1645 int totalProgressCount = 0;
1647 private void removeProgressPanel(JPanel progbar)
1649 if (progressPanel != null)
1651 synchronized (progressPanel)
1653 progressPanel.remove(progbar);
1654 GridLayout gl = (GridLayout) progressPanel.getLayout();
1655 gl.setRows(gl.getRows() - 1);
1656 if (--totalProgressCount < 1)
1658 this.getContentPane().remove(progressPanel);
1659 progressPanel = null;
1666 public void stopLoading()
1669 if (fileLoadingCount < 1)
1671 while (fileLoadingPanels.size() > 0)
1673 removeProgressPanel(fileLoadingPanels.remove(0));
1675 fileLoadingPanels.clear();
1676 fileLoadingCount = 0;
1681 public static int getViewCount(String alignmentId)
1683 AlignmentViewport[] aps = getViewports(alignmentId);
1684 return (aps == null) ? 0 : aps.length;
1689 * @param alignmentId
1690 * - if null, all sets are returned
1691 * @return all AlignmentPanels concerning the alignmentId sequence set
1693 public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
1695 if (Desktop.desktop == null)
1697 // no frames created and in headless mode
1698 // TODO: verify that frames are recoverable when in headless mode
1701 List<AlignmentPanel> aps = new ArrayList<AlignmentPanel>();
1702 AlignFrame[] frames = getAlignFrames();
1707 for (AlignFrame af : frames)
1709 for (AlignmentPanel ap : af.alignPanels)
1711 if (alignmentId==null || alignmentId.equals(ap.av.getSequenceSetId()))
1717 if (aps.size() == 0)
1721 AlignmentPanel[] vap = aps.toArray(new AlignmentPanel[aps.size()]);
1726 * get all the viewports on an alignment.
1728 * @param sequenceSetId
1729 * unique alignment id (may be null - all viewports returned in that
1731 * @return all viewports on the alignment bound to sequenceSetId
1733 public static AlignmentViewport[] getViewports(String sequenceSetId)
1735 List<AlignmentViewport> viewp = new ArrayList<AlignmentViewport>();
1736 if (desktop != null)
1738 AlignFrame[] frames = Desktop.getAlignFrames();
1740 for (AlignFrame afr : frames)
1742 if (sequenceSetId==null || afr.getViewport().getSequenceSetId().equals(sequenceSetId))
1744 if (afr.alignPanels != null)
1746 for (AlignmentPanel ap : afr.alignPanels)
1748 if (sequenceSetId == null
1749 || sequenceSetId.equals(ap.av.getSequenceSetId()))
1757 viewp.add(afr.getViewport());
1761 if (viewp.size() > 0)
1763 return viewp.toArray(new AlignmentViewport[viewp.size()]);
1770 * Explode the views in the given frame into separate AlignFrame
1774 public void explodeViews(AlignFrame af)
1776 int size = af.alignPanels.size();
1782 for (int i = 0; i < size; i++)
1784 AlignmentPanel ap = af.alignPanels.get(i);
1785 AlignFrame newaf = new AlignFrame(ap);
1788 * Restore the view's last exploded frame geometry if known. Multiple
1789 * views from one exploded frame share and restore the same (frame)
1790 * position and size.
1792 Rectangle geometry = ap.av.getExplodedGeometry();
1793 if (geometry != null)
1795 newaf.setBounds(geometry);
1798 ap.av.setGatherViewsHere(false);
1800 addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
1801 AlignFrame.DEFAULT_HEIGHT);
1804 af.alignPanels.clear();
1805 af.closeMenuItem_actionPerformed(true);
1810 * Gather expanded views (separate AlignFrame's) with the same sequence set
1811 * identifier back in to this frame as additional views, and close the
1812 * expanded views. Note the expanded frames may themselves have multiple
1813 * views. We take the lot.
1817 public void gatherViews(AlignFrame source)
1819 source.viewport.setGatherViewsHere(true);
1820 source.viewport.setExplodedGeometry(source.getBounds());
1821 JInternalFrame[] frames = desktop.getAllFrames();
1822 String viewId = source.viewport.getSequenceSetId();
1824 for (int t = 0; t < frames.length; t++)
1826 if (frames[t] instanceof AlignFrame && frames[t] != source)
1828 AlignFrame af = (AlignFrame) frames[t];
1829 boolean gatherThis = false;
1830 for (int a = 0; a < af.alignPanels.size(); a++)
1832 AlignmentPanel ap = af.alignPanels.get(a);
1833 if (viewId.equals(ap.av.getSequenceSetId()))
1836 ap.av.setGatherViewsHere(false);
1837 ap.av.setExplodedGeometry(af.getBounds());
1838 source.addAlignmentPanel(ap, false);
1844 af.alignPanels.clear();
1845 af.closeMenuItem_actionPerformed(true);
1852 jalview.gui.VamsasApplication v_client = null;
1854 public void vamsasImport_actionPerformed(ActionEvent e)
1856 if (v_client == null)
1858 // Load and try to start a session.
1859 JalviewFileChooser chooser = new JalviewFileChooser(
1860 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1862 chooser.setFileView(new JalviewFileView());
1863 chooser.setDialogTitle(MessageManager
1864 .getString("label.open_saved_vamsas_session"));
1865 chooser.setToolTipText(MessageManager
1866 .getString("label.select_vamsas_session_opened_as_new_vamsas_session"));
1868 int value = chooser.showOpenDialog(this);
1870 if (value == JalviewFileChooser.APPROVE_OPTION)
1872 String fle = chooser.getSelectedFile().toString();
1873 if (!vamsasImport(chooser.getSelectedFile()))
1876 .showInternalMessageDialog(
1878 MessageManager.formatMessage(
1879 "label.couldnt_import_as_vamsas_session",
1883 .getString("label.vamsas_document_import_failed"),
1884 JOptionPane.ERROR_MESSAGE);
1890 jalview.bin.Cache.log
1891 .error("Implementation error - load session from a running session is not supported.");
1896 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1899 * @return true if import was a success and a session was started.
1901 public boolean vamsasImport(URL url)
1903 // TODO: create progress bar
1904 if (v_client != null)
1907 jalview.bin.Cache.log
1908 .error("Implementation error - load session from a running session is not supported.");
1914 // copy the URL content to a temporary local file
1915 // TODO: be a bit cleverer here with nio (?!)
1916 File file = File.createTempFile("vdocfromurl", ".vdj");
1917 FileOutputStream fos = new FileOutputStream(file);
1918 BufferedInputStream bis = new BufferedInputStream(url.openStream());
1919 byte[] buffer = new byte[2048];
1921 while ((ln = bis.read(buffer)) > -1)
1923 fos.write(buffer, 0, ln);
1927 v_client = new jalview.gui.VamsasApplication(this, file,
1928 url.toExternalForm());
1929 } catch (Exception ex)
1931 jalview.bin.Cache.log.error(
1932 "Failed to create new vamsas session from contents of URL "
1936 setupVamsasConnectedGui();
1937 v_client.initial_update(); // TODO: thread ?
1938 return v_client.inSession();
1942 * import file into a new vamsas session (uses jalview.gui.VamsasApplication)
1945 * @return true if import was a success and a session was started.
1947 public boolean vamsasImport(File file)
1949 if (v_client != null)
1952 jalview.bin.Cache.log
1953 .error("Implementation error - load session from a running session is not supported.");
1957 setProgressBar(MessageManager.formatMessage(
1958 "status.importing_vamsas_session_from", new Object[]
1959 { file.getName() }), file.hashCode());
1962 v_client = new jalview.gui.VamsasApplication(this, file, null);
1963 } catch (Exception ex)
1965 setProgressBar(MessageManager.formatMessage(
1966 "status.importing_vamsas_session_from", new Object[]
1967 { file.getName() }), file.hashCode());
1968 jalview.bin.Cache.log.error(
1969 "New vamsas session from existing session file failed:", ex);
1972 setupVamsasConnectedGui();
1973 v_client.initial_update(); // TODO: thread ?
1974 setProgressBar(MessageManager.formatMessage(
1975 "status.importing_vamsas_session_from", new Object[]
1976 { file.getName() }), file.hashCode());
1977 return v_client.inSession();
1980 public boolean joinVamsasSession(String mysesid)
1982 if (v_client != null)
1986 .getString("error.try_join_vamsas_session_another"));
1988 if (mysesid == null)
1991 MessageManager.getString("error.invalid_vamsas_session_id"));
1993 v_client = new VamsasApplication(this, mysesid);
1994 setupVamsasConnectedGui();
1995 v_client.initial_update();
1996 return (v_client.inSession());
1999 public void vamsasStart_actionPerformed(ActionEvent e)
2001 if (v_client == null)
2004 // we just start a default session for moment.
2006 * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
2007 * getProperty("LAST_DIRECTORY"));
2009 * chooser.setFileView(new JalviewFileView());
2010 * chooser.setDialogTitle("Load Vamsas file");
2011 * chooser.setToolTipText("Import");
2013 * int value = chooser.showOpenDialog(this);
2015 * if (value == JalviewFileChooser.APPROVE_OPTION) { v_client = new
2016 * jalview.gui.VamsasApplication(this, chooser.getSelectedFile());
2018 v_client = new VamsasApplication(this);
2019 setupVamsasConnectedGui();
2020 v_client.initial_update(); // TODO: thread ?
2024 // store current data in session.
2025 v_client.push_update(); // TODO: thread
2029 protected void setupVamsasConnectedGui()
2031 vamsasStart.setText(MessageManager.getString("label.session_update"));
2032 vamsasSave.setVisible(true);
2033 vamsasStop.setVisible(true);
2034 vamsasImport.setVisible(false); // Document import to existing session is
2035 // not possible for vamsas-client-1.0.
2038 protected void setupVamsasDisconnectedGui()
2040 vamsasSave.setVisible(false);
2041 vamsasStop.setVisible(false);
2042 vamsasImport.setVisible(true);
2043 vamsasStart.setText(MessageManager
2044 .getString("label.new_vamsas_session"));
2047 public void vamsasStop_actionPerformed(ActionEvent e)
2049 if (v_client != null)
2051 v_client.end_session();
2053 setupVamsasDisconnectedGui();
2057 protected void buildVamsasStMenu()
2059 if (v_client == null)
2061 String[] sess = null;
2064 sess = VamsasApplication.getSessionList();
2065 } catch (Exception e)
2067 jalview.bin.Cache.log.warn(
2068 "Problem getting current sessions list.", e);
2073 jalview.bin.Cache.log.debug("Got current sessions list: "
2074 + sess.length + " entries.");
2075 VamsasStMenu.removeAll();
2076 for (int i = 0; i < sess.length; i++)
2078 JMenuItem sessit = new JMenuItem();
2079 sessit.setText(sess[i]);
2080 sessit.setToolTipText(MessageManager.formatMessage(
2081 "label.connect_to_session", new Object[]
2083 final Desktop dsktp = this;
2084 final String mysesid = sess[i];
2085 sessit.addActionListener(new ActionListener()
2088 public void actionPerformed(ActionEvent e)
2090 if (dsktp.v_client == null)
2092 Thread rthr = new Thread(new Runnable()
2097 dsktp.v_client = new VamsasApplication(dsktp, mysesid);
2098 dsktp.setupVamsasConnectedGui();
2099 dsktp.v_client.initial_update();
2107 VamsasStMenu.add(sessit);
2109 // don't show an empty menu.
2110 VamsasStMenu.setVisible(sess.length > 0);
2115 jalview.bin.Cache.log.debug("No current vamsas sessions.");
2116 VamsasStMenu.removeAll();
2117 VamsasStMenu.setVisible(false);
2122 // Not interested in the content. Just hide ourselves.
2123 VamsasStMenu.setVisible(false);
2127 public void vamsasSave_actionPerformed(ActionEvent e)
2129 if (v_client != null)
2131 JalviewFileChooser chooser = new JalviewFileChooser(
2132 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
2133 { "vdj" }, // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
2135 { "Vamsas Document" }, "Vamsas Document");
2137 chooser.setFileView(new JalviewFileView());
2138 chooser.setDialogTitle(MessageManager
2139 .getString("label.save_vamsas_document_archive"));
2141 int value = chooser.showSaveDialog(this);
2143 if (value == JalviewFileChooser.APPROVE_OPTION)
2145 java.io.File choice = chooser.getSelectedFile();
2146 JPanel progpanel = addProgressPanel(MessageManager.formatMessage(
2147 "label.saving_vamsas_doc", new Object[]
2148 { choice.getName() }));
2149 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
2150 String warnmsg = null;
2151 String warnttl = null;
2154 v_client.vclient.storeDocument(choice);
2157 warnttl = "Serious Problem saving Vamsas Document";
2158 warnmsg = ex.toString();
2159 jalview.bin.Cache.log.error("Error Whilst saving document to "
2162 } catch (Exception ex)
2164 warnttl = "Problem saving Vamsas Document.";
2165 warnmsg = ex.toString();
2166 jalview.bin.Cache.log.warn("Exception Whilst saving document to "
2170 removeProgressPanel(progpanel);
2171 if (warnmsg != null)
2173 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2175 warnmsg, warnttl, JOptionPane.ERROR_MESSAGE);
2181 JPanel vamUpdate = null;
2184 * hide vamsas user gui bits when a vamsas document event is being handled.
2187 * true to hide gui, false to reveal gui
2189 public void setVamsasUpdate(boolean b)
2191 jalview.bin.Cache.log.debug("Setting gui for Vamsas update "
2192 + (b ? "in progress" : "finished"));
2194 if (vamUpdate != null)
2196 this.removeProgressPanel(vamUpdate);
2200 vamUpdate = this.addProgressPanel(MessageManager
2201 .getString("label.updating_vamsas_session"));
2203 vamsasStart.setVisible(!b);
2204 vamsasStop.setVisible(!b);
2205 vamsasSave.setVisible(!b);
2208 public JInternalFrame[] getAllFrames()
2210 return desktop.getAllFrames();
2214 * Checks the given url to see if it gives a response indicating that the user
2215 * should be informed of a new questionnaire.
2219 public void checkForQuestionnaire(String url)
2221 UserQuestionnaireCheck jvq = new UserQuestionnaireCheck(url);
2222 // javax.swing.SwingUtilities.invokeLater(jvq);
2223 new Thread(jvq).start();
2227 * Proxy class for JDesktopPane which optionally displays the current memory
2228 * usage and highlights the desktop area with a red bar if free memory runs
2233 public class MyDesktopPane extends JDesktopPane implements Runnable
2236 private static final float ONE_MB = 1048576f;
2238 boolean showMemoryUsage = false;
2242 java.text.NumberFormat df;
2244 float maxMemory, allocatedMemory, freeMemory, totalFreeMemory,
2247 public MyDesktopPane(boolean showMemoryUsage)
2249 showMemoryUsage(showMemoryUsage);
2252 public void showMemoryUsage(boolean showMemoryUsage)
2254 this.showMemoryUsage = showMemoryUsage;
2255 if (showMemoryUsage)
2257 Thread worker = new Thread(this);
2262 public boolean isShowMemoryUsage()
2264 return showMemoryUsage;
2269 df = java.text.NumberFormat.getNumberInstance();
2270 df.setMaximumFractionDigits(2);
2271 runtime = Runtime.getRuntime();
2273 while (showMemoryUsage)
2277 maxMemory = runtime.maxMemory() / ONE_MB;
2278 allocatedMemory = runtime.totalMemory() / ONE_MB;
2279 freeMemory = runtime.freeMemory() / ONE_MB;
2280 totalFreeMemory = freeMemory + (maxMemory - allocatedMemory);
2282 percentUsage = (totalFreeMemory / maxMemory) * 100;
2284 // if (percentUsage < 20)
2286 // border1 = BorderFactory.createMatteBorder(12, 12, 12, 12,
2288 // instance.set.setBorder(border1);
2291 // sleep after showing usage
2293 } catch (Exception ex)
2295 ex.printStackTrace();
2301 public void paintComponent(Graphics g)
2303 if (showMemoryUsage && g != null && df != null)
2305 if (percentUsage < 20)
2307 g.setColor(Color.red);
2309 FontMetrics fm = g.getFontMetrics();
2312 g.drawString(MessageManager.formatMessage(
2313 "label.memory_stats",
2315 { df.format(totalFreeMemory), df.format(maxMemory),
2316 df.format(percentUsage) }), 10,
2317 getHeight() - fm.getHeight());
2324 * fixes stacking order after a modal dialog to ensure windows that should be
2325 * on top actually are
2327 public void relayerWindows()
2332 protected JMenuItem groovyShell;
2334 public void doGroovyCheck()
2336 if (jalview.bin.Cache.groovyJarsPresent())
2338 groovyShell = new JMenuItem();
2339 groovyShell.setText(MessageManager.getString("label.groovy_console"));
2340 groovyShell.addActionListener(new ActionListener()
2342 public void actionPerformed(ActionEvent e)
2344 groovyShell_actionPerformed(e);
2347 toolsMenu.add(groovyShell);
2348 groovyShell.setVisible(true);
2353 * Accessor method to quickly get all the AlignmentFrames loaded.
2355 * @return an array of AlignFrame, or null if none found
2357 public static AlignFrame[] getAlignFrames()
2359 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2365 List<AlignFrame> avp = new ArrayList<AlignFrame>();
2367 for (int i = frames.length - 1; i > -1; i--)
2369 if (frames[i] instanceof AlignFrame)
2371 avp.add((AlignFrame) frames[i]);
2373 else if (frames[i] instanceof SplitFrame)
2376 * Also check for a split frame containing an AlignFrame
2378 GSplitFrame sf = (GSplitFrame) frames[i];
2379 if (sf.getTopFrame() instanceof AlignFrame)
2381 avp.add((AlignFrame) sf.getTopFrame());
2383 if (sf.getBottomFrame() instanceof AlignFrame)
2385 avp.add((AlignFrame) sf.getBottomFrame());
2389 if (avp.size() == 0)
2393 AlignFrame afs[] = avp.toArray(new AlignFrame[avp.size()]);
2398 * Returns an array of any AppJmol frames in the Desktop (or null if none).
2402 public GStructureViewer[] getJmols()
2404 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
2410 List<GStructureViewer> avp = new ArrayList<GStructureViewer>();
2412 for (int i = frames.length - 1; i > -1; i--)
2414 if (frames[i] instanceof AppJmol)
2416 GStructureViewer af = (GStructureViewer) frames[i];
2420 if (avp.size() == 0)
2424 GStructureViewer afs[] = avp.toArray(new GStructureViewer[avp.size()]);
2429 * Add Groovy Support to Jalview
2431 public void groovyShell_actionPerformed(ActionEvent e)
2433 // use reflection to avoid creating compilation dependency.
2434 if (!jalview.bin.Cache.groovyJarsPresent())
2438 .getString("error.implementation_error_cannot_create_groovyshell"));
2442 Class<?> gcClass = Desktop.class.getClassLoader().loadClass(
2443 "groovy.ui.Console");
2444 Constructor<?> gccons = gcClass.getConstructor();
2445 java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
2447 { String.class, Object.class });
2448 java.lang.reflect.Method run = gcClass.getMethod("run");
2449 Object gc = gccons.newInstance();
2450 setvar.invoke(gc, new Object[]
2451 { "Jalview", this });
2453 } catch (Exception ex)
2455 jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
2456 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2458 MessageManager.getString("label.couldnt_create_groovy_shell"),
2459 MessageManager.getString("label.groovy_support_failed"),
2460 JOptionPane.ERROR_MESSAGE);
2465 * Progress bars managed by the IProgressIndicator method.
2467 private Hashtable<Long, JPanel> progressBars;
2469 private Hashtable<Long, IProgressIndicatorHandler> progressBarHandlers;
2474 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
2476 public void setProgressBar(String message, long id)
2478 if (progressBars == null)
2480 progressBars = new Hashtable<Long, JPanel>();
2481 progressBarHandlers = new Hashtable<Long, IProgressIndicatorHandler>();
2484 if (progressBars.get(new Long(id)) != null)
2486 JPanel progressPanel = progressBars.remove(new Long(id));
2487 if (progressBarHandlers.contains(new Long(id)))
2489 progressBarHandlers.remove(new Long(id));
2491 removeProgressPanel(progressPanel);
2495 progressBars.put(new Long(id), addProgressPanel(message));
2502 * @see jalview.gui.IProgressIndicator#registerHandler(long,
2503 * jalview.gui.IProgressIndicatorHandler)
2505 public void registerHandler(final long id,
2506 final IProgressIndicatorHandler handler)
2508 if (progressBarHandlers == null
2509 || !progressBars.containsKey(new Long(id)))
2513 .getString("error.call_setprogressbar_before_registering_handler"));
2515 progressBarHandlers.put(new Long(id), handler);
2516 final JPanel progressPanel = progressBars.get(new Long(id));
2517 if (handler.canCancel())
2519 JButton cancel = new JButton(
2520 MessageManager.getString("action.cancel"));
2521 final IProgressIndicator us = this;
2522 cancel.addActionListener(new ActionListener()
2525 public void actionPerformed(ActionEvent e)
2527 handler.cancelActivity(id);
2528 us.setProgressBar(MessageManager.formatMessage(
2529 "label.cancelled_params", new Object[]
2530 { ((JLabel) progressPanel.getComponent(0)).getText() }),
2534 progressPanel.add(cancel, BorderLayout.EAST);
2540 * @return true if any progress bars are still active
2543 public boolean operationInProgress()
2545 if (progressBars != null && progressBars.size() > 0)
2553 * This will return the first AlignFrame holding the given viewport instance. It
2554 * will break if there are more than one AlignFrames viewing a particular av.
2557 * @return alignFrame for viewport
2559 public static AlignFrame getAlignFrameFor(AlignViewportI viewport)
2561 if (desktop != null)
2563 AlignmentPanel[] aps = getAlignmentPanels(viewport
2564 .getSequenceSetId());
2565 for (int panel = 0; aps != null && panel < aps.length; panel++)
2567 if (aps[panel] != null && aps[panel].av == viewport)
2569 return aps[panel].alignFrame;
2576 public VamsasApplication getVamsasApplication()
2583 * flag set if jalview GUI is being operated programmatically
2585 private boolean inBatchMode = false;
2588 * check if jalview GUI is being operated programmatically
2590 * @return inBatchMode
2592 public boolean isInBatchMode()
2598 * set flag if jalview GUI is being operated programmatically
2600 * @param inBatchMode
2602 public void setInBatchMode(boolean inBatchMode)
2604 this.inBatchMode = inBatchMode;
2607 public void startServiceDiscovery()
2609 startServiceDiscovery(false);
2612 public void startServiceDiscovery(boolean blocking)
2614 boolean alive = true;
2615 Thread t0 = null, t1 = null, t2 = null;
2616 // JAL-940 - JALVIEW 1 services are now being EOLed as of JABA 2.1 release
2619 // todo: changesupport handlers need to be transferred
2620 if (discoverer == null)
2622 discoverer = new jalview.ws.jws1.Discoverer();
2623 // register PCS handler for desktop.
2624 discoverer.addPropertyChangeListener(changeSupport);
2626 // JAL-940 - disabled JWS1 service configuration - always start discoverer
2627 // until we phase out completely
2628 (t0 = new Thread(discoverer)).start();
2631 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
2633 if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
2635 jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
2637 t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
2643 // TODO: do rest service discovery
2652 } catch (Exception e)
2655 alive = (t1 != null && t1.isAlive())
2656 || (t2 != null && t2.isAlive())
2657 || (t3 != null && t3.isAlive())
2658 || (t0 != null && t0.isAlive());
2664 * called to check if the service discovery process completed successfully.
2668 protected void JalviewServicesChanged(PropertyChangeEvent evt)
2670 if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
2672 final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
2673 .getErrorMessages();
2676 if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true))
2678 if (serviceChangedDialog == null)
2680 // only run if we aren't already displaying one of these.
2681 addDialogThread(serviceChangedDialog = new Runnable()
2687 * JalviewDialog jd =new JalviewDialog() {
2689 * @Override protected void cancelPressed() { // TODO
2690 * Auto-generated method stub
2692 * }@Override protected void okPressed() { // TODO
2693 * Auto-generated method stub
2695 * }@Override protected void raiseClosed() { // TODO
2696 * Auto-generated method stub
2698 * } }; jd.initDialogFrame(new
2699 * JLabel("<html><table width=\"450\"><tr><td>" + ermsg +
2700 * "<br/>It may be that you have invalid JABA URLs in your web service preferences,"
2701 * + " or mis-configured HTTP proxy settings.<br/>" +
2702 * "Check the <em>Connections</em> and <em>Web services</em> tab of the"
2704 * " Tools->Preferences dialog box to change them.</td></tr></table></html>"
2705 * ), true, true, "Web Service Configuration Problem", 450,
2708 * jd.waitForInput();
2714 "<html><table width=\"450\"><tr><td>"
2716 + "</td></tr></table>"
2717 + "<p>It may be that you have invalid JABA URLs<br/>in your web service preferences,"
2718 + "<br>or as a command-line argument, or mis-configured HTTP proxy settings.</p>"
2719 + "<p>Check the <em>Connections</em> and <em>Web services</em> tab<br/>of the"
2720 + " Tools->Preferences dialog box to change them.</p></html>"),
2721 "Web Service Configuration Problem",
2722 JOptionPane.DEFAULT_OPTION,
2723 JOptionPane.ERROR_MESSAGE);
2724 serviceChangedDialog = null;
2733 .error("Errors reported by JABA discovery service. Check web services preferences.\n"
2740 private Runnable serviceChangedDialog = null;
2743 * start a thread to open a URL in the configured browser. Pops up a warning
2744 * dialog to the user if there is an exception when calling out to the browser
2749 public static void showUrl(final String url)
2751 showUrl(url, Desktop.instance);
2755 * Like showUrl but allows progress handler to be specified
2759 * (null) or object implementing IProgressIndicator
2761 public static void showUrl(final String url,
2762 final IProgressIndicator progress)
2764 new Thread(new Runnable()
2770 if (progress != null)
2772 progress.setProgressBar(MessageManager.formatMessage(
2773 "status.opening_params", new Object[]
2774 { url }), this.hashCode());
2776 jalview.util.BrowserLauncher.openURL(url);
2777 } catch (Exception ex)
2779 JOptionPane.showInternalMessageDialog(Desktop.desktop,
2781 .getString("label.web_browser_not_found_unix"),
2782 MessageManager.getString("label.web_browser_not_found"),
2783 JOptionPane.WARNING_MESSAGE);
2785 ex.printStackTrace();
2787 if (progress != null)
2789 progress.setProgressBar(null, this.hashCode());
2795 public static WsParamSetManager wsparamManager = null;
2797 public static ParamManager getUserParameterStore()
2799 if (wsparamManager == null)
2801 wsparamManager = new WsParamSetManager();
2803 return wsparamManager;
2807 * static hyperlink handler proxy method for use by Jalview's internal windows
2811 public static void hyperlinkUpdate(HyperlinkEvent e)
2813 if (e.getEventType() == EventType.ACTIVATED)
2818 url = e.getURL().toString();
2819 Desktop.showUrl(url);
2820 } catch (Exception x)
2824 if (Cache.log != null)
2826 Cache.log.error("Couldn't handle string " + url + " as a URL.");
2830 System.err.println("Couldn't handle string " + url
2834 // ignore any exceptions due to dud links.
2841 * single thread that handles display of dialogs to user.
2843 ExecutorService dialogExecutor = Executors.newSingleThreadExecutor();
2846 * flag indicating if dialogExecutor should try to acquire a permit
2848 private volatile boolean dialogPause = true;
2853 private java.util.concurrent.Semaphore block = new Semaphore(0);
2856 * add another dialog thread to the queue
2860 public void addDialogThread(final Runnable prompter)
2862 dialogExecutor.submit(new Runnable()
2871 } catch (InterruptedException x)
2876 if (instance == null)
2882 SwingUtilities.invokeAndWait(prompter);
2883 } catch (Exception q)
2885 Cache.log.warn("Unexpected Exception in dialog thread.", q);
2891 public void startDialogQueue()
2893 // set the flag so we don't pause waiting for another permit and semaphore
2894 // the current task to begin
2895 dialogPause = false;
2900 protected void snapShotWindow_actionPerformed(ActionEvent e)
2904 ImageMaker im = new jalview.util.ImageMaker(this, ImageMaker.TYPE.EPS,
2905 "View of Desktop", getWidth(), getHeight(), of = new File(
2906 "Jalview_snapshot" + System.currentTimeMillis()
2907 + ".eps"), "View of desktop");
2910 paintAll(im.getGraphics());
2912 } catch (Exception q)
2914 Cache.log.error("Couldn't write snapshot to " + of.getAbsolutePath(),
2918 Cache.log.info("Successfully written snapshot to file "
2919 + of.getAbsolutePath());
2923 * Explode the views in the given frame into separate AlignFrame windows.
2927 public void explodeViews(SplitFrame sf)
2929 AlignFrame oldTopFrame = (AlignFrame) sf.getTopFrame();
2930 AlignFrame oldBottomFrame = (AlignFrame) sf.getBottomFrame();
2931 List<? extends AlignmentViewPanel> topPanels = oldTopFrame
2933 List<? extends AlignmentViewPanel> bottomPanels = oldBottomFrame
2935 int viewCount = topPanels.size();
2942 * Processing in reverse order works, forwards order leaves the first panels
2943 * not visible. I don't know why!
2945 for (int i = viewCount - 1; i >= 0; i--)
2948 * Make new top and bottom frames. These take over the respective
2949 * AlignmentPanel objects, including their AlignmentViewports, so the
2950 * cdna/protein relationships between the viewports is carried over to the
2953 AlignmentPanel topPanel = (AlignmentPanel) topPanels.get(i);
2954 AlignFrame newTopFrame = new AlignFrame(topPanel);
2955 newTopFrame.setSize(new Dimension(AlignFrame.DEFAULT_WIDTH,
2956 AlignFrame.DEFAULT_HEIGHT));
2957 newTopFrame.setVisible(true);
2958 AlignmentPanel bottomPanel = (AlignmentPanel) bottomPanels.get(i);
2959 AlignFrame newBottomFrame = new AlignFrame(bottomPanel);
2960 newBottomFrame.setSize(new Dimension(AlignFrame.DEFAULT_WIDTH,
2961 AlignFrame.DEFAULT_HEIGHT));
2962 newBottomFrame.setVisible(true);
2963 topPanel.av.setGatherViewsHere(false);
2964 bottomPanel.av.setGatherViewsHere(false);
2965 JInternalFrame splitFrame = new SplitFrame(newTopFrame,
2967 // either panel may hold previous exploded frame geometry
2968 Rectangle geometry = ((AlignViewport) topPanel.getAlignViewport())
2969 .getExplodedGeometry();
2970 if (geometry != null)
2972 splitFrame.setBounds(geometry);
2974 Desktop.addInternalFrame(splitFrame, sf.getTitle(), -1, -1);
2978 * Clear references to the panels (now relocated in the new SplitFrames)
2979 * before closing the old SplitFrame.
2982 bottomPanels.clear();
2987 * Gather expanded split frames, sharing the same pairs of sequence set ids,
2988 * back into the given SplitFrame as additional views. Note that the gathered
2989 * frames may themselves have multiple views.
2993 public void gatherViews(GSplitFrame source)
2995 AlignFrame myTopFrame = (AlignFrame) source.getTopFrame();
2996 AlignFrame myBottomFrame = (AlignFrame) source.getBottomFrame();
2997 myTopFrame.viewport.setExplodedGeometry(source.getBounds());
2998 myBottomFrame.viewport.setExplodedGeometry(source.getBounds());
2999 myTopFrame.viewport.setGatherViewsHere(true);
3000 myBottomFrame.viewport.setGatherViewsHere(true);
3001 String topViewId = myTopFrame.viewport.getSequenceSetId();
3002 String bottomViewId = myBottomFrame.viewport.getSequenceSetId();
3004 JInternalFrame[] frames = desktop.getAllFrames();
3005 for (JInternalFrame frame : frames)
3007 if (frame instanceof SplitFrame && frame != source)
3009 SplitFrame sf = (SplitFrame) frame;
3010 AlignFrame topFrame = (AlignFrame) sf.getTopFrame();
3011 AlignFrame bottomFrame = (AlignFrame) sf.getBottomFrame();
3012 boolean gatherThis = false;
3013 for (int a = 0; a < topFrame.alignPanels.size(); a++)
3015 AlignmentPanel topPanel = topFrame.alignPanels.get(a);
3016 AlignmentPanel bottomPanel = bottomFrame.alignPanels.get(a);
3017 if (topViewId.equals(topPanel.av.getSequenceSetId())
3018 && bottomViewId.equals(bottomPanel.av.getSequenceSetId()))
3021 topPanel.av.setGatherViewsHere(false);
3022 bottomPanel.av.setGatherViewsHere(false);
3023 // both panels refer to the same split frame geometry
3024 Rectangle position = sf.getBounds();
3025 topPanel.av.setExplodedGeometry(position);
3026 bottomPanel.av.setExplodedGeometry(position);
3027 myTopFrame.addAlignmentPanel(topPanel, false);
3028 myBottomFrame.addAlignmentPanel(bottomPanel, false);
3034 topFrame.getAlignPanels().clear();
3035 bottomFrame.getAlignPanels().clear();
3042 * The dust settles...give focus to the tab we did this from.
3044 myTopFrame.setDisplayedView(myTopFrame.alignPanel);
3048 // public static AlignFrame getCurrentAlignFrame()
3050 // return currentAlignFrame;
3053 // public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
3055 // Desktop.currentAlignFrame = currentAlignFrame;