2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 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.analysis.AAFrequency;
24 import jalview.analysis.AlignmentSorter;
25 import jalview.analysis.AlignmentUtils;
26 import jalview.analysis.Conservation;
27 import jalview.analysis.CrossRef;
28 import jalview.analysis.NJTree;
29 import jalview.analysis.ParseProperties;
30 import jalview.analysis.SequenceIdMatcher;
31 import jalview.api.AlignViewControllerGuiI;
32 import jalview.api.AlignViewControllerI;
33 import jalview.api.analysis.ScoreModelI;
34 import jalview.bin.Cache;
35 import jalview.commands.CommandI;
36 import jalview.commands.EditCommand;
37 import jalview.commands.EditCommand.Action;
38 import jalview.commands.OrderCommand;
39 import jalview.commands.RemoveGapColCommand;
40 import jalview.commands.RemoveGapsCommand;
41 import jalview.commands.SlideSequencesCommand;
42 import jalview.commands.TrimRegionCommand;
43 import jalview.datamodel.AlignedCodonFrame;
44 import jalview.datamodel.Alignment;
45 import jalview.datamodel.AlignmentAnnotation;
46 import jalview.datamodel.AlignmentI;
47 import jalview.datamodel.AlignmentOrder;
48 import jalview.datamodel.AlignmentView;
49 import jalview.datamodel.ColumnSelection;
50 import jalview.datamodel.PDBEntry;
51 import jalview.datamodel.SeqCigar;
52 import jalview.datamodel.Sequence;
53 import jalview.datamodel.SequenceGroup;
54 import jalview.datamodel.SequenceI;
55 import jalview.io.AlignmentProperties;
56 import jalview.io.AnnotationFile;
57 import jalview.io.FeaturesFile;
58 import jalview.io.FileLoader;
59 import jalview.io.FormatAdapter;
60 import jalview.io.HtmlSvgOutput;
61 import jalview.io.IdentifyFile;
62 import jalview.io.JalviewFileChooser;
63 import jalview.io.JalviewFileView;
64 import jalview.io.JnetAnnotationMaker;
65 import jalview.io.NewickFile;
66 import jalview.io.TCoffeeScoreFile;
67 import jalview.jbgui.GAlignFrame;
68 import jalview.schemes.Blosum62ColourScheme;
69 import jalview.schemes.BuriedColourScheme;
70 import jalview.schemes.ClustalxColourScheme;
71 import jalview.schemes.ColourSchemeI;
72 import jalview.schemes.ColourSchemeProperty;
73 import jalview.schemes.HelixColourScheme;
74 import jalview.schemes.HydrophobicColourScheme;
75 import jalview.schemes.NucleotideColourScheme;
76 import jalview.schemes.PIDColourScheme;
77 import jalview.schemes.PurinePyrimidineColourScheme;
78 import jalview.schemes.RNAHelicesColourChooser;
79 import jalview.schemes.ResidueProperties;
80 import jalview.schemes.StrandColourScheme;
81 import jalview.schemes.TCoffeeColourScheme;
82 import jalview.schemes.TaylorColourScheme;
83 import jalview.schemes.TurnColourScheme;
84 import jalview.schemes.UserColourScheme;
85 import jalview.schemes.ZappoColourScheme;
86 import jalview.util.MessageManager;
87 import jalview.ws.jws1.Discoverer;
88 import jalview.ws.jws2.Jws2Discoverer;
89 import jalview.ws.jws2.jabaws2.Jws2Instance;
90 import jalview.ws.seqfetcher.DbSourceProxy;
92 import java.awt.BorderLayout;
93 import java.awt.Component;
94 import java.awt.GridLayout;
95 import java.awt.Rectangle;
96 import java.awt.Toolkit;
97 import java.awt.datatransfer.Clipboard;
98 import java.awt.datatransfer.DataFlavor;
99 import java.awt.datatransfer.StringSelection;
100 import java.awt.datatransfer.Transferable;
101 import java.awt.dnd.DnDConstants;
102 import java.awt.dnd.DropTargetDragEvent;
103 import java.awt.dnd.DropTargetDropEvent;
104 import java.awt.dnd.DropTargetEvent;
105 import java.awt.dnd.DropTargetListener;
106 import java.awt.event.ActionEvent;
107 import java.awt.event.ActionListener;
108 import java.awt.event.KeyAdapter;
109 import java.awt.event.KeyEvent;
110 import java.awt.event.MouseAdapter;
111 import java.awt.event.MouseEvent;
112 import java.awt.print.PageFormat;
113 import java.awt.print.PrinterJob;
114 import java.beans.PropertyChangeEvent;
117 import java.util.ArrayList;
118 import java.util.Enumeration;
119 import java.util.Hashtable;
120 import java.util.List;
121 import java.util.Vector;
123 import javax.swing.JButton;
124 import javax.swing.JCheckBoxMenuItem;
125 import javax.swing.JEditorPane;
126 import javax.swing.JInternalFrame;
127 import javax.swing.JLabel;
128 import javax.swing.JLayeredPane;
129 import javax.swing.JMenu;
130 import javax.swing.JMenuItem;
131 import javax.swing.JOptionPane;
132 import javax.swing.JPanel;
133 import javax.swing.JProgressBar;
134 import javax.swing.JRadioButtonMenuItem;
135 import javax.swing.JScrollPane;
136 import javax.swing.SwingUtilities;
142 * @version $Revision$
144 public class AlignFrame extends GAlignFrame implements DropTargetListener,
145 IProgressIndicator, AlignViewControllerGuiI
149 public static final int DEFAULT_WIDTH = 700;
152 public static final int DEFAULT_HEIGHT = 500;
154 public AlignmentPanel alignPanel;
156 AlignViewport viewport;
158 public AlignViewControllerI avc;
160 Vector alignPanels = new Vector();
163 * Last format used to load or save alignments in this window
165 String currentFileFormat = null;
168 * Current filename for this alignment
170 String fileName = null;
173 * Creates a new AlignFrame object with specific width and height.
179 public AlignFrame(AlignmentI al, int width, int height)
181 this(al, null, width, height);
185 * Creates a new AlignFrame object with specific width, height and
191 * @param sequenceSetId
193 public AlignFrame(AlignmentI al, int width, int height,
194 String sequenceSetId)
196 this(al, null, width, height, sequenceSetId);
200 * Creates a new AlignFrame object with specific width, height and
206 * @param sequenceSetId
209 public AlignFrame(AlignmentI al, int width, int height,
210 String sequenceSetId, String viewId)
212 this(al, null, width, height, sequenceSetId, viewId);
216 * new alignment window with hidden columns
220 * @param hiddenColumns
221 * ColumnSelection or null
223 * Width of alignment frame
227 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
228 int width, int height)
230 this(al, hiddenColumns, width, height, null);
234 * Create alignment frame for al with hiddenColumns, a specific width and
235 * height, and specific sequenceId
238 * @param hiddenColumns
241 * @param sequenceSetId
244 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
245 int width, int height, String sequenceSetId)
247 this(al, hiddenColumns, width, height, sequenceSetId, null);
251 * Create alignment frame for al with hiddenColumns, a specific width and
252 * height, and specific sequenceId
255 * @param hiddenColumns
258 * @param sequenceSetId
263 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
264 int width, int height, String sequenceSetId, String viewId)
266 setSize(width, height);
268 if (al.getDataset() == null)
273 viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
275 alignPanel = new AlignmentPanel(this, viewport);
278 addAlignmentPanel(alignPanel, true);
283 * Make a new AlignFrame from existing alignmentPanels
290 public AlignFrame(AlignmentPanel ap)
294 addAlignmentPanel(ap, false);
299 * initalise the alignframe from the underlying viewport data and the
304 avc = new jalview.controller.AlignViewController(this, viewport,
306 if (viewport.getAlignmentConservationAnnotation() == null)
308 BLOSUM62Colour.setEnabled(false);
309 conservationMenuItem.setEnabled(false);
310 modifyConservation.setEnabled(false);
311 // PIDColour.setEnabled(false);
312 // abovePIDThreshold.setEnabled(false);
313 // modifyPID.setEnabled(false);
316 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
319 if (sortby.equals("Id"))
321 sortIDMenuItem_actionPerformed(null);
323 else if (sortby.equals("Pairwise Identity"))
325 sortPairwiseMenuItem_actionPerformed(null);
328 if (Desktop.desktop != null)
330 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
331 addServiceListeners();
332 setGUINucleotide(viewport.getAlignment().isNucleotide());
335 setMenusFromViewport(viewport);
336 buildSortByAnnotationScoresMenu();
339 if (viewport.wrapAlignment)
341 wrapMenuItem_actionPerformed(null);
344 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
346 this.overviewMenuItem_actionPerformed(null);
354 * Change the filename and format for the alignment, and enable the 'reload'
355 * button functionality.
362 public void setFileName(String file, String format)
365 currentFileFormat = format;
366 reload.setEnabled(true);
369 void addKeyListener()
371 addKeyListener(new KeyAdapter()
374 public void keyPressed(KeyEvent evt)
376 if (viewport.cursorMode
377 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
378 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
379 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
380 && Character.isDigit(evt.getKeyChar()))
382 alignPanel.getSeqPanel().numberPressed(evt.getKeyChar());
385 switch (evt.getKeyCode())
388 case 27: // escape key
389 deselectAllSequenceMenuItem_actionPerformed(null);
393 case KeyEvent.VK_DOWN:
394 if (evt.isAltDown() || !viewport.cursorMode)
396 moveSelectedSequences(false);
398 if (viewport.cursorMode)
400 alignPanel.getSeqPanel().moveCursor(0, 1);
405 if (evt.isAltDown() || !viewport.cursorMode)
407 moveSelectedSequences(true);
409 if (viewport.cursorMode)
411 alignPanel.getSeqPanel().moveCursor(0, -1);
416 case KeyEvent.VK_LEFT:
417 if (evt.isAltDown() || !viewport.cursorMode)
419 slideSequences(false, alignPanel.getSeqPanel().getKeyboardNo1());
423 alignPanel.getSeqPanel().moveCursor(-1, 0);
428 case KeyEvent.VK_RIGHT:
429 if (evt.isAltDown() || !viewport.cursorMode)
431 slideSequences(true, alignPanel.getSeqPanel().getKeyboardNo1());
435 alignPanel.getSeqPanel().moveCursor(1, 0);
439 case KeyEvent.VK_SPACE:
440 if (viewport.cursorMode)
442 alignPanel.getSeqPanel().insertGapAtCursor(evt.isControlDown()
443 || evt.isShiftDown() || evt.isAltDown());
447 // case KeyEvent.VK_A:
448 // if (viewport.cursorMode)
450 // alignPanel.seqPanel.insertNucAtCursor(false,"A");
451 // //System.out.println("A");
455 * case KeyEvent.VK_CLOSE_BRACKET: if (viewport.cursorMode) {
456 * System.out.println("closing bracket"); } break;
458 case KeyEvent.VK_DELETE:
459 case KeyEvent.VK_BACK_SPACE:
460 if (!viewport.cursorMode)
462 cut_actionPerformed(null);
466 alignPanel.getSeqPanel().deleteGapAtCursor(evt.isControlDown()
467 || evt.isShiftDown() || evt.isAltDown());
473 if (viewport.cursorMode)
475 alignPanel.getSeqPanel().setCursorRow();
479 if (viewport.cursorMode && !evt.isControlDown())
481 alignPanel.getSeqPanel().setCursorColumn();
485 if (viewport.cursorMode)
487 alignPanel.getSeqPanel().setCursorPosition();
491 case KeyEvent.VK_ENTER:
492 case KeyEvent.VK_COMMA:
493 if (viewport.cursorMode)
495 alignPanel.getSeqPanel().setCursorRowAndColumn();
500 if (viewport.cursorMode)
502 alignPanel.getSeqPanel().setSelectionAreaAtCursor(true);
506 if (viewport.cursorMode)
508 alignPanel.getSeqPanel().setSelectionAreaAtCursor(false);
513 viewport.cursorMode = !viewport.cursorMode;
514 statusBar.setText(MessageManager.formatMessage(
515 "label.keyboard_editing_mode", new String[]
516 { (viewport.cursorMode ? "on" : "off") }));
517 if (viewport.cursorMode)
519 alignPanel.getSeqPanel().seqCanvas.cursorX = viewport.startRes;
520 alignPanel.getSeqPanel().seqCanvas.cursorY = viewport.startSeq;
522 alignPanel.getSeqPanel().seqCanvas.repaint();
528 Help.showHelpWindow();
529 } catch (Exception ex)
531 ex.printStackTrace();
536 boolean toggleSeqs = !evt.isControlDown();
537 boolean toggleCols = !evt.isShiftDown();
538 toggleHiddenRegions(toggleSeqs, toggleCols);
541 case KeyEvent.VK_PAGE_UP:
542 if (viewport.wrapAlignment)
544 alignPanel.scrollUp(true);
548 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
549 - viewport.endSeq + viewport.startSeq);
552 case KeyEvent.VK_PAGE_DOWN:
553 if (viewport.wrapAlignment)
555 alignPanel.scrollUp(false);
559 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
560 + viewport.endSeq - viewport.startSeq);
567 public void keyReleased(KeyEvent evt)
569 switch (evt.getKeyCode())
571 case KeyEvent.VK_LEFT:
572 if (evt.isAltDown() || !viewport.cursorMode)
574 viewport.firePropertyChange("alignment", null, viewport
575 .getAlignment().getSequences());
579 case KeyEvent.VK_RIGHT:
580 if (evt.isAltDown() || !viewport.cursorMode)
582 viewport.firePropertyChange("alignment", null, viewport
583 .getAlignment().getSequences());
591 public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
593 ap.alignFrame = this;
594 avc = new jalview.controller.AlignViewController(this, viewport,
597 alignPanels.addElement(ap);
599 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
601 int aSize = alignPanels.size();
603 tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
605 if (aSize == 1 && ap.av.viewName == null)
607 this.getContentPane().add(ap, BorderLayout.CENTER);
613 setInitialTabVisible();
616 expandViews.setEnabled(true);
617 gatherViews.setEnabled(true);
618 tabbedPane.addTab(ap.av.viewName, ap);
620 ap.setVisible(false);
625 if (ap.av.isPadGaps())
627 ap.av.getAlignment().padGaps();
629 ap.av.updateConservation(ap);
630 ap.av.updateConsensus(ap);
631 ap.av.updateStrucConsensus(ap);
635 public void setInitialTabVisible()
637 expandViews.setEnabled(true);
638 gatherViews.setEnabled(true);
639 tabbedPane.setVisible(true);
640 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
641 tabbedPane.addTab(first.av.viewName, first);
642 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
645 public AlignViewport getViewport()
650 /* Set up intrinsic listeners for dynamically generated GUI bits. */
651 private void addServiceListeners()
653 final java.beans.PropertyChangeListener thisListener;
654 Desktop.instance.addJalviewPropertyChangeListener("services",
655 thisListener = new java.beans.PropertyChangeListener()
658 public void propertyChange(PropertyChangeEvent evt)
660 // // System.out.println("Discoverer property change.");
661 // if (evt.getPropertyName().equals("services"))
663 SwingUtilities.invokeLater(new Runnable()
670 .println("Rebuild WS Menu for service change");
671 BuildWebServiceMenu();
678 addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
681 public void internalFrameClosed(
682 javax.swing.event.InternalFrameEvent evt)
684 System.out.println("deregistering discoverer listener");
685 Desktop.instance.removeJalviewPropertyChangeListener("services",
687 closeMenuItem_actionPerformed(true);
690 // Finally, build the menu once to get current service state
691 new Thread(new Runnable()
696 BuildWebServiceMenu();
701 public void setGUINucleotide(boolean nucleotide)
703 showTranslation.setVisible(nucleotide);
704 conservationMenuItem.setEnabled(!nucleotide);
705 modifyConservation.setEnabled(!nucleotide);
706 showGroupConservation.setEnabled(!nucleotide);
707 rnahelicesColour.setEnabled(nucleotide);
708 purinePyrimidineColour.setEnabled(nucleotide);
709 // Remember AlignFrame always starts as protein
713 // calculateMenu.remove(calculateMenu.getItemCount() - 2);
718 * set up menus for the currently viewport. This may be called after any
719 * operation that affects the data in the current view (selection changed,
720 * etc) to update the menus to reflect the new state.
722 public void setMenusForViewport()
724 setMenusFromViewport(viewport);
728 * Need to call this method when tabs are selected for multiple views, or when
729 * loading from Jalview2XML.java
734 void setMenusFromViewport(AlignViewport av)
736 padGapsMenuitem.setSelected(av.isPadGaps());
737 colourTextMenuItem.setSelected(av.showColourText);
738 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
739 conservationMenuItem.setSelected(av.getConservationSelected());
740 seqLimits.setSelected(av.getShowJVSuffix());
741 idRightAlign.setSelected(av.isRightAlignIds());
742 centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
743 renderGapsMenuItem.setSelected(av.renderGaps);
744 wrapMenuItem.setSelected(av.wrapAlignment);
745 scaleAbove.setVisible(av.wrapAlignment);
746 scaleLeft.setVisible(av.wrapAlignment);
747 scaleRight.setVisible(av.wrapAlignment);
748 annotationPanelMenuItem.setState(av.isShowAnnotation());
750 * Show/hide annotations only enabled if annotation panel is shown
752 showAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
753 hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
754 showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
755 hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
756 viewBoxesMenuItem.setSelected(av.showBoxes);
757 viewTextMenuItem.setSelected(av.showText);
758 showNonconservedMenuItem.setSelected(av.getShowUnconserved());
759 showGroupConsensus.setSelected(av.isShowGroupConsensus());
760 showGroupConservation.setSelected(av.isShowGroupConservation());
761 showConsensusHistogram.setSelected(av.isShowConsensusHistogram());
762 showSequenceLogo.setSelected(av.isShowSequenceLogo());
763 normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
765 setColourSelected(ColourSchemeProperty.getColourName(av
766 .getGlobalColourScheme()));
768 showSeqFeatures.setSelected(av.showSequenceFeatures);
769 hiddenMarkers.setState(av.showHiddenMarkers);
770 applyToAllGroups.setState(av.getColourAppliesToAllGroups());
771 showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
772 showDbRefsMenuitem.setSelected(av.isShowDbRefs());
773 autoCalculate.setSelected(av.autoCalculateConsensus);
774 sortByTree.setSelected(av.sortByTree);
775 listenToViewSelections.setSelected(av.followSelection);
776 rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());
778 .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
779 setShowProductsEnabled();
783 // methods for implementing IProgressIndicator
784 // need to refactor to a reusable stub class
785 Hashtable progressBars, progressBarHandlers;
790 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
793 public void setProgressBar(String message, long id)
795 if (progressBars == null)
797 progressBars = new Hashtable();
798 progressBarHandlers = new Hashtable();
801 JPanel progressPanel;
802 Long lId = new Long(id);
803 GridLayout layout = (GridLayout) statusPanel.getLayout();
804 if (progressBars.get(lId) != null)
806 progressPanel = (JPanel) progressBars.get(new Long(id));
807 statusPanel.remove(progressPanel);
808 progressBars.remove(lId);
809 progressPanel = null;
812 statusBar.setText(message);
814 if (progressBarHandlers.contains(lId))
816 progressBarHandlers.remove(lId);
818 layout.setRows(layout.getRows() - 1);
822 progressPanel = new JPanel(new BorderLayout(10, 5));
824 JProgressBar progressBar = new JProgressBar();
825 progressBar.setIndeterminate(true);
827 progressPanel.add(new JLabel(message), BorderLayout.WEST);
828 progressPanel.add(progressBar, BorderLayout.CENTER);
830 layout.setRows(layout.getRows() + 1);
831 statusPanel.add(progressPanel);
833 progressBars.put(lId, progressPanel);
836 // setMenusForViewport();
841 public void registerHandler(final long id,
842 final IProgressIndicatorHandler handler)
844 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
846 throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
848 progressBarHandlers.put(new Long(id), handler);
849 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
850 if (handler.canCancel())
852 JButton cancel = new JButton(
853 MessageManager.getString("action.cancel"));
854 final IProgressIndicator us = this;
855 cancel.addActionListener(new ActionListener()
859 public void actionPerformed(ActionEvent e)
861 handler.cancelActivity(id);
862 us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
865 progressPanel.add(cancel, BorderLayout.EAST);
871 * @return true if any progress bars are still active
874 public boolean operationInProgress()
876 if (progressBars != null && progressBars.size() > 0)
884 public void setStatus(String text)
886 statusBar.setText(text);
890 * Added so Castor Mapping file can obtain Jalview Version
892 public String getVersion()
894 return jalview.bin.Cache.getProperty("VERSION");
897 public FeatureRenderer getFeatureRenderer()
899 return alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer();
903 public void fetchSequence_actionPerformed(ActionEvent e)
905 new SequenceFetcher(this);
909 public void addFromFile_actionPerformed(ActionEvent e)
911 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
915 public void reload_actionPerformed(ActionEvent e)
917 if (fileName != null)
919 // TODO: JAL-1108 - ensure all associated frames are closed regardless of
920 // originating file's format
921 // TODO: work out how to recover feature settings for correct view(s) when
923 if (currentFileFormat.equals("Jalview"))
925 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
926 for (int i = 0; i < frames.length; i++)
928 if (frames[i] instanceof AlignFrame && frames[i] != this
929 && ((AlignFrame) frames[i]).fileName != null
930 && ((AlignFrame) frames[i]).fileName.equals(fileName))
934 frames[i].setSelected(true);
935 Desktop.instance.closeAssociatedWindows();
936 } catch (java.beans.PropertyVetoException ex)
942 Desktop.instance.closeAssociatedWindows();
944 FileLoader loader = new FileLoader();
945 String protocol = fileName.startsWith("http:") ? "URL" : "File";
946 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
950 Rectangle bounds = this.getBounds();
952 FileLoader loader = new FileLoader();
953 String protocol = fileName.startsWith("http:") ? "URL" : "File";
954 AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,
955 protocol, currentFileFormat);
957 newframe.setBounds(bounds);
958 if (featureSettings != null && featureSettings.isShowing())
960 final Rectangle fspos = featureSettings.frame.getBounds();
961 // TODO: need a 'show feature settings' function that takes bounds -
962 // need to refactor Desktop.addFrame
963 newframe.featureSettings_actionPerformed(null);
964 final FeatureSettings nfs = newframe.featureSettings;
965 SwingUtilities.invokeLater(new Runnable()
970 nfs.frame.setBounds(fspos);
973 this.featureSettings.close();
974 this.featureSettings = null;
976 this.closeMenuItem_actionPerformed(true);
982 public void addFromText_actionPerformed(ActionEvent e)
984 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
988 public void addFromURL_actionPerformed(ActionEvent e)
990 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
994 public void save_actionPerformed(ActionEvent e)
997 || (currentFileFormat == null || !jalview.io.FormatAdapter
998 .isValidIOFormat(currentFileFormat, true))
999 || fileName.startsWith("http"))
1001 saveAs_actionPerformed(null);
1005 saveAlignment(fileName, currentFileFormat);
1016 public void saveAs_actionPerformed(ActionEvent e)
1018 JalviewFileChooser chooser = new JalviewFileChooser(
1019 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
1020 jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,
1021 jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,
1022 currentFileFormat, false);
1024 chooser.setFileView(new JalviewFileView());
1025 chooser.setDialogTitle(MessageManager.getString("label.save_alignment_to_file"));
1026 chooser.setToolTipText(MessageManager.getString("action.save"));
1028 int value = chooser.showSaveDialog(this);
1030 if (value == JalviewFileChooser.APPROVE_OPTION)
1032 currentFileFormat = chooser.getSelectedFormat();
1033 if (currentFileFormat == null)
1036 .showInternalMessageDialog(
1039 .getString("label.select_file_format_before_saving"),
1041 .getString("label.file_format_not_specified"),
1042 JOptionPane.WARNING_MESSAGE);
1043 value = chooser.showSaveDialog(this);
1047 fileName = chooser.getSelectedFile().getPath();
1049 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
1052 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
1053 if (currentFileFormat.indexOf(" ") > -1)
1055 currentFileFormat = currentFileFormat.substring(0,
1056 currentFileFormat.indexOf(" "));
1058 saveAlignment(fileName, currentFileFormat);
1062 public boolean saveAlignment(String file, String format)
1064 boolean success = true;
1066 if (format.equalsIgnoreCase("Jalview"))
1068 String shortName = title;
1070 if (shortName.indexOf(java.io.File.separatorChar) > -1)
1072 shortName = shortName.substring(shortName
1073 .lastIndexOf(java.io.File.separatorChar) + 1);
1076 success = new Jalview2XML().SaveAlignment(this, file, shortName);
1078 statusBar.setText(MessageManager.formatMessage(
1079 "label.successfully_saved_to_file_in_format", new String[]
1080 { fileName, format }));
1085 if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
1087 warningMessage("Cannot save file " + fileName + " using format "
1088 + format, "Alignment output format not supported");
1089 saveAs_actionPerformed(null);
1090 // JBPNote need to have a raise_gui flag here
1094 String[] omitHidden = null;
1096 if (viewport.hasHiddenColumns())
1098 int reply = JOptionPane
1099 .showInternalConfirmDialog(
1102 .getString("label.alignment_contains_hidden_columns"),
1104 .getString("action.save_omit_hidden_columns"),
1105 JOptionPane.YES_NO_OPTION,
1106 JOptionPane.QUESTION_MESSAGE);
1108 if (reply == JOptionPane.YES_OPTION)
1110 omitHidden = viewport.getViewAsString(false);
1113 FormatAdapter f = new FormatAdapter();
1114 String output = f.formatSequences(format,
1115 viewport.getAlignment(), // class cast exceptions will
1116 // occur in the distant future
1117 omitHidden, f.getCacheSuffixDefault(format),
1118 viewport.getColumnSelection());
1128 java.io.PrintWriter out = new java.io.PrintWriter(
1129 new java.io.FileWriter(file));
1133 this.setTitle(file);
1134 statusBar.setText(MessageManager.formatMessage(
1135 "label.successfully_saved_to_file_in_format",
1137 { fileName, format }));
1138 } catch (Exception ex)
1141 ex.printStackTrace();
1148 JOptionPane.showInternalMessageDialog(this, MessageManager
1149 .formatMessage("label.couldnt_save_file", new String[]
1150 { fileName }), MessageManager
1151 .getString("label.error_saving_file"),
1152 JOptionPane.WARNING_MESSAGE);
1158 private void warningMessage(String warning, String title)
1160 if (new jalview.util.Platform().isHeadless())
1162 System.err.println("Warning: " + title + "\nWarning: " + warning);
1167 JOptionPane.showInternalMessageDialog(this, warning, title,
1168 JOptionPane.WARNING_MESSAGE);
1180 protected void outputText_actionPerformed(ActionEvent e)
1182 String[] omitHidden = null;
1184 if (viewport.hasHiddenColumns())
1186 int reply = JOptionPane
1187 .showInternalConfirmDialog(
1190 .getString("label.alignment_contains_hidden_columns"),
1192 .getString("action.save_omit_hidden_columns"),
1193 JOptionPane.YES_NO_OPTION,
1194 JOptionPane.QUESTION_MESSAGE);
1196 if (reply == JOptionPane.YES_OPTION)
1198 omitHidden = viewport.getViewAsString(false);
1202 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1203 cap.setForInput(null);
1207 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1208 viewport.getAlignment(), omitHidden,
1209 viewport.getColumnSelection()));
1210 Desktop.addInternalFrame(cap, MessageManager.formatMessage(
1211 "label.alignment_output_command", new String[]
1212 { e.getActionCommand() }), 600, 500);
1213 } catch (OutOfMemoryError oom)
1215 new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
1228 protected void htmlMenuItem_actionPerformed(ActionEvent e)
1230 // new HTMLOutput(alignPanel,
1231 // alignPanel.getSeqPanel().seqCanvas.getSequenceRenderer(),
1232 // alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
1233 new HtmlSvgOutput(null, alignPanel);
1236 public void createImageMap(File file, String image)
1238 alignPanel.makePNGImageMap(file, image);
1248 public void createPNG(File f)
1250 alignPanel.makePNG(f);
1260 public void createEPS(File f)
1262 alignPanel.makeEPS(f);
1265 public void createSVG(File f)
1267 alignPanel.makeSVG(f);
1270 public void pageSetup_actionPerformed(ActionEvent e)
1272 PrinterJob printJob = PrinterJob.getPrinterJob();
1273 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
1283 public void printMenuItem_actionPerformed(ActionEvent e)
1285 // Putting in a thread avoids Swing painting problems
1286 PrintThread thread = new PrintThread(alignPanel);
1291 public void exportFeatures_actionPerformed(ActionEvent e)
1293 new AnnotationExporter().exportFeatures(alignPanel);
1297 public void exportAnnotations_actionPerformed(ActionEvent e)
1299 new AnnotationExporter().exportAnnotations(alignPanel,
1300 viewport.isShowAnnotation() ? viewport.getAlignment()
1301 .getAlignmentAnnotation() : null, viewport
1302 .getAlignment().getGroups(), ((Alignment) viewport
1303 .getAlignment()).alignmentProperties);
1307 public void associatedData_actionPerformed(ActionEvent e)
1309 // Pick the tree file
1310 JalviewFileChooser chooser = new JalviewFileChooser(
1311 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1312 chooser.setFileView(new JalviewFileView());
1313 chooser.setDialogTitle(MessageManager
1314 .getString("label.load_jalview_annotations"));
1315 chooser.setToolTipText(MessageManager
1316 .getString("label.load_jalview_annotations"));
1318 int value = chooser.showOpenDialog(null);
1320 if (value == JalviewFileChooser.APPROVE_OPTION)
1322 String choice = chooser.getSelectedFile().getPath();
1323 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1324 loadJalviewDataFile(choice, null, null, null);
1330 * Close the current view or all views in the alignment frame. If the frame
1331 * only contains one view then the alignment will be removed from memory.
1333 * @param closeAllTabs
1336 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
1338 if (alignPanels != null && alignPanels.size() < 2)
1340 closeAllTabs = true;
1345 if (alignPanels != null)
1349 if (this.isClosed())
1351 // really close all the windows - otherwise wait till
1352 // setClosed(true) is called
1353 for (int i = 0; i < alignPanels.size(); i++)
1355 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
1362 closeView(alignPanel);
1368 this.setClosed(true);
1370 } catch (Exception ex)
1372 ex.printStackTrace();
1377 * close alignPanel2 and shuffle tabs appropriately.
1379 * @param alignPanel2
1381 public void closeView(AlignmentPanel alignPanel2)
1383 int index = tabbedPane.getSelectedIndex();
1384 int closedindex = tabbedPane.indexOfComponent(alignPanel2);
1385 alignPanels.removeElement(alignPanel2);
1387 // if (viewport == alignPanel2.av)
1391 alignPanel2.closePanel();
1394 tabbedPane.removeTabAt(closedindex);
1395 tabbedPane.validate();
1397 if (index > closedindex || index == tabbedPane.getTabCount())
1399 // modify currently selected tab index if necessary.
1403 this.tabSelectionChanged(index);
1409 void updateEditMenuBar()
1412 if (viewport.historyList.size() > 0)
1414 undoMenuItem.setEnabled(true);
1415 CommandI command = viewport.historyList.peek();
1416 undoMenuItem.setText(MessageManager.formatMessage(
1417 "label.undo_command", new String[]
1418 { command.getDescription() }));
1422 undoMenuItem.setEnabled(false);
1423 undoMenuItem.setText(MessageManager.getString("action.undo"));
1426 if (viewport.redoList.size() > 0)
1428 redoMenuItem.setEnabled(true);
1430 CommandI command = viewport.redoList.peek();
1431 redoMenuItem.setText(MessageManager.formatMessage(
1432 "label.redo_command", new String[]
1433 { command.getDescription() }));
1437 redoMenuItem.setEnabled(false);
1438 redoMenuItem.setText(MessageManager.getString("action.redo"));
1442 public void addHistoryItem(CommandI command)
1444 if (command.getSize() > 0)
1446 viewport.historyList.push(command);
1447 viewport.redoList.clear();
1448 updateEditMenuBar();
1449 viewport.updateHiddenColumns();
1450 // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
1451 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1452 // viewport.getColumnSelection()
1453 // .getHiddenColumns().size() > 0);
1459 * @return alignment objects for all views
1461 AlignmentI[] getViewAlignments()
1463 if (alignPanels != null)
1465 Enumeration e = alignPanels.elements();
1466 AlignmentI[] als = new AlignmentI[alignPanels.size()];
1467 for (int i = 0; e.hasMoreElements(); i++)
1469 als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
1473 if (viewport != null)
1475 return new AlignmentI[]
1476 { viewport.getAlignment() };
1488 protected void undoMenuItem_actionPerformed(ActionEvent e)
1490 if (viewport.historyList.empty())
1494 CommandI command = viewport.historyList.pop();
1495 viewport.redoList.push(command);
1496 command.undoCommand(getViewAlignments());
1498 AlignViewport originalSource = getOriginatingSource(command);
1499 updateEditMenuBar();
1501 if (originalSource != null)
1503 if (originalSource != viewport)
1506 .warn("Implementation worry: mismatch of viewport origin for undo");
1508 originalSource.updateHiddenColumns();
1509 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1511 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1512 // viewport.getColumnSelection()
1513 // .getHiddenColumns().size() > 0);
1514 originalSource.firePropertyChange("alignment", null, originalSource
1515 .getAlignment().getSequences());
1526 protected void redoMenuItem_actionPerformed(ActionEvent e)
1528 if (viewport.redoList.size() < 1)
1533 CommandI command = viewport.redoList.pop();
1534 viewport.historyList.push(command);
1535 command.doCommand(getViewAlignments());
1537 AlignViewport originalSource = getOriginatingSource(command);
1538 updateEditMenuBar();
1540 if (originalSource != null)
1543 if (originalSource != viewport)
1546 .warn("Implementation worry: mismatch of viewport origin for redo");
1548 originalSource.updateHiddenColumns();
1549 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1551 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1552 // viewport.getColumnSelection()
1553 // .getHiddenColumns().size() > 0);
1554 originalSource.firePropertyChange("alignment", null, originalSource
1555 .getAlignment().getSequences());
1559 AlignViewport getOriginatingSource(CommandI command)
1561 AlignViewport originalSource = null;
1562 // For sequence removal and addition, we need to fire
1563 // the property change event FROM the viewport where the
1564 // original alignment was altered
1565 AlignmentI al = null;
1566 if (command instanceof EditCommand)
1568 EditCommand editCommand = (EditCommand) command;
1569 al = editCommand.getAlignment();
1570 Vector comps = (Vector) PaintRefresher.components.get(viewport
1571 .getSequenceSetId());
1573 for (int i = 0; i < comps.size(); i++)
1575 if (comps.elementAt(i) instanceof AlignmentPanel)
1577 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1579 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1586 if (originalSource == null)
1588 // The original view is closed, we must validate
1589 // the current view against the closed view first
1592 PaintRefresher.validateSequences(al, viewport.getAlignment());
1595 originalSource = viewport;
1598 return originalSource;
1607 public void moveSelectedSequences(boolean up)
1609 SequenceGroup sg = viewport.getSelectionGroup();
1615 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1616 viewport.getHiddenRepSequences(), up);
1617 alignPanel.paintAlignment(true);
1620 synchronized void slideSequences(boolean right, int size)
1622 List<SequenceI> sg = new Vector();
1623 if (viewport.cursorMode)
1625 sg.add(viewport.getAlignment().getSequenceAt(
1626 alignPanel.getSeqPanel().seqCanvas.cursorY));
1628 else if (viewport.getSelectionGroup() != null
1629 && viewport.getSelectionGroup().getSize() != viewport
1630 .getAlignment().getHeight())
1632 sg = viewport.getSelectionGroup().getSequences(
1633 viewport.getHiddenRepSequences());
1641 Vector invertGroup = new Vector();
1643 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1645 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1647 invertGroup.add(viewport.getAlignment().getSequenceAt(i));
1651 SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
1653 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1654 for (int i = 0; i < invertGroup.size(); i++)
1656 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1659 SlideSequencesCommand ssc;
1662 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1663 size, viewport.getGapCharacter());
1667 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1668 size, viewport.getGapCharacter());
1671 int groupAdjustment = 0;
1672 if (ssc.getGapsInsertedBegin() && right)
1674 if (viewport.cursorMode)
1676 alignPanel.getSeqPanel().moveCursor(size, 0);
1680 groupAdjustment = size;
1683 else if (!ssc.getGapsInsertedBegin() && !right)
1685 if (viewport.cursorMode)
1687 alignPanel.getSeqPanel().moveCursor(-size, 0);
1691 groupAdjustment = -size;
1695 if (groupAdjustment != 0)
1697 viewport.getSelectionGroup().setStartRes(
1698 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1699 viewport.getSelectionGroup().setEndRes(
1700 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1703 boolean appendHistoryItem = false;
1704 if (viewport.historyList != null && viewport.historyList.size() > 0
1705 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1707 appendHistoryItem = ssc
1708 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1712 if (!appendHistoryItem)
1714 addHistoryItem(ssc);
1727 protected void copy_actionPerformed(ActionEvent e)
1730 if (viewport.getSelectionGroup() == null)
1734 // TODO: preserve the ordering of displayed alignment annotation in any
1735 // internal paste (particularly sequence associated annotation)
1736 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1737 String[] omitHidden = null;
1739 if (viewport.hasHiddenColumns())
1741 omitHidden = viewport.getViewAsString(true);
1744 String output = new FormatAdapter().formatSequences("Fasta", seqs,
1747 StringSelection ss = new StringSelection(output);
1751 jalview.gui.Desktop.internalCopy = true;
1752 // Its really worth setting the clipboard contents
1753 // to empty before setting the large StringSelection!!
1754 Toolkit.getDefaultToolkit().getSystemClipboard()
1755 .setContents(new StringSelection(""), null);
1757 Toolkit.getDefaultToolkit().getSystemClipboard()
1758 .setContents(ss, Desktop.instance);
1759 } catch (OutOfMemoryError er)
1761 new OOMWarning("copying region", er);
1765 Vector hiddenColumns = null;
1766 if (viewport.hasHiddenColumns())
1768 hiddenColumns = new Vector();
1769 int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
1770 .getSelectionGroup().getEndRes();
1771 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1774 int[] region = (int[]) viewport.getColumnSelection()
1775 .getHiddenColumns().elementAt(i);
1776 if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
1778 hiddenColumns.addElement(new int[]
1779 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1784 Desktop.jalviewClipboard = new Object[]
1785 { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
1786 statusBar.setText(MessageManager.formatMessage(
1787 "label.copied_sequences_to_clipboard", new String[]
1788 { Integer.valueOf(seqs.length).toString() }));
1798 protected void pasteNew_actionPerformed(ActionEvent e)
1810 protected void pasteThis_actionPerformed(ActionEvent e)
1816 * Paste contents of Jalview clipboard
1818 * @param newAlignment
1819 * true to paste to a new alignment, otherwise add to this.
1821 void paste(boolean newAlignment)
1823 boolean externalPaste = true;
1826 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1827 Transferable contents = c.getContents(this);
1829 if (contents == null)
1837 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1838 if (str.length() < 1)
1843 format = new IdentifyFile().Identify(str, "Paste");
1845 } catch (OutOfMemoryError er)
1847 new OOMWarning("Out of memory pasting sequences!!", er);
1851 SequenceI[] sequences;
1852 boolean annotationAdded = false;
1853 AlignmentI alignment = null;
1855 if (Desktop.jalviewClipboard != null)
1857 // The clipboard was filled from within Jalview, we must use the
1859 // And dataset from the copied alignment
1860 SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
1861 // be doubly sure that we create *new* sequence objects.
1862 sequences = new SequenceI[newseq.length];
1863 for (int i = 0; i < newseq.length; i++)
1865 sequences[i] = new Sequence(newseq[i]);
1867 alignment = new Alignment(sequences);
1868 externalPaste = false;
1872 // parse the clipboard as an alignment.
1873 alignment = new FormatAdapter().readFile(str, "Paste", format);
1874 sequences = alignment.getSequencesArray();
1878 ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
1884 if (Desktop.jalviewClipboard != null)
1886 // dataset is inherited
1887 alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
1891 // new dataset is constructed
1892 alignment.setDataset(null);
1894 alwidth = alignment.getWidth() + 1;
1898 AlignmentI pastedal = alignment; // preserve pasted alignment object
1899 // Add pasted sequences and dataset into existing alignment.
1900 alignment = viewport.getAlignment();
1901 alwidth = alignment.getWidth() + 1;
1902 // decide if we need to import sequences from an existing dataset
1903 boolean importDs = Desktop.jalviewClipboard != null
1904 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1905 // importDs==true instructs us to copy over new dataset sequences from
1906 // an existing alignment
1907 Vector newDs = (importDs) ? new Vector() : null; // used to create
1908 // minimum dataset set
1910 for (int i = 0; i < sequences.length; i++)
1914 newDs.addElement(null);
1916 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1918 if (importDs && ds != null)
1920 if (!newDs.contains(ds))
1922 newDs.setElementAt(ds, i);
1923 ds = new Sequence(ds);
1924 // update with new dataset sequence
1925 sequences[i].setDatasetSequence(ds);
1929 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1934 // copy and derive new dataset sequence
1935 sequences[i] = sequences[i].deriveSequence();
1936 alignment.getDataset().addSequence(
1937 sequences[i].getDatasetSequence());
1938 // TODO: avoid creation of duplicate dataset sequences with a
1939 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1941 alignment.addSequence(sequences[i]); // merges dataset
1945 newDs.clear(); // tidy up
1947 if (alignment.getAlignmentAnnotation() != null)
1949 for (AlignmentAnnotation alan : alignment
1950 .getAlignmentAnnotation())
1952 if (alan.graphGroup > fgroup)
1954 fgroup = alan.graphGroup;
1958 if (pastedal.getAlignmentAnnotation() != null)
1960 // Add any annotation attached to alignment.
1961 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1962 for (int i = 0; i < alann.length; i++)
1964 annotationAdded = true;
1965 if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
1967 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1968 if (newann.graphGroup > -1)
1970 if (newGraphGroups.size() <= newann.graphGroup
1971 || newGraphGroups.get(newann.graphGroup) == null)
1973 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
1975 newGraphGroups.add(q, null);
1977 newGraphGroups.set(newann.graphGroup, new Integer(
1980 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
1984 newann.padAnnotation(alwidth);
1985 alignment.addAnnotation(newann);
1995 addHistoryItem(new EditCommand(
1996 MessageManager.getString("label.add_sequences"),
1998 sequences, 0, alignment.getWidth(), alignment));
2000 // Add any annotations attached to sequences
2001 for (int i = 0; i < sequences.length; i++)
2003 if (sequences[i].getAnnotation() != null)
2005 AlignmentAnnotation newann;
2006 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
2008 annotationAdded = true;
2009 newann = sequences[i].getAnnotation()[a];
2010 newann.adjustForAlignment();
2011 newann.padAnnotation(alwidth);
2012 if (newann.graphGroup > -1)
2014 if (newann.graphGroup > -1)
2016 if (newGraphGroups.size() <= newann.graphGroup
2017 || newGraphGroups.get(newann.graphGroup) == null)
2019 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
2021 newGraphGroups.add(q, null);
2023 newGraphGroups.set(newann.graphGroup, new Integer(
2026 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
2030 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
2035 .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
2042 // propagate alignment changed.
2043 viewport.setEndSeq(alignment.getHeight());
2044 if (annotationAdded)
2046 // Duplicate sequence annotation in all views.
2047 AlignmentI[] alview = this.getViewAlignments();
2048 for (int i = 0; i < sequences.length; i++)
2050 AlignmentAnnotation sann[] = sequences[i].getAnnotation();
2055 for (int avnum = 0; avnum < alview.length; avnum++)
2057 if (alview[avnum] != alignment)
2059 // duplicate in a view other than the one with input focus
2060 int avwidth = alview[avnum].getWidth() + 1;
2061 // this relies on sann being preserved after we
2062 // modify the sequence's annotation array for each duplication
2063 for (int a = 0; a < sann.length; a++)
2065 AlignmentAnnotation newann = new AlignmentAnnotation(
2067 sequences[i].addAlignmentAnnotation(newann);
2068 newann.padAnnotation(avwidth);
2069 alview[avnum].addAnnotation(newann); // annotation was
2070 // duplicated earlier
2071 // TODO JAL-1145 graphGroups are not updated for sequence
2072 // annotation added to several views. This may cause
2074 alview[avnum].setAnnotationIndex(newann, a);
2079 buildSortByAnnotationScoresMenu();
2081 viewport.firePropertyChange("alignment", null,
2082 alignment.getSequences());
2083 if (alignPanels != null)
2085 for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))
2087 ap.validateAnnotationDimensions(false);
2092 alignPanel.validateAnnotationDimensions(false);
2098 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2100 String newtitle = new String("Copied sequences");
2102 if (Desktop.jalviewClipboard != null
2103 && Desktop.jalviewClipboard[2] != null)
2105 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2106 for (int i = 0; i < hc.size(); i++)
2108 int[] region = (int[]) hc.elementAt(i);
2109 af.viewport.hideColumns(region[0], region[1]);
2113 // >>>This is a fix for the moment, until a better solution is
2115 af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()
2117 alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
2119 // TODO: maintain provenance of an alignment, rather than just make the
2120 // title a concatenation of operations.
2123 if (title.startsWith("Copied sequences"))
2129 newtitle = newtitle.concat("- from " + title);
2134 newtitle = new String("Pasted sequences");
2137 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
2142 } catch (Exception ex)
2144 ex.printStackTrace();
2145 System.out.println("Exception whilst pasting: " + ex);
2146 // could be anything being pasted in here
2152 protected void expand_newalign(ActionEvent e)
2156 AlignmentI alignment = AlignmentUtils.expandContext(getViewport()
2157 .getAlignment(), -1);
2158 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2160 String newtitle = new String("Flanking alignment");
2162 if (Desktop.jalviewClipboard != null
2163 && Desktop.jalviewClipboard[2] != null)
2165 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2166 for (int i = 0; i < hc.size(); i++)
2168 int[] region = (int[]) hc.elementAt(i);
2169 af.viewport.hideColumns(region[0], region[1]);
2173 // >>>This is a fix for the moment, until a better solution is
2175 af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()
2177 alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
2179 // TODO: maintain provenance of an alignment, rather than just make the
2180 // title a concatenation of operations.
2182 if (title.startsWith("Copied sequences"))
2188 newtitle = newtitle.concat("- from " + title);
2192 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT);
2194 } catch (Exception ex)
2196 ex.printStackTrace();
2197 System.out.println("Exception whilst pasting: " + ex);
2198 // could be anything being pasted in here
2199 } catch (OutOfMemoryError oom)
2201 new OOMWarning("Viewing flanking region of alignment", oom);
2212 protected void cut_actionPerformed(ActionEvent e)
2214 copy_actionPerformed(null);
2215 delete_actionPerformed(null);
2225 protected void delete_actionPerformed(ActionEvent evt)
2228 SequenceGroup sg = viewport.getSelectionGroup();
2234 List<SequenceI> seqs = new ArrayList<SequenceI>(sg.getSize());
2236 for (int i = 0; i < sg.getSize(); i++)
2238 seq = sg.getSequenceAt(i);
2242 // If the cut affects all sequences, warn, remove highlighted columns
2243 if (sg.getSize() == viewport.getAlignment().getHeight())
2245 int confirm = JOptionPane.showConfirmDialog(this,
2246 MessageManager.getString("warn.delete_all"), // $NON-NLS-1$
2247 MessageManager.getString("label.delete_all"), // $NON-NLS-1$
2248 JOptionPane.OK_CANCEL_OPTION);
2250 if (confirm == JOptionPane.CANCEL_OPTION
2251 || confirm == JOptionPane.CLOSED_OPTION)
2255 viewport.getColumnSelection().removeElements(sg.getStartRes(),
2256 sg.getEndRes() + 1);
2259 SequenceI[] cut = new SequenceI[seqs.size()];
2260 for (int i = 0; i < seqs.size(); i++)
2262 cut[i] = seqs.get(i);
2266 * //ADD HISTORY ITEM
2268 addHistoryItem(new EditCommand(
2269 MessageManager.getString("label.cut_sequences"), Action.CUT,
2270 cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
2271 viewport.getAlignment()));
2273 viewport.setSelectionGroup(null);
2274 viewport.sendSelection();
2275 viewport.getAlignment().deleteGroup(sg);
2277 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2279 if (viewport.getAlignment().getHeight() < 1)
2283 this.setClosed(true);
2284 } catch (Exception ex)
2297 protected void deleteGroups_actionPerformed(ActionEvent e)
2299 if (avc.deleteGroups())
2301 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
2302 alignPanel.updateAnnotation();
2303 alignPanel.paintAlignment(true);
2314 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2316 SequenceGroup sg = new SequenceGroup();
2318 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2320 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
2323 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
2324 viewport.setSelectionGroup(sg);
2325 viewport.sendSelection();
2326 alignPanel.paintAlignment(true);
2327 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2337 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2339 if (viewport.cursorMode)
2341 alignPanel.getSeqPanel().keyboardNo1 = null;
2342 alignPanel.getSeqPanel().keyboardNo2 = null;
2344 viewport.setSelectionGroup(null);
2345 viewport.getColumnSelection().clear();
2346 viewport.setSelectionGroup(null);
2347 alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null);
2348 alignPanel.getIdPanel().getIdCanvas().searchResults = null;
2349 alignPanel.paintAlignment(true);
2350 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2351 viewport.sendSelection();
2361 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
2363 SequenceGroup sg = viewport.getSelectionGroup();
2367 selectAllSequenceMenuItem_actionPerformed(null);
2372 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2374 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
2377 alignPanel.paintAlignment(true);
2378 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2379 viewport.sendSelection();
2383 public void invertColSel_actionPerformed(ActionEvent e)
2385 viewport.invertColumnSelection();
2386 alignPanel.paintAlignment(true);
2387 viewport.sendSelection();
2397 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2399 trimAlignment(true);
2409 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
2411 trimAlignment(false);
2414 void trimAlignment(boolean trimLeft)
2416 ColumnSelection colSel = viewport.getColumnSelection();
2419 if (colSel.size() > 0)
2423 column = colSel.getMin();
2427 column = colSel.getMax();
2431 if (viewport.getSelectionGroup() != null)
2433 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2434 viewport.getHiddenRepSequences());
2438 seqs = viewport.getAlignment().getSequencesArray();
2441 TrimRegionCommand trimRegion;
2444 trimRegion = new TrimRegionCommand("Remove Left",
2445 TrimRegionCommand.TRIM_LEFT, seqs, column,
2446 viewport.getAlignment(), viewport.getColumnSelection(),
2447 viewport.getSelectionGroup());
2448 viewport.setStartRes(0);
2452 trimRegion = new TrimRegionCommand("Remove Right",
2453 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2454 viewport.getAlignment(), viewport.getColumnSelection(),
2455 viewport.getSelectionGroup());
2458 statusBar.setText(MessageManager.formatMessage(
2459 "label.removed_columns", new String[]
2460 { Integer.valueOf(trimRegion.getSize()).toString() }));
2462 addHistoryItem(trimRegion);
2464 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2466 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2467 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2469 viewport.getAlignment().deleteGroup(sg);
2473 viewport.firePropertyChange("alignment", null, viewport
2474 .getAlignment().getSequences());
2485 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2487 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2490 if (viewport.getSelectionGroup() != null)
2492 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2493 viewport.getHiddenRepSequences());
2494 start = viewport.getSelectionGroup().getStartRes();
2495 end = viewport.getSelectionGroup().getEndRes();
2499 seqs = viewport.getAlignment().getSequencesArray();
2502 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2503 "Remove Gapped Columns", seqs, start, end,
2504 viewport.getAlignment());
2506 addHistoryItem(removeGapCols);
2508 statusBar.setText(MessageManager.formatMessage(
2509 "label.removed_empty_columns", new String[]
2510 { Integer.valueOf(removeGapCols.getSize()).toString() }));
2512 // This is to maintain viewport position on first residue
2513 // of first sequence
2514 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2515 int startRes = seq.findPosition(viewport.startRes);
2516 // ShiftList shifts;
2517 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2518 // edit.alColumnChanges=shifts.getInverse();
2519 // if (viewport.hasHiddenColumns)
2520 // viewport.getColumnSelection().compensateForEdits(shifts);
2521 viewport.setStartRes(seq.findIndex(startRes) - 1);
2522 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2534 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2536 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2539 if (viewport.getSelectionGroup() != null)
2541 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2542 viewport.getHiddenRepSequences());
2543 start = viewport.getSelectionGroup().getStartRes();
2544 end = viewport.getSelectionGroup().getEndRes();
2548 seqs = viewport.getAlignment().getSequencesArray();
2551 // This is to maintain viewport position on first residue
2552 // of first sequence
2553 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2554 int startRes = seq.findPosition(viewport.startRes);
2556 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2557 viewport.getAlignment()));
2559 viewport.setStartRes(seq.findIndex(startRes) - 1);
2561 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2573 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2575 viewport.setPadGaps(padGapsMenuitem.isSelected());
2576 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2582 // if (justifySeqs>0)
2584 // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
2597 public void findMenuItem_actionPerformed(ActionEvent e)
2603 public void newView_actionPerformed(ActionEvent e)
2610 * @param copyAnnotation
2611 * if true then duplicate all annnotation, groups and settings
2612 * @return new alignment panel, already displayed.
2614 public AlignmentPanel newView(boolean copyAnnotation)
2616 return newView(null, copyAnnotation);
2622 * title of newly created view
2623 * @return new alignment panel, already displayed.
2625 public AlignmentPanel newView(String viewTitle)
2627 return newView(viewTitle, true);
2633 * title of newly created view
2634 * @param copyAnnotation
2635 * if true then duplicate all annnotation, groups and settings
2636 * @return new alignment panel, already displayed.
2638 public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)
2640 AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
2642 if (!copyAnnotation)
2644 // just remove all the current annotation except for the automatic stuff
2645 newap.av.getAlignment().deleteAllGroups();
2646 for (AlignmentAnnotation alan : newap.av.getAlignment()
2647 .getAlignmentAnnotation())
2649 if (!alan.autoCalculated)
2651 newap.av.getAlignment().deleteAnnotation(alan);
2657 newap.av.gatherViewsHere = false;
2659 if (viewport.viewName == null)
2661 viewport.viewName = "Original";
2664 newap.av.historyList = viewport.historyList;
2665 newap.av.redoList = viewport.redoList;
2667 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2668 // make sure the new view has a unique name - this is essential for Jalview
2670 boolean addFirstIndex = false;
2671 if (viewTitle == null || viewTitle.trim().length() == 0)
2673 viewTitle = MessageManager.getString("action.view");
2674 addFirstIndex = true;
2678 index = 1;// we count from 1 if given a specific name
2680 String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");
2681 Vector comps = (Vector) PaintRefresher.components.get(viewport
2682 .getSequenceSetId());
2683 Vector existingNames = new Vector();
2684 for (int i = 0; i < comps.size(); i++)
2686 if (comps.elementAt(i) instanceof AlignmentPanel)
2688 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
2689 if (!existingNames.contains(ap.av.viewName))
2691 existingNames.addElement(ap.av.viewName);
2696 while (existingNames.contains(newViewName))
2698 newViewName = viewTitle + " " + (++index);
2701 newap.av.viewName = newViewName;
2703 addAlignmentPanel(newap, true);
2704 newap.alignmentChanged();
2706 if (alignPanels.size() == 2)
2708 viewport.gatherViewsHere = true;
2710 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2715 public void expandViews_actionPerformed(ActionEvent e)
2717 Desktop.instance.explodeViews(this);
2721 public void gatherViews_actionPerformed(ActionEvent e)
2723 Desktop.instance.gatherViews(this);
2733 public void font_actionPerformed(ActionEvent e)
2735 new FontChooser(alignPanel);
2745 protected void seqLimit_actionPerformed(ActionEvent e)
2747 viewport.setShowJVSuffix(seqLimits.isSelected());
2749 alignPanel.getIdPanel().getIdCanvas().setPreferredSize(alignPanel
2750 .calculateIdWidth());
2751 alignPanel.paintAlignment(true);
2755 public void idRightAlign_actionPerformed(ActionEvent e)
2757 viewport.setRightAlignIds(idRightAlign.isSelected());
2758 alignPanel.paintAlignment(true);
2762 public void centreColumnLabels_actionPerformed(ActionEvent e)
2764 viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
2765 alignPanel.paintAlignment(true);
2771 * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
2774 protected void followHighlight_actionPerformed()
2776 if (viewport.followHighlight = this.followHighlightMenuItem.getState())
2778 alignPanel.scrollToPosition(
2779 alignPanel.getSeqPanel().seqCanvas.searchResults, false);
2790 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2792 viewport.setColourText(colourTextMenuItem.isSelected());
2793 alignPanel.paintAlignment(true);
2803 public void wrapMenuItem_actionPerformed(ActionEvent e)
2805 scaleAbove.setVisible(wrapMenuItem.isSelected());
2806 scaleLeft.setVisible(wrapMenuItem.isSelected());
2807 scaleRight.setVisible(wrapMenuItem.isSelected());
2808 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2809 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2813 public void showAllSeqs_actionPerformed(ActionEvent e)
2815 viewport.showAllHiddenSeqs();
2819 public void showAllColumns_actionPerformed(ActionEvent e)
2821 viewport.showAllHiddenColumns();
2826 public void hideSelSequences_actionPerformed(ActionEvent e)
2828 viewport.hideAllSelectedSeqs();
2829 alignPanel.paintAlignment(true);
2833 * called by key handler and the hide all/show all menu items
2838 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
2841 boolean hide = false;
2842 SequenceGroup sg = viewport.getSelectionGroup();
2843 if (!toggleSeqs && !toggleCols)
2845 // Hide everything by the current selection - this is a hack - we do the
2846 // invert and then hide
2847 // first check that there will be visible columns after the invert.
2848 if ((viewport.getColumnSelection() != null
2849 && viewport.getColumnSelection().getSelected() != null && viewport
2850 .getColumnSelection().getSelected().size() > 0)
2851 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
2854 // now invert the sequence set, if required - empty selection implies
2855 // that no hiding is required.
2858 invertSequenceMenuItem_actionPerformed(null);
2859 sg = viewport.getSelectionGroup();
2863 viewport.expandColSelection(sg, true);
2864 // finally invert the column selection and get the new sequence
2866 invertColSel_actionPerformed(null);
2873 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
2875 hideSelSequences_actionPerformed(null);
2878 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
2881 showAllSeqs_actionPerformed(null);
2887 if (viewport.getColumnSelection().getSelected().size() > 0)
2889 hideSelColumns_actionPerformed(null);
2892 viewport.setSelectionGroup(sg);
2897 showAllColumns_actionPerformed(null);
2906 * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
2907 * event.ActionEvent)
2910 public void hideAllButSelection_actionPerformed(ActionEvent e)
2912 toggleHiddenRegions(false, false);
2919 * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
2923 public void hideAllSelection_actionPerformed(ActionEvent e)
2925 SequenceGroup sg = viewport.getSelectionGroup();
2926 viewport.expandColSelection(sg, false);
2927 viewport.hideAllSelectedSeqs();
2928 viewport.hideSelectedColumns();
2929 alignPanel.paintAlignment(true);
2936 * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
2940 public void showAllhidden_actionPerformed(ActionEvent e)
2942 viewport.showAllHiddenColumns();
2943 viewport.showAllHiddenSeqs();
2944 alignPanel.paintAlignment(true);
2948 public void hideSelColumns_actionPerformed(ActionEvent e)
2950 viewport.hideSelectedColumns();
2951 alignPanel.paintAlignment(true);
2955 public void hiddenMarkers_actionPerformed(ActionEvent e)
2957 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2968 protected void scaleAbove_actionPerformed(ActionEvent e)
2970 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2971 alignPanel.paintAlignment(true);
2981 protected void scaleLeft_actionPerformed(ActionEvent e)
2983 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2984 alignPanel.paintAlignment(true);
2994 protected void scaleRight_actionPerformed(ActionEvent e)
2996 viewport.setScaleRightWrapped(scaleRight.isSelected());
2997 alignPanel.paintAlignment(true);
3007 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
3009 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
3010 alignPanel.paintAlignment(true);
3020 public void viewTextMenuItem_actionPerformed(ActionEvent e)
3022 viewport.setShowText(viewTextMenuItem.isSelected());
3023 alignPanel.paintAlignment(true);
3033 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
3035 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
3036 alignPanel.paintAlignment(true);
3039 public FeatureSettings featureSettings;
3042 public void featureSettings_actionPerformed(ActionEvent e)
3044 if (featureSettings != null)
3046 featureSettings.close();
3047 featureSettings = null;
3049 if (!showSeqFeatures.isSelected())
3051 // make sure features are actually displayed
3052 showSeqFeatures.setSelected(true);
3053 showSeqFeatures_actionPerformed(null);
3055 featureSettings = new FeatureSettings(this);
3059 * Set or clear 'Show Sequence Features'
3065 public void showSeqFeatures_actionPerformed(ActionEvent evt)
3067 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
3068 alignPanel.paintAlignment(true);
3069 if (alignPanel.getOverviewPanel() != null)
3071 alignPanel.getOverviewPanel().updateOverviewImage();
3076 * Set or clear 'Show Sequence Features'
3082 public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
3084 viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
3086 if (viewport.getShowSequenceFeaturesHeight())
3088 // ensure we're actually displaying features
3089 viewport.setShowSequenceFeatures(true);
3090 showSeqFeatures.setSelected(true);
3092 alignPanel.paintAlignment(true);
3093 if (alignPanel.getOverviewPanel() != null)
3095 alignPanel.getOverviewPanel().updateOverviewImage();
3100 * Action on toggle of the 'Show annotations' menu item. This shows or hides
3101 * the annotations panel as a whole.
3103 * The options to show/hide all annotations should be enabled when the panel
3104 * is shown, and disabled when the panel is hidden.
3109 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
3111 final boolean setVisible = annotationPanelMenuItem.isSelected();
3112 viewport.setShowAnnotation(setVisible);
3113 alignPanel.setAnnotationVisible(setVisible);
3114 this.showAllSeqAnnotations.setEnabled(setVisible);
3115 this.hideAllSeqAnnotations.setEnabled(setVisible);
3116 this.showAllAlAnnotations.setEnabled(setVisible);
3117 this.hideAllAlAnnotations.setEnabled(setVisible);
3121 public void alignmentProperties()
3123 JEditorPane editPane = new JEditorPane("text/html", "");
3124 editPane.setEditable(false);
3125 StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
3127 editPane.setText(MessageManager.formatMessage("label.html_content",
3129 { contents.toString() }));
3130 JInternalFrame frame = new JInternalFrame();
3131 frame.getContentPane().add(new JScrollPane(editPane));
3133 Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage(
3134 "label.alignment_properties", new String[]
3135 { getTitle() }), 500, 400);
3145 public void overviewMenuItem_actionPerformed(ActionEvent e)
3147 if (alignPanel.overviewPanel != null)
3152 JInternalFrame frame = new JInternalFrame();
3153 OverviewPanel overview = new OverviewPanel(alignPanel);
3154 frame.setContentPane(overview);
3155 Desktop.addInternalFrame(frame, MessageManager.formatMessage(
3156 "label.overview_params", new String[]
3157 { this.getTitle() }), frame.getWidth(), frame.getHeight());
3159 frame.setLayer(JLayeredPane.PALETTE_LAYER);
3160 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
3163 public void internalFrameClosed(
3164 javax.swing.event.InternalFrameEvent evt)
3166 alignPanel.setOverviewPanel(null);
3170 alignPanel.setOverviewPanel(overview);
3174 public void textColour_actionPerformed(ActionEvent e)
3176 new TextColourChooser().chooseColour(alignPanel, null);
3186 protected void noColourmenuItem_actionPerformed(ActionEvent e)
3198 public void clustalColour_actionPerformed(ActionEvent e)
3200 changeColour(new ClustalxColourScheme(viewport.getAlignment(),
3201 viewport.getHiddenRepSequences()));
3211 public void zappoColour_actionPerformed(ActionEvent e)
3213 changeColour(new ZappoColourScheme());
3223 public void taylorColour_actionPerformed(ActionEvent e)
3225 changeColour(new TaylorColourScheme());
3235 public void hydrophobicityColour_actionPerformed(ActionEvent e)
3237 changeColour(new HydrophobicColourScheme());
3247 public void helixColour_actionPerformed(ActionEvent e)
3249 changeColour(new HelixColourScheme());
3259 public void strandColour_actionPerformed(ActionEvent e)
3261 changeColour(new StrandColourScheme());
3271 public void turnColour_actionPerformed(ActionEvent e)
3273 changeColour(new TurnColourScheme());
3283 public void buriedColour_actionPerformed(ActionEvent e)
3285 changeColour(new BuriedColourScheme());
3295 public void nucleotideColour_actionPerformed(ActionEvent e)
3297 changeColour(new NucleotideColourScheme());
3301 public void purinePyrimidineColour_actionPerformed(ActionEvent e)
3303 changeColour(new PurinePyrimidineColourScheme());
3307 * public void covariationColour_actionPerformed(ActionEvent e) {
3309 * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation
3313 public void annotationColour_actionPerformed(ActionEvent e)
3315 new AnnotationColourChooser(viewport, alignPanel);
3319 public void rnahelicesColour_actionPerformed(ActionEvent e)
3321 new RNAHelicesColourChooser(viewport, alignPanel);
3331 protected void applyToAllGroups_actionPerformed(ActionEvent e)
3333 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
3342 public void changeColour(ColourSchemeI cs)
3344 // TODO: compare with applet and pull up to model method
3349 if (viewport.getAbovePIDThreshold())
3351 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
3353 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3357 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3360 if (viewport.getConservationSelected())
3363 Alignment al = (Alignment) viewport.getAlignment();
3364 Conservation c = new Conservation("All",
3365 ResidueProperties.propHash, 3, al.getSequences(), 0,
3369 c.verdict(false, viewport.getConsPercGaps());
3371 cs.setConservation(c);
3373 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
3378 cs.setConservation(null);
3381 cs.setConsensus(viewport.getSequenceConsensusHash());
3384 viewport.setGlobalColourScheme(cs);
3386 if (viewport.getColourAppliesToAllGroups())
3389 for (SequenceGroup sg : viewport.getAlignment().getGroups())
3397 if (cs instanceof ClustalxColourScheme)
3399 sg.cs = new ClustalxColourScheme(sg,
3400 viewport.getHiddenRepSequences());
3402 else if (cs instanceof UserColourScheme)
3404 sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
3410 sg.cs = cs.getClass().newInstance();
3411 } catch (Exception ex)
3416 if (viewport.getAbovePIDThreshold()
3417 || cs instanceof PIDColourScheme
3418 || cs instanceof Blosum62ColourScheme)
3420 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3422 sg.cs.setConsensus(AAFrequency.calculate(
3423 sg.getSequences(viewport.getHiddenRepSequences()),
3424 sg.getStartRes(), sg.getEndRes() + 1));
3428 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3431 if (viewport.getConservationSelected())
3433 Conservation c = new Conservation("Group",
3434 ResidueProperties.propHash, 3, sg.getSequences(viewport
3435 .getHiddenRepSequences()), sg.getStartRes(),
3436 sg.getEndRes() + 1);
3438 c.verdict(false, viewport.getConsPercGaps());
3439 sg.cs.setConservation(c);
3443 sg.cs.setConservation(null);
3448 if (alignPanel.getOverviewPanel() != null)
3450 alignPanel.getOverviewPanel().updateOverviewImage();
3453 alignPanel.paintAlignment(true);
3463 protected void modifyPID_actionPerformed(ActionEvent e)
3465 if (viewport.getAbovePIDThreshold()
3466 && viewport.getGlobalColourScheme() != null)
3468 SliderPanel.setPIDSliderSource(alignPanel,
3469 viewport.getGlobalColourScheme(), "Background");
3470 SliderPanel.showPIDSlider();
3481 protected void modifyConservation_actionPerformed(ActionEvent e)
3483 if (viewport.getConservationSelected()
3484 && viewport.getGlobalColourScheme() != null)
3486 SliderPanel.setConservationSlider(alignPanel,
3487 viewport.getGlobalColourScheme(), "Background");
3488 SliderPanel.showConservationSlider();
3499 protected void conservationMenuItem_actionPerformed(ActionEvent e)
3501 viewport.setConservationSelected(conservationMenuItem.isSelected());
3503 viewport.setAbovePIDThreshold(false);
3504 abovePIDThreshold.setSelected(false);
3506 changeColour(viewport.getGlobalColourScheme());
3508 modifyConservation_actionPerformed(null);
3518 public void abovePIDThreshold_actionPerformed(ActionEvent e)
3520 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
3522 conservationMenuItem.setSelected(false);
3523 viewport.setConservationSelected(false);
3525 changeColour(viewport.getGlobalColourScheme());
3527 modifyPID_actionPerformed(null);
3537 public void userDefinedColour_actionPerformed(ActionEvent e)
3539 if (e.getActionCommand().equals(
3540 MessageManager.getString("action.user_defined")))
3542 new UserDefinedColours(alignPanel, null);
3546 UserColourScheme udc = (UserColourScheme) UserDefinedColours
3547 .getUserColourSchemes().get(e.getActionCommand());
3553 public void updateUserColourMenu()
3556 Component[] menuItems = colourMenu.getMenuComponents();
3557 int i, iSize = menuItems.length;
3558 for (i = 0; i < iSize; i++)
3560 if (menuItems[i].getName() != null
3561 && menuItems[i].getName().equals("USER_DEFINED"))
3563 colourMenu.remove(menuItems[i]);
3567 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
3569 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
3570 .getUserColourSchemes().keys();
3572 while (userColours.hasMoreElements())
3574 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
3575 userColours.nextElement().toString());
3576 radioItem.setName("USER_DEFINED");
3577 radioItem.addMouseListener(new MouseAdapter()
3580 public void mousePressed(MouseEvent evt)
3582 if (evt.isControlDown()
3583 || SwingUtilities.isRightMouseButton(evt))
3585 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
3587 int option = JOptionPane.showInternalConfirmDialog(
3588 jalview.gui.Desktop.desktop,
3590 .getString("label.remove_from_default_list"),
3592 .getString("label.remove_user_defined_colour"),
3593 JOptionPane.YES_NO_OPTION);
3594 if (option == JOptionPane.YES_OPTION)
3596 jalview.gui.UserDefinedColours
3597 .removeColourFromDefaults(radioItem.getText());
3598 colourMenu.remove(radioItem);
3602 radioItem.addActionListener(new ActionListener()
3605 public void actionPerformed(ActionEvent evt)
3607 userDefinedColour_actionPerformed(evt);
3614 radioItem.addActionListener(new ActionListener()
3617 public void actionPerformed(ActionEvent evt)
3619 userDefinedColour_actionPerformed(evt);
3623 colourMenu.insert(radioItem, 15);
3624 colours.add(radioItem);
3636 public void PIDColour_actionPerformed(ActionEvent e)
3638 changeColour(new PIDColourScheme());
3648 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
3650 changeColour(new Blosum62ColourScheme());
3660 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
3662 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3663 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
3664 .getAlignment().getSequenceAt(0), null);
3665 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
3666 viewport.getAlignment()));
3667 alignPanel.paintAlignment(true);
3677 public void sortIDMenuItem_actionPerformed(ActionEvent e)
3679 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3680 AlignmentSorter.sortByID(viewport.getAlignment());
3681 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
3682 viewport.getAlignment()));
3683 alignPanel.paintAlignment(true);
3693 public void sortLengthMenuItem_actionPerformed(ActionEvent e)
3695 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3696 AlignmentSorter.sortByLength(viewport.getAlignment());
3697 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
3698 viewport.getAlignment()));
3699 alignPanel.paintAlignment(true);
3709 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
3711 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3712 AlignmentSorter.sortByGroup(viewport.getAlignment());
3713 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
3714 viewport.getAlignment()));
3716 alignPanel.paintAlignment(true);
3726 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
3728 new RedundancyPanel(alignPanel, this);
3738 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
3740 if ((viewport.getSelectionGroup() == null)
3741 || (viewport.getSelectionGroup().getSize() < 2))
3743 JOptionPane.showInternalMessageDialog(this, MessageManager
3744 .getString("label.you_must_select_least_two_sequences"),
3745 MessageManager.getString("label.invalid_selection"),
3746 JOptionPane.WARNING_MESSAGE);
3750 JInternalFrame frame = new JInternalFrame();
3751 frame.setContentPane(new PairwiseAlignPanel(viewport));
3752 Desktop.addInternalFrame(frame,
3753 MessageManager.getString("action.pairwise_alignment"), 600,
3765 public void PCAMenuItem_actionPerformed(ActionEvent e)
3767 if (((viewport.getSelectionGroup() != null)
3768 && (viewport.getSelectionGroup().getSize() < 4) && (viewport
3769 .getSelectionGroup().getSize() > 0))
3770 || (viewport.getAlignment().getHeight() < 4))
3773 .showInternalMessageDialog(
3776 .getString("label.principal_component_analysis_must_take_least_four_input_sequences"),
3778 .getString("label.sequence_selection_insufficient"),
3779 JOptionPane.WARNING_MESSAGE);
3784 new PCAPanel(alignPanel);
3788 public void autoCalculate_actionPerformed(ActionEvent e)
3790 viewport.autoCalculateConsensus = autoCalculate.isSelected();
3791 if (viewport.autoCalculateConsensus)
3793 viewport.firePropertyChange("alignment", null, viewport
3794 .getAlignment().getSequences());
3799 public void sortByTreeOption_actionPerformed(ActionEvent e)
3801 viewport.sortByTree = sortByTree.isSelected();
3805 protected void listenToViewSelections_actionPerformed(ActionEvent e)
3807 viewport.followSelection = listenToViewSelections.isSelected();
3817 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
3819 NewTreePanel("AV", "PID", "Average distance tree using PID");
3829 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
3831 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
3841 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3843 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
3853 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3855 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
3868 void NewTreePanel(String type, String pwType, String title)
3872 if (viewport.getSelectionGroup() != null
3873 && viewport.getSelectionGroup().getSize() > 0)
3875 if (viewport.getSelectionGroup().getSize() < 3)
3881 .getString("label.you_need_more_two_sequences_selected_build_tree"),
3883 .getString("label.not_enough_sequences"),
3884 JOptionPane.WARNING_MESSAGE);
3888 SequenceGroup sg = viewport.getSelectionGroup();
3890 /* Decide if the selection is a column region */
3891 for (SequenceI _s : sg.getSequences())
3893 if (_s.getLength() < sg.getEndRes())
3899 .getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
3901 .getString("label.sequences_selection_not_aligned"),
3902 JOptionPane.WARNING_MESSAGE);
3908 title = title + " on region";
3909 tp = new TreePanel(alignPanel, type, pwType);
3913 // are the visible sequences aligned?
3914 if (!viewport.getAlignment().isAligned(false))
3920 .getString("label.sequences_must_be_aligned_before_creating_tree"),
3922 .getString("label.sequences_not_aligned"),
3923 JOptionPane.WARNING_MESSAGE);
3928 if (viewport.getAlignment().getHeight() < 2)
3933 tp = new TreePanel(alignPanel, type, pwType);
3938 if (viewport.viewName != null)
3940 title += viewport.viewName + " of ";
3943 title += this.title;
3945 Desktop.addInternalFrame(tp, title, 600, 500);
3956 public void addSortByOrderMenuItem(String title,
3957 final AlignmentOrder order)
3959 final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title}));
3961 item.addActionListener(new java.awt.event.ActionListener()
3964 public void actionPerformed(ActionEvent e)
3966 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3968 // TODO: JBPNote - have to map order entries to curent SequenceI
3970 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3972 addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport
3975 alignPanel.paintAlignment(true);
3981 * Add a new sort by annotation score menu item
3984 * the menu to add the option to
3986 * the label used to retrieve scores for each sequence on the
3989 public void addSortByAnnotScoreMenuItem(JMenu sort,
3990 final String scoreLabel)
3992 final JMenuItem item = new JMenuItem(scoreLabel);
3994 item.addActionListener(new java.awt.event.ActionListener()
3997 public void actionPerformed(ActionEvent e)
3999 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
4000 AlignmentSorter.sortByAnnotationScore(scoreLabel,
4001 viewport.getAlignment());// ,viewport.getSelectionGroup());
4002 addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
4003 viewport.getAlignment()));
4004 alignPanel.paintAlignment(true);
4010 * last hash for alignment's annotation array - used to minimise cost of
4013 protected int _annotationScoreVectorHash;
4016 * search the alignment and rebuild the sort by annotation score submenu the
4017 * last alignment annotation vector hash is stored to minimize cost of
4018 * rebuilding in subsequence calls.
4022 public void buildSortByAnnotationScoresMenu()
4024 if (viewport.getAlignment().getAlignmentAnnotation() == null)
4029 if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
4031 sortByAnnotScore.removeAll();
4032 // almost certainly a quicker way to do this - but we keep it simple
4033 Hashtable scoreSorts = new Hashtable();
4034 AlignmentAnnotation aann[];
4035 for (SequenceI sqa : viewport.getAlignment().getSequences())
4037 aann = sqa.getAnnotation();
4038 for (int i = 0; aann != null && i < aann.length; i++)
4040 if (aann[i].hasScore() && aann[i].sequenceRef != null)
4042 scoreSorts.put(aann[i].label, aann[i].label);
4046 Enumeration labels = scoreSorts.keys();
4047 while (labels.hasMoreElements())
4049 addSortByAnnotScoreMenuItem(sortByAnnotScore,
4050 (String) labels.nextElement());
4052 sortByAnnotScore.setVisible(scoreSorts.size() > 0);
4055 _annotationScoreVectorHash = viewport.getAlignment()
4056 .getAlignmentAnnotation().hashCode();
4061 * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
4062 * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
4063 * call. Listeners are added to remove the menu item when the treePanel is
4064 * closed, and adjust the tree leaf to sequence mapping when the alignment is
4068 * Displayed tree window.
4070 * SortBy menu item title.
4073 public void buildTreeMenu()
4075 calculateTree.removeAll();
4076 // build the calculate menu
4078 for (final String type : new String[]
4081 String treecalcnm = MessageManager.getString("label.tree_calc_"
4082 + type.toLowerCase());
4083 for (final Object pwtype : ResidueProperties.scoreMatrices.keySet())
4085 JMenuItem tm = new JMenuItem();
4086 ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype);
4087 if (sm.isProtein() == !viewport.getAlignment().isNucleotide())
4089 String smn = MessageManager.getStringOrReturn(
4090 "label.score_model_", sm.getName());
4091 final String title = MessageManager.formatMessage(
4092 "label.treecalc_title", treecalcnm, smn);
4093 tm.setText(title);//
4094 tm.addActionListener(new java.awt.event.ActionListener()
4097 public void actionPerformed(ActionEvent e)
4099 NewTreePanel(type, (String) pwtype, title);
4102 calculateTree.add(tm);
4107 sortByTreeMenu.removeAll();
4109 Vector comps = (Vector) PaintRefresher.components.get(viewport
4110 .getSequenceSetId());
4111 Vector treePanels = new Vector();
4112 int i, iSize = comps.size();
4113 for (i = 0; i < iSize; i++)
4115 if (comps.elementAt(i) instanceof TreePanel)
4117 treePanels.add(comps.elementAt(i));
4121 iSize = treePanels.size();
4125 sortByTreeMenu.setVisible(false);
4129 sortByTreeMenu.setVisible(true);
4131 for (i = 0; i < treePanels.size(); i++)
4133 final TreePanel tp = (TreePanel) treePanels.elementAt(i);
4134 final JMenuItem item = new JMenuItem(tp.getTitle());
4135 final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
4136 item.addActionListener(new java.awt.event.ActionListener()
4139 public void actionPerformed(ActionEvent e)
4141 tp.sortByTree_actionPerformed(null);
4142 addHistoryItem(tp.sortAlignmentIn(alignPanel));
4147 sortByTreeMenu.add(item);
4151 public boolean sortBy(AlignmentOrder alorder, String undoname)
4153 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
4154 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
4155 if (undoname != null)
4157 addHistoryItem(new OrderCommand(undoname, oldOrder,
4158 viewport.getAlignment()));
4160 alignPanel.paintAlignment(true);
4165 * Work out whether the whole set of sequences or just the selected set will
4166 * be submitted for multiple alignment.
4169 public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
4171 // Now, check we have enough sequences
4172 AlignmentView msa = null;
4174 if ((viewport.getSelectionGroup() != null)
4175 && (viewport.getSelectionGroup().getSize() > 1))
4177 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
4178 // some common interface!
4180 * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
4181 * SequenceI[sz = seqs.getSize(false)];
4183 * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
4184 * seqs.getSequenceAt(i); }
4186 msa = viewport.getAlignmentView(true);
4188 else if (viewport.getSelectionGroup() != null
4189 && viewport.getSelectionGroup().getSize() == 1)
4191 int option = JOptionPane
4194 "More than one sequece group selection is required for this Job, click \n'Cancel' to edit your selection or 'Ok' to submit the entire sequence.",
4195 "Invalid selection",
4196 JOptionPane.OK_CANCEL_OPTION);
4197 if (option == JOptionPane.OK_OPTION)
4199 msa = viewport.getAlignmentView(false);
4206 * Vector seqs = viewport.getAlignment().getSequences();
4208 * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
4210 * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
4211 * seqs.elementAt(i); } }
4213 msa = viewport.getAlignmentView(false);
4219 * Decides what is submitted to a secondary structure prediction service: the
4220 * first sequence in the alignment, or in the current selection, or, if the
4221 * alignment is 'aligned' (ie padded with gaps), then the currently selected
4222 * region or the whole alignment. (where the first sequence in the set is the
4223 * one that the prediction will be for).
4225 public AlignmentView gatherSeqOrMsaForSecStrPrediction()
4227 AlignmentView seqs = null;
4229 if ((viewport.getSelectionGroup() != null)
4230 && (viewport.getSelectionGroup().getSize() > 0))
4232 seqs = viewport.getAlignmentView(true);
4236 seqs = viewport.getAlignmentView(false);
4238 // limit sequences - JBPNote in future - could spawn multiple prediction
4240 // TODO: viewport.getAlignment().isAligned is a global state - the local
4241 // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
4242 if (!viewport.getAlignment().isAligned(false))
4244 seqs.setSequences(new SeqCigar[]
4245 { seqs.getSequences()[0] });
4246 // TODO: if seqs.getSequences().length>1 then should really have warned
4260 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
4262 // Pick the tree file
4263 JalviewFileChooser chooser = new JalviewFileChooser(
4264 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
4265 chooser.setFileView(new JalviewFileView());
4266 chooser.setDialogTitle(MessageManager
4267 .getString("label.select_newick_like_tree_file"));
4268 chooser.setToolTipText(MessageManager.getString("label.load_tree_file"));
4270 int value = chooser.showOpenDialog(null);
4272 if (value == JalviewFileChooser.APPROVE_OPTION)
4274 String choice = chooser.getSelectedFile().getPath();
4275 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
4276 jalview.io.NewickFile fin = null;
4279 fin = new jalview.io.NewickFile(choice, "File");
4280 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
4281 } catch (Exception ex)
4288 .getString("label.problem_reading_tree_file"),
4289 JOptionPane.WARNING_MESSAGE);
4290 ex.printStackTrace();
4292 if (fin != null && fin.hasWarningMessage())
4294 JOptionPane.showMessageDialog(Desktop.desktop, fin
4295 .getWarningMessage(), MessageManager
4296 .getString("label.possible_problem_with_tree_file"),
4297 JOptionPane.WARNING_MESSAGE);
4303 protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)
4305 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
4308 public TreePanel ShowNewickTree(NewickFile nf, String title)
4310 return ShowNewickTree(nf, title, 600, 500, 4, 5);
4313 public TreePanel ShowNewickTree(NewickFile nf, String title,
4314 AlignmentView input)
4316 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
4319 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
4320 int h, int x, int y)
4322 return ShowNewickTree(nf, title, null, w, h, x, y);
4326 * Add a treeviewer for the tree extracted from a newick file object to the
4327 * current alignment view
4334 * Associated alignment input data (or null)
4343 * @return TreePanel handle
4345 public TreePanel ShowNewickTree(NewickFile nf, String title,
4346 AlignmentView input, int w, int h, int x, int y)
4348 TreePanel tp = null;
4354 if (nf.getTree() != null)
4356 tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
4362 tp.setLocation(x, y);
4365 Desktop.addInternalFrame(tp, title, w, h);
4367 } catch (Exception ex)
4369 ex.printStackTrace();
4375 private boolean buildingMenu = false;
4378 * Generates menu items and listener event actions for web service clients
4381 public void BuildWebServiceMenu()
4383 while (buildingMenu)
4387 System.err.println("Waiting for building menu to finish.");
4389 } catch (Exception e)
4394 final AlignFrame me = this;
4395 buildingMenu = true;
4396 new Thread(new Runnable()
4401 final List<JMenuItem> legacyItems = new ArrayList<JMenuItem>();
4404 System.err.println("Building ws menu again "
4405 + Thread.currentThread());
4406 // TODO: add support for context dependent disabling of services based
4408 // alignment and current selection
4409 // TODO: add additional serviceHandle parameter to specify abstract
4411 // class independently of AbstractName
4412 // TODO: add in rediscovery GUI function to restart discoverer
4413 // TODO: group services by location as well as function and/or
4415 // object broker mechanism.
4416 final Vector<JMenu> wsmenu = new Vector<JMenu>();
4417 final IProgressIndicator af = me;
4418 final JMenu msawsmenu = new JMenu("Alignment");
4419 final JMenu secstrmenu = new JMenu(
4420 "Secondary Structure Prediction");
4421 final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
4422 final JMenu analymenu = new JMenu("Analysis");
4423 final JMenu dismenu = new JMenu("Protein Disorder");
4424 // final JMenu msawsmenu = new
4425 // JMenu(MessageManager.getString("label.alignment"));
4426 // final JMenu secstrmenu = new
4427 // JMenu(MessageManager.getString("label.secondary_structure_prediction"));
4428 // final JMenu seqsrchmenu = new
4429 // JMenu(MessageManager.getString("label.sequence_database_search"));
4430 // final JMenu analymenu = new
4431 // JMenu(MessageManager.getString("label.analysis"));
4432 // final JMenu dismenu = new
4433 // JMenu(MessageManager.getString("label.protein_disorder"));
4434 // JAL-940 - only show secondary structure prediction services from
4435 // the legacy server
4436 if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
4438 Discoverer.services != null && (Discoverer.services.size() > 0))
4440 // TODO: refactor to allow list of AbstractName/Handler bindings to
4442 // stored or retrieved from elsewhere
4443 // No MSAWS used any more:
4444 // Vector msaws = null; // (Vector)
4445 // Discoverer.services.get("MsaWS");
4446 Vector secstrpr = (Vector) Discoverer.services
4448 if (secstrpr != null)
4450 // Add any secondary structure prediction services
4451 for (int i = 0, j = secstrpr.size(); i < j; i++)
4453 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
4455 jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
4456 .getServiceClient(sh);
4457 int p = secstrmenu.getItemCount();
4458 impl.attachWSMenuEntry(secstrmenu, me);
4459 int q = secstrmenu.getItemCount();
4460 for (int litm = p; litm < q; litm++)
4462 legacyItems.add(secstrmenu.getItem(litm));
4468 // Add all submenus in the order they should appear on the web
4470 wsmenu.add(msawsmenu);
4471 wsmenu.add(secstrmenu);
4472 wsmenu.add(dismenu);
4473 wsmenu.add(analymenu);
4474 // No search services yet
4475 // wsmenu.add(seqsrchmenu);
4477 javax.swing.SwingUtilities.invokeLater(new Runnable()
4484 webService.removeAll();
4485 // first, add discovered services onto the webservices menu
4486 if (wsmenu.size() > 0)
4488 for (int i = 0, j = wsmenu.size(); i < j; i++)
4490 webService.add(wsmenu.get(i));
4495 webService.add(me.webServiceNoServices);
4497 // TODO: move into separate menu builder class.
4498 boolean new_sspred = false;
4499 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
4501 Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
4502 if (jws2servs != null)
4504 if (jws2servs.hasServices())
4506 jws2servs.attachWSMenuEntry(webService, me);
4507 for (Jws2Instance sv : jws2servs.getServices())
4509 if (sv.description.toLowerCase().contains("jpred"))
4511 for (JMenuItem jmi : legacyItems)
4513 jmi.setVisible(false);
4519 if (jws2servs.isRunning())
4521 JMenuItem tm = new JMenuItem(
4522 "Still discovering JABA Services");
4523 tm.setEnabled(false);
4528 build_urlServiceMenu(me.webService);
4529 build_fetchdbmenu(webService);
4530 for (JMenu item : wsmenu)
4532 if (item.getItemCount() == 0)
4534 item.setEnabled(false);
4538 item.setEnabled(true);
4541 } catch (Exception e)
4544 .debug("Exception during web service menu building process.",
4550 } catch (Exception e)
4555 buildingMenu = false;
4562 * construct any groupURL type service menu entries.
4566 private void build_urlServiceMenu(JMenu webService)
4568 // TODO: remove this code when 2.7 is released
4569 // DEBUG - alignmentView
4571 * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final
4572 * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {
4574 * @Override public void actionPerformed(ActionEvent e) {
4575 * jalview.datamodel.AlignmentView
4576 * .testSelectionViews(af.viewport.getAlignment(),
4577 * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }
4579 * }); webService.add(testAlView);
4581 // TODO: refactor to RestClient discoverer and merge menu entries for
4582 // rest-style services with other types of analysis/calculation service
4583 // SHmmr test client - still being implemented.
4584 // DEBUG - alignmentView
4586 for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient
4589 client.attachWSMenuEntry(
4590 JvSwingUtils.findOrCreateMenu(webService, client.getAction()),
4596 * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
4597 * chooser = new JalviewFileChooser(jalview.bin.Cache.
4598 * getProperty("LAST_DIRECTORY"));
4600 * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
4601 * to Vamsas file"); chooser.setToolTipText("Export");
4603 * int value = chooser.showSaveDialog(this);
4605 * if (value == JalviewFileChooser.APPROVE_OPTION) {
4606 * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
4607 * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
4608 * chooser.getSelectedFile().getAbsolutePath(), this); } }
4611 * prototype of an automatically enabled/disabled analysis function
4614 protected void setShowProductsEnabled()
4616 SequenceI[] selection = viewport.getSequenceSelection();
4617 if (canShowProducts(selection, viewport.getSelectionGroup() != null,
4618 viewport.getAlignment().getDataset()))
4620 showProducts.setEnabled(true);
4625 showProducts.setEnabled(false);
4630 * search selection for sequence xRef products and build the show products
4635 * @return true if showProducts menu should be enabled.
4637 public boolean canShowProducts(SequenceI[] selection,
4638 boolean isRegionSelection, Alignment dataset)
4640 boolean showp = false;
4643 showProducts.removeAll();
4644 final boolean dna = viewport.getAlignment().isNucleotide();
4645 final Alignment ds = dataset;
4646 String[] ptypes = (selection == null || selection.length == 0) ? null
4647 : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
4649 // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
4650 // selection, dataset, true);
4651 final SequenceI[] sel = selection;
4652 for (int t = 0; ptypes != null && t < ptypes.length; t++)
4655 final boolean isRegSel = isRegionSelection;
4656 final AlignFrame af = this;
4657 final String source = ptypes[t];
4658 JMenuItem xtype = new JMenuItem(ptypes[t]);
4659 xtype.addActionListener(new ActionListener()
4663 public void actionPerformed(ActionEvent e)
4665 // TODO: new thread for this call with vis-delay
4666 af.showProductsFor(af.viewport.getSequenceSelection(), ds,
4667 isRegSel, dna, source);
4671 showProducts.add(xtype);
4673 showProducts.setVisible(showp);
4674 showProducts.setEnabled(showp);
4675 } catch (Exception e)
4677 jalview.bin.Cache.log
4678 .warn("canTranslate threw an exception - please report to help@jalview.org",
4685 protected void showProductsFor(SequenceI[] sel, Alignment ds,
4686 boolean isRegSel, boolean dna, String source)
4688 final boolean fisRegSel = isRegSel;
4689 final boolean fdna = dna;
4690 final String fsrc = source;
4691 final AlignFrame ths = this;
4692 final SequenceI[] fsel = sel;
4693 Runnable foo = new Runnable()
4699 final long sttime = System.currentTimeMillis();
4700 ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime);
4703 Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
4707 Alignment prods = CrossRef
4708 .findXrefSequences(fsel, fdna, fsrc, ds);
4711 SequenceI[] sprods = new SequenceI[prods.getHeight()];
4712 for (int s = 0; s < sprods.length; s++)
4714 sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
4715 if (ds.getSequences() == null
4716 || !ds.getSequences().contains(
4717 sprods[s].getDatasetSequence()))
4719 ds.addSequence(sprods[s].getDatasetSequence());
4721 sprods[s].updatePDBIds();
4723 Alignment al = new Alignment(sprods);
4724 AlignedCodonFrame[] cf = prods.getCodonFrames();
4726 for (int s = 0; cf != null && s < cf.length; s++)
4728 al.addCodonFrame(cf[s]);
4731 AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
4733 String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
4734 + " for " + ((fisRegSel) ? "selected region of " : "")
4736 Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
4741 System.err.println("No Sequences generated for xRef type "
4744 } catch (Exception e)
4746 jalview.bin.Cache.log.error(
4747 "Exception when finding crossreferences", e);
4748 } catch (OutOfMemoryError e)
4750 new OOMWarning("whilst fetching crossreferences", e);
4753 jalview.bin.Cache.log.error("Error when finding crossreferences",
4756 ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}),
4761 Thread frunner = new Thread(foo);
4765 public boolean canShowTranslationProducts(SequenceI[] selection,
4766 AlignmentI alignment)
4771 return (jalview.analysis.Dna.canTranslate(selection,
4772 viewport.getViewAsVisibleContigs(true)));
4773 } catch (Exception e)
4775 jalview.bin.Cache.log
4776 .warn("canTranslate threw an exception - please report to help@jalview.org",
4783 public void showProducts_actionPerformed(ActionEvent e)
4785 // /////////////////////////////
4786 // Collect Data to be translated/transferred
4788 SequenceI[] selection = viewport.getSequenceSelection();
4789 AlignmentI al = null;
4792 al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
4793 .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
4794 viewport.getAlignment().getDataset());
4795 } catch (Exception ex)
4798 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4806 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4807 MessageManager.getString("label.translation_failed"),
4808 JOptionPane.WARNING_MESSAGE);
4812 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4813 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4814 "label.translation_of_params", new String[]
4815 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4820 public void showTranslation_actionPerformed(ActionEvent e)
4822 // /////////////////////////////
4823 // Collect Data to be translated/transferred
4825 SequenceI[] selection = viewport.getSequenceSelection();
4826 String[] seqstring = viewport.getViewAsString(true);
4827 AlignmentI al = null;
4830 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
4831 viewport.getViewAsVisibleContigs(true), viewport
4832 .getGapCharacter(), viewport.getAlignment()
4833 .getAlignmentAnnotation(), viewport.getAlignment()
4834 .getWidth(), viewport.getAlignment().getDataset());
4835 } catch (Exception ex)
4838 jalview.bin.Cache.log.error(
4839 "Exception during translation. Please report this !", ex);
4844 .getString("label.error_when_translating_sequences_submit_bug_report"),
4846 .getString("label.implementation_error")
4848 .getString("translation_failed"),
4849 JOptionPane.ERROR_MESSAGE);
4858 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4859 MessageManager.getString("label.translation_failed"),
4860 JOptionPane.WARNING_MESSAGE);
4864 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4865 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4866 "label.translation_of_params", new String[]
4867 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4872 * Try to load a features file onto the alignment.
4875 * contents or path to retrieve file
4877 * access mode of file (see jalview.io.AlignFile)
4878 * @return true if features file was parsed corectly.
4880 public boolean parseFeaturesFile(String file, String type)
4882 boolean featuresFile = false;
4885 featuresFile = new FeaturesFile(file, type).parse(viewport
4886 .getAlignment().getDataset(), alignPanel.getSeqPanel().seqCanvas
4887 .getFeatureRenderer().featureColours, false,
4888 jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
4889 } catch (Exception ex)
4891 ex.printStackTrace();
4896 viewport.showSequenceFeatures = true;
4897 showSeqFeatures.setSelected(true);
4898 if (alignPanel.getSeqPanel().seqCanvas.fr != null)
4900 // update the min/max ranges where necessary
4901 alignPanel.getSeqPanel().seqCanvas.fr.findAllFeatures(true);
4903 if (featureSettings != null)
4905 featureSettings.setTableData();
4907 alignPanel.paintAlignment(true);
4910 return featuresFile;
4914 public void dragEnter(DropTargetDragEvent evt)
4919 public void dragExit(DropTargetEvent evt)
4924 public void dragOver(DropTargetDragEvent evt)
4929 public void dropActionChanged(DropTargetDragEvent evt)
4934 public void drop(DropTargetDropEvent evt)
4936 Transferable t = evt.getTransferable();
4937 java.util.List files = null;
4941 DataFlavor uriListFlavor = new DataFlavor(
4942 "text/uri-list;class=java.lang.String");
4943 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
4945 // Works on Windows and MacOSX
4946 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4947 files = (java.util.List) t
4948 .getTransferData(DataFlavor.javaFileListFlavor);
4950 else if (t.isDataFlavorSupported(uriListFlavor))
4952 // This is used by Unix drag system
4953 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4954 String data = (String) t.getTransferData(uriListFlavor);
4955 files = new java.util.ArrayList(1);
4956 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
4957 data, "\r\n"); st.hasMoreTokens();)
4959 String s = st.nextToken();
4960 if (s.startsWith("#"))
4962 // the line is a comment (as per the RFC 2483)
4966 java.net.URI uri = new java.net.URI(s);
4967 // check to see if we can handle this kind of URI
4968 if (uri.getScheme().toLowerCase().startsWith("http"))
4970 files.add(uri.toString());
4974 // otherwise preserve old behaviour: catch all for file objects
4975 java.io.File file = new java.io.File(uri);
4976 files.add(file.toString());
4980 } catch (Exception e)
4982 e.printStackTrace();
4988 // check to see if any of these files have names matching sequences in
4990 SequenceIdMatcher idm = new SequenceIdMatcher(viewport
4991 .getAlignment().getSequencesArray());
4993 * Object[] { String,SequenceI}
4995 ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
4996 ArrayList<String> filesnotmatched = new ArrayList<String>();
4997 for (int i = 0; i < files.size(); i++)
4999 String file = files.get(i).toString();
5001 String protocol = FormatAdapter.checkProtocol(file);
5002 if (protocol == jalview.io.FormatAdapter.FILE)
5004 File fl = new File(file);
5005 pdbfn = fl.getName();
5007 else if (protocol == jalview.io.FormatAdapter.URL)
5009 URL url = new URL(file);
5010 pdbfn = url.getFile();
5012 if (pdbfn.length() > 0)
5014 // attempt to find a match in the alignment
5015 SequenceI[] mtch = idm.findAllIdMatches(pdbfn);
5016 int l = 0, c = pdbfn.indexOf(".");
5017 while (mtch == null && c != -1)
5022 } while ((c = pdbfn.indexOf(".", l)) > l);
5025 pdbfn = pdbfn.substring(0, l);
5027 mtch = idm.findAllIdMatches(pdbfn);
5034 type = new IdentifyFile().Identify(file, protocol);
5035 } catch (Exception ex)
5041 if (type.equalsIgnoreCase("PDB"))
5043 filesmatched.add(new Object[]
5044 { file, protocol, mtch });
5049 // File wasn't named like one of the sequences or wasn't a PDB file.
5050 filesnotmatched.add(file);
5054 if (filesmatched.size() > 0)
5056 if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false)
5062 "label.automatically_associate_pdb_files_with_sequences_same_name",
5069 .getString("label.automatically_associate_pdb_files_by_name"),
5070 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
5073 for (Object[] fm : filesmatched)
5075 // try and associate
5076 // TODO: may want to set a standard ID naming formalism for
5077 // associating PDB files which have no IDs.
5078 for (SequenceI toassoc : (SequenceI[]) fm[2])
5080 PDBEntry pe = new AssociatePdbFileWithSeq()
5081 .associatePdbWithSeq((String) fm[0],
5082 (String) fm[1], toassoc, false,
5086 System.err.println("Associated file : "
5087 + ((String) fm[0]) + " with "
5088 + toassoc.getDisplayId(true));
5092 alignPanel.paintAlignment(true);
5096 if (filesnotmatched.size() > 0)
5099 && (Cache.getDefault(
5100 "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane
5103 "<html>"+MessageManager
5105 "label.ignore_unmatched_dropped_files_info",
5110 .toString() })+"</html>",
5112 .getString("label.ignore_unmatched_dropped_files"),
5113 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))
5117 for (String fn : filesnotmatched)
5119 loadJalviewDataFile(fn, null, null, null);
5123 } catch (Exception ex)
5125 ex.printStackTrace();
5131 * Attempt to load a "dropped" file or URL string: First by testing whether
5132 * it's and Annotation file, then a JNet file, and finally a features file. If
5133 * all are false then the user may have dropped an alignment file onto this
5137 * either a filename or a URL string.
5139 public void loadJalviewDataFile(String file, String protocol,
5140 String format, SequenceI assocSeq)
5144 if (protocol == null)
5146 protocol = jalview.io.FormatAdapter.checkProtocol(file);
5148 // if the file isn't identified, or not positively identified as some
5149 // other filetype (PFAM is default unidentified alignment file type) then
5150 // try to parse as annotation.
5151 boolean isAnnotation = (format == null || format
5152 .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
5153 .readAnnotationFile(viewport.getAlignment(), file, protocol)
5158 // first see if its a T-COFFEE score file
5159 TCoffeeScoreFile tcf = null;
5162 tcf = new TCoffeeScoreFile(file, protocol);
5165 if (tcf.annotateAlignment(viewport.getAlignment(), true))
5167 tcoffeeColour.setEnabled(true);
5168 tcoffeeColour.setSelected(true);
5169 changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
5170 isAnnotation = true;
5172 .setText(MessageManager
5173 .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
5177 // some problem - if no warning its probable that the ID matching
5178 // process didn't work
5182 tcf.getWarningMessage() == null ? MessageManager
5183 .getString("label.check_file_matches_sequence_ids_alignment")
5184 : tcf.getWarningMessage(),
5186 .getString("label.problem_reading_tcoffee_score_file"),
5187 JOptionPane.WARNING_MESSAGE);
5194 } catch (Exception x)
5197 .debug("Exception when processing data source as T-COFFEE score file",
5203 // try to see if its a JNet 'concise' style annotation file *before*
5205 // try to parse it as a features file
5208 format = new IdentifyFile().Identify(file, protocol);
5210 if (format.equalsIgnoreCase("JnetFile"))
5212 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
5214 new JnetAnnotationMaker().add_annotation(predictions,
5215 viewport.getAlignment(), 0, false);
5216 isAnnotation = true;
5221 * if (format.equalsIgnoreCase("PDB")) {
5223 * String pdbfn = ""; // try to match up filename with sequence id
5224 * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
5225 * new File(file); pdbfn = fl.getName(); } else if (protocol ==
5226 * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
5227 * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
5228 * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
5229 * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
5230 * // attempt to find a match in the alignment SequenceI mtch =
5231 * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
5232 * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
5233 * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
5234 * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
5235 * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
5236 * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
5237 * { System.err.println("Associated file : " + file + " with " +
5238 * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
5239 * TODO: maybe need to load as normal otherwise return; } }
5241 // try to parse it as a features file
5242 boolean isGroupsFile = parseFeaturesFile(file, protocol);
5243 // if it wasn't a features file then we just treat it as a general
5244 // alignment file to load into the current view.
5247 new FileLoader().LoadFile(viewport, file, protocol, format);
5251 alignPanel.paintAlignment(true);
5259 alignPanel.adjustAnnotationHeight();
5260 viewport.updateSequenceIdColours();
5261 buildSortByAnnotationScoresMenu();
5262 alignPanel.paintAlignment(true);
5264 } catch (Exception ex)
5266 ex.printStackTrace();
5267 } catch (OutOfMemoryError oom)
5272 } catch (Exception x)
5278 + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."
5279 : "using " + protocol + " from " + file)
5281 + (format != null ? "(parsing as '" + format
5282 + "' file)" : ""), oom, Desktop.desktop);
5287 public void tabSelectionChanged(int index)
5291 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
5292 viewport = alignPanel.av;
5293 avc.setViewportAndAlignmentPanel(viewport, alignPanel);
5294 setMenusFromViewport(viewport);
5299 public void tabbedPane_mousePressed(MouseEvent e)
5301 if (SwingUtilities.isRightMouseButton(e))
5303 String reply = JOptionPane.showInternalInputDialog(this,
5304 MessageManager.getString("label.enter_view_name"),
5305 MessageManager.getString("label.enter_view_name"),
5306 JOptionPane.QUESTION_MESSAGE);
5310 viewport.viewName = reply;
5311 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
5316 public AlignViewport getCurrentView()
5322 * Open the dialog for regex description parsing.
5325 protected void extractScores_actionPerformed(ActionEvent e)
5327 ParseProperties pp = new jalview.analysis.ParseProperties(
5328 viewport.getAlignment());
5329 // TODO: verify regex and introduce GUI dialog for version 2.5
5330 // if (pp.getScoresFromDescription("col", "score column ",
5331 // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
5333 if (pp.getScoresFromDescription("description column",
5334 "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
5336 buildSortByAnnotationScoresMenu();
5344 * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
5348 protected void showDbRefs_actionPerformed(ActionEvent e)
5350 viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
5356 * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
5360 protected void showNpFeats_actionPerformed(ActionEvent e)
5362 viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
5366 * find the viewport amongst the tabs in this alignment frame and close that
5371 public boolean closeView(AlignViewport av)
5375 this.closeMenuItem_actionPerformed(false);
5378 Component[] comp = tabbedPane.getComponents();
5379 for (int i = 0; comp != null && i < comp.length; i++)
5381 if (comp[i] instanceof AlignmentPanel)
5383 if (((AlignmentPanel) comp[i]).av == av)
5386 closeView((AlignmentPanel) comp[i]);
5394 protected void build_fetchdbmenu(JMenu webService)
5396 // Temporary hack - DBRef Fetcher always top level ws entry.
5397 // TODO We probably want to store a sequence database checklist in
5398 // preferences and have checkboxes.. rather than individual sources selected
5400 final JMenu rfetch = new JMenu(
5401 MessageManager.getString("action.fetch_db_references"));
5402 rfetch.setToolTipText(MessageManager
5403 .getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences"));
5404 webService.add(rfetch);
5406 final JCheckBoxMenuItem trimrs = new JCheckBoxMenuItem(
5407 MessageManager.getString("option.trim_retrieved_seqs"));
5408 trimrs.setToolTipText(MessageManager
5409 .getString("label.trim_retrieved_sequences"));
5410 trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true));
5411 trimrs.addActionListener(new ActionListener()
5414 public void actionPerformed(ActionEvent e)
5416 trimrs.setSelected(trimrs.isSelected());
5417 Cache.setProperty("TRIM_FETCHED_DATASET_SEQS",
5418 Boolean.valueOf(trimrs.isSelected()).toString());
5422 JMenuItem fetchr = new JMenuItem(
5423 MessageManager.getString("label.standard_databases"));
5424 fetchr.setToolTipText(MessageManager
5425 .getString("label.fetch_embl_uniprot"));
5426 fetchr.addActionListener(new ActionListener()
5430 public void actionPerformed(ActionEvent e)
5432 new Thread(new Runnable()
5438 new jalview.ws.DBRefFetcher(alignPanel.av
5439 .getSequenceSelection(), alignPanel.alignFrame)
5440 .fetchDBRefs(false);
5448 final AlignFrame me = this;
5449 new Thread(new Runnable()
5454 final jalview.ws.SequenceFetcher sf = SequenceFetcher
5455 .getSequenceFetcherSingleton(me);
5456 javax.swing.SwingUtilities.invokeLater(new Runnable()
5461 String[] dbclasses = sf.getOrderedSupportedSources();
5462 // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
5463 // jalview.util.QuickSort.sort(otherdb, otherdb);
5464 List<DbSourceProxy> otherdb;
5465 JMenu dfetch = new JMenu();
5466 JMenu ifetch = new JMenu();
5467 JMenuItem fetchr = null;
5468 int comp = 0, icomp = 0, mcomp = 15;
5469 String mname = null;
5471 for (String dbclass : dbclasses)
5473 otherdb = sf.getSourceProxy(dbclass);
5474 // add a single entry for this class, or submenu allowing 'fetch
5476 if (otherdb == null || otherdb.size() < 1)
5480 // List<DbSourceProxy> dbs=otherdb;
5481 // otherdb=new ArrayList<DbSourceProxy>();
5482 // for (DbSourceProxy db:dbs)
5484 // if (!db.isA(DBRefSource.ALIGNMENTDB)
5488 mname = "From " + dbclass;
5490 if (otherdb.size() == 1)
5492 final DbSourceProxy[] dassource = otherdb
5493 .toArray(new DbSourceProxy[0]);
5494 DbSourceProxy src = otherdb.get(0);
5495 fetchr = new JMenuItem(src.getDbSource());
5496 fetchr.addActionListener(new ActionListener()
5500 public void actionPerformed(ActionEvent e)
5502 new Thread(new Runnable()
5508 new jalview.ws.DBRefFetcher(alignPanel.av
5509 .getSequenceSelection(),
5510 alignPanel.alignFrame, dassource)
5511 .fetchDBRefs(false);
5517 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()})));
5523 final DbSourceProxy[] dassource = otherdb
5524 .toArray(new DbSourceProxy[0]);
5526 DbSourceProxy src = otherdb.get(0);
5527 fetchr = new JMenuItem(MessageManager.formatMessage(
5528 "label.fetch_all_param", new String[]
5529 { src.getDbSource() }));
5530 fetchr.addActionListener(new ActionListener()
5533 public void actionPerformed(ActionEvent e)
5535 new Thread(new Runnable()
5541 new jalview.ws.DBRefFetcher(alignPanel.av
5542 .getSequenceSelection(),
5543 alignPanel.alignFrame, dassource)
5544 .fetchDBRefs(false);
5550 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
5553 // and then build the rest of the individual menus
5554 ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()}));
5556 String imname = null;
5558 for (DbSourceProxy sproxy : otherdb)
5560 String dbname = sproxy.getDbName();
5561 String sname = dbname.length() > 5 ? dbname.substring(0,
5562 5) + "..." : dbname;
5563 String msname = dbname.length() > 10 ? dbname.substring(
5564 0, 10) + "..." : dbname;
5567 imname = MessageManager.formatMessage("label.from_msname", new String[]{sname});
5569 fetchr = new JMenuItem(msname);
5570 final DbSourceProxy[] dassrc =
5572 fetchr.addActionListener(new ActionListener()
5576 public void actionPerformed(ActionEvent e)
5578 new Thread(new Runnable()
5584 new jalview.ws.DBRefFetcher(alignPanel.av
5585 .getSequenceSelection(),
5586 alignPanel.alignFrame, dassrc)
5587 .fetchDBRefs(false);
5593 fetchr.setToolTipText("<html>"
5594 + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname}));
5597 if (++icomp >= mcomp || i == (otherdb.size()))
5599 ifetch.setText(MessageManager.formatMessage(
5600 "label.source_to_target", imname, sname));
5602 ifetch = new JMenu();
5610 if (comp >= mcomp || dbi >= (dbclasses.length))
5612 dfetch.setText(MessageManager.formatMessage(
5613 "label.source_to_target", mname, dbclass));
5615 dfetch = new JMenu();
5628 * Left justify the whole alignment.
5631 protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
5633 AlignmentI al = viewport.getAlignment();
5635 viewport.firePropertyChange("alignment", null, al);
5639 * Right justify the whole alignment.
5642 protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
5644 AlignmentI al = viewport.getAlignment();
5646 viewport.firePropertyChange("alignment", null, al);
5649 public void setShowSeqFeatures(boolean b)
5651 showSeqFeatures.setSelected(true);
5652 viewport.setShowSequenceFeatures(true);
5659 * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
5660 * awt.event.ActionEvent)
5663 protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
5665 viewport.setShowUnconserved(showNonconservedMenuItem.getState());
5666 alignPanel.paintAlignment(true);
5673 * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
5677 protected void showGroupConsensus_actionPerformed(ActionEvent e)
5679 viewport.setShowGroupConsensus(showGroupConsensus.getState());
5680 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5688 * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
5689 * .event.ActionEvent)
5692 protected void showGroupConservation_actionPerformed(ActionEvent e)
5694 viewport.setShowGroupConservation(showGroupConservation.getState());
5695 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5702 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
5703 * .event.ActionEvent)
5706 protected void showConsensusHistogram_actionPerformed(ActionEvent e)
5708 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
5709 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5716 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
5717 * .event.ActionEvent)
5720 protected void showSequenceLogo_actionPerformed(ActionEvent e)
5722 viewport.setShowSequenceLogo(showSequenceLogo.getState());
5723 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5727 protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
5729 showSequenceLogo.setState(true);
5730 viewport.setShowSequenceLogo(true);
5731 viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
5732 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5736 protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
5738 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5745 * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
5746 * .event.ActionEvent)
5749 protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
5751 if (avc.makeGroupsFromSelection())
5753 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
5754 alignPanel.updateAnnotation();
5755 alignPanel.paintAlignment(true);
5760 protected void createGroup_actionPerformed(ActionEvent e)
5762 if (avc.createGroup())
5764 alignPanel.alignmentChanged();
5769 protected void unGroup_actionPerformed(ActionEvent e)
5773 alignPanel.alignmentChanged();
5778 * make the given alignmentPanel the currently selected tab
5780 * @param alignmentPanel
5782 public void setDisplayedView(AlignmentPanel alignmentPanel)
5784 if (!viewport.getSequenceSetId().equals(
5785 alignmentPanel.av.getSequenceSetId()))
5787 throw new Error(MessageManager.getString("error.implementation_error_cannot_show_view_alignment_frame"));
5789 if (tabbedPane != null
5790 & alignPanels.indexOf(alignmentPanel) != tabbedPane
5791 .getSelectedIndex())
5793 tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));
5798 * Action on selection of menu options to Show or Hide annotations.
5801 * @param forSequences
5802 * update sequence-related annotations
5803 * @param forAlignment
5804 * update non-sequence-related annotations
5807 protected void setAnnotationsVisibility(boolean visible,
5808 boolean forSequences, boolean forAlignment)
5810 for (AlignmentAnnotation aa : alignPanel.getAlignment()
5811 .getAlignmentAnnotation())
5813 boolean apply = (aa.sequenceRef == null && forAlignment)
5814 || (aa.sequenceRef != null && forSequences);
5817 aa.visible = visible;
5820 alignPanel.validateAnnotationDimensions(false);
5821 alignPanel.alignmentChanged();
5825 * Store selected annotation sort order for the view and repaint.
5828 protected void sortAnnotations_actionPerformed()
5830 this.alignPanel.av.setSortAnnotationsBy(getAnnotationSortOrder());
5832 .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
5833 alignPanel.paintAlignment(true);
5837 class PrintThread extends Thread
5841 public PrintThread(AlignmentPanel ap)
5846 static PageFormat pf;
5851 PrinterJob printJob = PrinterJob.getPrinterJob();
5855 printJob.setPrintable(ap, pf);
5859 printJob.setPrintable(ap);
5862 if (printJob.printDialog())
5867 } catch (Exception PrintException)
5869 PrintException.printStackTrace();