2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
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 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
17 * The Jalview Authors are detailed in the 'AUTHORS' file.
19 package jalview.appletgui;
21 import jalview.analysis.AlignmentSorter;
22 import jalview.analysis.Conservation;
23 import jalview.api.AlignViewControllerGuiI;
24 import jalview.api.AlignViewControllerI;
25 import jalview.api.SequenceStructureBinding;
26 import jalview.bin.JalviewLite;
27 import jalview.commands.CommandI;
28 import jalview.commands.EditCommand;
29 import jalview.commands.OrderCommand;
30 import jalview.commands.RemoveGapColCommand;
31 import jalview.commands.RemoveGapsCommand;
32 import jalview.commands.SlideSequencesCommand;
33 import jalview.commands.TrimRegionCommand;
34 import jalview.datamodel.Alignment;
35 import jalview.datamodel.AlignmentI;
36 import jalview.datamodel.AlignmentOrder;
37 import jalview.datamodel.ColumnSelection;
38 import jalview.datamodel.PDBEntry;
39 import jalview.datamodel.Sequence;
40 import jalview.datamodel.SequenceGroup;
41 import jalview.datamodel.SequenceI;
42 import jalview.io.AnnotationFile;
43 import jalview.io.AppletFormatAdapter;
44 import jalview.io.FeaturesFile;
45 import jalview.io.TCoffeeScoreFile;
46 import jalview.schemes.Blosum62ColourScheme;
47 import jalview.schemes.BuriedColourScheme;
48 import jalview.schemes.ClustalxColourScheme;
49 import jalview.schemes.ColourSchemeI;
50 import jalview.schemes.HelixColourScheme;
51 import jalview.schemes.HydrophobicColourScheme;
52 import jalview.schemes.NucleotideColourScheme;
53 import jalview.schemes.PIDColourScheme;
54 import jalview.schemes.PurinePyrimidineColourScheme;
55 import jalview.schemes.RNAHelicesColourChooser;
56 import jalview.schemes.ResidueProperties;
57 import jalview.schemes.StrandColourScheme;
58 import jalview.schemes.TCoffeeColourScheme;
59 import jalview.schemes.TaylorColourScheme;
60 import jalview.schemes.TurnColourScheme;
61 import jalview.schemes.ZappoColourScheme;
62 import jalview.structure.StructureSelectionManager;
63 import jalview.util.MessageManager;
65 import java.awt.BorderLayout;
66 import java.awt.Canvas;
67 import java.awt.CheckboxMenuItem;
68 import java.awt.Color;
70 import java.awt.FontMetrics;
71 import java.awt.Frame;
72 import java.awt.Graphics;
73 import java.awt.Label;
75 import java.awt.MenuBar;
76 import java.awt.MenuItem;
77 import java.awt.event.ActionEvent;
78 import java.awt.event.ActionListener;
79 import java.awt.event.FocusEvent;
80 import java.awt.event.FocusListener;
81 import java.awt.event.ItemEvent;
82 import java.awt.event.ItemListener;
83 import java.awt.event.KeyEvent;
84 import java.awt.event.KeyListener;
85 import java.awt.event.WindowAdapter;
86 import java.awt.event.WindowEvent;
87 import java.io.IOException;
89 import java.net.URLEncoder;
90 import java.util.Enumeration;
91 import java.util.Hashtable;
92 import java.util.List;
93 import java.util.StringTokenizer;
94 import java.util.Vector;
96 public class AlignFrame extends EmbmenuFrame implements ActionListener,
97 ItemListener, KeyListener, AlignViewControllerGuiI
99 public AlignViewControllerI avc;
100 public AlignmentPanel alignPanel;
102 public AlignViewport viewport;
104 int DEFAULT_WIDTH = 700;
106 int DEFAULT_HEIGHT = 500;
108 String jalviewServletURL;
110 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
111 String title, boolean embedded)
115 jalviewServletURL = applet.getParameter("APPLICATION_URL");
121 } catch (Exception ex)
123 ex.printStackTrace();
125 // need to get window geometry before we calculate alignment layout
131 param = applet.getParameter("windowWidth");
134 int width = Integer.parseInt(param);
135 DEFAULT_WIDTH = width;
137 param = applet.getParameter("windowHeight");
140 int height = Integer.parseInt(param);
141 DEFAULT_HEIGHT = height;
143 } catch (Exception ex)
147 viewport = new AlignViewport(al, applet);
148 alignPanel = new AlignmentPanel(this, viewport);
149 avc = new jalview.controller.AlignViewController(this, viewport, alignPanel);
150 viewport.updateConservation(alignPanel);
151 viewport.updateConsensus(alignPanel);
153 annotationPanelMenuItem.setState(viewport.showAnnotation);
154 displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
155 followMouseOverFlag.setState(viewport.getFollowHighlight());
156 showGroupConsensus.setState(viewport.isShowGroupConsensus());
157 showGroupConservation.setState(viewport.isShowGroupConservation());
158 showConsensusHistogram.setState(viewport.isShowConsensusHistogram());
159 showSequenceLogo.setState(viewport.isShowSequenceLogo());
160 normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
162 seqLimits.setState(viewport.showJVSuffix);
166 String param = applet.getParameter("sortBy");
169 if (param.equalsIgnoreCase("Id"))
171 sortIDMenuItem_actionPerformed();
173 else if (param.equalsIgnoreCase("Pairwise Identity"))
175 sortPairwiseMenuItem_actionPerformed();
177 else if (param.equalsIgnoreCase("Length"))
179 sortLengthMenuItem_actionPerformed();
183 param = applet.getParameter("wrap");
186 if (param.equalsIgnoreCase("true"))
188 wrapMenuItem.setState(true);
189 wrapMenuItem_actionPerformed();
192 param = applet.getParameter("centrecolumnlabels");
195 centreColumnLabelFlag.setState(true);
196 centreColumnLabelFlag_stateChanged();
200 if (viewport.getAlignment().isNucleotide())
202 viewport.updateStrucConsensus(alignPanel);
203 if (viewport.getAlignment().hasRNAStructure())
205 RNAHelixColour.setEnabled(true);
209 RNAHelixColour.setEnabled(false);
214 RNAHelixColour.setEnabled(false);
215 purinePyrimidineColour.setEnabled(false);
217 // Some JVMS send keyevents to Top frame or lowest panel,
218 // Havent worked out why yet. So add to both this frame and seqCanvas for
220 this.addKeyListener(this);
221 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
222 alignPanel.idPanel.idCanvas.addKeyListener(this);
223 alignPanel.scalePanel.addKeyListener(this);
224 alignPanel.annotationPanel.addKeyListener(this);
225 alignPanel.annotationPanelHolder.addKeyListener(this);
226 alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
227 alignPanel.alabels.addKeyListener(this);
228 createAlignFrameWindow(embedded, title);
231 alignPanel.adjustAnnotationHeight();
232 alignPanel.paintAlignment(true);
235 public AlignViewport getAlignViewport()
240 public SeqCanvas getSeqcanvas()
242 return alignPanel.seqPanel.seqCanvas;
246 * Load a features file onto the alignment
249 * file URL, content, or other resolvable path
251 * is protocol for accessing data referred to by file
254 public boolean parseFeaturesFile(String file, String type)
256 return parseFeaturesFile(file, type, true);
260 * Load a features file onto the alignment
263 * file URL, content, or other resolvable path
265 * is protocol for accessing data referred to by file
266 * @param autoenabledisplay
267 * when true, display features flag will be automatically enabled if
268 * features are loaded
269 * @return true if data parsed as a features file
271 public boolean parseFeaturesFile(String file, String type,
272 boolean autoenabledisplay)
274 // TODO: test if importing a features file onto an alignment which already
275 // has features with links overwrites the original links.
277 Hashtable featureLinks = new Hashtable();
278 boolean featuresFile = false;
281 featuresFile = new jalview.io.FeaturesFile(file, type)
282 .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
283 .getFeatureRenderer().featureColours, featureLinks,
284 true, viewport.applet.getDefaultParameter(
285 "relaxedidmatch", false));
286 } catch (Exception ex)
288 ex.printStackTrace();
293 if (featureLinks.size() > 0)
295 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
297 if (autoenabledisplay)
299 viewport.showSequenceFeatures = true;
300 sequenceFeatures.setState(true);
302 if (viewport.featureSettings != null)
304 viewport.featureSettings.refreshTable();
306 alignPanel.paintAlignment(true);
307 statusBar.setText(MessageManager.getString("label.successfully_added_features_alignment"));
313 public void keyPressed(KeyEvent evt)
315 if (viewport.cursorMode
316 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
317 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
318 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
319 && Character.isDigit(evt.getKeyChar()))
320 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
322 switch (evt.getKeyCode())
324 case 27: // escape key
325 deselectAllSequenceMenuItem_actionPerformed();
327 alignPanel.alabels.cancelDrag();
330 if (evt.isControlDown() || evt.isMetaDown())
332 cut_actionPerformed();
336 if (viewport.cursorMode && !evt.isControlDown())
338 alignPanel.seqPanel.setCursorColumn();
340 if (evt.isControlDown() || evt.isMetaDown())
342 copy_actionPerformed();
346 if (evt.isControlDown())
348 paste(evt.isShiftDown());
352 if (evt.isControlDown() || evt.isMetaDown())
354 selectAllSequenceMenuItem_actionPerformed();
357 case KeyEvent.VK_DOWN:
358 if (viewport.cursorMode)
360 alignPanel.seqPanel.moveCursor(0, 1);
364 moveSelectedSequences(false);
369 if (viewport.cursorMode)
371 alignPanel.seqPanel.moveCursor(0, -1);
375 moveSelectedSequences(true);
379 case KeyEvent.VK_LEFT:
380 if (evt.isAltDown() || !viewport.cursorMode)
381 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
383 alignPanel.seqPanel.moveCursor(-1, 0);
386 case KeyEvent.VK_RIGHT:
387 if (evt.isAltDown() || !viewport.cursorMode)
388 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
390 alignPanel.seqPanel.moveCursor(1, 0);
393 case KeyEvent.VK_SPACE:
394 if (viewport.cursorMode)
396 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
397 || evt.isShiftDown() || evt.isAltDown());
401 case KeyEvent.VK_DELETE:
402 case KeyEvent.VK_BACK_SPACE:
403 if (viewport.cursorMode)
405 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
406 || evt.isShiftDown() || evt.isAltDown());
410 cut_actionPerformed();
411 alignPanel.seqPanel.seqCanvas.repaint();
416 if (viewport.cursorMode)
418 alignPanel.seqPanel.setCursorRow();
422 if (viewport.cursorMode)
424 alignPanel.seqPanel.setCursorPosition();
428 case KeyEvent.VK_ENTER:
429 case KeyEvent.VK_COMMA:
430 if (viewport.cursorMode)
432 alignPanel.seqPanel.setCursorRowAndColumn();
437 if (viewport.cursorMode)
439 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
443 if (viewport.cursorMode)
445 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
450 viewport.cursorMode = !viewport.cursorMode;
451 statusBar.setText(MessageManager.formatMessage("label.keyboard_editing_mode", new String[]{(viewport.cursorMode ? "on" : "off")}));
452 if (viewport.cursorMode)
454 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
455 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
460 if (evt.isControlDown())
462 findMenuItem_actionPerformed();
468 boolean toggleSeqs = !evt.isControlDown();
469 boolean toggleCols = !evt.isShiftDown();
470 toggleHiddenRegions(toggleSeqs, toggleCols);
474 case KeyEvent.VK_PAGE_UP:
475 if (viewport.wrapAlignment)
477 alignPanel.scrollUp(true);
481 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
482 - viewport.endSeq + viewport.startSeq);
486 case KeyEvent.VK_PAGE_DOWN:
487 if (viewport.wrapAlignment)
489 alignPanel.scrollUp(false);
493 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
494 + viewport.endSeq - viewport.startSeq);
499 if (evt.isControlDown())
501 undoMenuItem_actionPerformed();
506 if (evt.isControlDown())
508 redoMenuItem_actionPerformed();
513 if (evt.isControlDown())
520 if (evt.isControlDown())
522 trimAlignment(false);
527 if (evt.isControlDown())
529 if (evt.isShiftDown())
531 this.removeAllGapsMenuItem_actionPerformed();
535 removeGappedColumnMenuItem_actionPerformed();
540 if (evt.isControlDown())
544 invertColSel_actionPerformed();
548 invertSequenceMenuItem_actionPerformed();
554 if (evt.isControlDown())
556 if (evt.isShiftDown())
558 this.unGroup_actionPerformed();
562 this.createGroup_actionPerformed();
568 if (evt.isControlDown())
570 this.deleteGroups_actionPerformed();
575 if (evt.isControlDown())
582 alignPanel.paintAlignment(true);
586 * called by key handler and the hide all/show all menu items
591 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
593 boolean hide = false;
594 SequenceGroup sg = viewport.getSelectionGroup();
595 if (!toggleSeqs && !toggleCols)
597 // Hide everything by the current selection - this is a hack - we do the
598 // invert and then hide
599 // first check that there will be visible columns after the invert.
600 if ((viewport.getColumnSelection() != null
601 && viewport.getColumnSelection().getSelected() != null && viewport
602 .getColumnSelection().getSelected().size() > 0)
603 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
606 // now invert the sequence set, if required - empty selection implies
607 // that no hiding is required.
610 invertSequenceMenuItem_actionPerformed();
611 sg = viewport.getSelectionGroup();
615 viewport.expandColSelection(sg, true);
616 // finally invert the column selection and get the new sequence
617 // selection and indicate it should be hidden.
618 invertColSel_actionPerformed();
625 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
628 viewport.hideAllSelectedSeqs();
630 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
633 viewport.showAllHiddenSeqs();
639 if (viewport.getColumnSelection().getSelected().size() > 0)
641 viewport.hideSelectedColumns();
644 viewport.setSelectionGroup(sg);
649 viewport.showAllHiddenColumns();
655 public void keyReleased(KeyEvent evt)
660 public void keyTyped(KeyEvent evt)
665 public void itemStateChanged(ItemEvent evt)
667 if (evt.getSource() == displayNonconservedMenuItem)
669 displayNonconservedMenuItem_actionPerformed();
671 else if (evt.getSource() == colourTextMenuItem)
673 colourTextMenuItem_actionPerformed();
675 else if (evt.getSource() == wrapMenuItem)
677 wrapMenuItem_actionPerformed();
679 else if (evt.getSource() == scaleAbove)
681 viewport.setScaleAboveWrapped(scaleAbove.getState());
683 else if (evt.getSource() == scaleLeft)
685 viewport.setScaleLeftWrapped(scaleLeft.getState());
687 else if (evt.getSource() == scaleRight)
689 viewport.setScaleRightWrapped(scaleRight.getState());
691 else if (evt.getSource() == seqLimits)
693 seqLimits_itemStateChanged();
695 else if (evt.getSource() == viewBoxesMenuItem)
697 viewport.setShowBoxes(viewBoxesMenuItem.getState());
699 else if (evt.getSource() == viewTextMenuItem)
701 viewport.setShowText(viewTextMenuItem.getState());
703 else if (evt.getSource() == renderGapsMenuItem)
705 viewport.setRenderGaps(renderGapsMenuItem.getState());
707 else if (evt.getSource() == annotationPanelMenuItem)
709 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
710 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
712 else if (evt.getSource() == sequenceFeatures)
714 viewport.showSequenceFeatures(sequenceFeatures.getState());
715 alignPanel.seqPanel.seqCanvas.repaint();
717 else if (evt.getSource() == conservationMenuItem)
719 conservationMenuItem_actionPerformed();
721 else if (evt.getSource() == abovePIDThreshold)
723 abovePIDThreshold_actionPerformed();
725 else if (evt.getSource() == applyToAllGroups)
727 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
729 else if (evt.getSource() == autoCalculate)
731 viewport.autoCalculateConsensus = autoCalculate.getState();
733 else if (evt.getSource() == sortByTree)
735 viewport.sortByTree = sortByTree.getState();
737 else if (evt.getSource() == this.centreColumnLabelFlag)
739 centreColumnLabelFlag_stateChanged();
741 else if (evt.getSource() == this.followMouseOverFlag)
743 mouseOverFlag_stateChanged();
745 else if (evt.getSource() == showGroupConsensus)
747 showGroupConsensus_actionPerformed();
749 else if (evt.getSource() == showGroupConservation)
751 showGroupConservation_actionPerformed();
753 else if (evt.getSource() == showSequenceLogo)
755 showSequenceLogo_actionPerformed();
757 else if (evt.getSource() == normSequenceLogo)
759 normSequenceLogo_actionPerformed();
761 else if (evt.getSource() == showConsensusHistogram)
763 showConsensusHistogram_actionPerformed();
765 else if (evt.getSource() == applyAutoAnnotationSettings)
767 applyAutoAnnotationSettings_actionPerformed();
769 alignPanel.paintAlignment(true);
772 private void mouseOverFlag_stateChanged()
774 viewport.followHighlight = followMouseOverFlag.getState();
775 // TODO: could kick the scrollTo mechanism to reset view for current
779 private void centreColumnLabelFlag_stateChanged()
781 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
782 this.alignPanel.annotationPanel.repaint();
786 public void actionPerformed(ActionEvent evt)
788 Object source = evt.getSource();
790 if (source == inputText)
792 inputText_actionPerformed();
794 else if (source == loadTree)
796 loadTree_actionPerformed();
798 else if (source == loadApplication)
800 launchFullApplication();
802 else if (source == loadAnnotations)
806 else if (source == outputAnnotations)
808 outputAnnotations(true);
810 else if (source == outputFeatures)
812 outputFeatures(true, "Jalview");
814 else if (source == closeMenuItem)
816 closeMenuItem_actionPerformed();
818 else if (source == copy)
820 copy_actionPerformed();
822 else if (source == undoMenuItem)
824 undoMenuItem_actionPerformed();
826 else if (source == redoMenuItem)
828 redoMenuItem_actionPerformed();
830 else if (source == inputText)
832 inputText_actionPerformed();
834 else if (source == closeMenuItem)
836 closeMenuItem_actionPerformed();
838 else if (source == undoMenuItem)
840 undoMenuItem_actionPerformed();
842 else if (source == redoMenuItem)
844 redoMenuItem_actionPerformed();
846 else if (source == copy)
848 copy_actionPerformed();
850 else if (source == pasteNew)
852 pasteNew_actionPerformed();
854 else if (source == pasteThis)
856 pasteThis_actionPerformed();
858 else if (source == cut)
860 cut_actionPerformed();
862 else if (source == delete)
864 delete_actionPerformed();
866 else if (source == grpsFromSelection)
868 makeGrpsFromSelection_actionPerformed();
870 else if (source == deleteGroups)
872 deleteGroups_actionPerformed();
874 else if (source == selectAllSequenceMenuItem)
876 selectAllSequenceMenuItem_actionPerformed();
878 else if (source == deselectAllSequenceMenuItem)
880 deselectAllSequenceMenuItem_actionPerformed();
882 else if (source == invertSequenceMenuItem)
884 invertSequenceMenuItem_actionPerformed();
886 else if (source == invertColSel)
888 viewport.invertColumnSelection();
889 alignPanel.paintAlignment(true);
891 else if (source == remove2LeftMenuItem)
895 else if (source == remove2RightMenuItem)
897 trimAlignment(false);
899 else if (source == removeGappedColumnMenuItem)
901 removeGappedColumnMenuItem_actionPerformed();
903 else if (source == removeAllGapsMenuItem)
905 removeAllGapsMenuItem_actionPerformed();
907 else if (source == findMenuItem)
909 findMenuItem_actionPerformed();
911 else if (source == font)
913 new FontChooser(alignPanel);
915 else if (source == newView)
919 else if (source == showColumns)
921 viewport.showAllHiddenColumns();
922 alignPanel.paintAlignment(true);
924 else if (source == showSeqs)
926 viewport.showAllHiddenSeqs();
927 alignPanel.paintAlignment(true);
929 else if (source == hideColumns)
931 viewport.hideSelectedColumns();
932 alignPanel.paintAlignment(true);
934 else if (source == hideSequences
935 && viewport.getSelectionGroup() != null)
937 viewport.hideAllSelectedSeqs();
938 alignPanel.paintAlignment(true);
940 else if (source == hideAllButSelection)
942 toggleHiddenRegions(false, false);
943 alignPanel.paintAlignment(true);
945 else if (source == hideAllSelection)
947 SequenceGroup sg = viewport.getSelectionGroup();
948 viewport.expandColSelection(sg, false);
949 viewport.hideAllSelectedSeqs();
950 viewport.hideSelectedColumns();
951 alignPanel.paintAlignment(true);
953 else if (source == showAllHidden)
955 viewport.showAllHiddenColumns();
956 viewport.showAllHiddenSeqs();
957 alignPanel.paintAlignment(true);
959 else if (source == showGroupConsensus)
961 showGroupConsensus_actionPerformed();
963 else if (source == showGroupConservation)
965 showGroupConservation_actionPerformed();
967 else if (source == showSequenceLogo)
969 showSequenceLogo_actionPerformed();
971 else if (source == normSequenceLogo)
973 normSequenceLogo_actionPerformed();
975 else if (source == showConsensusHistogram)
977 showConsensusHistogram_actionPerformed();
979 else if (source == applyAutoAnnotationSettings)
981 applyAutoAnnotationSettings_actionPerformed();
983 else if (source == featureSettings)
985 new FeatureSettings(alignPanel);
987 else if (source == alProperties)
989 StringBuffer contents = new jalview.io.AlignmentProperties(
990 viewport.getAlignment()).formatAsString();
991 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
992 cap.setText(contents.toString());
993 Frame frame = new Frame();
995 jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage("label.alignment_properties", new String[]{getTitle()}),
998 else if (source == overviewMenuItem)
1000 overviewMenuItem_actionPerformed();
1002 else if (source == noColourmenuItem)
1006 else if (source == clustalColour)
1008 abovePIDThreshold.setState(false);
1009 changeColour(new ClustalxColourScheme(viewport.getAlignment(), null));
1011 else if (source == zappoColour)
1013 changeColour(new ZappoColourScheme());
1015 else if (source == taylorColour)
1017 changeColour(new TaylorColourScheme());
1019 else if (source == hydrophobicityColour)
1021 changeColour(new HydrophobicColourScheme());
1023 else if (source == helixColour)
1025 changeColour(new HelixColourScheme());
1027 else if (source == strandColour)
1029 changeColour(new StrandColourScheme());
1031 else if (source == turnColour)
1033 changeColour(new TurnColourScheme());
1035 else if (source == buriedColour)
1037 changeColour(new BuriedColourScheme());
1039 else if (source == nucleotideColour)
1041 changeColour(new NucleotideColourScheme());
1043 else if (source == purinePyrimidineColour)
1045 changeColour(new PurinePyrimidineColourScheme());
1047 else if (source == RNAHelixColour)
1049 new RNAHelicesColourChooser(viewport, alignPanel);
1051 else if (source == modifyPID)
1053 modifyPID_actionPerformed();
1055 else if (source == modifyConservation)
1057 modifyConservation_actionPerformed();
1059 else if (source == userDefinedColour)
1061 new UserDefinedColours(alignPanel, null);
1063 else if (source == PIDColour)
1065 changeColour(new PIDColourScheme());
1067 else if (source == BLOSUM62Colour)
1069 changeColour(new Blosum62ColourScheme());
1071 else if (source == tcoffeeColour)
1073 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
1075 else if (source == annotationColour)
1077 new AnnotationColourChooser(viewport, alignPanel);
1079 else if (source == sortPairwiseMenuItem)
1081 sortPairwiseMenuItem_actionPerformed();
1083 else if (source == sortIDMenuItem)
1085 sortIDMenuItem_actionPerformed();
1087 else if (source == sortLengthMenuItem)
1089 sortLengthMenuItem_actionPerformed();
1091 else if (source == sortGroupMenuItem)
1093 sortGroupMenuItem_actionPerformed();
1095 else if (source == removeRedundancyMenuItem)
1097 removeRedundancyMenuItem_actionPerformed();
1099 else if (source == pairwiseAlignmentMenuItem)
1101 pairwiseAlignmentMenuItem_actionPerformed();
1103 else if (source == PCAMenuItem)
1105 PCAMenuItem_actionPerformed();
1107 else if (source == averageDistanceTreeMenuItem)
1109 averageDistanceTreeMenuItem_actionPerformed();
1111 else if (source == neighbourTreeMenuItem)
1113 neighbourTreeMenuItem_actionPerformed();
1115 else if (source == njTreeBlosumMenuItem)
1117 njTreeBlosumMenuItem_actionPerformed();
1119 else if (source == avDistanceTreeBlosumMenuItem)
1121 avTreeBlosumMenuItem_actionPerformed();
1123 else if (source == documentation)
1125 documentation_actionPerformed();
1127 else if (source == about)
1129 about_actionPerformed();
1134 public void inputText_actionPerformed()
1136 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1137 Frame frame = new Frame();
1139 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.input_cut_paste"), 500, 500);
1142 protected void outputText_actionPerformed(ActionEvent e)
1144 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1145 Frame frame = new Frame();
1147 jalview.bin.JalviewLite.addFrame(frame,
1148 MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}),600, 500);
1149 cap.setText(new AppletFormatAdapter().formatSequences(
1150 e.getActionCommand(), viewport.getAlignment(),
1151 viewport.showJVSuffix));
1154 public void loadAnnotations()
1156 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1157 cap.setText(MessageManager.getString("label.paste_features_annotations_Tcoffee_here"));
1158 cap.setAnnotationImport();
1159 Frame frame = new Frame();
1161 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("action.paste_annotations"), 400, 300);
1165 public String outputAnnotations(boolean displayTextbox)
1167 String annotation = new AnnotationFile().printAnnotations(
1168 viewport.showAnnotation ? viewport.getAlignment()
1169 .getAlignmentAnnotation() : null, viewport
1170 .getAlignment().getGroups(), ((Alignment) viewport
1171 .getAlignment()).alignmentProperties);
1175 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1176 Frame frame = new Frame();
1178 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.annotations"), 600, 500);
1179 cap.setText(annotation);
1185 private Hashtable getDisplayedFeatureCols()
1187 if (alignPanel.getFeatureRenderer() != null
1188 && viewport.featuresDisplayed != null)
1190 FeatureRenderer fr = alignPanel.getFeatureRenderer();
1191 Hashtable fcols = new Hashtable();
1192 Enumeration en = viewport.featuresDisplayed.keys();
1193 while (en.hasMoreElements())
1195 Object col = en.nextElement();
1196 fcols.put(col, fr.featureColours.get(col));
1203 public String outputFeatures(boolean displayTextbox, String format)
1206 if (format.equalsIgnoreCase("Jalview"))
1208 features = new FeaturesFile().printJalviewFormat(viewport
1209 .getAlignment().getSequencesArray(),
1210 getDisplayedFeatureCols());
1214 features = new FeaturesFile().printGFFFormat(viewport.getAlignment()
1215 .getSequencesArray(), getDisplayedFeatureCols());
1220 boolean frimport = false;
1221 if (features == null || features.equals("No Features Visible"))
1223 features = "# No features visible - paste some and import them here.";
1227 CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);
1230 cap.setAnnotationImport();
1232 Frame frame = new Frame();
1234 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.features"), 600, 500);
1235 cap.setText(features);
1239 if (features == null)
1246 void launchFullApplication()
1248 StringBuffer url = new StringBuffer(jalviewServletURL);
1251 + appendProtocol(viewport.applet.getParameter("file")));
1253 if (viewport.applet.getParameter("features") != null)
1255 url.append("&features=");
1256 url.append(appendProtocol(viewport.applet.getParameter("features")));
1259 if (viewport.applet.getParameter("annotations") != null)
1261 url.append("&annotations=");
1262 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
1265 if (viewport.applet.getParameter("jnetfile") != null)
1267 url.append("&annotations=");
1268 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1271 if (viewport.applet.getParameter("defaultColour") != null)
1273 url.append("&colour="
1274 + removeWhiteSpace(viewport.applet
1275 .getParameter("defaultColour")));
1278 if (viewport.applet.getParameter("userDefinedColour") != null)
1280 url.append("&colour="
1281 + removeWhiteSpace(viewport.applet
1282 .getParameter("userDefinedColour")));
1284 if (viewport.applet.getParameter("tree") != null)
1287 + appendProtocol(viewport.applet.getParameter("tree")));
1289 if (viewport.applet.getParameter("treeFile") != null)
1292 + appendProtocol(viewport.applet.getParameter("treeFile")));
1295 showURL(url.toString(), "FULL_APP");
1298 String removeWhiteSpace(String colour)
1300 StringBuffer sb = new StringBuffer();
1301 for (int i = 0; i < colour.length(); i++)
1303 if (Character.isWhitespace(colour.charAt(i)))
1309 sb.append(colour.charAt(i));
1313 return sb.toString();
1316 String appendProtocol(String url)
1321 url = URLEncoder.encode(url);
1324 * When we finally deprecate 1.1 compatibility, we can start to use
1325 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1326 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1327 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1328 * ex.printStackTrace(); }
1330 catch (java.net.MalformedURLException ex)
1332 url = viewport.applet.getCodeBase() + url;
1337 public void closeMenuItem_actionPerformed()
1339 PaintRefresher.RemoveComponent(alignPanel);
1340 if (alignPanel.seqPanel != null
1341 && alignPanel.seqPanel.seqCanvas != null)
1343 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1345 if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null)
1347 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1350 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1365 void updateEditMenuBar()
1368 if (viewport.historyList.size() > 0)
1370 undoMenuItem.setEnabled(true);
1371 CommandI command = (CommandI) viewport.historyList.peek();
1372 undoMenuItem.setLabel(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));
1376 undoMenuItem.setEnabled(false);
1377 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
1380 if (viewport.redoList.size() > 0)
1382 redoMenuItem.setEnabled(true);
1384 CommandI command = (CommandI) viewport.redoList.peek();
1385 redoMenuItem.setLabel(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));
1389 redoMenuItem.setEnabled(false);
1390 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
1397 public void addHistoryItem(CommandI command)
1399 if (command.getSize() > 0)
1401 viewport.historyList.push(command);
1402 viewport.redoList.removeAllElements();
1403 updateEditMenuBar();
1404 viewport.updateHiddenColumns();
1409 * TODO: JAL-1104 DOCUMENT ME!
1414 protected void undoMenuItem_actionPerformed()
1416 if (viewport.historyList.size() < 1)
1421 CommandI command = (CommandI) viewport.historyList.pop();
1422 viewport.redoList.push(command);
1423 command.undoCommand(null);
1425 AlignViewport originalSource = getOriginatingSource(command);
1427 if (originalSource != viewport)
1430 .println("Warning: Viewport object mismatch whilst undoing");
1432 originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns =
1433 // viewport.getColumnSelection().getHiddenColumns()
1435 updateEditMenuBar();
1436 originalSource.firePropertyChange("alignment", null, originalSource
1437 .getAlignment().getSequences());
1441 * TODO: JAL-1104 DOCUMENT ME!
1446 protected void redoMenuItem_actionPerformed()
1448 if (viewport.redoList.size() < 1)
1453 CommandI command = (CommandI) viewport.redoList.pop();
1454 viewport.historyList.push(command);
1455 command.doCommand(null);
1457 AlignViewport originalSource = getOriginatingSource(command);
1459 if (originalSource != viewport)
1462 .println("Warning: Viewport object mismatch whilst re-doing");
1464 originalSource.updateHiddenColumns(); // sethasHiddenColumns(); =
1465 // viewport.getColumnSelection().getHiddenColumns()
1468 updateEditMenuBar();
1469 originalSource.firePropertyChange("alignment", null, originalSource
1470 .getAlignment().getSequences());
1473 AlignViewport getOriginatingSource(CommandI command)
1475 AlignViewport originalSource = null;
1476 // For sequence removal and addition, we need to fire
1477 // the property change event FROM the viewport where the
1478 // original alignment was altered
1479 AlignmentI al = null;
1480 if (command instanceof EditCommand)
1482 EditCommand editCommand = (EditCommand) command;
1483 al = editCommand.getAlignment();
1484 Vector comps = (Vector) PaintRefresher.components.get(viewport
1485 .getSequenceSetId());
1486 for (int i = 0; i < comps.size(); i++)
1488 if (comps.elementAt(i) instanceof AlignmentPanel)
1490 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1492 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1499 if (originalSource == null)
1501 // The original view is closed, we must validate
1502 // the current view against the closed view first
1505 PaintRefresher.validateSequences(al, viewport.getAlignment());
1508 originalSource = viewport;
1511 return originalSource;
1514 public void moveSelectedSequences(boolean up)
1516 SequenceGroup sg = viewport.getSelectionGroup();
1521 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1522 up ? null : viewport.getHiddenRepSequences(), up);
1523 alignPanel.paintAlignment(true);
1526 synchronized void slideSequences(boolean right, int size)
1528 List<SequenceI> sg = new Vector<SequenceI>();
1529 if (viewport.cursorMode)
1531 sg.add(viewport.getAlignment().getSequenceAt(
1532 alignPanel.seqPanel.seqCanvas.cursorY));
1534 else if (viewport.getSelectionGroup() != null
1535 && viewport.getSelectionGroup().getSize() != viewport
1536 .getAlignment().getHeight())
1538 sg = viewport.getSelectionGroup().getSequences(
1539 viewport.getHiddenRepSequences());
1547 Vector<SequenceI> invertGroup = new Vector();
1549 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1551 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1552 invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));
1555 SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);
1557 SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup
1559 for (int i = 0; i < invertGroup.size(); i++)
1560 seqs2[i] = invertGroup.elementAt(i);
1562 SlideSequencesCommand ssc;
1564 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1565 size, viewport.getGapCharacter());
1567 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1568 size, viewport.getGapCharacter());
1570 int groupAdjustment = 0;
1571 if (ssc.getGapsInsertedBegin() && right)
1573 if (viewport.cursorMode)
1574 alignPanel.seqPanel.moveCursor(size, 0);
1576 groupAdjustment = size;
1578 else if (!ssc.getGapsInsertedBegin() && !right)
1580 if (viewport.cursorMode)
1581 alignPanel.seqPanel.moveCursor(-size, 0);
1583 groupAdjustment = -size;
1586 if (groupAdjustment != 0)
1588 viewport.getSelectionGroup().setStartRes(
1589 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1590 viewport.getSelectionGroup().setEndRes(
1591 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1594 boolean appendHistoryItem = false;
1595 if (viewport.historyList != null && viewport.historyList.size() > 0
1596 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1598 appendHistoryItem = ssc
1599 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1603 if (!appendHistoryItem)
1604 addHistoryItem(ssc);
1609 static StringBuffer copiedSequences;
1611 static Vector copiedHiddenColumns;
1613 protected void copy_actionPerformed()
1615 if (viewport.getSelectionGroup() == null)
1620 SequenceGroup sg = viewport.getSelectionGroup();
1621 copiedSequences = new StringBuffer();
1622 Hashtable orderedSeqs = new Hashtable();
1623 for (int i = 0; i < sg.getSize(); i++)
1625 SequenceI seq = sg.getSequenceAt(i);
1626 int index = viewport.getAlignment().findIndex(seq);
1627 orderedSeqs.put(index + "", seq);
1630 int index = 0, startRes, endRes;
1633 if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null)
1635 copiedHiddenColumns = new Vector();
1636 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1637 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1640 int[] region = (int[]) viewport.getColumnSelection()
1641 .getHiddenColumns().elementAt(i);
1643 copiedHiddenColumns.addElement(new int[]
1644 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1649 copiedHiddenColumns = null;
1652 for (int i = 0; i < sg.getSize(); i++)
1654 SequenceI seq = null;
1658 if (orderedSeqs.containsKey(index + ""))
1660 seq = (SequenceI) orderedSeqs.get(index + "");
1672 // Returns residue following index if gap
1673 startRes = seq.findPosition(sg.getStartRes());
1676 // Need to find the residue preceeding index if gap
1679 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1681 ch = seq.getCharAt(j);
1682 if (!jalview.util.Comparison.isGap((ch)))
1690 endRes += seq.getStart() - 1;
1693 copiedSequences.append(seq.getName()
1699 + seq.getSequenceAsString(sg.getStartRes(),
1700 sg.getEndRes() + 1) + "\n");
1705 protected void pasteNew_actionPerformed()
1710 protected void pasteThis_actionPerformed()
1715 void paste(boolean newAlignment)
1720 if (copiedSequences == null)
1725 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1726 Vector seqs = new Vector();
1727 while (st.hasMoreElements())
1729 String name = st.nextToken();
1730 int start = Integer.parseInt(st.nextToken());
1731 int end = Integer.parseInt(st.nextToken());
1732 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1734 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1735 for (int i = 0; i < seqs.size(); i++)
1737 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1742 String newtitle = new String("Copied sequences");
1743 if (getTitle().startsWith("Copied sequences"))
1745 newtitle = getTitle();
1749 newtitle = newtitle.concat("- from " + getTitle());
1751 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1752 viewport.applet, newtitle, false);
1753 if (copiedHiddenColumns != null)
1755 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1757 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1758 af.viewport.hideColumns(region[0], region[1]);
1762 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1767 addSequences(newSeqs);
1770 } catch (Exception ex)
1772 } // could be anything being pasted in here
1776 void addSequences(SequenceI[] seqs)
1778 for (int i = 0; i < seqs.length; i++)
1780 viewport.getAlignment().addSequence(seqs[i]);
1784 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1785 seqs, 0, viewport.getAlignment().getWidth(),
1786 viewport.getAlignment()));
1788 viewport.setEndSeq(viewport.getAlignment().getHeight());
1789 viewport.getAlignment().getWidth();
1790 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1795 protected void cut_actionPerformed()
1797 copy_actionPerformed();
1798 delete_actionPerformed();
1801 protected void delete_actionPerformed()
1804 SequenceGroup sg = viewport.getSelectionGroup();
1810 Vector seqs = new Vector();
1812 for (int i = 0; i < sg.getSize(); i++)
1814 seq = sg.getSequenceAt(i);
1815 seqs.addElement(seq);
1818 // If the cut affects all sequences, remove highlighted columns
1819 if (sg.getSize() == viewport.getAlignment().getHeight())
1821 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1822 sg.getEndRes() + 1);
1825 SequenceI[] cut = new SequenceI[seqs.size()];
1826 for (int i = 0; i < seqs.size(); i++)
1828 cut[i] = (SequenceI) seqs.elementAt(i);
1832 * //ADD HISTORY ITEM
1834 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1835 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1836 viewport.getAlignment()));
1838 viewport.setSelectionGroup(null);
1839 viewport.getAlignment().deleteGroup(sg);
1841 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1844 if (viewport.getAlignment().getHeight() < 1)
1846 this.setVisible(false);
1848 viewport.sendSelection();
1852 * group consensus toggled
1855 protected void showGroupConsensus_actionPerformed()
1857 viewport.setShowGroupConsensus(showGroupConsensus.getState());
1858 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1863 * group conservation toggled.
1865 protected void showGroupConservation_actionPerformed()
1867 viewport.setShowGroupConservation(showGroupConservation.getState());
1868 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1875 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
1876 * .event.ActionEvent)
1878 protected void showConsensusHistogram_actionPerformed()
1880 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
1881 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1888 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
1889 * .event.ActionEvent)
1891 protected void showSequenceLogo_actionPerformed()
1893 viewport.setShowSequenceLogo(showSequenceLogo.getState());
1894 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1897 protected void normSequenceLogo_actionPerformed()
1899 showSequenceLogo.setState(true);
1900 viewport.setShowSequenceLogo(true);
1901 viewport.setNormaliseSequenceLogo(normSequenceLogo.getState());
1902 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1905 protected void applyAutoAnnotationSettings_actionPerformed()
1907 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1910 protected void makeGrpsFromSelection_actionPerformed()
1912 if (avc.makeGroupsFromSelection()) {
1913 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1914 alignPanel.updateAnnotation();
1915 alignPanel.paintAlignment(true);
1919 protected void createGroup_actionPerformed()
1923 protected void unGroup_actionPerformed()
1927 alignPanel.alignmentChanged();
1930 protected void deleteGroups_actionPerformed()
1932 if (avc.deleteGroups())
1934 alignPanel.alignmentChanged();
1938 public void selectAllSequenceMenuItem_actionPerformed()
1940 SequenceGroup sg = new SequenceGroup();
1941 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1943 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1945 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
1946 viewport.setSelectionGroup(sg);
1947 alignPanel.paintAlignment(true);
1948 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1949 viewport.sendSelection();
1952 public void deselectAllSequenceMenuItem_actionPerformed()
1954 if (viewport.cursorMode)
1956 alignPanel.seqPanel.keyboardNo1 = null;
1957 alignPanel.seqPanel.keyboardNo2 = null;
1959 viewport.setSelectionGroup(null);
1960 viewport.getColumnSelection().clear();
1961 viewport.setSelectionGroup(null);
1962 alignPanel.idPanel.idCanvas.searchResults = null;
1963 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1964 alignPanel.paintAlignment(true);
1965 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1966 viewport.sendSelection();
1969 public void invertSequenceMenuItem_actionPerformed()
1971 SequenceGroup sg = viewport.getSelectionGroup();
1972 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1974 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1977 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1978 viewport.sendSelection();
1981 public void invertColSel_actionPerformed()
1983 viewport.invertColumnSelection();
1984 alignPanel.paintAlignment(true);
1985 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1986 viewport.sendSelection();
1989 void trimAlignment(boolean trimLeft)
1991 ColumnSelection colSel = viewport.getColumnSelection();
1994 if (colSel.size() > 0)
1998 column = colSel.getMin();
2002 column = colSel.getMax();
2006 if (viewport.getSelectionGroup() != null)
2008 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2009 viewport.getHiddenRepSequences());
2013 seqs = viewport.getAlignment().getSequencesArray();
2016 TrimRegionCommand trimRegion;
2019 trimRegion = new TrimRegionCommand("Remove Left",
2020 TrimRegionCommand.TRIM_LEFT, seqs, column,
2021 viewport.getAlignment(), viewport.getColumnSelection(),
2022 viewport.getSelectionGroup());
2023 viewport.setStartRes(0);
2027 trimRegion = new TrimRegionCommand("Remove Right",
2028 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2029 viewport.getAlignment(), viewport.getColumnSelection(),
2030 viewport.getSelectionGroup());
2033 statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));
2034 addHistoryItem(trimRegion);
2036 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2038 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2039 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2041 viewport.getAlignment().deleteGroup(sg);
2045 viewport.firePropertyChange("alignment", null, viewport
2046 .getAlignment().getSequences());
2050 public void removeGappedColumnMenuItem_actionPerformed()
2052 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2055 if (viewport.getSelectionGroup() != null)
2057 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2058 viewport.getHiddenRepSequences());
2059 start = viewport.getSelectionGroup().getStartRes();
2060 end = viewport.getSelectionGroup().getEndRes();
2064 seqs = viewport.getAlignment().getSequencesArray();
2067 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2068 "Remove Gapped Columns", seqs, start, end,
2069 viewport.getAlignment());
2071 addHistoryItem(removeGapCols);
2073 statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));
2075 // This is to maintain viewport position on first residue
2076 // of first sequence
2077 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2078 int startRes = seq.findPosition(viewport.startRes);
2079 // ShiftList shifts;
2080 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2081 // edit.alColumnChanges=shifts.getInverse();
2082 // if (viewport.hasHiddenColumns)
2083 // viewport.getColumnSelection().compensateForEdits(shifts);
2084 viewport.setStartRes(seq.findIndex(startRes) - 1);
2085 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2090 public void removeAllGapsMenuItem_actionPerformed()
2092 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2095 if (viewport.getSelectionGroup() != null)
2097 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2098 viewport.getHiddenRepSequences());
2099 start = viewport.getSelectionGroup().getStartRes();
2100 end = viewport.getSelectionGroup().getEndRes();
2104 seqs = viewport.getAlignment().getSequencesArray();
2107 // This is to maintain viewport position on first residue
2108 // of first sequence
2109 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2110 int startRes = seq.findPosition(viewport.startRes);
2112 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2113 viewport.getAlignment()));
2115 viewport.setStartRes(seq.findIndex(startRes) - 1);
2117 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2122 public void findMenuItem_actionPerformed()
2124 new Finder(alignPanel);
2128 * create a new view derived from the current view
2131 * @return frame for the new view
2133 public AlignFrame newView(String viewtitle)
2136 if (viewport.hasHiddenRows())
2138 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
2139 .getFullAlignment().getSequencesArray());
2143 newal = new Alignment(viewport.getAlignment().getSequencesArray());
2146 if (viewport.getAlignment().getAlignmentAnnotation() != null)
2148 for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++)
2150 if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated)
2152 newal.addAnnotation(viewport.getAlignment()
2153 .getAlignmentAnnotation()[i]);
2158 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
2160 newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId());
2161 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
2162 PaintRefresher.Register(newaf.alignPanel,
2163 newaf.alignPanel.av.getSequenceSetId());
2165 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
2166 newaf.alignPanel.av.getSequenceSetId());
2167 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
2168 newaf.alignPanel.av.getSequenceSetId());
2170 Vector comps = (Vector) PaintRefresher.components.get(viewport
2171 .getSequenceSetId());
2173 for (int i = 0; i < comps.size(); i++)
2175 if (comps.elementAt(i) instanceof AlignmentPanel)
2181 String title = new String(this.getTitle());
2182 if (viewtitle != null)
2184 title = viewtitle + " ( " + title + ")";
2188 if (title.indexOf("(View") > -1)
2190 title = title.substring(0, title.indexOf("(View"));
2192 title += "(View " + viewSize + ")";
2195 newaf.setTitle(title.toString());
2197 newaf.viewport.historyList = viewport.historyList;
2198 newaf.viewport.redoList = viewport.redoList;
2204 * @return list of feature groups on the view
2206 public String[] getFeatureGroups()
2208 FeatureRenderer fr = null;
2209 if (alignPanel != null
2210 && (fr = alignPanel.getFeatureRenderer()) != null)
2212 return fr.getGroups();
2218 * get sequence feature groups that are hidden or shown
2224 public String[] getFeatureGroupsOfState(boolean visible)
2226 FeatureRenderer fr = null;
2227 if (alignPanel != null
2228 && (fr = alignPanel.getFeatureRenderer()) != null)
2230 return fr.getGroups(visible);
2236 * Change the display state for the given feature groups
2239 * list of group strings
2241 * visible or invisible
2243 public void setFeatureGroupState(String[] groups, boolean state)
2245 FeatureRenderer fr = null;
2246 this.sequenceFeatures.setState(true);
2247 viewport.showSequenceFeatures(true);
2248 if (alignPanel != null
2249 && (fr = alignPanel.getFeatureRenderer()) != null)
2251 fr.setGroupState(groups, state);
2252 alignPanel.seqPanel.seqCanvas.repaint();
2253 if (alignPanel.overviewPanel != null)
2255 alignPanel.overviewPanel.updateOverviewImage();
2260 public void seqLimits_itemStateChanged()
2262 viewport.setShowJVSuffix(seqLimits.getState());
2263 alignPanel.fontChanged();
2264 alignPanel.paintAlignment(true);
2267 protected void colourTextMenuItem_actionPerformed()
2269 viewport.setColourText(colourTextMenuItem.getState());
2270 alignPanel.paintAlignment(true);
2273 protected void displayNonconservedMenuItem_actionPerformed()
2275 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2276 alignPanel.paintAlignment(true);
2279 protected void wrapMenuItem_actionPerformed()
2281 viewport.setWrapAlignment(wrapMenuItem.getState());
2282 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2283 scaleAbove.setEnabled(wrapMenuItem.getState());
2284 scaleLeft.setEnabled(wrapMenuItem.getState());
2285 scaleRight.setEnabled(wrapMenuItem.getState());
2286 alignPanel.paintAlignment(true);
2289 public void overviewMenuItem_actionPerformed()
2291 if (alignPanel.overviewPanel != null)
2296 Frame frame = new Frame();
2297 OverviewPanel overview = new OverviewPanel(alignPanel);
2298 frame.add(overview);
2299 // +50 must allow for applet frame window
2300 jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage("label.overview_params", new String[]{this.getTitle()}),
2301 overview.getPreferredSize().width,
2302 overview.getPreferredSize().height + 50);
2305 final AlignmentPanel ap = alignPanel;
2306 frame.addWindowListener(new WindowAdapter()
2309 public void windowClosing(WindowEvent e)
2313 ap.setOverviewPanel(null);
2318 alignPanel.setOverviewPanel(overview);
2322 void changeColour(ColourSchemeI cs)
2328 if (viewport.getAbovePIDThreshold())
2330 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2333 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2335 viewport.setGlobalColourScheme(cs);
2339 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2342 if (viewport.getConservationSelected())
2345 Alignment al = (Alignment) viewport.getAlignment();
2346 Conservation c = new Conservation("All",
2347 ResidueProperties.propHash, 3, al.getSequences(), 0,
2351 c.verdict(false, viewport.getConsPercGaps());
2353 cs.setConservation(c);
2355 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2361 cs.setConservation(null);
2364 cs.setConsensus(viewport.getSequenceConsensusHash());
2367 viewport.setGlobalColourScheme(cs);
2369 if (alignPanel.getOverviewPanel() != null)
2371 alignPanel.getOverviewPanel().updateOverviewImage();
2374 jalview.structure.StructureSelectionManager
2375 .getStructureSelectionManager(viewport.applet)
2376 .sequenceColoursChanged(alignPanel);
2378 alignPanel.paintAlignment(true);
2381 protected void modifyPID_actionPerformed()
2383 if (viewport.getAbovePIDThreshold()
2384 && viewport.getGlobalColourScheme() != null)
2386 SliderPanel.setPIDSliderSource(alignPanel,
2387 viewport.getGlobalColourScheme(), "Background");
2388 SliderPanel.showPIDSlider();
2392 protected void modifyConservation_actionPerformed()
2394 if (viewport.getConservationSelected()
2395 && viewport.getGlobalColourScheme() != null)
2397 SliderPanel.setConservationSlider(alignPanel,
2398 viewport.getGlobalColourScheme(), "Background");
2399 SliderPanel.showConservationSlider();
2403 protected void conservationMenuItem_actionPerformed()
2405 viewport.setConservationSelected(conservationMenuItem.getState());
2407 viewport.setAbovePIDThreshold(false);
2408 abovePIDThreshold.setState(false);
2410 changeColour(viewport.getGlobalColourScheme());
2412 modifyConservation_actionPerformed();
2415 public void abovePIDThreshold_actionPerformed()
2417 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2419 conservationMenuItem.setState(false);
2420 viewport.setConservationSelected(false);
2422 changeColour(viewport.getGlobalColourScheme());
2424 modifyPID_actionPerformed();
2427 public void sortPairwiseMenuItem_actionPerformed()
2429 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2430 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2431 .getAlignment().getSequenceAt(0), null);
2433 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2434 viewport.getAlignment()));
2435 alignPanel.paintAlignment(true);
2438 public void sortIDMenuItem_actionPerformed()
2440 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2441 AlignmentSorter.sortByID(viewport.getAlignment());
2442 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2443 viewport.getAlignment()));
2444 alignPanel.paintAlignment(true);
2447 public void sortLengthMenuItem_actionPerformed()
2449 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2450 AlignmentSorter.sortByLength(viewport.getAlignment());
2451 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
2452 viewport.getAlignment()));
2453 alignPanel.paintAlignment(true);
2456 public void sortGroupMenuItem_actionPerformed()
2458 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2459 AlignmentSorter.sortByGroup(viewport.getAlignment());
2460 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2461 viewport.getAlignment()));
2462 alignPanel.paintAlignment(true);
2466 public void removeRedundancyMenuItem_actionPerformed()
2468 new RedundancyPanel(alignPanel);
2471 public void pairwiseAlignmentMenuItem_actionPerformed()
2473 if (viewport.getSelectionGroup() != null
2474 && viewport.getSelectionGroup().getSize() > 1)
2476 Frame frame = new Frame();
2477 frame.add(new PairwiseAlignPanel(alignPanel));
2478 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("action.pairwise_alignment"), 600,
2483 public void PCAMenuItem_actionPerformed()
2485 // are the sequences aligned?
2486 if (!viewport.getAlignment().isAligned(false))
2489 int Width = viewport.getAlignment().getWidth();
2491 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2493 current = viewport.getAlignment().getSequenceAt(i);
2495 if (current.getLength() < Width)
2497 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2500 alignPanel.paintAlignment(true);
2503 if ((viewport.getSelectionGroup() != null
2504 && viewport.getSelectionGroup().getSize() < 4 && viewport
2505 .getSelectionGroup().getSize() > 0)
2506 || viewport.getAlignment().getHeight() < 4)
2513 new PCAPanel(viewport);
2514 } catch (java.lang.OutOfMemoryError ex)
2520 public void averageDistanceTreeMenuItem_actionPerformed()
2522 NewTreePanel("AV", "PID", "Average distance tree using PID");
2525 public void neighbourTreeMenuItem_actionPerformed()
2527 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2530 protected void njTreeBlosumMenuItem_actionPerformed()
2532 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2535 protected void avTreeBlosumMenuItem_actionPerformed()
2537 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2540 void NewTreePanel(String type, String pwType, String title)
2542 // are the sequences aligned?
2543 if (!viewport.getAlignment().isAligned(false))
2546 int Width = viewport.getAlignment().getWidth();
2548 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2550 current = viewport.getAlignment().getSequenceAt(i);
2552 if (current.getLength() < Width)
2554 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2557 alignPanel.paintAlignment(true);
2561 if ((viewport.getSelectionGroup() != null && viewport
2562 .getSelectionGroup().getSize() > 1)
2563 || (viewport.getAlignment().getHeight() > 1))
2565 final TreePanel tp = new TreePanel(alignPanel, type, pwType);
2567 addTreeMenuItem(tp, title);
2569 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2573 void loadTree_actionPerformed()
2575 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2576 cap.setText(MessageManager.getString("label.paste_newick_tree_file"));
2577 cap.setTreeImport();
2578 Frame frame = new Frame();
2580 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.paste_newick_file"), 400, 300);
2583 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2585 TreePanel tp = new TreePanel(alignPanel, treeFile, MessageManager.getString("label.load_tree_from_file"), tree);
2586 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2587 addTreeMenuItem(tp, treeFile);
2591 * sort the alignment using the given treePanel
2594 * tree used to sort view
2596 * string used for undo event name
2598 public void sortByTree(TreePanel treePanel, String title)
2600 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2602 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2603 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2604 // HistoryItem.SORT));
2605 addHistoryItem(new OrderCommand(MessageManager.formatMessage("label.order_by_params", new String[]{title}), oldOrder,
2606 viewport.getAlignment()));
2607 alignPanel.paintAlignment(true);
2611 * Do any automatic reordering of the alignment and add the necessary bits to
2612 * the menu structure for the new tree
2617 protected void addTreeMenuItem(final TreePanel treePanel,
2620 final MenuItem item = new MenuItem(title);
2621 sortByTreeMenu.add(item);
2622 item.addActionListener(new java.awt.event.ActionListener()
2625 public void actionPerformed(ActionEvent evt)
2627 sortByTree(treePanel, title); // treePanel.getTitle());
2631 treePanel.addWindowListener(new WindowAdapter()
2634 public void windowOpened(WindowEvent e)
2636 if (viewport.sortByTree)
2638 sortByTree(treePanel, title);
2640 super.windowOpened(e);
2644 public void windowClosing(WindowEvent e)
2646 sortByTreeMenu.remove(item);
2651 public boolean sortBy(AlignmentOrder alorder, String undoname)
2653 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2654 if (viewport.applet.debug)
2656 System.err.println("Sorting " + alorder.getOrder().size()
2657 + " in alignment '" + getTitle() + "'");
2659 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
2660 if (undoname != null)
2662 addHistoryItem(new OrderCommand(undoname, oldOrder,
2663 viewport.getAlignment()));
2665 alignPanel.paintAlignment(true);
2669 protected void documentation_actionPerformed()
2671 alignPanel.av.applet.openJalviewHelpUrl();
2674 protected void about_actionPerformed()
2677 class AboutPanel extends Canvas
2683 public AboutPanel(String version, String builddate)
2685 this.version = version;
2686 this.builddate = builddate;
2690 public void paint(Graphics g)
2692 g.setColor(Color.white);
2693 g.fillRect(0, 0, getSize().width, getSize().height);
2694 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2695 FontMetrics fm = g.getFontMetrics();
2696 int fh = fm.getHeight();
2698 g.setColor(Color.black);
2699 // TODO: update this text for each release or centrally store it for
2700 // lite and application
2701 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2702 g.drawString(MessageManager.formatMessage("label.jalviewLite_release", new String[]{version}), x, y += fh);
2703 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2704 g.drawString(MessageManager.formatMessage("label.jaview_build_date", new String[]{builddate}), x, y += fh);
2705 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2707 MessageManager.getString("label.jalview_authors_1"),
2709 g.drawString(MessageManager.getString("label.jalview_authors_2"), x + 50, y += fh+8);
2711 MessageManager.getString("label.jalview_dev_managers"),
2714 MessageManager.getString("label.jalview_distribution_lists"),
2716 g.drawString(MessageManager.getString("label.jalview_please_cite"), x, y += fh + 8);
2718 MessageManager.getString("label.jalview_cite_1_authors"),
2721 MessageManager.getString("label.jalview_cite_1_title"),
2723 g.drawString(MessageManager.getString("label.jalview_cite_1_ref"),
2728 Frame frame = new Frame();
2729 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2731 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("label.jalview"), 580, 220);
2735 public void showURL(String url, String target)
2737 if (viewport.applet == null)
2739 System.out.println("Not running as applet - no browser available.");
2743 viewport.applet.showURL(url, target);
2747 // ////////////////////////////////////////////////////////////////////////////////
2748 // JBuilder Graphics here
2750 MenuBar alignFrameMenuBar = new MenuBar();
2752 Menu fileMenu = new Menu(MessageManager.getString("action.file"));
2754 MenuItem loadApplication = new MenuItem(MessageManager.getString("label.view_full_application"));
2756 MenuItem loadTree = new MenuItem(MessageManager.getString("label.load_associated_tree"));
2758 MenuItem loadAnnotations = new MenuItem(MessageManager.getString("label.load_features_annotations"));
2760 MenuItem outputFeatures = new MenuItem(MessageManager.getString("label.export_features"));
2762 MenuItem outputAnnotations = new MenuItem(MessageManager.getString("label.export_annotations"));
2764 MenuItem closeMenuItem = new MenuItem(MessageManager.getString("action.close"));
2766 Menu editMenu = new Menu(MessageManager.getString("action.edit"));
2768 Menu viewMenu = new Menu(MessageManager.getString("action.view"));
2770 Menu colourMenu = new Menu(MessageManager.getString("action.colour"));
2772 Menu calculateMenu = new Menu(MessageManager.getString("action.calculate"));
2774 MenuItem selectAllSequenceMenuItem = new MenuItem(MessageManager.getString("action.select_all"));
2776 MenuItem deselectAllSequenceMenuItem = new MenuItem(MessageManager.getString("action.deselect_all"));
2778 MenuItem invertSequenceMenuItem = new MenuItem(MessageManager.getString("action.invert_selection"));
2780 MenuItem remove2LeftMenuItem = new MenuItem();
2782 MenuItem remove2RightMenuItem = new MenuItem();
2784 MenuItem removeGappedColumnMenuItem = new MenuItem();
2786 MenuItem removeAllGapsMenuItem = new MenuItem();
2788 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2790 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2792 MenuItem sortPairwiseMenuItem = new MenuItem();
2794 MenuItem sortIDMenuItem = new MenuItem();
2796 MenuItem sortLengthMenuItem = new MenuItem();
2798 MenuItem sortGroupMenuItem = new MenuItem();
2800 MenuItem removeRedundancyMenuItem = new MenuItem();
2802 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2804 MenuItem PCAMenuItem = new MenuItem();
2806 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2808 MenuItem neighbourTreeMenuItem = new MenuItem();
2810 BorderLayout borderLayout1 = new BorderLayout();
2812 public Label statusBar = new Label();
2814 Menu outputTextboxMenu = new Menu();
2816 MenuItem clustalColour = new MenuItem();
2818 MenuItem zappoColour = new MenuItem();
2820 MenuItem taylorColour = new MenuItem();
2822 MenuItem hydrophobicityColour = new MenuItem();
2824 MenuItem helixColour = new MenuItem();
2826 MenuItem strandColour = new MenuItem();
2828 MenuItem turnColour = new MenuItem();
2830 MenuItem buriedColour = new MenuItem();
2832 MenuItem purinePyrimidineColour = new MenuItem();
2834 MenuItem RNAHelixColour = new MenuItem();
2836 MenuItem userDefinedColour = new MenuItem();
2838 MenuItem PIDColour = new MenuItem();
2840 MenuItem BLOSUM62Colour = new MenuItem();
2842 MenuItem tcoffeeColour = new MenuItem();
2844 MenuItem njTreeBlosumMenuItem = new MenuItem();
2846 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2848 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2850 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2852 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2854 MenuItem alProperties = new MenuItem(MessageManager.getString("label.alignment_props"));
2856 MenuItem overviewMenuItem = new MenuItem();
2858 MenuItem undoMenuItem = new MenuItem();
2860 MenuItem redoMenuItem = new MenuItem();
2862 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2864 MenuItem noColourmenuItem = new MenuItem();
2866 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2868 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2870 MenuItem findMenuItem = new MenuItem();
2872 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2874 MenuItem nucleotideColour = new MenuItem();
2876 MenuItem deleteGroups = new MenuItem();
2878 MenuItem grpsFromSelection = new MenuItem();
2880 MenuItem createGroup = new MenuItem();
2882 MenuItem unGroup = new MenuItem();
2884 MenuItem delete = new MenuItem();
2886 MenuItem copy = new MenuItem();
2888 MenuItem cut = new MenuItem();
2890 Menu pasteMenu = new Menu();
2892 MenuItem pasteNew = new MenuItem();
2894 MenuItem pasteThis = new MenuItem();
2896 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2898 MenuItem font = new MenuItem();
2900 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2902 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2904 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2906 MenuItem modifyPID = new MenuItem();
2908 MenuItem modifyConservation = new MenuItem();
2910 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2911 "Autocalculate Consensus", true);
2913 CheckboxMenuItem sortByTree = new CheckboxMenuItem(
2914 "Sort Alignment With New Tree", true);
2916 Menu sortByTreeMenu = new Menu();
2918 Menu sort = new Menu();
2920 Menu calculate = new Menu();
2922 MenuItem inputText = new MenuItem();
2924 Menu helpMenu = new Menu();
2926 MenuItem documentation = new MenuItem();
2928 MenuItem about = new MenuItem();
2930 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2932 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2934 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2936 Menu autoAnnMenu = new Menu();
2938 CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem();
2940 CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
2942 CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem();
2944 CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem();
2946 CheckboxMenuItem showGroupConservation = new CheckboxMenuItem();
2948 CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem();
2950 private void jbInit() throws Exception
2953 setMenuBar(alignFrameMenuBar);
2957 // dynamically fill save as menu with available formats
2958 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2961 item = new MenuItem(
2962 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2964 item.addActionListener(new java.awt.event.ActionListener()
2967 public void actionPerformed(ActionEvent e)
2969 outputText_actionPerformed(e);
2973 outputTextboxMenu.add(item);
2975 closeMenuItem.addActionListener(this);
2976 loadApplication.addActionListener(this);
2978 loadTree.addActionListener(this);
2979 loadAnnotations.addActionListener(this);
2980 outputFeatures.addActionListener(this);
2981 outputAnnotations.addActionListener(this);
2982 selectAllSequenceMenuItem.addActionListener(this);
2983 deselectAllSequenceMenuItem.addActionListener(this);
2984 invertSequenceMenuItem.addActionListener(this);
2985 remove2LeftMenuItem.setLabel(MessageManager.getString("action.remove_left"));
2986 remove2LeftMenuItem.addActionListener(this);
2987 remove2RightMenuItem.setLabel(MessageManager.getString("action.remove_right"));
2988 remove2RightMenuItem.addActionListener(this);
2989 removeGappedColumnMenuItem.setLabel(MessageManager.getString("action.remove_empty_columns"));
2990 removeGappedColumnMenuItem.addActionListener(this);
2991 removeAllGapsMenuItem.setLabel(MessageManager.getString("action.remove_all_gaps"));
2992 removeAllGapsMenuItem.addActionListener(this);
2993 viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
2994 viewBoxesMenuItem.setState(true);
2995 viewBoxesMenuItem.addItemListener(this);
2996 viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
2997 viewTextMenuItem.setState(true);
2998 viewTextMenuItem.addItemListener(this);
2999 sortPairwiseMenuItem.setLabel(MessageManager.getString("action.by_pairwise_id"));
3000 sortPairwiseMenuItem.addActionListener(this);
3001 sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
3002 sortIDMenuItem.addActionListener(this);
3003 sortLengthMenuItem.setLabel(MessageManager.getString("action.by_length"));
3004 sortLengthMenuItem.addActionListener(this);
3005 sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
3006 sortGroupMenuItem.addActionListener(this);
3007 removeRedundancyMenuItem.setLabel(MessageManager.getString("action.remove_redundancy"));
3008 removeRedundancyMenuItem.addActionListener(this);
3009 pairwiseAlignmentMenuItem.setLabel(MessageManager.getString("action.pairwise_alignment"));
3010 pairwiseAlignmentMenuItem.addActionListener(this);
3011 PCAMenuItem.setLabel(MessageManager.getString("label.principal_component_analysis"));
3012 PCAMenuItem.addActionListener(this);
3013 averageDistanceTreeMenuItem
3014 .setLabel(MessageManager.getString("label.average_distance_identity"));
3015 averageDistanceTreeMenuItem.addActionListener(this);
3016 neighbourTreeMenuItem.setLabel(MessageManager.getString("label.neighbour_joining_identity"));
3017 neighbourTreeMenuItem.addActionListener(this);
3018 statusBar.setBackground(Color.white);
3019 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
3020 statusBar.setText(MessageManager.getString("label.status_bar"));
3021 outputTextboxMenu.setLabel(MessageManager.getString("label.out_to_textbox"));
3022 clustalColour.setLabel(MessageManager.getString("label.clustalx"));
3024 clustalColour.addActionListener(this);
3025 zappoColour.setLabel(MessageManager.getString("label.zappo"));
3026 zappoColour.addActionListener(this);
3027 taylorColour.setLabel(MessageManager.getString("label.taylor"));
3028 taylorColour.addActionListener(this);
3029 hydrophobicityColour.setLabel(MessageManager.getString("label.hydrophobicity"));
3030 hydrophobicityColour.addActionListener(this);
3031 helixColour.setLabel(MessageManager.getString("label.helix_propensity"));
3032 helixColour.addActionListener(this);
3033 strandColour.setLabel(MessageManager.getString("label.strand_propensity"));
3034 strandColour.addActionListener(this);
3035 turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
3036 turnColour.addActionListener(this);
3037 buriedColour.setLabel(MessageManager.getString("label.buried_index"));
3038 buriedColour.addActionListener(this);
3039 purinePyrimidineColour.setLabel(MessageManager.getString("label.purine_pyrimidine"));
3040 purinePyrimidineColour.addActionListener(this);
3041 RNAHelixColour.setLabel(MessageManager.getString("action.by_rna_helixes"));
3042 RNAHelixColour.addActionListener(this);
3043 userDefinedColour.setLabel(MessageManager.getString("action.user_defined"));
3044 userDefinedColour.addActionListener(this);
3045 PIDColour.setLabel(MessageManager.getString("label.percentage_identity"));
3046 PIDColour.addActionListener(this);
3047 BLOSUM62Colour.setLabel(MessageManager.getString("label.blosum62_score"));
3048 BLOSUM62Colour.addActionListener(this);
3049 tcoffeeColour.setLabel(MessageManager.getString("label.tcoffee_scores"));
3050 tcoffeeColour.setEnabled(false); // it will enabled only if a score file is
3052 tcoffeeColour.addActionListener(this);
3053 avDistanceTreeBlosumMenuItem
3054 .setLabel(MessageManager.getString("label.average_distance_bloslum62"));
3055 avDistanceTreeBlosumMenuItem.addActionListener(this);
3056 njTreeBlosumMenuItem.setLabel(MessageManager.getString("label.neighbour_blosum62"));
3057 njTreeBlosumMenuItem.addActionListener(this);
3058 annotationPanelMenuItem.setLabel(MessageManager.getString("label.show_annotations"));
3059 annotationPanelMenuItem.addItemListener(this);
3060 colourTextMenuItem.setLabel(MessageManager.getString("label.colour_text"));
3061 colourTextMenuItem.addItemListener(this);
3062 displayNonconservedMenuItem.setLabel(MessageManager.getString("label.show_non_conversed"));
3063 displayNonconservedMenuItem.addItemListener(this);
3064 alProperties.addActionListener(this);
3065 overviewMenuItem.setLabel(MessageManager.getString("label.overview_window"));
3066 overviewMenuItem.addActionListener(this);
3067 undoMenuItem.setEnabled(false);
3068 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
3069 undoMenuItem.addActionListener(this);
3070 redoMenuItem.setEnabled(false);
3071 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
3072 redoMenuItem.addActionListener(this);
3073 conservationMenuItem.setLabel(MessageManager.getString("action.by_conservation"));
3074 conservationMenuItem.addItemListener(this);
3075 noColourmenuItem.setLabel(MessageManager.getString("label.none"));
3076 noColourmenuItem.addActionListener(this);
3077 wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
3078 wrapMenuItem.addItemListener(this);
3079 renderGapsMenuItem.setLabel(MessageManager.getString("action.show_gaps"));
3080 renderGapsMenuItem.setState(true);
3081 renderGapsMenuItem.addItemListener(this);
3082 findMenuItem.setLabel(MessageManager.getString("action.find"));
3083 findMenuItem.addActionListener(this);
3084 abovePIDThreshold.setLabel(MessageManager.getString("label.above_identity_threshold"));
3085 abovePIDThreshold.addItemListener(this);
3086 nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
3087 nucleotideColour.addActionListener(this);
3088 deleteGroups.setLabel(MessageManager.getString("action.undefine_groups"));
3089 deleteGroups.addActionListener(this);
3090 grpsFromSelection.setLabel(MessageManager.getString("action.make_groups_selection"));
3091 grpsFromSelection.addActionListener(this);
3092 createGroup.setLabel(MessageManager.getString("action.create_group"));
3093 unGroup.setLabel(MessageManager.getString("action.remove_group"));
3094 copy.setLabel(MessageManager.getString("action.copy"));
3095 copy.addActionListener(this);
3096 cut.setLabel(MessageManager.getString("action.cut"));
3097 cut.addActionListener(this);
3098 delete.setLabel(MessageManager.getString("action.delete"));
3099 delete.addActionListener(this);
3100 pasteMenu.setLabel(MessageManager.getString("action.paste"));
3101 pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
3102 pasteNew.addActionListener(this);
3103 pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
3104 pasteThis.addActionListener(this);
3105 applyToAllGroups.setLabel(MessageManager.getString("label.apply_colour_to_all_groups"));
3106 applyToAllGroups.setState(true);
3107 applyToAllGroups.addItemListener(this);
3108 font.setLabel(MessageManager.getString("action.font"));
3109 font.addActionListener(this);
3110 scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
3111 scaleAbove.setState(true);
3112 scaleAbove.setEnabled(false);
3113 scaleAbove.addItemListener(this);
3114 scaleLeft.setEnabled(false);
3115 scaleLeft.setState(true);
3116 scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
3117 scaleLeft.addItemListener(this);
3118 scaleRight.setEnabled(false);
3119 scaleRight.setState(true);
3120 scaleRight.setLabel(MessageManager.getString("action.scale_right"));
3121 scaleRight.addItemListener(this);
3122 modifyPID.setLabel(MessageManager.getString("label.modify_identity_thereshold"));
3123 modifyPID.addActionListener(this);
3124 modifyConservation.setLabel(MessageManager.getString("label.modify_conservation_thereshold"));
3125 modifyConservation.addActionListener(this);
3126 sortByTreeMenu.setLabel(MessageManager.getString("action.by_tree_order"));
3127 sort.setLabel(MessageManager.getString("action.sort"));
3128 calculate.setLabel(MessageManager.getString("action.calculate_tree"));
3129 autoCalculate.addItemListener(this);
3130 sortByTree.addItemListener(this);
3131 inputText.setLabel(MessageManager.getString("label.input_from_textbox"));
3132 inputText.addActionListener(this);
3133 centreColumnLabelFlag.setLabel(MessageManager.getString("label.centre_column_labels"));
3134 centreColumnLabelFlag.addItemListener(this);
3135 followMouseOverFlag.setLabel(MessageManager.getString("label.automatic_scrolling"));
3136 followMouseOverFlag.addItemListener(this);
3137 helpMenu.setLabel(MessageManager.getString("action.help"));
3138 documentation.setLabel(MessageManager.getString("label.documentation"));
3139 documentation.addActionListener(this);
3141 about.setLabel(MessageManager.getString("label.about"));
3142 about.addActionListener(this);
3143 seqLimits.setState(true);
3144 seqLimits.setLabel(MessageManager.getString("label.show_sequence_limits"));
3145 seqLimits.addItemListener(this);
3146 featureSettings.setLabel(MessageManager.getString("label.feature_settings"));
3147 featureSettings.addActionListener(this);
3148 sequenceFeatures.setLabel(MessageManager.getString("label.sequence_features"));
3149 sequenceFeatures.addItemListener(this);
3150 sequenceFeatures.setState(false);
3151 annotationColour.setLabel(MessageManager.getString("action.by_annotation"));
3152 annotationColour.addActionListener(this);
3153 invertSequenceMenuItem.setLabel(MessageManager.getString("action.invert_sequence_selection"));
3154 invertColSel.setLabel(MessageManager.getString("action.invert_column_selection"));
3155 menu1.setLabel(MessageManager.getString("action.show"));
3156 showColumns.setLabel(MessageManager.getString("label.all_columns"));
3157 showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
3158 menu2.setLabel(MessageManager.getString("action.hide"));
3159 hideColumns.setLabel(MessageManager.getString("label.selected_columns"));
3160 hideSequences.setLabel(MessageManager.getString("label.selected_sequences"));
3161 hideAllButSelection.setLabel(MessageManager.getString("label.all_but_selected_region"));
3162 hideAllSelection.setLabel(MessageManager.getString("label.selected_region"));
3163 showAllHidden.setLabel(MessageManager.getString("label.all_sequences_columns"));
3164 showGroupConsensus.setLabel(MessageManager.getString("label.group_consensus"));
3165 showGroupConservation.setLabel(MessageManager.getString("label.group_conservation"));
3166 showConsensusHistogram.setLabel(MessageManager.getString("label.show_consensus_histogram"));
3167 showSequenceLogo.setLabel(MessageManager.getString("label.show_consensus_logo"));
3168 normSequenceLogo.setLabel(MessageManager.getString("label.norm_consensus_logo"));
3169 applyAutoAnnotationSettings.setLabel(MessageManager.getString("label.apply_all_groups"));
3170 applyAutoAnnotationSettings.setState(true);
3171 autoAnnMenu.setLabel(MessageManager.getString("label.autocalculated_annotation"));
3173 invertColSel.addActionListener(this);
3174 showColumns.addActionListener(this);
3175 showSeqs.addActionListener(this);
3176 hideColumns.addActionListener(this);
3177 hideSequences.addActionListener(this);
3178 hideAllButSelection.addActionListener(this);
3179 hideAllSelection.addActionListener(this);
3180 showAllHidden.addActionListener(this);
3181 showGroupConsensus.addItemListener(this);
3182 showGroupConservation.addItemListener(this);
3183 showConsensusHistogram.addItemListener(this);
3184 showSequenceLogo.addItemListener(this);
3185 normSequenceLogo.addItemListener(this);
3187 applyAutoAnnotationSettings.addItemListener(this);
3188 formatMenu.setLabel(MessageManager.getString("action.format"));
3189 selectMenu.setLabel(MessageManager.getString("action.select"));
3190 newView.setLabel(MessageManager.getString("action.new_view"));
3191 newView.addActionListener(this);
3192 alignFrameMenuBar.add(fileMenu);
3193 alignFrameMenuBar.add(editMenu);
3194 alignFrameMenuBar.add(selectMenu);
3195 alignFrameMenuBar.add(viewMenu);
3196 alignFrameMenuBar.add(formatMenu);
3197 alignFrameMenuBar.add(colourMenu);
3198 alignFrameMenuBar.add(calculateMenu);
3199 alignFrameMenuBar.add(helpMenu);
3201 fileMenu.add(inputText);
3202 fileMenu.add(loadTree);
3203 fileMenu.add(loadAnnotations);
3205 fileMenu.addSeparator();
3206 fileMenu.add(outputTextboxMenu);
3207 fileMenu.add(outputFeatures);
3208 fileMenu.add(outputAnnotations);
3210 if (jalviewServletURL != null)
3212 fileMenu.add(loadApplication);
3215 fileMenu.addSeparator();
3216 fileMenu.add(closeMenuItem);
3218 editMenu.add(undoMenuItem);
3219 editMenu.add(redoMenuItem);
3222 editMenu.add(pasteMenu);
3223 editMenu.add(delete);
3224 editMenu.addSeparator();
3225 editMenu.add(remove2LeftMenuItem);
3226 editMenu.add(remove2RightMenuItem);
3227 editMenu.add(removeGappedColumnMenuItem);
3228 editMenu.add(removeAllGapsMenuItem);
3229 editMenu.add(removeRedundancyMenuItem);
3230 viewMenu.add(newView);
3231 viewMenu.addSeparator();
3232 viewMenu.add(menu1);
3233 viewMenu.add(menu2);
3234 viewMenu.addSeparator();
3235 viewMenu.add(followMouseOverFlag);
3236 viewMenu.add(annotationPanelMenuItem);
3237 autoAnnMenu.add(applyAutoAnnotationSettings);
3238 autoAnnMenu.add(showConsensusHistogram);
3239 autoAnnMenu.add(showSequenceLogo);
3240 autoAnnMenu.add(normSequenceLogo);
3241 autoAnnMenu.addSeparator();
3242 autoAnnMenu.add(showGroupConservation);
3243 autoAnnMenu.add(showGroupConsensus);
3244 viewMenu.add(autoAnnMenu);
3245 viewMenu.addSeparator();
3246 viewMenu.add(sequenceFeatures);
3247 viewMenu.add(featureSettings);
3248 viewMenu.addSeparator();
3249 viewMenu.add(alProperties);
3250 viewMenu.addSeparator();
3251 viewMenu.add(overviewMenuItem);
3252 colourMenu.add(applyToAllGroups);
3253 colourMenu.addSeparator();
3254 colourMenu.add(noColourmenuItem);
3255 colourMenu.add(clustalColour);
3256 colourMenu.add(BLOSUM62Colour);
3257 colourMenu.add(PIDColour);
3258 colourMenu.add(zappoColour);
3259 colourMenu.add(taylorColour);
3260 colourMenu.add(hydrophobicityColour);
3261 colourMenu.add(helixColour);
3262 colourMenu.add(strandColour);
3263 colourMenu.add(turnColour);
3264 colourMenu.add(buriedColour);
3265 colourMenu.add(nucleotideColour);
3266 colourMenu.add(purinePyrimidineColour);
3267 colourMenu.add(tcoffeeColour);
3268 colourMenu.add(userDefinedColour);
3269 colourMenu.addSeparator();
3270 colourMenu.add(conservationMenuItem);
3271 colourMenu.add(modifyConservation);
3272 colourMenu.add(abovePIDThreshold);
3273 colourMenu.add(modifyPID);
3274 colourMenu.add(annotationColour);
3275 colourMenu.add(RNAHelixColour);
3276 calculateMenu.add(sort);
3277 calculateMenu.add(calculate);
3278 calculateMenu.addSeparator();
3279 calculateMenu.add(pairwiseAlignmentMenuItem);
3280 calculateMenu.add(PCAMenuItem);
3281 calculateMenu.add(autoCalculate);
3282 calculateMenu.add(sortByTree);
3283 this.add(statusBar, BorderLayout.SOUTH);
3284 pasteMenu.add(pasteNew);
3285 pasteMenu.add(pasteThis);
3286 sort.add(sortIDMenuItem);
3287 sort.add(sortLengthMenuItem);
3288 sort.add(sortByTreeMenu);
3289 sort.add(sortGroupMenuItem);
3290 sort.add(sortPairwiseMenuItem);
3291 calculate.add(averageDistanceTreeMenuItem);
3292 calculate.add(neighbourTreeMenuItem);
3293 calculate.add(avDistanceTreeBlosumMenuItem);
3294 calculate.add(njTreeBlosumMenuItem);
3295 helpMenu.add(documentation);
3296 helpMenu.add(about);
3297 menu1.add(showColumns);
3298 menu1.add(showSeqs);
3299 menu1.add(showAllHidden);
3300 menu2.add(hideColumns);
3301 menu2.add(hideSequences);
3302 menu2.add(hideAllSelection);
3303 menu2.add(hideAllButSelection);
3304 formatMenu.add(font);
3305 formatMenu.add(seqLimits);
3306 formatMenu.add(wrapMenuItem);
3307 formatMenu.add(scaleAbove);
3308 formatMenu.add(scaleLeft);
3309 formatMenu.add(scaleRight);
3310 formatMenu.add(viewBoxesMenuItem);
3311 formatMenu.add(viewTextMenuItem);
3312 formatMenu.add(colourTextMenuItem);
3313 formatMenu.add(displayNonconservedMenuItem);
3314 formatMenu.add(renderGapsMenuItem);
3315 formatMenu.add(centreColumnLabelFlag);
3316 selectMenu.add(findMenuItem);
3317 selectMenu.addSeparator();
3318 selectMenu.add(selectAllSequenceMenuItem);
3319 selectMenu.add(deselectAllSequenceMenuItem);
3320 selectMenu.add(invertSequenceMenuItem);
3321 selectMenu.add(invertColSel);
3322 selectMenu.add(createGroup);
3323 selectMenu.add(unGroup);
3324 selectMenu.add(grpsFromSelection);
3325 selectMenu.add(deleteGroups);
3330 public void setStatus(String string) {
3331 statusBar.setText(string);
3334 MenuItem featureSettings = new MenuItem();
3336 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3338 MenuItem annotationColour = new MenuItem();
3340 MenuItem invertColSel = new MenuItem();
3342 Menu menu1 = new Menu();
3344 MenuItem showColumns = new MenuItem();
3346 MenuItem showSeqs = new MenuItem();
3348 Menu menu2 = new Menu();
3350 MenuItem hideColumns = new MenuItem();
3352 MenuItem hideSequences = new MenuItem();
3354 MenuItem hideAllButSelection = new MenuItem();
3356 MenuItem hideAllSelection = new MenuItem();
3358 MenuItem showAllHidden = new MenuItem();
3360 Menu formatMenu = new Menu();
3362 Menu selectMenu = new Menu();
3364 MenuItem newView = new MenuItem();
3367 * Attach the alignFrame panels after embedding menus, if necessary. This used
3368 * to be called setEmbedded, but is now creates the dropdown menus in a
3369 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3371 * @param reallyEmbedded
3372 * true to attach the view to the applet area on the page rather than
3375 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3380 // Explicly build the embedded menu panel for the on-page applet
3382 // view cannot be closed if its actually on the page
3383 fileMenu.remove(closeMenuItem);
3384 fileMenu.remove(3); // Remove Seperator
3385 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3386 Font.PLAIN, 10, false); // use our own fonts.
3387 // and actually add the components to the applet area
3388 viewport.applet.setLayout(new BorderLayout());
3389 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3390 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3391 alignPanel.setSize(viewport.applet.getSize().width,
3392 viewport.applet.getSize().height - embeddedMenu.HEIGHT
3393 - statusBar.HEIGHT);
3394 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3395 final AlignFrame me = this;
3396 viewport.applet.addFocusListener(new FocusListener()
3400 public void focusLost(FocusEvent e)
3402 if (me.viewport.applet.currentAlignFrame == me)
3404 me.viewport.applet.currentAlignFrame = null;
3409 public void focusGained(FocusEvent e)
3411 me.viewport.applet.currentAlignFrame = me;
3414 viewport.applet.validate();
3419 // test and embed menu bar if necessary.
3421 if (embedMenuIfNeeded(alignPanel))
3423 // adjust for status bar height too
3424 alignPanel.setSize(getSize().width, getSize().height
3425 - statusBar.HEIGHT);
3427 add(statusBar, BorderLayout.SOUTH);
3428 add(alignPanel, BorderLayout.CENTER);
3429 // and register with the applet so it can pass external API calls to us
3430 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
3436 * create a new binding between structures in an existing jmol viewer instance
3437 * and an alignpanel with sequences that have existing PDBFile entries. Note,
3438 * this does not open a new Jmol window, or modify the display of the
3439 * structures in the original jmol window. Note This method doesn't work
3440 * without an additional javascript library to exchange messages between the
3441 * distinct applets. See http://issues.jalview.org/browse/JAL-621
3444 * JmolViewer instance
3445 * @param sequenceIds
3446 * - sequence Ids to search for associations
3448 public SequenceStructureBinding addStructureViewInstance(
3449 Object jmolviewer, String[] sequenceIds)
3451 org.jmol.api.JmolViewer viewer = null;
3454 viewer = (org.jmol.api.JmolViewer) jmolviewer;
3455 } catch (ClassCastException ex)
3457 System.err.println("Unsupported viewer object :"
3458 + jmolviewer.getClass());
3462 System.err.println("Can't use this object as a structure viewer:"
3463 + jmolviewer.getClass());
3466 SequenceI[] seqs = null;
3467 if (sequenceIds == null || sequenceIds.length == 0)
3469 seqs = viewport.getAlignment().getSequencesArray();
3473 Vector sqi = new Vector();
3474 AlignmentI al = viewport.getAlignment();
3475 for (int sid = 0; sid < sequenceIds.length; sid++)
3477 SequenceI sq = al.findName(sequenceIds[sid]);
3485 seqs = new SequenceI[sqi.size()];
3486 for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++)
3488 seqs[sid] = (SequenceI) sqi.elementAt(sid);
3497 // TODO: search for a jmv that involves viewer
3499 { // create a new viewer/jalview binding.
3500 jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][]
3508 * bind a pdb file to a sequence in the current view
3511 * - sequenceId within the dataset.
3512 * @param pdbEntryString
3513 * - the short name for the PDB file
3515 * - pdb file - either a URL or a valid PDB file.
3516 * @return true if binding was as success TODO: consider making an exception
3517 * structure for indicating when PDB parsing or sequenceId location
3520 public boolean addPdbFile(String sequenceId, String pdbEntryString,
3523 SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId);
3524 boolean needtoadd = false;
3525 if (toaddpdb != null)
3527 Vector pdbe = toaddpdb.getPDBId();
3528 PDBEntry pdbentry = null;
3529 if (pdbe != null && pdbe.size() > 0)
3531 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
3533 pdbentry = (PDBEntry) pdbe.elementAt(pe);
3534 if (!pdbentry.getId().equals(pdbEntryString)
3535 && !pdbentry.getFile().equals(pdbFile))
3545 if (pdbentry == null)
3547 pdbentry = new PDBEntry();
3548 pdbentry.setId(pdbEntryString);
3549 pdbentry.setFile(pdbFile);
3550 needtoadd = true; // add this new entry to sequence.
3552 // resolve data source
3553 // TODO: this code should be a refactored to an io package
3554 String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB");
3555 if (protocol == null)
3561 // make a note of the access mode and add
3562 if (pdbentry.getProperty() == null)
3564 pdbentry.setProperty(new Hashtable());
3566 pdbentry.getProperty().put("protocol", protocol);
3567 toaddpdb.addPDBId(pdbentry);
3573 private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains)
3577 Vector sequences = new Vector();
3578 for (int i = 0; i < seqs.length; i++)
3580 if (seqs[i] != null)
3582 sequences.addElement(new Object[]
3583 { seqs[i], (chains != null) ? chains[i] : null });
3586 seqs = new SequenceI[sequences.size()];
3587 chains = new String[sequences.size()];
3588 for (int i = 0, isize = sequences.size(); i < isize; i++)
3590 Object[] oj = (Object[]) sequences.elementAt(i);
3592 seqs[i] = (SequenceI) oj[0];
3593 chains[i] = (String) oj[1];
3601 public void newStructureView(JalviewLite applet, PDBEntry pdb,
3602 SequenceI[] seqs, String[] chains, String protocol)
3604 // Scrub any null sequences from the array
3605 Object[] sqch = cleanSeqChainArrays(seqs, chains);
3606 seqs = (SequenceI[]) sqch[0];
3607 chains = (String[]) sqch[1];
3608 if (seqs == null || seqs.length == 0)
3611 .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to.");
3613 if (protocol == null || protocol.trim().length() == 0
3614 || protocol.equals("null"))
3616 protocol = (String) pdb.getProperty().get("protocol");
3617 if (protocol == null)
3619 System.err.println("Couldn't work out protocol to open structure: "
3624 if (applet.useXtrnalSviewer)
3626 // register the association(s) and quit, don't create any windows.
3627 if (StructureSelectionManager.getStructureSelectionManager(applet)
3628 .setMapping(seqs, chains, pdb.getFile(), protocol) == null)
3630 System.err.println("Failed to map " + pdb.getFile() + " ("
3631 + protocol + ") to any sequences");
3635 if (applet.isAlignPdbStructures() && applet.jmolAvailable)
3637 // can only do alignments with Jmol
3638 // find the last jmol window assigned to this alignment
3639 jalview.appletgui.AppletJmol ajm = null, tajm;
3640 Vector jmols = applet
3641 .getAppletWindow(jalview.appletgui.AppletJmol.class);
3642 for (int i = 0, iSize = jmols.size(); i < iSize; i++)
3644 tajm = (jalview.appletgui.AppletJmol) jmols.elementAt(i);
3645 if (tajm.ap.alignFrame == this)
3654 .println("Incremental adding and aligning structure to existing Jmol view not yet implemented.");
3655 // try and add the pdb structure
3660 // otherwise, create a new window
3661 if (applet.jmolAvailable)
3663 new jalview.appletgui.AppletJmol(pdb, seqs, chains, alignPanel,
3665 applet.lastFrameX += 40;
3666 applet.lastFrameY += 40;
3670 new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol);
3675 public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb,
3676 SequenceI[][] seqs, String[][] chains, String[] protocols)
3678 // TODO Auto-generated method stub
3679 System.err.println("Aligned Structure View: Not yet implemented.");
3683 * modify the current selection, providing the user has not made a selection
3687 * - sequences from this alignment
3689 * - columns to be selected on the alignment
3691 public void select(SequenceGroup sel, ColumnSelection csel)
3693 alignPanel.seqPanel.selection(sel, csel, null);
3696 public void scrollTo(int row, int column)
3698 alignPanel.seqPanel.scrollTo(row, column);
3701 public void scrollToRow(int row)
3703 alignPanel.seqPanel.scrollToRow(row);
3706 public void scrollToColumn(int column)
3708 alignPanel.seqPanel.scrollToColumn(column);
3712 * @return the alignments unique ID.
3714 public String getSequenceSetId()
3716 return viewport.getSequenceSetId();
3720 * Load the (T-Coffee) score file from the specified url
3723 * File/URL/T-COFFEE score file contents
3724 * @throws IOException
3725 * @return true if alignment was annotated with data from source
3727 public boolean loadScoreFile(String source) throws IOException
3730 TCoffeeScoreFile file = new TCoffeeScoreFile(source,
3731 AppletFormatAdapter.checkProtocol(source));
3732 if (!file.isValid())
3734 // TODO: raise dialog for gui
3735 System.err.println("Problems parsing T-Coffee scores: "
3736 + file.getWarningMessage());
3737 System.err.println("Origin was:\n" + source);
3742 * check that the score matrix matches the alignment dimensions
3745 if ((aln = viewport.getAlignment()) != null
3746 && (aln.getHeight() != file.getHeight() || aln.getWidth() != file
3749 // TODO: raise a dialog box here rather than bomb out.
3751 .println("The scores matrix does not match the alignment dimensions");
3755 // TODO add parameter to indicate if matching should be done
3756 if (file.annotateAlignment(alignPanel.getAlignment(), false))
3758 alignPanel.fontChanged();
3759 tcoffeeColour.setEnabled(true);
3760 // switch to this color
3761 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
3766 System.err.println("Problems resolving T-Coffee scores:");
3767 if (file.getWarningMessage() != null)
3769 System.err.println(file.getWarningMessage());