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.HTMLOutput;
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.seqPanel.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.seqPanel.moveCursor(0, 1);
405 if (evt.isAltDown() || !viewport.cursorMode)
407 moveSelectedSequences(true);
409 if (viewport.cursorMode)
411 alignPanel.seqPanel.moveCursor(0, -1);
416 case KeyEvent.VK_LEFT:
417 if (evt.isAltDown() || !viewport.cursorMode)
419 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
423 alignPanel.seqPanel.moveCursor(-1, 0);
428 case KeyEvent.VK_RIGHT:
429 if (evt.isAltDown() || !viewport.cursorMode)
431 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
435 alignPanel.seqPanel.moveCursor(1, 0);
439 case KeyEvent.VK_SPACE:
440 if (viewport.cursorMode)
442 alignPanel.seqPanel.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.seqPanel.deleteGapAtCursor(evt.isControlDown()
467 || evt.isShiftDown() || evt.isAltDown());
473 if (viewport.cursorMode)
475 alignPanel.seqPanel.setCursorRow();
479 if (viewport.cursorMode && !evt.isControlDown())
481 alignPanel.seqPanel.setCursorColumn();
485 if (viewport.cursorMode)
487 alignPanel.seqPanel.setCursorPosition();
491 case KeyEvent.VK_ENTER:
492 case KeyEvent.VK_COMMA:
493 if (viewport.cursorMode)
495 alignPanel.seqPanel.setCursorRowAndColumn();
500 if (viewport.cursorMode)
502 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
506 if (viewport.cursorMode)
508 alignPanel.seqPanel.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.seqPanel.seqCanvas.cursorX = viewport.startRes;
520 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
522 alignPanel.seqPanel.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.rightAlignIds);
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.showAnnotation);
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.seqPanel.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.seqPanel.seqCanvas.getSequenceRenderer(),
1232 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1235 public void createImageMap(File file, String image)
1237 alignPanel.makePNGImageMap(file, image);
1247 public void createPNG(File f)
1249 alignPanel.makePNG(f);
1259 public void createEPS(File f)
1261 alignPanel.makeEPS(f);
1264 public void createSVG(File f)
1266 alignPanel.makeSVG(f);
1269 public void pageSetup_actionPerformed(ActionEvent e)
1271 PrinterJob printJob = PrinterJob.getPrinterJob();
1272 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
1282 public void printMenuItem_actionPerformed(ActionEvent e)
1284 // Putting in a thread avoids Swing painting problems
1285 PrintThread thread = new PrintThread(alignPanel);
1290 public void exportFeatures_actionPerformed(ActionEvent e)
1292 new AnnotationExporter().exportFeatures(alignPanel);
1296 public void exportAnnotations_actionPerformed(ActionEvent e)
1298 new AnnotationExporter().exportAnnotations(alignPanel,
1299 viewport.showAnnotation ? viewport.getAlignment()
1300 .getAlignmentAnnotation() : null, viewport
1301 .getAlignment().getGroups(), ((Alignment) viewport
1302 .getAlignment()).alignmentProperties);
1306 public void associatedData_actionPerformed(ActionEvent e)
1308 // Pick the tree file
1309 JalviewFileChooser chooser = new JalviewFileChooser(
1310 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1311 chooser.setFileView(new JalviewFileView());
1312 chooser.setDialogTitle(MessageManager
1313 .getString("label.load_jalview_annotations"));
1314 chooser.setToolTipText(MessageManager
1315 .getString("label.load_jalview_annotations"));
1317 int value = chooser.showOpenDialog(null);
1319 if (value == JalviewFileChooser.APPROVE_OPTION)
1321 String choice = chooser.getSelectedFile().getPath();
1322 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1323 loadJalviewDataFile(choice, null, null, null);
1329 * Close the current view or all views in the alignment frame. If the frame
1330 * only contains one view then the alignment will be removed from memory.
1332 * @param closeAllTabs
1335 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
1337 if (alignPanels != null && alignPanels.size() < 2)
1339 closeAllTabs = true;
1344 if (alignPanels != null)
1348 if (this.isClosed())
1350 // really close all the windows - otherwise wait till
1351 // setClosed(true) is called
1352 for (int i = 0; i < alignPanels.size(); i++)
1354 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
1361 closeView(alignPanel);
1367 this.setClosed(true);
1369 } catch (Exception ex)
1371 ex.printStackTrace();
1376 * close alignPanel2 and shuffle tabs appropriately.
1378 * @param alignPanel2
1380 public void closeView(AlignmentPanel alignPanel2)
1382 int index = tabbedPane.getSelectedIndex();
1383 int closedindex = tabbedPane.indexOfComponent(alignPanel2);
1384 alignPanels.removeElement(alignPanel2);
1386 // if (viewport == alignPanel2.av)
1390 alignPanel2.closePanel();
1393 tabbedPane.removeTabAt(closedindex);
1394 tabbedPane.validate();
1396 if (index > closedindex || index == tabbedPane.getTabCount())
1398 // modify currently selected tab index if necessary.
1402 this.tabSelectionChanged(index);
1408 void updateEditMenuBar()
1411 if (viewport.historyList.size() > 0)
1413 undoMenuItem.setEnabled(true);
1414 CommandI command = viewport.historyList.peek();
1415 undoMenuItem.setText(MessageManager.formatMessage(
1416 "label.undo_command", new String[]
1417 { command.getDescription() }));
1421 undoMenuItem.setEnabled(false);
1422 undoMenuItem.setText(MessageManager.getString("action.undo"));
1425 if (viewport.redoList.size() > 0)
1427 redoMenuItem.setEnabled(true);
1429 CommandI command = viewport.redoList.peek();
1430 redoMenuItem.setText(MessageManager.formatMessage(
1431 "label.redo_command", new String[]
1432 { command.getDescription() }));
1436 redoMenuItem.setEnabled(false);
1437 redoMenuItem.setText(MessageManager.getString("action.redo"));
1441 public void addHistoryItem(CommandI command)
1443 if (command.getSize() > 0)
1445 viewport.historyList.push(command);
1446 viewport.redoList.clear();
1447 updateEditMenuBar();
1448 viewport.updateHiddenColumns();
1449 // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
1450 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1451 // viewport.getColumnSelection()
1452 // .getHiddenColumns().size() > 0);
1458 * @return alignment objects for all views
1460 AlignmentI[] getViewAlignments()
1462 if (alignPanels != null)
1464 Enumeration e = alignPanels.elements();
1465 AlignmentI[] als = new AlignmentI[alignPanels.size()];
1466 for (int i = 0; e.hasMoreElements(); i++)
1468 als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
1472 if (viewport != null)
1474 return new AlignmentI[]
1475 { viewport.getAlignment() };
1487 protected void undoMenuItem_actionPerformed(ActionEvent e)
1489 if (viewport.historyList.empty())
1493 CommandI command = viewport.historyList.pop();
1494 viewport.redoList.push(command);
1495 command.undoCommand(getViewAlignments());
1497 AlignViewport originalSource = getOriginatingSource(command);
1498 updateEditMenuBar();
1500 if (originalSource != null)
1502 if (originalSource != viewport)
1505 .warn("Implementation worry: mismatch of viewport origin for undo");
1507 originalSource.updateHiddenColumns();
1508 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1510 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1511 // viewport.getColumnSelection()
1512 // .getHiddenColumns().size() > 0);
1513 originalSource.firePropertyChange("alignment", null, originalSource
1514 .getAlignment().getSequences());
1525 protected void redoMenuItem_actionPerformed(ActionEvent e)
1527 if (viewport.redoList.size() < 1)
1532 CommandI command = viewport.redoList.pop();
1533 viewport.historyList.push(command);
1534 command.doCommand(getViewAlignments());
1536 AlignViewport originalSource = getOriginatingSource(command);
1537 updateEditMenuBar();
1539 if (originalSource != null)
1542 if (originalSource != viewport)
1545 .warn("Implementation worry: mismatch of viewport origin for redo");
1547 originalSource.updateHiddenColumns();
1548 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1550 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1551 // viewport.getColumnSelection()
1552 // .getHiddenColumns().size() > 0);
1553 originalSource.firePropertyChange("alignment", null, originalSource
1554 .getAlignment().getSequences());
1558 AlignViewport getOriginatingSource(CommandI command)
1560 AlignViewport originalSource = null;
1561 // For sequence removal and addition, we need to fire
1562 // the property change event FROM the viewport where the
1563 // original alignment was altered
1564 AlignmentI al = null;
1565 if (command instanceof EditCommand)
1567 EditCommand editCommand = (EditCommand) command;
1568 al = editCommand.getAlignment();
1569 Vector comps = (Vector) PaintRefresher.components.get(viewport
1570 .getSequenceSetId());
1572 for (int i = 0; i < comps.size(); i++)
1574 if (comps.elementAt(i) instanceof AlignmentPanel)
1576 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1578 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1585 if (originalSource == null)
1587 // The original view is closed, we must validate
1588 // the current view against the closed view first
1591 PaintRefresher.validateSequences(al, viewport.getAlignment());
1594 originalSource = viewport;
1597 return originalSource;
1606 public void moveSelectedSequences(boolean up)
1608 SequenceGroup sg = viewport.getSelectionGroup();
1614 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1615 viewport.getHiddenRepSequences(), up);
1616 alignPanel.paintAlignment(true);
1619 synchronized void slideSequences(boolean right, int size)
1621 List<SequenceI> sg = new Vector();
1622 if (viewport.cursorMode)
1624 sg.add(viewport.getAlignment().getSequenceAt(
1625 alignPanel.seqPanel.seqCanvas.cursorY));
1627 else if (viewport.getSelectionGroup() != null
1628 && viewport.getSelectionGroup().getSize() != viewport
1629 .getAlignment().getHeight())
1631 sg = viewport.getSelectionGroup().getSequences(
1632 viewport.getHiddenRepSequences());
1640 Vector invertGroup = new Vector();
1642 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1644 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1646 invertGroup.add(viewport.getAlignment().getSequenceAt(i));
1650 SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
1652 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1653 for (int i = 0; i < invertGroup.size(); i++)
1655 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1658 SlideSequencesCommand ssc;
1661 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1662 size, viewport.getGapCharacter());
1666 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1667 size, viewport.getGapCharacter());
1670 int groupAdjustment = 0;
1671 if (ssc.getGapsInsertedBegin() && right)
1673 if (viewport.cursorMode)
1675 alignPanel.seqPanel.moveCursor(size, 0);
1679 groupAdjustment = size;
1682 else if (!ssc.getGapsInsertedBegin() && !right)
1684 if (viewport.cursorMode)
1686 alignPanel.seqPanel.moveCursor(-size, 0);
1690 groupAdjustment = -size;
1694 if (groupAdjustment != 0)
1696 viewport.getSelectionGroup().setStartRes(
1697 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1698 viewport.getSelectionGroup().setEndRes(
1699 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1702 boolean appendHistoryItem = false;
1703 if (viewport.historyList != null && viewport.historyList.size() > 0
1704 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1706 appendHistoryItem = ssc
1707 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1711 if (!appendHistoryItem)
1713 addHistoryItem(ssc);
1726 protected void copy_actionPerformed(ActionEvent e)
1729 if (viewport.getSelectionGroup() == null)
1733 // TODO: preserve the ordering of displayed alignment annotation in any
1734 // internal paste (particularly sequence associated annotation)
1735 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1736 String[] omitHidden = null;
1738 if (viewport.hasHiddenColumns())
1740 omitHidden = viewport.getViewAsString(true);
1743 String output = new FormatAdapter().formatSequences("Fasta", seqs,
1746 StringSelection ss = new StringSelection(output);
1750 jalview.gui.Desktop.internalCopy = true;
1751 // Its really worth setting the clipboard contents
1752 // to empty before setting the large StringSelection!!
1753 Toolkit.getDefaultToolkit().getSystemClipboard()
1754 .setContents(new StringSelection(""), null);
1756 Toolkit.getDefaultToolkit().getSystemClipboard()
1757 .setContents(ss, Desktop.instance);
1758 } catch (OutOfMemoryError er)
1760 new OOMWarning("copying region", er);
1764 Vector hiddenColumns = null;
1765 if (viewport.hasHiddenColumns())
1767 hiddenColumns = new Vector();
1768 int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
1769 .getSelectionGroup().getEndRes();
1770 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1773 int[] region = (int[]) viewport.getColumnSelection()
1774 .getHiddenColumns().elementAt(i);
1775 if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
1777 hiddenColumns.addElement(new int[]
1778 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1783 Desktop.jalviewClipboard = new Object[]
1784 { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
1785 statusBar.setText(MessageManager.formatMessage(
1786 "label.copied_sequences_to_clipboard", new String[]
1787 { Integer.valueOf(seqs.length).toString() }));
1797 protected void pasteNew_actionPerformed(ActionEvent e)
1809 protected void pasteThis_actionPerformed(ActionEvent e)
1815 * Paste contents of Jalview clipboard
1817 * @param newAlignment
1818 * true to paste to a new alignment, otherwise add to this.
1820 void paste(boolean newAlignment)
1822 boolean externalPaste = true;
1825 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1826 Transferable contents = c.getContents(this);
1828 if (contents == null)
1836 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1837 if (str.length() < 1)
1842 format = new IdentifyFile().Identify(str, "Paste");
1844 } catch (OutOfMemoryError er)
1846 new OOMWarning("Out of memory pasting sequences!!", er);
1850 SequenceI[] sequences;
1851 boolean annotationAdded = false;
1852 AlignmentI alignment = null;
1854 if (Desktop.jalviewClipboard != null)
1856 // The clipboard was filled from within Jalview, we must use the
1858 // And dataset from the copied alignment
1859 SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
1860 // be doubly sure that we create *new* sequence objects.
1861 sequences = new SequenceI[newseq.length];
1862 for (int i = 0; i < newseq.length; i++)
1864 sequences[i] = new Sequence(newseq[i]);
1866 alignment = new Alignment(sequences);
1867 externalPaste = false;
1871 // parse the clipboard as an alignment.
1872 alignment = new FormatAdapter().readFile(str, "Paste", format);
1873 sequences = alignment.getSequencesArray();
1877 ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
1883 if (Desktop.jalviewClipboard != null)
1885 // dataset is inherited
1886 alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
1890 // new dataset is constructed
1891 alignment.setDataset(null);
1893 alwidth = alignment.getWidth() + 1;
1897 AlignmentI pastedal = alignment; // preserve pasted alignment object
1898 // Add pasted sequences and dataset into existing alignment.
1899 alignment = viewport.getAlignment();
1900 alwidth = alignment.getWidth() + 1;
1901 // decide if we need to import sequences from an existing dataset
1902 boolean importDs = Desktop.jalviewClipboard != null
1903 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1904 // importDs==true instructs us to copy over new dataset sequences from
1905 // an existing alignment
1906 Vector newDs = (importDs) ? new Vector() : null; // used to create
1907 // minimum dataset set
1909 for (int i = 0; i < sequences.length; i++)
1913 newDs.addElement(null);
1915 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1917 if (importDs && ds != null)
1919 if (!newDs.contains(ds))
1921 newDs.setElementAt(ds, i);
1922 ds = new Sequence(ds);
1923 // update with new dataset sequence
1924 sequences[i].setDatasetSequence(ds);
1928 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1933 // copy and derive new dataset sequence
1934 sequences[i] = sequences[i].deriveSequence();
1935 alignment.getDataset().addSequence(
1936 sequences[i].getDatasetSequence());
1937 // TODO: avoid creation of duplicate dataset sequences with a
1938 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1940 alignment.addSequence(sequences[i]); // merges dataset
1944 newDs.clear(); // tidy up
1946 if (alignment.getAlignmentAnnotation() != null)
1948 for (AlignmentAnnotation alan : alignment
1949 .getAlignmentAnnotation())
1951 if (alan.graphGroup > fgroup)
1953 fgroup = alan.graphGroup;
1957 if (pastedal.getAlignmentAnnotation() != null)
1959 // Add any annotation attached to alignment.
1960 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1961 for (int i = 0; i < alann.length; i++)
1963 annotationAdded = true;
1964 if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
1966 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1967 if (newann.graphGroup > -1)
1969 if (newGraphGroups.size() <= newann.graphGroup
1970 || newGraphGroups.get(newann.graphGroup) == null)
1972 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
1974 newGraphGroups.add(q, null);
1976 newGraphGroups.set(newann.graphGroup, new Integer(
1979 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
1983 newann.padAnnotation(alwidth);
1984 alignment.addAnnotation(newann);
1994 addHistoryItem(new EditCommand(
1995 MessageManager.getString("label.add_sequences"),
1997 sequences, 0, alignment.getWidth(), alignment));
1999 // Add any annotations attached to sequences
2000 for (int i = 0; i < sequences.length; i++)
2002 if (sequences[i].getAnnotation() != null)
2004 AlignmentAnnotation newann;
2005 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
2007 annotationAdded = true;
2008 newann = sequences[i].getAnnotation()[a];
2009 newann.adjustForAlignment();
2010 newann.padAnnotation(alwidth);
2011 if (newann.graphGroup > -1)
2013 if (newann.graphGroup > -1)
2015 if (newGraphGroups.size() <= newann.graphGroup
2016 || newGraphGroups.get(newann.graphGroup) == null)
2018 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
2020 newGraphGroups.add(q, null);
2022 newGraphGroups.set(newann.graphGroup, new Integer(
2025 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
2029 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
2034 .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
2041 // propagate alignment changed.
2042 viewport.setEndSeq(alignment.getHeight());
2043 if (annotationAdded)
2045 // Duplicate sequence annotation in all views.
2046 AlignmentI[] alview = this.getViewAlignments();
2047 for (int i = 0; i < sequences.length; i++)
2049 AlignmentAnnotation sann[] = sequences[i].getAnnotation();
2054 for (int avnum = 0; avnum < alview.length; avnum++)
2056 if (alview[avnum] != alignment)
2058 // duplicate in a view other than the one with input focus
2059 int avwidth = alview[avnum].getWidth() + 1;
2060 // this relies on sann being preserved after we
2061 // modify the sequence's annotation array for each duplication
2062 for (int a = 0; a < sann.length; a++)
2064 AlignmentAnnotation newann = new AlignmentAnnotation(
2066 sequences[i].addAlignmentAnnotation(newann);
2067 newann.padAnnotation(avwidth);
2068 alview[avnum].addAnnotation(newann); // annotation was
2069 // duplicated earlier
2070 // TODO JAL-1145 graphGroups are not updated for sequence
2071 // annotation added to several views. This may cause
2073 alview[avnum].setAnnotationIndex(newann, a);
2078 buildSortByAnnotationScoresMenu();
2080 viewport.firePropertyChange("alignment", null,
2081 alignment.getSequences());
2082 if (alignPanels != null)
2084 for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))
2086 ap.validateAnnotationDimensions(false);
2091 alignPanel.validateAnnotationDimensions(false);
2097 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2099 String newtitle = new String("Copied sequences");
2101 if (Desktop.jalviewClipboard != null
2102 && Desktop.jalviewClipboard[2] != null)
2104 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2105 for (int i = 0; i < hc.size(); i++)
2107 int[] region = (int[]) hc.elementAt(i);
2108 af.viewport.hideColumns(region[0], region[1]);
2112 // >>>This is a fix for the moment, until a better solution is
2114 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
2116 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
2118 // TODO: maintain provenance of an alignment, rather than just make the
2119 // title a concatenation of operations.
2122 if (title.startsWith("Copied sequences"))
2128 newtitle = newtitle.concat("- from " + title);
2133 newtitle = new String("Pasted sequences");
2136 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
2141 } catch (Exception ex)
2143 ex.printStackTrace();
2144 System.out.println("Exception whilst pasting: " + ex);
2145 // could be anything being pasted in here
2151 protected void expand_newalign(ActionEvent e)
2155 AlignmentI alignment = AlignmentUtils.expandContext(getViewport()
2156 .getAlignment(), -1);
2157 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2159 String newtitle = new String("Flanking alignment");
2161 if (Desktop.jalviewClipboard != null
2162 && Desktop.jalviewClipboard[2] != null)
2164 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2165 for (int i = 0; i < hc.size(); i++)
2167 int[] region = (int[]) hc.elementAt(i);
2168 af.viewport.hideColumns(region[0], region[1]);
2172 // >>>This is a fix for the moment, until a better solution is
2174 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
2176 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
2178 // TODO: maintain provenance of an alignment, rather than just make the
2179 // title a concatenation of operations.
2181 if (title.startsWith("Copied sequences"))
2187 newtitle = newtitle.concat("- from " + title);
2191 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT);
2193 } catch (Exception ex)
2195 ex.printStackTrace();
2196 System.out.println("Exception whilst pasting: " + ex);
2197 // could be anything being pasted in here
2198 } catch (OutOfMemoryError oom)
2200 new OOMWarning("Viewing flanking region of alignment", oom);
2211 protected void cut_actionPerformed(ActionEvent e)
2213 copy_actionPerformed(null);
2214 delete_actionPerformed(null);
2224 protected void delete_actionPerformed(ActionEvent evt)
2227 SequenceGroup sg = viewport.getSelectionGroup();
2233 List<SequenceI> seqs = new ArrayList<SequenceI>(sg.getSize());
2235 for (int i = 0; i < sg.getSize(); i++)
2237 seq = sg.getSequenceAt(i);
2241 // If the cut affects all sequences, warn, remove highlighted columns
2242 if (sg.getSize() == viewport.getAlignment().getHeight())
2244 int confirm = JOptionPane.showConfirmDialog(this,
2245 MessageManager.getString("warn.delete_all"), // $NON-NLS-1$
2246 MessageManager.getString("label.delete_all"), // $NON-NLS-1$
2247 JOptionPane.OK_CANCEL_OPTION);
2249 if (confirm == JOptionPane.CANCEL_OPTION
2250 || confirm == JOptionPane.CLOSED_OPTION)
2254 viewport.getColumnSelection().removeElements(sg.getStartRes(),
2255 sg.getEndRes() + 1);
2258 SequenceI[] cut = new SequenceI[seqs.size()];
2259 for (int i = 0; i < seqs.size(); i++)
2261 cut[i] = seqs.get(i);
2265 * //ADD HISTORY ITEM
2267 addHistoryItem(new EditCommand(
2268 MessageManager.getString("label.cut_sequences"), Action.CUT,
2269 cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
2270 viewport.getAlignment()));
2272 viewport.setSelectionGroup(null);
2273 viewport.sendSelection();
2274 viewport.getAlignment().deleteGroup(sg);
2276 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2278 if (viewport.getAlignment().getHeight() < 1)
2282 this.setClosed(true);
2283 } catch (Exception ex)
2296 protected void deleteGroups_actionPerformed(ActionEvent e)
2298 if (avc.deleteGroups())
2300 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
2301 alignPanel.updateAnnotation();
2302 alignPanel.paintAlignment(true);
2313 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2315 SequenceGroup sg = new SequenceGroup();
2317 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2319 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
2322 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
2323 viewport.setSelectionGroup(sg);
2324 viewport.sendSelection();
2325 alignPanel.paintAlignment(true);
2326 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2336 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2338 if (viewport.cursorMode)
2340 alignPanel.seqPanel.keyboardNo1 = null;
2341 alignPanel.seqPanel.keyboardNo2 = null;
2343 viewport.setSelectionGroup(null);
2344 viewport.getColumnSelection().clear();
2345 viewport.setSelectionGroup(null);
2346 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
2347 alignPanel.idPanel.idCanvas.searchResults = null;
2348 alignPanel.paintAlignment(true);
2349 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2350 viewport.sendSelection();
2360 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
2362 SequenceGroup sg = viewport.getSelectionGroup();
2366 selectAllSequenceMenuItem_actionPerformed(null);
2371 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2373 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
2376 alignPanel.paintAlignment(true);
2377 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2378 viewport.sendSelection();
2382 public void invertColSel_actionPerformed(ActionEvent e)
2384 viewport.invertColumnSelection();
2385 alignPanel.paintAlignment(true);
2386 viewport.sendSelection();
2396 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2398 trimAlignment(true);
2408 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
2410 trimAlignment(false);
2413 void trimAlignment(boolean trimLeft)
2415 ColumnSelection colSel = viewport.getColumnSelection();
2418 if (colSel.size() > 0)
2422 column = colSel.getMin();
2426 column = colSel.getMax();
2430 if (viewport.getSelectionGroup() != null)
2432 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2433 viewport.getHiddenRepSequences());
2437 seqs = viewport.getAlignment().getSequencesArray();
2440 TrimRegionCommand trimRegion;
2443 trimRegion = new TrimRegionCommand("Remove Left",
2444 TrimRegionCommand.TRIM_LEFT, seqs, column,
2445 viewport.getAlignment(), viewport.getColumnSelection(),
2446 viewport.getSelectionGroup());
2447 viewport.setStartRes(0);
2451 trimRegion = new TrimRegionCommand("Remove Right",
2452 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2453 viewport.getAlignment(), viewport.getColumnSelection(),
2454 viewport.getSelectionGroup());
2457 statusBar.setText(MessageManager.formatMessage(
2458 "label.removed_columns", new String[]
2459 { Integer.valueOf(trimRegion.getSize()).toString() }));
2461 addHistoryItem(trimRegion);
2463 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2465 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2466 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2468 viewport.getAlignment().deleteGroup(sg);
2472 viewport.firePropertyChange("alignment", null, viewport
2473 .getAlignment().getSequences());
2484 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2486 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2489 if (viewport.getSelectionGroup() != null)
2491 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2492 viewport.getHiddenRepSequences());
2493 start = viewport.getSelectionGroup().getStartRes();
2494 end = viewport.getSelectionGroup().getEndRes();
2498 seqs = viewport.getAlignment().getSequencesArray();
2501 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2502 "Remove Gapped Columns", seqs, start, end,
2503 viewport.getAlignment());
2505 addHistoryItem(removeGapCols);
2507 statusBar.setText(MessageManager.formatMessage(
2508 "label.removed_empty_columns", new String[]
2509 { Integer.valueOf(removeGapCols.getSize()).toString() }));
2511 // This is to maintain viewport position on first residue
2512 // of first sequence
2513 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2514 int startRes = seq.findPosition(viewport.startRes);
2515 // ShiftList shifts;
2516 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2517 // edit.alColumnChanges=shifts.getInverse();
2518 // if (viewport.hasHiddenColumns)
2519 // viewport.getColumnSelection().compensateForEdits(shifts);
2520 viewport.setStartRes(seq.findIndex(startRes) - 1);
2521 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2533 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2535 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2538 if (viewport.getSelectionGroup() != null)
2540 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2541 viewport.getHiddenRepSequences());
2542 start = viewport.getSelectionGroup().getStartRes();
2543 end = viewport.getSelectionGroup().getEndRes();
2547 seqs = viewport.getAlignment().getSequencesArray();
2550 // This is to maintain viewport position on first residue
2551 // of first sequence
2552 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2553 int startRes = seq.findPosition(viewport.startRes);
2555 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2556 viewport.getAlignment()));
2558 viewport.setStartRes(seq.findIndex(startRes) - 1);
2560 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2572 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2574 viewport.setPadGaps(padGapsMenuitem.isSelected());
2575 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2581 // if (justifySeqs>0)
2583 // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
2596 public void findMenuItem_actionPerformed(ActionEvent e)
2602 public void newView_actionPerformed(ActionEvent e)
2609 * @param copyAnnotation
2610 * if true then duplicate all annnotation, groups and settings
2611 * @return new alignment panel, already displayed.
2613 public AlignmentPanel newView(boolean copyAnnotation)
2615 return newView(null, copyAnnotation);
2621 * title of newly created view
2622 * @return new alignment panel, already displayed.
2624 public AlignmentPanel newView(String viewTitle)
2626 return newView(viewTitle, true);
2632 * title of newly created view
2633 * @param copyAnnotation
2634 * if true then duplicate all annnotation, groups and settings
2635 * @return new alignment panel, already displayed.
2637 public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)
2639 AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
2641 if (!copyAnnotation)
2643 // just remove all the current annotation except for the automatic stuff
2644 newap.av.getAlignment().deleteAllGroups();
2645 for (AlignmentAnnotation alan : newap.av.getAlignment()
2646 .getAlignmentAnnotation())
2648 if (!alan.autoCalculated)
2650 newap.av.getAlignment().deleteAnnotation(alan);
2656 newap.av.gatherViewsHere = false;
2658 if (viewport.viewName == null)
2660 viewport.viewName = "Original";
2663 newap.av.historyList = viewport.historyList;
2664 newap.av.redoList = viewport.redoList;
2666 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2667 // make sure the new view has a unique name - this is essential for Jalview
2669 boolean addFirstIndex = false;
2670 if (viewTitle == null || viewTitle.trim().length() == 0)
2672 viewTitle = MessageManager.getString("action.view");
2673 addFirstIndex = true;
2677 index = 1;// we count from 1 if given a specific name
2679 String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");
2680 Vector comps = (Vector) PaintRefresher.components.get(viewport
2681 .getSequenceSetId());
2682 Vector existingNames = new Vector();
2683 for (int i = 0; i < comps.size(); i++)
2685 if (comps.elementAt(i) instanceof AlignmentPanel)
2687 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
2688 if (!existingNames.contains(ap.av.viewName))
2690 existingNames.addElement(ap.av.viewName);
2695 while (existingNames.contains(newViewName))
2697 newViewName = viewTitle + " " + (++index);
2700 newap.av.viewName = newViewName;
2702 addAlignmentPanel(newap, true);
2703 newap.alignmentChanged();
2705 if (alignPanels.size() == 2)
2707 viewport.gatherViewsHere = true;
2709 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2714 public void expandViews_actionPerformed(ActionEvent e)
2716 Desktop.instance.explodeViews(this);
2720 public void gatherViews_actionPerformed(ActionEvent e)
2722 Desktop.instance.gatherViews(this);
2732 public void font_actionPerformed(ActionEvent e)
2734 new FontChooser(alignPanel);
2744 protected void seqLimit_actionPerformed(ActionEvent e)
2746 viewport.setShowJVSuffix(seqLimits.isSelected());
2748 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
2749 .calculateIdWidth());
2750 alignPanel.paintAlignment(true);
2754 public void idRightAlign_actionPerformed(ActionEvent e)
2756 viewport.rightAlignIds = idRightAlign.isSelected();
2757 alignPanel.paintAlignment(true);
2761 public void centreColumnLabels_actionPerformed(ActionEvent e)
2763 viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
2764 alignPanel.paintAlignment(true);
2770 * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
2773 protected void followHighlight_actionPerformed()
2775 if (viewport.followHighlight = this.followHighlightMenuItem.getState())
2777 alignPanel.scrollToPosition(
2778 alignPanel.seqPanel.seqCanvas.searchResults, false);
2789 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2791 viewport.setColourText(colourTextMenuItem.isSelected());
2792 alignPanel.paintAlignment(true);
2802 public void wrapMenuItem_actionPerformed(ActionEvent e)
2804 scaleAbove.setVisible(wrapMenuItem.isSelected());
2805 scaleLeft.setVisible(wrapMenuItem.isSelected());
2806 scaleRight.setVisible(wrapMenuItem.isSelected());
2807 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2808 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2812 public void showAllSeqs_actionPerformed(ActionEvent e)
2814 viewport.showAllHiddenSeqs();
2818 public void showAllColumns_actionPerformed(ActionEvent e)
2820 viewport.showAllHiddenColumns();
2825 public void hideSelSequences_actionPerformed(ActionEvent e)
2827 viewport.hideAllSelectedSeqs();
2828 alignPanel.paintAlignment(true);
2832 * called by key handler and the hide all/show all menu items
2837 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
2840 boolean hide = false;
2841 SequenceGroup sg = viewport.getSelectionGroup();
2842 if (!toggleSeqs && !toggleCols)
2844 // Hide everything by the current selection - this is a hack - we do the
2845 // invert and then hide
2846 // first check that there will be visible columns after the invert.
2847 if ((viewport.getColumnSelection() != null
2848 && viewport.getColumnSelection().getSelected() != null && viewport
2849 .getColumnSelection().getSelected().size() > 0)
2850 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
2853 // now invert the sequence set, if required - empty selection implies
2854 // that no hiding is required.
2857 invertSequenceMenuItem_actionPerformed(null);
2858 sg = viewport.getSelectionGroup();
2862 viewport.expandColSelection(sg, true);
2863 // finally invert the column selection and get the new sequence
2865 invertColSel_actionPerformed(null);
2872 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
2874 hideSelSequences_actionPerformed(null);
2877 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
2880 showAllSeqs_actionPerformed(null);
2886 if (viewport.getColumnSelection().getSelected().size() > 0)
2888 hideSelColumns_actionPerformed(null);
2891 viewport.setSelectionGroup(sg);
2896 showAllColumns_actionPerformed(null);
2905 * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
2906 * event.ActionEvent)
2909 public void hideAllButSelection_actionPerformed(ActionEvent e)
2911 toggleHiddenRegions(false, false);
2918 * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
2922 public void hideAllSelection_actionPerformed(ActionEvent e)
2924 SequenceGroup sg = viewport.getSelectionGroup();
2925 viewport.expandColSelection(sg, false);
2926 viewport.hideAllSelectedSeqs();
2927 viewport.hideSelectedColumns();
2928 alignPanel.paintAlignment(true);
2935 * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
2939 public void showAllhidden_actionPerformed(ActionEvent e)
2941 viewport.showAllHiddenColumns();
2942 viewport.showAllHiddenSeqs();
2943 alignPanel.paintAlignment(true);
2947 public void hideSelColumns_actionPerformed(ActionEvent e)
2949 viewport.hideSelectedColumns();
2950 alignPanel.paintAlignment(true);
2954 public void hiddenMarkers_actionPerformed(ActionEvent e)
2956 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2967 protected void scaleAbove_actionPerformed(ActionEvent e)
2969 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2970 alignPanel.paintAlignment(true);
2980 protected void scaleLeft_actionPerformed(ActionEvent e)
2982 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2983 alignPanel.paintAlignment(true);
2993 protected void scaleRight_actionPerformed(ActionEvent e)
2995 viewport.setScaleRightWrapped(scaleRight.isSelected());
2996 alignPanel.paintAlignment(true);
3006 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
3008 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
3009 alignPanel.paintAlignment(true);
3019 public void viewTextMenuItem_actionPerformed(ActionEvent e)
3021 viewport.setShowText(viewTextMenuItem.isSelected());
3022 alignPanel.paintAlignment(true);
3032 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
3034 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
3035 alignPanel.paintAlignment(true);
3038 public FeatureSettings featureSettings;
3041 public void featureSettings_actionPerformed(ActionEvent e)
3043 if (featureSettings != null)
3045 featureSettings.close();
3046 featureSettings = null;
3048 if (!showSeqFeatures.isSelected())
3050 // make sure features are actually displayed
3051 showSeqFeatures.setSelected(true);
3052 showSeqFeatures_actionPerformed(null);
3054 featureSettings = new FeatureSettings(this);
3058 * Set or clear 'Show Sequence Features'
3064 public void showSeqFeatures_actionPerformed(ActionEvent evt)
3066 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
3067 alignPanel.paintAlignment(true);
3068 if (alignPanel.getOverviewPanel() != null)
3070 alignPanel.getOverviewPanel().updateOverviewImage();
3075 * Set or clear 'Show Sequence Features'
3081 public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
3083 viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
3085 if (viewport.getShowSequenceFeaturesHeight())
3087 // ensure we're actually displaying features
3088 viewport.setShowSequenceFeatures(true);
3089 showSeqFeatures.setSelected(true);
3091 alignPanel.paintAlignment(true);
3092 if (alignPanel.getOverviewPanel() != null)
3094 alignPanel.getOverviewPanel().updateOverviewImage();
3099 * Action on toggle of the 'Show annotations' menu item. This shows or hides
3100 * the annotations panel as a whole.
3102 * The options to show/hide all annotations should be enabled when the panel
3103 * is shown, and disabled when the panel is hidden.
3108 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
3110 final boolean setVisible = annotationPanelMenuItem.isSelected();
3111 viewport.setShowAnnotation(setVisible);
3112 alignPanel.setAnnotationVisible(setVisible);
3113 this.showAllSeqAnnotations.setEnabled(setVisible);
3114 this.hideAllSeqAnnotations.setEnabled(setVisible);
3115 this.showAllAlAnnotations.setEnabled(setVisible);
3116 this.hideAllAlAnnotations.setEnabled(setVisible);
3120 public void alignmentProperties()
3122 JEditorPane editPane = new JEditorPane("text/html", "");
3123 editPane.setEditable(false);
3124 StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
3126 editPane.setText(MessageManager.formatMessage("label.html_content",
3128 { contents.toString() }));
3129 JInternalFrame frame = new JInternalFrame();
3130 frame.getContentPane().add(new JScrollPane(editPane));
3132 Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage(
3133 "label.alignment_properties", new String[]
3134 { getTitle() }), 500, 400);
3144 public void overviewMenuItem_actionPerformed(ActionEvent e)
3146 if (alignPanel.overviewPanel != null)
3151 JInternalFrame frame = new JInternalFrame();
3152 OverviewPanel overview = new OverviewPanel(alignPanel);
3153 frame.setContentPane(overview);
3154 Desktop.addInternalFrame(frame, MessageManager.formatMessage(
3155 "label.overview_params", new String[]
3156 { this.getTitle() }), frame.getWidth(), frame.getHeight());
3158 frame.setLayer(JLayeredPane.PALETTE_LAYER);
3159 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
3162 public void internalFrameClosed(
3163 javax.swing.event.InternalFrameEvent evt)
3165 alignPanel.setOverviewPanel(null);
3169 alignPanel.setOverviewPanel(overview);
3173 public void textColour_actionPerformed(ActionEvent e)
3175 new TextColourChooser().chooseColour(alignPanel, null);
3185 protected void noColourmenuItem_actionPerformed(ActionEvent e)
3197 public void clustalColour_actionPerformed(ActionEvent e)
3199 changeColour(new ClustalxColourScheme(viewport.getAlignment(),
3200 viewport.getHiddenRepSequences()));
3210 public void zappoColour_actionPerformed(ActionEvent e)
3212 changeColour(new ZappoColourScheme());
3222 public void taylorColour_actionPerformed(ActionEvent e)
3224 changeColour(new TaylorColourScheme());
3234 public void hydrophobicityColour_actionPerformed(ActionEvent e)
3236 changeColour(new HydrophobicColourScheme());
3246 public void helixColour_actionPerformed(ActionEvent e)
3248 changeColour(new HelixColourScheme());
3258 public void strandColour_actionPerformed(ActionEvent e)
3260 changeColour(new StrandColourScheme());
3270 public void turnColour_actionPerformed(ActionEvent e)
3272 changeColour(new TurnColourScheme());
3282 public void buriedColour_actionPerformed(ActionEvent e)
3284 changeColour(new BuriedColourScheme());
3294 public void nucleotideColour_actionPerformed(ActionEvent e)
3296 changeColour(new NucleotideColourScheme());
3300 public void purinePyrimidineColour_actionPerformed(ActionEvent e)
3302 changeColour(new PurinePyrimidineColourScheme());
3306 * public void covariationColour_actionPerformed(ActionEvent e) {
3308 * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation
3312 public void annotationColour_actionPerformed(ActionEvent e)
3314 new AnnotationColourChooser(viewport, alignPanel);
3318 public void rnahelicesColour_actionPerformed(ActionEvent e)
3320 new RNAHelicesColourChooser(viewport, alignPanel);
3330 protected void applyToAllGroups_actionPerformed(ActionEvent e)
3332 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
3341 public void changeColour(ColourSchemeI cs)
3343 // TODO: compare with applet and pull up to model method
3348 if (viewport.getAbovePIDThreshold())
3350 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
3352 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3356 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3359 if (viewport.getConservationSelected())
3362 Alignment al = (Alignment) viewport.getAlignment();
3363 Conservation c = new Conservation("All",
3364 ResidueProperties.propHash, 3, al.getSequences(), 0,
3368 c.verdict(false, viewport.getConsPercGaps());
3370 cs.setConservation(c);
3372 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
3377 cs.setConservation(null);
3380 cs.setConsensus(viewport.getSequenceConsensusHash());
3383 viewport.setGlobalColourScheme(cs);
3385 if (viewport.getColourAppliesToAllGroups())
3388 for (SequenceGroup sg : viewport.getAlignment().getGroups())
3396 if (cs instanceof ClustalxColourScheme)
3398 sg.cs = new ClustalxColourScheme(sg,
3399 viewport.getHiddenRepSequences());
3401 else if (cs instanceof UserColourScheme)
3403 sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
3409 sg.cs = cs.getClass().newInstance();
3410 } catch (Exception ex)
3415 if (viewport.getAbovePIDThreshold()
3416 || cs instanceof PIDColourScheme
3417 || cs instanceof Blosum62ColourScheme)
3419 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3421 sg.cs.setConsensus(AAFrequency.calculate(
3422 sg.getSequences(viewport.getHiddenRepSequences()),
3423 sg.getStartRes(), sg.getEndRes() + 1));
3427 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3430 if (viewport.getConservationSelected())
3432 Conservation c = new Conservation("Group",
3433 ResidueProperties.propHash, 3, sg.getSequences(viewport
3434 .getHiddenRepSequences()), sg.getStartRes(),
3435 sg.getEndRes() + 1);
3437 c.verdict(false, viewport.getConsPercGaps());
3438 sg.cs.setConservation(c);
3442 sg.cs.setConservation(null);
3447 if (alignPanel.getOverviewPanel() != null)
3449 alignPanel.getOverviewPanel().updateOverviewImage();
3452 alignPanel.paintAlignment(true);
3462 protected void modifyPID_actionPerformed(ActionEvent e)
3464 if (viewport.getAbovePIDThreshold()
3465 && viewport.getGlobalColourScheme() != null)
3467 SliderPanel.setPIDSliderSource(alignPanel,
3468 viewport.getGlobalColourScheme(), "Background");
3469 SliderPanel.showPIDSlider();
3480 protected void modifyConservation_actionPerformed(ActionEvent e)
3482 if (viewport.getConservationSelected()
3483 && viewport.getGlobalColourScheme() != null)
3485 SliderPanel.setConservationSlider(alignPanel,
3486 viewport.getGlobalColourScheme(), "Background");
3487 SliderPanel.showConservationSlider();
3498 protected void conservationMenuItem_actionPerformed(ActionEvent e)
3500 viewport.setConservationSelected(conservationMenuItem.isSelected());
3502 viewport.setAbovePIDThreshold(false);
3503 abovePIDThreshold.setSelected(false);
3505 changeColour(viewport.getGlobalColourScheme());
3507 modifyConservation_actionPerformed(null);
3517 public void abovePIDThreshold_actionPerformed(ActionEvent e)
3519 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
3521 conservationMenuItem.setSelected(false);
3522 viewport.setConservationSelected(false);
3524 changeColour(viewport.getGlobalColourScheme());
3526 modifyPID_actionPerformed(null);
3536 public void userDefinedColour_actionPerformed(ActionEvent e)
3538 if (e.getActionCommand().equals(
3539 MessageManager.getString("action.user_defined")))
3541 new UserDefinedColours(alignPanel, null);
3545 UserColourScheme udc = (UserColourScheme) UserDefinedColours
3546 .getUserColourSchemes().get(e.getActionCommand());
3552 public void updateUserColourMenu()
3555 Component[] menuItems = colourMenu.getMenuComponents();
3556 int i, iSize = menuItems.length;
3557 for (i = 0; i < iSize; i++)
3559 if (menuItems[i].getName() != null
3560 && menuItems[i].getName().equals("USER_DEFINED"))
3562 colourMenu.remove(menuItems[i]);
3566 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
3568 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
3569 .getUserColourSchemes().keys();
3571 while (userColours.hasMoreElements())
3573 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
3574 userColours.nextElement().toString());
3575 radioItem.setName("USER_DEFINED");
3576 radioItem.addMouseListener(new MouseAdapter()
3579 public void mousePressed(MouseEvent evt)
3581 if (evt.isControlDown()
3582 || SwingUtilities.isRightMouseButton(evt))
3584 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
3586 int option = JOptionPane.showInternalConfirmDialog(
3587 jalview.gui.Desktop.desktop,
3589 .getString("label.remove_from_default_list"),
3591 .getString("label.remove_user_defined_colour"),
3592 JOptionPane.YES_NO_OPTION);
3593 if (option == JOptionPane.YES_OPTION)
3595 jalview.gui.UserDefinedColours
3596 .removeColourFromDefaults(radioItem.getText());
3597 colourMenu.remove(radioItem);
3601 radioItem.addActionListener(new ActionListener()
3604 public void actionPerformed(ActionEvent evt)
3606 userDefinedColour_actionPerformed(evt);
3613 radioItem.addActionListener(new ActionListener()
3616 public void actionPerformed(ActionEvent evt)
3618 userDefinedColour_actionPerformed(evt);
3622 colourMenu.insert(radioItem, 15);
3623 colours.add(radioItem);
3635 public void PIDColour_actionPerformed(ActionEvent e)
3637 changeColour(new PIDColourScheme());
3647 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
3649 changeColour(new Blosum62ColourScheme());
3659 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
3661 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3662 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
3663 .getAlignment().getSequenceAt(0), null);
3664 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
3665 viewport.getAlignment()));
3666 alignPanel.paintAlignment(true);
3676 public void sortIDMenuItem_actionPerformed(ActionEvent e)
3678 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3679 AlignmentSorter.sortByID(viewport.getAlignment());
3680 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
3681 viewport.getAlignment()));
3682 alignPanel.paintAlignment(true);
3692 public void sortLengthMenuItem_actionPerformed(ActionEvent e)
3694 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3695 AlignmentSorter.sortByLength(viewport.getAlignment());
3696 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
3697 viewport.getAlignment()));
3698 alignPanel.paintAlignment(true);
3708 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
3710 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3711 AlignmentSorter.sortByGroup(viewport.getAlignment());
3712 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
3713 viewport.getAlignment()));
3715 alignPanel.paintAlignment(true);
3725 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
3727 new RedundancyPanel(alignPanel, this);
3737 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
3739 if ((viewport.getSelectionGroup() == null)
3740 || (viewport.getSelectionGroup().getSize() < 2))
3742 JOptionPane.showInternalMessageDialog(this, MessageManager
3743 .getString("label.you_must_select_least_two_sequences"),
3744 MessageManager.getString("label.invalid_selection"),
3745 JOptionPane.WARNING_MESSAGE);
3749 JInternalFrame frame = new JInternalFrame();
3750 frame.setContentPane(new PairwiseAlignPanel(viewport));
3751 Desktop.addInternalFrame(frame,
3752 MessageManager.getString("action.pairwise_alignment"), 600,
3764 public void PCAMenuItem_actionPerformed(ActionEvent e)
3766 if (((viewport.getSelectionGroup() != null)
3767 && (viewport.getSelectionGroup().getSize() < 4) && (viewport
3768 .getSelectionGroup().getSize() > 0))
3769 || (viewport.getAlignment().getHeight() < 4))
3772 .showInternalMessageDialog(
3775 .getString("label.principal_component_analysis_must_take_least_four_input_sequences"),
3777 .getString("label.sequence_selection_insufficient"),
3778 JOptionPane.WARNING_MESSAGE);
3783 new PCAPanel(alignPanel);
3787 public void autoCalculate_actionPerformed(ActionEvent e)
3789 viewport.autoCalculateConsensus = autoCalculate.isSelected();
3790 if (viewport.autoCalculateConsensus)
3792 viewport.firePropertyChange("alignment", null, viewport
3793 .getAlignment().getSequences());
3798 public void sortByTreeOption_actionPerformed(ActionEvent e)
3800 viewport.sortByTree = sortByTree.isSelected();
3804 protected void listenToViewSelections_actionPerformed(ActionEvent e)
3806 viewport.followSelection = listenToViewSelections.isSelected();
3816 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
3818 NewTreePanel("AV", "PID", "Average distance tree using PID");
3828 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
3830 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
3840 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3842 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
3852 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3854 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
3867 void NewTreePanel(String type, String pwType, String title)
3871 if (viewport.getSelectionGroup() != null
3872 && viewport.getSelectionGroup().getSize() > 0)
3874 if (viewport.getSelectionGroup().getSize() < 3)
3880 .getString("label.you_need_more_two_sequences_selected_build_tree"),
3882 .getString("label.not_enough_sequences"),
3883 JOptionPane.WARNING_MESSAGE);
3887 SequenceGroup sg = viewport.getSelectionGroup();
3889 /* Decide if the selection is a column region */
3890 for (SequenceI _s : sg.getSequences())
3892 if (_s.getLength() < sg.getEndRes())
3898 .getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
3900 .getString("label.sequences_selection_not_aligned"),
3901 JOptionPane.WARNING_MESSAGE);
3907 title = title + " on region";
3908 tp = new TreePanel(alignPanel, type, pwType);
3912 // are the visible sequences aligned?
3913 if (!viewport.getAlignment().isAligned(false))
3919 .getString("label.sequences_must_be_aligned_before_creating_tree"),
3921 .getString("label.sequences_not_aligned"),
3922 JOptionPane.WARNING_MESSAGE);
3927 if (viewport.getAlignment().getHeight() < 2)
3932 tp = new TreePanel(alignPanel, type, pwType);
3937 if (viewport.viewName != null)
3939 title += viewport.viewName + " of ";
3942 title += this.title;
3944 Desktop.addInternalFrame(tp, title, 600, 500);
3955 public void addSortByOrderMenuItem(String title,
3956 final AlignmentOrder order)
3958 final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title}));
3960 item.addActionListener(new java.awt.event.ActionListener()
3963 public void actionPerformed(ActionEvent e)
3965 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3967 // TODO: JBPNote - have to map order entries to curent SequenceI
3969 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3971 addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport
3974 alignPanel.paintAlignment(true);
3980 * Add a new sort by annotation score menu item
3983 * the menu to add the option to
3985 * the label used to retrieve scores for each sequence on the
3988 public void addSortByAnnotScoreMenuItem(JMenu sort,
3989 final String scoreLabel)
3991 final JMenuItem item = new JMenuItem(scoreLabel);
3993 item.addActionListener(new java.awt.event.ActionListener()
3996 public void actionPerformed(ActionEvent e)
3998 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3999 AlignmentSorter.sortByAnnotationScore(scoreLabel,
4000 viewport.getAlignment());// ,viewport.getSelectionGroup());
4001 addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
4002 viewport.getAlignment()));
4003 alignPanel.paintAlignment(true);
4009 * last hash for alignment's annotation array - used to minimise cost of
4012 protected int _annotationScoreVectorHash;
4015 * search the alignment and rebuild the sort by annotation score submenu the
4016 * last alignment annotation vector hash is stored to minimize cost of
4017 * rebuilding in subsequence calls.
4021 public void buildSortByAnnotationScoresMenu()
4023 if (viewport.getAlignment().getAlignmentAnnotation() == null)
4028 if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
4030 sortByAnnotScore.removeAll();
4031 // almost certainly a quicker way to do this - but we keep it simple
4032 Hashtable scoreSorts = new Hashtable();
4033 AlignmentAnnotation aann[];
4034 for (SequenceI sqa : viewport.getAlignment().getSequences())
4036 aann = sqa.getAnnotation();
4037 for (int i = 0; aann != null && i < aann.length; i++)
4039 if (aann[i].hasScore() && aann[i].sequenceRef != null)
4041 scoreSorts.put(aann[i].label, aann[i].label);
4045 Enumeration labels = scoreSorts.keys();
4046 while (labels.hasMoreElements())
4048 addSortByAnnotScoreMenuItem(sortByAnnotScore,
4049 (String) labels.nextElement());
4051 sortByAnnotScore.setVisible(scoreSorts.size() > 0);
4054 _annotationScoreVectorHash = viewport.getAlignment()
4055 .getAlignmentAnnotation().hashCode();
4060 * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
4061 * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
4062 * call. Listeners are added to remove the menu item when the treePanel is
4063 * closed, and adjust the tree leaf to sequence mapping when the alignment is
4067 * Displayed tree window.
4069 * SortBy menu item title.
4072 public void buildTreeMenu()
4074 calculateTree.removeAll();
4075 // build the calculate menu
4077 for (final String type : new String[]
4080 String treecalcnm = MessageManager.getString("label.tree_calc_"
4081 + type.toLowerCase());
4082 for (final Object pwtype : ResidueProperties.scoreMatrices.keySet())
4084 JMenuItem tm = new JMenuItem();
4085 ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype);
4086 if (sm.isProtein() == !viewport.getAlignment().isNucleotide())
4088 String smn = MessageManager.getStringOrReturn(
4089 "label.score_model_", sm.getName());
4090 final String title = MessageManager.formatMessage(
4091 "label.treecalc_title", treecalcnm, smn);
4092 tm.setText(title);//
4093 tm.addActionListener(new java.awt.event.ActionListener()
4096 public void actionPerformed(ActionEvent e)
4098 NewTreePanel(type, (String) pwtype, title);
4101 calculateTree.add(tm);
4106 sortByTreeMenu.removeAll();
4108 Vector comps = (Vector) PaintRefresher.components.get(viewport
4109 .getSequenceSetId());
4110 Vector treePanels = new Vector();
4111 int i, iSize = comps.size();
4112 for (i = 0; i < iSize; i++)
4114 if (comps.elementAt(i) instanceof TreePanel)
4116 treePanels.add(comps.elementAt(i));
4120 iSize = treePanels.size();
4124 sortByTreeMenu.setVisible(false);
4128 sortByTreeMenu.setVisible(true);
4130 for (i = 0; i < treePanels.size(); i++)
4132 final TreePanel tp = (TreePanel) treePanels.elementAt(i);
4133 final JMenuItem item = new JMenuItem(tp.getTitle());
4134 final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
4135 item.addActionListener(new java.awt.event.ActionListener()
4138 public void actionPerformed(ActionEvent e)
4140 tp.sortByTree_actionPerformed(null);
4141 addHistoryItem(tp.sortAlignmentIn(alignPanel));
4146 sortByTreeMenu.add(item);
4150 public boolean sortBy(AlignmentOrder alorder, String undoname)
4152 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
4153 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
4154 if (undoname != null)
4156 addHistoryItem(new OrderCommand(undoname, oldOrder,
4157 viewport.getAlignment()));
4159 alignPanel.paintAlignment(true);
4164 * Work out whether the whole set of sequences or just the selected set will
4165 * be submitted for multiple alignment.
4168 public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
4170 // Now, check we have enough sequences
4171 AlignmentView msa = null;
4173 if ((viewport.getSelectionGroup() != null)
4174 && (viewport.getSelectionGroup().getSize() > 1))
4176 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
4177 // some common interface!
4179 * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
4180 * SequenceI[sz = seqs.getSize(false)];
4182 * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
4183 * seqs.getSequenceAt(i); }
4185 msa = viewport.getAlignmentView(true);
4187 else if (viewport.getSelectionGroup() != null
4188 && viewport.getSelectionGroup().getSize() == 1)
4190 int option = JOptionPane
4193 "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.",
4194 "Invalid selection",
4195 JOptionPane.OK_CANCEL_OPTION);
4196 if (option == JOptionPane.OK_OPTION)
4198 msa = viewport.getAlignmentView(false);
4205 * Vector seqs = viewport.getAlignment().getSequences();
4207 * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
4209 * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
4210 * seqs.elementAt(i); } }
4212 msa = viewport.getAlignmentView(false);
4218 * Decides what is submitted to a secondary structure prediction service: the
4219 * first sequence in the alignment, or in the current selection, or, if the
4220 * alignment is 'aligned' (ie padded with gaps), then the currently selected
4221 * region or the whole alignment. (where the first sequence in the set is the
4222 * one that the prediction will be for).
4224 public AlignmentView gatherSeqOrMsaForSecStrPrediction()
4226 AlignmentView seqs = null;
4228 if ((viewport.getSelectionGroup() != null)
4229 && (viewport.getSelectionGroup().getSize() > 0))
4231 seqs = viewport.getAlignmentView(true);
4235 seqs = viewport.getAlignmentView(false);
4237 // limit sequences - JBPNote in future - could spawn multiple prediction
4239 // TODO: viewport.getAlignment().isAligned is a global state - the local
4240 // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
4241 if (!viewport.getAlignment().isAligned(false))
4243 seqs.setSequences(new SeqCigar[]
4244 { seqs.getSequences()[0] });
4245 // TODO: if seqs.getSequences().length>1 then should really have warned
4259 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
4261 // Pick the tree file
4262 JalviewFileChooser chooser = new JalviewFileChooser(
4263 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
4264 chooser.setFileView(new JalviewFileView());
4265 chooser.setDialogTitle(MessageManager
4266 .getString("label.select_newick_like_tree_file"));
4267 chooser.setToolTipText(MessageManager.getString("label.load_tree_file"));
4269 int value = chooser.showOpenDialog(null);
4271 if (value == JalviewFileChooser.APPROVE_OPTION)
4273 String choice = chooser.getSelectedFile().getPath();
4274 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
4275 jalview.io.NewickFile fin = null;
4278 fin = new jalview.io.NewickFile(choice, "File");
4279 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
4280 } catch (Exception ex)
4287 .getString("label.problem_reading_tree_file"),
4288 JOptionPane.WARNING_MESSAGE);
4289 ex.printStackTrace();
4291 if (fin != null && fin.hasWarningMessage())
4293 JOptionPane.showMessageDialog(Desktop.desktop, fin
4294 .getWarningMessage(), MessageManager
4295 .getString("label.possible_problem_with_tree_file"),
4296 JOptionPane.WARNING_MESSAGE);
4302 protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)
4304 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
4307 public TreePanel ShowNewickTree(NewickFile nf, String title)
4309 return ShowNewickTree(nf, title, 600, 500, 4, 5);
4312 public TreePanel ShowNewickTree(NewickFile nf, String title,
4313 AlignmentView input)
4315 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
4318 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
4319 int h, int x, int y)
4321 return ShowNewickTree(nf, title, null, w, h, x, y);
4325 * Add a treeviewer for the tree extracted from a newick file object to the
4326 * current alignment view
4333 * Associated alignment input data (or null)
4342 * @return TreePanel handle
4344 public TreePanel ShowNewickTree(NewickFile nf, String title,
4345 AlignmentView input, int w, int h, int x, int y)
4347 TreePanel tp = null;
4353 if (nf.getTree() != null)
4355 tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
4361 tp.setLocation(x, y);
4364 Desktop.addInternalFrame(tp, title, w, h);
4366 } catch (Exception ex)
4368 ex.printStackTrace();
4374 private boolean buildingMenu = false;
4377 * Generates menu items and listener event actions for web service clients
4380 public void BuildWebServiceMenu()
4382 while (buildingMenu)
4386 System.err.println("Waiting for building menu to finish.");
4388 } catch (Exception e)
4393 final AlignFrame me = this;
4394 buildingMenu = true;
4395 new Thread(new Runnable()
4400 final List<JMenuItem> legacyItems = new ArrayList<JMenuItem>();
4403 System.err.println("Building ws menu again "
4404 + Thread.currentThread());
4405 // TODO: add support for context dependent disabling of services based
4407 // alignment and current selection
4408 // TODO: add additional serviceHandle parameter to specify abstract
4410 // class independently of AbstractName
4411 // TODO: add in rediscovery GUI function to restart discoverer
4412 // TODO: group services by location as well as function and/or
4414 // object broker mechanism.
4415 final Vector<JMenu> wsmenu = new Vector<JMenu>();
4416 final IProgressIndicator af = me;
4417 final JMenu msawsmenu = new JMenu("Alignment");
4418 final JMenu secstrmenu = new JMenu(
4419 "Secondary Structure Prediction");
4420 final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
4421 final JMenu analymenu = new JMenu("Analysis");
4422 final JMenu dismenu = new JMenu("Protein Disorder");
4423 // final JMenu msawsmenu = new
4424 // JMenu(MessageManager.getString("label.alignment"));
4425 // final JMenu secstrmenu = new
4426 // JMenu(MessageManager.getString("label.secondary_structure_prediction"));
4427 // final JMenu seqsrchmenu = new
4428 // JMenu(MessageManager.getString("label.sequence_database_search"));
4429 // final JMenu analymenu = new
4430 // JMenu(MessageManager.getString("label.analysis"));
4431 // final JMenu dismenu = new
4432 // JMenu(MessageManager.getString("label.protein_disorder"));
4433 // JAL-940 - only show secondary structure prediction services from
4434 // the legacy server
4435 if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
4437 Discoverer.services != null && (Discoverer.services.size() > 0))
4439 // TODO: refactor to allow list of AbstractName/Handler bindings to
4441 // stored or retrieved from elsewhere
4442 // No MSAWS used any more:
4443 // Vector msaws = null; // (Vector)
4444 // Discoverer.services.get("MsaWS");
4445 Vector secstrpr = (Vector) Discoverer.services
4447 if (secstrpr != null)
4449 // Add any secondary structure prediction services
4450 for (int i = 0, j = secstrpr.size(); i < j; i++)
4452 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
4454 jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
4455 .getServiceClient(sh);
4456 int p = secstrmenu.getItemCount();
4457 impl.attachWSMenuEntry(secstrmenu, me);
4458 int q = secstrmenu.getItemCount();
4459 for (int litm = p; litm < q; litm++)
4461 legacyItems.add(secstrmenu.getItem(litm));
4467 // Add all submenus in the order they should appear on the web
4469 wsmenu.add(msawsmenu);
4470 wsmenu.add(secstrmenu);
4471 wsmenu.add(dismenu);
4472 wsmenu.add(analymenu);
4473 // No search services yet
4474 // wsmenu.add(seqsrchmenu);
4476 javax.swing.SwingUtilities.invokeLater(new Runnable()
4483 webService.removeAll();
4484 // first, add discovered services onto the webservices menu
4485 if (wsmenu.size() > 0)
4487 for (int i = 0, j = wsmenu.size(); i < j; i++)
4489 webService.add(wsmenu.get(i));
4494 webService.add(me.webServiceNoServices);
4496 // TODO: move into separate menu builder class.
4497 boolean new_sspred = false;
4498 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
4500 Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
4501 if (jws2servs != null)
4503 if (jws2servs.hasServices())
4505 jws2servs.attachWSMenuEntry(webService, me);
4506 for (Jws2Instance sv : jws2servs.getServices())
4508 if (sv.description.toLowerCase().contains("jpred"))
4510 for (JMenuItem jmi : legacyItems)
4512 jmi.setVisible(false);
4518 if (jws2servs.isRunning())
4520 JMenuItem tm = new JMenuItem(
4521 "Still discovering JABA Services");
4522 tm.setEnabled(false);
4527 build_urlServiceMenu(me.webService);
4528 build_fetchdbmenu(webService);
4529 for (JMenu item : wsmenu)
4531 if (item.getItemCount() == 0)
4533 item.setEnabled(false);
4537 item.setEnabled(true);
4540 } catch (Exception e)
4543 .debug("Exception during web service menu building process.",
4549 } catch (Exception e)
4554 buildingMenu = false;
4561 * construct any groupURL type service menu entries.
4565 private void build_urlServiceMenu(JMenu webService)
4567 // TODO: remove this code when 2.7 is released
4568 // DEBUG - alignmentView
4570 * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final
4571 * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {
4573 * @Override public void actionPerformed(ActionEvent e) {
4574 * jalview.datamodel.AlignmentView
4575 * .testSelectionViews(af.viewport.getAlignment(),
4576 * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }
4578 * }); webService.add(testAlView);
4580 // TODO: refactor to RestClient discoverer and merge menu entries for
4581 // rest-style services with other types of analysis/calculation service
4582 // SHmmr test client - still being implemented.
4583 // DEBUG - alignmentView
4585 for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient
4588 client.attachWSMenuEntry(
4589 JvSwingUtils.findOrCreateMenu(webService, client.getAction()),
4595 * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
4596 * chooser = new JalviewFileChooser(jalview.bin.Cache.
4597 * getProperty("LAST_DIRECTORY"));
4599 * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
4600 * to Vamsas file"); chooser.setToolTipText("Export");
4602 * int value = chooser.showSaveDialog(this);
4604 * if (value == JalviewFileChooser.APPROVE_OPTION) {
4605 * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
4606 * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
4607 * chooser.getSelectedFile().getAbsolutePath(), this); } }
4610 * prototype of an automatically enabled/disabled analysis function
4613 protected void setShowProductsEnabled()
4615 SequenceI[] selection = viewport.getSequenceSelection();
4616 if (canShowProducts(selection, viewport.getSelectionGroup() != null,
4617 viewport.getAlignment().getDataset()))
4619 showProducts.setEnabled(true);
4624 showProducts.setEnabled(false);
4629 * search selection for sequence xRef products and build the show products
4634 * @return true if showProducts menu should be enabled.
4636 public boolean canShowProducts(SequenceI[] selection,
4637 boolean isRegionSelection, Alignment dataset)
4639 boolean showp = false;
4642 showProducts.removeAll();
4643 final boolean dna = viewport.getAlignment().isNucleotide();
4644 final Alignment ds = dataset;
4645 String[] ptypes = (selection == null || selection.length == 0) ? null
4646 : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
4648 // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
4649 // selection, dataset, true);
4650 final SequenceI[] sel = selection;
4651 for (int t = 0; ptypes != null && t < ptypes.length; t++)
4654 final boolean isRegSel = isRegionSelection;
4655 final AlignFrame af = this;
4656 final String source = ptypes[t];
4657 JMenuItem xtype = new JMenuItem(ptypes[t]);
4658 xtype.addActionListener(new ActionListener()
4662 public void actionPerformed(ActionEvent e)
4664 // TODO: new thread for this call with vis-delay
4665 af.showProductsFor(af.viewport.getSequenceSelection(), ds,
4666 isRegSel, dna, source);
4670 showProducts.add(xtype);
4672 showProducts.setVisible(showp);
4673 showProducts.setEnabled(showp);
4674 } catch (Exception e)
4676 jalview.bin.Cache.log
4677 .warn("canTranslate threw an exception - please report to help@jalview.org",
4684 protected void showProductsFor(SequenceI[] sel, Alignment ds,
4685 boolean isRegSel, boolean dna, String source)
4687 final boolean fisRegSel = isRegSel;
4688 final boolean fdna = dna;
4689 final String fsrc = source;
4690 final AlignFrame ths = this;
4691 final SequenceI[] fsel = sel;
4692 Runnable foo = new Runnable()
4698 final long sttime = System.currentTimeMillis();
4699 ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime);
4702 Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
4706 Alignment prods = CrossRef
4707 .findXrefSequences(fsel, fdna, fsrc, ds);
4710 SequenceI[] sprods = new SequenceI[prods.getHeight()];
4711 for (int s = 0; s < sprods.length; s++)
4713 sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
4714 if (ds.getSequences() == null
4715 || !ds.getSequences().contains(
4716 sprods[s].getDatasetSequence()))
4718 ds.addSequence(sprods[s].getDatasetSequence());
4720 sprods[s].updatePDBIds();
4722 Alignment al = new Alignment(sprods);
4723 AlignedCodonFrame[] cf = prods.getCodonFrames();
4725 for (int s = 0; cf != null && s < cf.length; s++)
4727 al.addCodonFrame(cf[s]);
4730 AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
4732 String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
4733 + " for " + ((fisRegSel) ? "selected region of " : "")
4735 Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
4740 System.err.println("No Sequences generated for xRef type "
4743 } catch (Exception e)
4745 jalview.bin.Cache.log.error(
4746 "Exception when finding crossreferences", e);
4747 } catch (OutOfMemoryError e)
4749 new OOMWarning("whilst fetching crossreferences", e);
4752 jalview.bin.Cache.log.error("Error when finding crossreferences",
4755 ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}),
4760 Thread frunner = new Thread(foo);
4764 public boolean canShowTranslationProducts(SequenceI[] selection,
4765 AlignmentI alignment)
4770 return (jalview.analysis.Dna.canTranslate(selection,
4771 viewport.getViewAsVisibleContigs(true)));
4772 } catch (Exception e)
4774 jalview.bin.Cache.log
4775 .warn("canTranslate threw an exception - please report to help@jalview.org",
4782 public void showProducts_actionPerformed(ActionEvent e)
4784 // /////////////////////////////
4785 // Collect Data to be translated/transferred
4787 SequenceI[] selection = viewport.getSequenceSelection();
4788 AlignmentI al = null;
4791 al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
4792 .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
4793 viewport.getAlignment().getDataset());
4794 } catch (Exception ex)
4797 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4805 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4806 MessageManager.getString("label.translation_failed"),
4807 JOptionPane.WARNING_MESSAGE);
4811 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4812 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4813 "label.translation_of_params", new String[]
4814 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4819 public void showTranslation_actionPerformed(ActionEvent e)
4821 // /////////////////////////////
4822 // Collect Data to be translated/transferred
4824 SequenceI[] selection = viewport.getSequenceSelection();
4825 String[] seqstring = viewport.getViewAsString(true);
4826 AlignmentI al = null;
4829 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
4830 viewport.getViewAsVisibleContigs(true), viewport
4831 .getGapCharacter(), viewport.getAlignment()
4832 .getAlignmentAnnotation(), viewport.getAlignment()
4833 .getWidth(), viewport.getAlignment().getDataset());
4834 } catch (Exception ex)
4837 jalview.bin.Cache.log.error(
4838 "Exception during translation. Please report this !", ex);
4843 .getString("label.error_when_translating_sequences_submit_bug_report"),
4845 .getString("label.implementation_error")
4847 .getString("translation_failed"),
4848 JOptionPane.ERROR_MESSAGE);
4857 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4858 MessageManager.getString("label.translation_failed"),
4859 JOptionPane.WARNING_MESSAGE);
4863 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4864 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4865 "label.translation_of_params", new String[]
4866 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4871 * Try to load a features file onto the alignment.
4874 * contents or path to retrieve file
4876 * access mode of file (see jalview.io.AlignFile)
4877 * @return true if features file was parsed corectly.
4879 public boolean parseFeaturesFile(String file, String type)
4881 boolean featuresFile = false;
4884 featuresFile = new FeaturesFile(file, type).parse(viewport
4885 .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas
4886 .getFeatureRenderer().featureColours, false,
4887 jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
4888 } catch (Exception ex)
4890 ex.printStackTrace();
4895 viewport.showSequenceFeatures = true;
4896 showSeqFeatures.setSelected(true);
4897 if (alignPanel.seqPanel.seqCanvas.fr != null)
4899 // update the min/max ranges where necessary
4900 alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
4902 if (featureSettings != null)
4904 featureSettings.setTableData();
4906 alignPanel.paintAlignment(true);
4909 return featuresFile;
4913 public void dragEnter(DropTargetDragEvent evt)
4918 public void dragExit(DropTargetEvent evt)
4923 public void dragOver(DropTargetDragEvent evt)
4928 public void dropActionChanged(DropTargetDragEvent evt)
4933 public void drop(DropTargetDropEvent evt)
4935 Transferable t = evt.getTransferable();
4936 java.util.List files = null;
4940 DataFlavor uriListFlavor = new DataFlavor(
4941 "text/uri-list;class=java.lang.String");
4942 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
4944 // Works on Windows and MacOSX
4945 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4946 files = (java.util.List) t
4947 .getTransferData(DataFlavor.javaFileListFlavor);
4949 else if (t.isDataFlavorSupported(uriListFlavor))
4951 // This is used by Unix drag system
4952 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4953 String data = (String) t.getTransferData(uriListFlavor);
4954 files = new java.util.ArrayList(1);
4955 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
4956 data, "\r\n"); st.hasMoreTokens();)
4958 String s = st.nextToken();
4959 if (s.startsWith("#"))
4961 // the line is a comment (as per the RFC 2483)
4965 java.net.URI uri = new java.net.URI(s);
4966 // check to see if we can handle this kind of URI
4967 if (uri.getScheme().toLowerCase().startsWith("http"))
4969 files.add(uri.toString());
4973 // otherwise preserve old behaviour: catch all for file objects
4974 java.io.File file = new java.io.File(uri);
4975 files.add(file.toString());
4979 } catch (Exception e)
4981 e.printStackTrace();
4987 // check to see if any of these files have names matching sequences in
4989 SequenceIdMatcher idm = new SequenceIdMatcher(viewport
4990 .getAlignment().getSequencesArray());
4992 * Object[] { String,SequenceI}
4994 ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
4995 ArrayList<String> filesnotmatched = new ArrayList<String>();
4996 for (int i = 0; i < files.size(); i++)
4998 String file = files.get(i).toString();
5000 String protocol = FormatAdapter.checkProtocol(file);
5001 if (protocol == jalview.io.FormatAdapter.FILE)
5003 File fl = new File(file);
5004 pdbfn = fl.getName();
5006 else if (protocol == jalview.io.FormatAdapter.URL)
5008 URL url = new URL(file);
5009 pdbfn = url.getFile();
5011 if (pdbfn.length() > 0)
5013 // attempt to find a match in the alignment
5014 SequenceI[] mtch = idm.findAllIdMatches(pdbfn);
5015 int l = 0, c = pdbfn.indexOf(".");
5016 while (mtch == null && c != -1)
5021 } while ((c = pdbfn.indexOf(".", l)) > l);
5024 pdbfn = pdbfn.substring(0, l);
5026 mtch = idm.findAllIdMatches(pdbfn);
5033 type = new IdentifyFile().Identify(file, protocol);
5034 } catch (Exception ex)
5040 if (type.equalsIgnoreCase("PDB"))
5042 filesmatched.add(new Object[]
5043 { file, protocol, mtch });
5048 // File wasn't named like one of the sequences or wasn't a PDB file.
5049 filesnotmatched.add(file);
5053 if (filesmatched.size() > 0)
5055 if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false)
5061 "label.automatically_associate_pdb_files_with_sequences_same_name",
5068 .getString("label.automatically_associate_pdb_files_by_name"),
5069 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
5072 for (Object[] fm : filesmatched)
5074 // try and associate
5075 // TODO: may want to set a standard ID naming formalism for
5076 // associating PDB files which have no IDs.
5077 for (SequenceI toassoc : (SequenceI[]) fm[2])
5079 PDBEntry pe = new AssociatePdbFileWithSeq()
5080 .associatePdbWithSeq((String) fm[0],
5081 (String) fm[1], toassoc, false,
5085 System.err.println("Associated file : "
5086 + ((String) fm[0]) + " with "
5087 + toassoc.getDisplayId(true));
5091 alignPanel.paintAlignment(true);
5095 if (filesnotmatched.size() > 0)
5098 && (Cache.getDefault(
5099 "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane
5102 "<html>"+MessageManager
5104 "label.ignore_unmatched_dropped_files_info",
5109 .toString() })+"</html>",
5111 .getString("label.ignore_unmatched_dropped_files"),
5112 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))
5116 for (String fn : filesnotmatched)
5118 loadJalviewDataFile(fn, null, null, null);
5122 } catch (Exception ex)
5124 ex.printStackTrace();
5130 * Attempt to load a "dropped" file or URL string: First by testing whether
5131 * it's and Annotation file, then a JNet file, and finally a features file. If
5132 * all are false then the user may have dropped an alignment file onto this
5136 * either a filename or a URL string.
5138 public void loadJalviewDataFile(String file, String protocol,
5139 String format, SequenceI assocSeq)
5143 if (protocol == null)
5145 protocol = jalview.io.FormatAdapter.checkProtocol(file);
5147 // if the file isn't identified, or not positively identified as some
5148 // other filetype (PFAM is default unidentified alignment file type) then
5149 // try to parse as annotation.
5150 boolean isAnnotation = (format == null || format
5151 .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
5152 .readAnnotationFile(viewport.getAlignment(), file, protocol)
5157 // first see if its a T-COFFEE score file
5158 TCoffeeScoreFile tcf = null;
5161 tcf = new TCoffeeScoreFile(file, protocol);
5164 if (tcf.annotateAlignment(viewport.getAlignment(), true))
5166 tcoffeeColour.setEnabled(true);
5167 tcoffeeColour.setSelected(true);
5168 changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
5169 isAnnotation = true;
5171 .setText(MessageManager
5172 .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
5176 // some problem - if no warning its probable that the ID matching
5177 // process didn't work
5181 tcf.getWarningMessage() == null ? MessageManager
5182 .getString("label.check_file_matches_sequence_ids_alignment")
5183 : tcf.getWarningMessage(),
5185 .getString("label.problem_reading_tcoffee_score_file"),
5186 JOptionPane.WARNING_MESSAGE);
5193 } catch (Exception x)
5196 .debug("Exception when processing data source as T-COFFEE score file",
5202 // try to see if its a JNet 'concise' style annotation file *before*
5204 // try to parse it as a features file
5207 format = new IdentifyFile().Identify(file, protocol);
5209 if (format.equalsIgnoreCase("JnetFile"))
5211 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
5213 new JnetAnnotationMaker().add_annotation(predictions,
5214 viewport.getAlignment(), 0, false);
5215 isAnnotation = true;
5220 * if (format.equalsIgnoreCase("PDB")) {
5222 * String pdbfn = ""; // try to match up filename with sequence id
5223 * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
5224 * new File(file); pdbfn = fl.getName(); } else if (protocol ==
5225 * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
5226 * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
5227 * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
5228 * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
5229 * // attempt to find a match in the alignment SequenceI mtch =
5230 * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
5231 * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
5232 * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
5233 * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
5234 * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
5235 * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
5236 * { System.err.println("Associated file : " + file + " with " +
5237 * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
5238 * TODO: maybe need to load as normal otherwise return; } }
5240 // try to parse it as a features file
5241 boolean isGroupsFile = parseFeaturesFile(file, protocol);
5242 // if it wasn't a features file then we just treat it as a general
5243 // alignment file to load into the current view.
5246 new FileLoader().LoadFile(viewport, file, protocol, format);
5250 alignPanel.paintAlignment(true);
5258 alignPanel.adjustAnnotationHeight();
5259 viewport.updateSequenceIdColours();
5260 buildSortByAnnotationScoresMenu();
5261 alignPanel.paintAlignment(true);
5263 } catch (Exception ex)
5265 ex.printStackTrace();
5266 } catch (OutOfMemoryError oom)
5271 } catch (Exception x)
5277 + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."
5278 : "using " + protocol + " from " + file)
5280 + (format != null ? "(parsing as '" + format
5281 + "' file)" : ""), oom, Desktop.desktop);
5286 public void tabSelectionChanged(int index)
5290 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
5291 viewport = alignPanel.av;
5292 avc.setViewportAndAlignmentPanel(viewport, alignPanel);
5293 setMenusFromViewport(viewport);
5298 public void tabbedPane_mousePressed(MouseEvent e)
5300 if (SwingUtilities.isRightMouseButton(e))
5302 String reply = JOptionPane.showInternalInputDialog(this,
5303 MessageManager.getString("label.enter_view_name"),
5304 MessageManager.getString("label.enter_view_name"),
5305 JOptionPane.QUESTION_MESSAGE);
5309 viewport.viewName = reply;
5310 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
5315 public AlignViewport getCurrentView()
5321 * Open the dialog for regex description parsing.
5324 protected void extractScores_actionPerformed(ActionEvent e)
5326 ParseProperties pp = new jalview.analysis.ParseProperties(
5327 viewport.getAlignment());
5328 // TODO: verify regex and introduce GUI dialog for version 2.5
5329 // if (pp.getScoresFromDescription("col", "score column ",
5330 // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
5332 if (pp.getScoresFromDescription("description column",
5333 "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
5335 buildSortByAnnotationScoresMenu();
5343 * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
5347 protected void showDbRefs_actionPerformed(ActionEvent e)
5349 viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
5355 * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
5359 protected void showNpFeats_actionPerformed(ActionEvent e)
5361 viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
5365 * find the viewport amongst the tabs in this alignment frame and close that
5370 public boolean closeView(AlignViewport av)
5374 this.closeMenuItem_actionPerformed(false);
5377 Component[] comp = tabbedPane.getComponents();
5378 for (int i = 0; comp != null && i < comp.length; i++)
5380 if (comp[i] instanceof AlignmentPanel)
5382 if (((AlignmentPanel) comp[i]).av == av)
5385 closeView((AlignmentPanel) comp[i]);
5393 protected void build_fetchdbmenu(JMenu webService)
5395 // Temporary hack - DBRef Fetcher always top level ws entry.
5396 // TODO We probably want to store a sequence database checklist in
5397 // preferences and have checkboxes.. rather than individual sources selected
5399 final JMenu rfetch = new JMenu(
5400 MessageManager.getString("action.fetch_db_references"));
5401 rfetch.setToolTipText(MessageManager
5402 .getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences"));
5403 webService.add(rfetch);
5405 final JCheckBoxMenuItem trimrs = new JCheckBoxMenuItem(
5406 MessageManager.getString("option.trim_retrieved_seqs"));
5407 trimrs.setToolTipText(MessageManager
5408 .getString("label.trim_retrieved_sequences"));
5409 trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true));
5410 trimrs.addActionListener(new ActionListener()
5413 public void actionPerformed(ActionEvent e)
5415 trimrs.setSelected(trimrs.isSelected());
5416 Cache.setProperty("TRIM_FETCHED_DATASET_SEQS",
5417 Boolean.valueOf(trimrs.isSelected()).toString());
5421 JMenuItem fetchr = new JMenuItem(
5422 MessageManager.getString("label.standard_databases"));
5423 fetchr.setToolTipText(MessageManager
5424 .getString("label.fetch_embl_uniprot"));
5425 fetchr.addActionListener(new ActionListener()
5429 public void actionPerformed(ActionEvent e)
5431 new Thread(new Runnable()
5437 new jalview.ws.DBRefFetcher(alignPanel.av
5438 .getSequenceSelection(), alignPanel.alignFrame)
5439 .fetchDBRefs(false);
5447 final AlignFrame me = this;
5448 new Thread(new Runnable()
5453 final jalview.ws.SequenceFetcher sf = SequenceFetcher
5454 .getSequenceFetcherSingleton(me);
5455 javax.swing.SwingUtilities.invokeLater(new Runnable()
5460 String[] dbclasses = sf.getOrderedSupportedSources();
5461 // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
5462 // jalview.util.QuickSort.sort(otherdb, otherdb);
5463 List<DbSourceProxy> otherdb;
5464 JMenu dfetch = new JMenu();
5465 JMenu ifetch = new JMenu();
5466 JMenuItem fetchr = null;
5467 int comp = 0, icomp = 0, mcomp = 15;
5468 String mname = null;
5470 for (String dbclass : dbclasses)
5472 otherdb = sf.getSourceProxy(dbclass);
5473 // add a single entry for this class, or submenu allowing 'fetch
5475 if (otherdb == null || otherdb.size() < 1)
5479 // List<DbSourceProxy> dbs=otherdb;
5480 // otherdb=new ArrayList<DbSourceProxy>();
5481 // for (DbSourceProxy db:dbs)
5483 // if (!db.isA(DBRefSource.ALIGNMENTDB)
5487 mname = "From " + dbclass;
5489 if (otherdb.size() == 1)
5491 final DbSourceProxy[] dassource = otherdb
5492 .toArray(new DbSourceProxy[0]);
5493 DbSourceProxy src = otherdb.get(0);
5494 fetchr = new JMenuItem(src.getDbSource());
5495 fetchr.addActionListener(new ActionListener()
5499 public void actionPerformed(ActionEvent e)
5501 new Thread(new Runnable()
5507 new jalview.ws.DBRefFetcher(alignPanel.av
5508 .getSequenceSelection(),
5509 alignPanel.alignFrame, dassource)
5510 .fetchDBRefs(false);
5516 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()})));
5522 final DbSourceProxy[] dassource = otherdb
5523 .toArray(new DbSourceProxy[0]);
5525 DbSourceProxy src = otherdb.get(0);
5526 fetchr = new JMenuItem(MessageManager.formatMessage(
5527 "label.fetch_all_param", new String[]
5528 { src.getDbSource() }));
5529 fetchr.addActionListener(new ActionListener()
5532 public void actionPerformed(ActionEvent e)
5534 new Thread(new Runnable()
5540 new jalview.ws.DBRefFetcher(alignPanel.av
5541 .getSequenceSelection(),
5542 alignPanel.alignFrame, dassource)
5543 .fetchDBRefs(false);
5549 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
5552 // and then build the rest of the individual menus
5553 ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()}));
5555 String imname = null;
5557 for (DbSourceProxy sproxy : otherdb)
5559 String dbname = sproxy.getDbName();
5560 String sname = dbname.length() > 5 ? dbname.substring(0,
5561 5) + "..." : dbname;
5562 String msname = dbname.length() > 10 ? dbname.substring(
5563 0, 10) + "..." : dbname;
5566 imname = MessageManager.formatMessage("label.from_msname", new String[]{sname});
5568 fetchr = new JMenuItem(msname);
5569 final DbSourceProxy[] dassrc =
5571 fetchr.addActionListener(new ActionListener()
5575 public void actionPerformed(ActionEvent e)
5577 new Thread(new Runnable()
5583 new jalview.ws.DBRefFetcher(alignPanel.av
5584 .getSequenceSelection(),
5585 alignPanel.alignFrame, dassrc)
5586 .fetchDBRefs(false);
5592 fetchr.setToolTipText("<html>"
5593 + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname}));
5596 if (++icomp >= mcomp || i == (otherdb.size()))
5598 ifetch.setText(MessageManager.formatMessage(
5599 "label.source_to_target", imname, sname));
5601 ifetch = new JMenu();
5609 if (comp >= mcomp || dbi >= (dbclasses.length))
5611 dfetch.setText(MessageManager.formatMessage(
5612 "label.source_to_target", mname, dbclass));
5614 dfetch = new JMenu();
5627 * Left justify the whole alignment.
5630 protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
5632 AlignmentI al = viewport.getAlignment();
5634 viewport.firePropertyChange("alignment", null, al);
5638 * Right justify the whole alignment.
5641 protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
5643 AlignmentI al = viewport.getAlignment();
5645 viewport.firePropertyChange("alignment", null, al);
5648 public void setShowSeqFeatures(boolean b)
5650 showSeqFeatures.setSelected(true);
5651 viewport.setShowSequenceFeatures(true);
5658 * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
5659 * awt.event.ActionEvent)
5662 protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
5664 viewport.setShowUnconserved(showNonconservedMenuItem.getState());
5665 alignPanel.paintAlignment(true);
5672 * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
5676 protected void showGroupConsensus_actionPerformed(ActionEvent e)
5678 viewport.setShowGroupConsensus(showGroupConsensus.getState());
5679 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5687 * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
5688 * .event.ActionEvent)
5691 protected void showGroupConservation_actionPerformed(ActionEvent e)
5693 viewport.setShowGroupConservation(showGroupConservation.getState());
5694 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5701 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
5702 * .event.ActionEvent)
5705 protected void showConsensusHistogram_actionPerformed(ActionEvent e)
5707 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
5708 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5715 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
5716 * .event.ActionEvent)
5719 protected void showSequenceLogo_actionPerformed(ActionEvent e)
5721 viewport.setShowSequenceLogo(showSequenceLogo.getState());
5722 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5726 protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
5728 showSequenceLogo.setState(true);
5729 viewport.setShowSequenceLogo(true);
5730 viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
5731 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5735 protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
5737 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5744 * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
5745 * .event.ActionEvent)
5748 protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
5750 if (avc.makeGroupsFromSelection())
5752 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
5753 alignPanel.updateAnnotation();
5754 alignPanel.paintAlignment(true);
5759 protected void createGroup_actionPerformed(ActionEvent e)
5761 if (avc.createGroup())
5763 alignPanel.alignmentChanged();
5768 protected void unGroup_actionPerformed(ActionEvent e)
5772 alignPanel.alignmentChanged();
5777 * make the given alignmentPanel the currently selected tab
5779 * @param alignmentPanel
5781 public void setDisplayedView(AlignmentPanel alignmentPanel)
5783 if (!viewport.getSequenceSetId().equals(
5784 alignmentPanel.av.getSequenceSetId()))
5786 throw new Error(MessageManager.getString("error.implementation_error_cannot_show_view_alignment_frame"));
5788 if (tabbedPane != null
5789 & alignPanels.indexOf(alignmentPanel) != tabbedPane
5790 .getSelectedIndex())
5792 tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));
5797 * Action on selection of menu options to Show or Hide annotations.
5800 * @param forSequences
5801 * update sequence-related annotations
5802 * @param forAlignment
5803 * update non-sequence-related annotations
5806 protected void setAnnotationsVisibility(boolean visible,
5807 boolean forSequences, boolean forAlignment)
5809 for (AlignmentAnnotation aa : alignPanel.getAlignment()
5810 .getAlignmentAnnotation())
5812 boolean apply = (aa.sequenceRef == null && forAlignment)
5813 || (aa.sequenceRef != null && forSequences);
5816 aa.visible = visible;
5819 alignPanel.validateAnnotationDimensions(false);
5820 alignPanel.alignmentChanged();
5824 * Store selected annotation sort order for the view and repaint.
5827 protected void sortAnnotations_actionPerformed()
5829 this.alignPanel.av.setSortAnnotationsBy(getAnnotationSortOrder());
5831 .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
5832 alignPanel.paintAlignment(true);
5836 class PrintThread extends Thread
5840 public PrintThread(AlignmentPanel ap)
5845 static PageFormat pf;
5850 PrinterJob printJob = PrinterJob.getPrinterJob();
5854 printJob.setPrintable(ap, pf);
5858 printJob.setPrintable(ap);
5861 if (printJob.printDialog())
5866 } catch (Exception PrintException)
5868 PrintException.printStackTrace();