2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.analysis.AlignmentSorter;
24 import jalview.api.AlignViewControllerGuiI;
25 import jalview.api.AlignViewControllerI;
26 import jalview.api.SequenceStructureBinding;
27 import jalview.bin.JalviewLite;
28 import jalview.commands.CommandI;
29 import jalview.commands.EditCommand;
30 import jalview.commands.OrderCommand;
31 import jalview.commands.RemoveGapColCommand;
32 import jalview.commands.RemoveGapsCommand;
33 import jalview.commands.SlideSequencesCommand;
34 import jalview.commands.TrimRegionCommand;
35 import jalview.datamodel.Alignment;
36 import jalview.datamodel.AlignmentI;
37 import jalview.datamodel.AlignmentOrder;
38 import jalview.datamodel.ColumnSelection;
39 import jalview.datamodel.PDBEntry;
40 import jalview.datamodel.Sequence;
41 import jalview.datamodel.SequenceGroup;
42 import jalview.datamodel.SequenceI;
43 import jalview.io.AnnotationFile;
44 import jalview.io.AppletFormatAdapter;
45 import jalview.io.FeaturesFile;
46 import jalview.io.TCoffeeScoreFile;
47 import jalview.schemes.Blosum62ColourScheme;
48 import jalview.schemes.BuriedColourScheme;
49 import jalview.schemes.ClustalxColourScheme;
50 import jalview.schemes.ColourSchemeI;
51 import jalview.schemes.HelixColourScheme;
52 import jalview.schemes.HydrophobicColourScheme;
53 import jalview.schemes.NucleotideColourScheme;
54 import jalview.schemes.PIDColourScheme;
55 import jalview.schemes.PurinePyrimidineColourScheme;
56 import jalview.schemes.RNAHelicesColourChooser;
57 import jalview.schemes.RNAInteractionColourScheme;
58 import jalview.schemes.StrandColourScheme;
59 import jalview.schemes.TCoffeeColourScheme;
60 import jalview.schemes.TaylorColourScheme;
61 import jalview.schemes.TurnColourScheme;
62 import jalview.schemes.ZappoColourScheme;
63 import jalview.structure.StructureSelectionManager;
64 import jalview.util.MessageManager;
66 import java.awt.BorderLayout;
67 import java.awt.Canvas;
68 import java.awt.CheckboxMenuItem;
69 import java.awt.Color;
71 import java.awt.FontMetrics;
72 import java.awt.Frame;
73 import java.awt.Graphics;
74 import java.awt.Label;
76 import java.awt.MenuBar;
77 import java.awt.MenuItem;
78 import java.awt.event.ActionEvent;
79 import java.awt.event.ActionListener;
80 import java.awt.event.FocusEvent;
81 import java.awt.event.FocusListener;
82 import java.awt.event.ItemEvent;
83 import java.awt.event.ItemListener;
84 import java.awt.event.KeyEvent;
85 import java.awt.event.KeyListener;
86 import java.awt.event.WindowAdapter;
87 import java.awt.event.WindowEvent;
88 import java.io.IOException;
90 import java.net.URLEncoder;
91 import java.util.Enumeration;
92 import java.util.Hashtable;
93 import java.util.List;
94 import java.util.StringTokenizer;
95 import java.util.Vector;
97 public class AlignFrame extends EmbmenuFrame implements ActionListener,
98 ItemListener, KeyListener, AlignViewControllerGuiI
100 public AlignViewControllerI avc;
102 public AlignmentPanel alignPanel;
104 public AlignViewport viewport;
106 int DEFAULT_WIDTH = 700;
108 int DEFAULT_HEIGHT = 500;
110 String jalviewServletURL;
112 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
113 String title, boolean embedded)
117 jalviewServletURL = applet.getParameter("APPLICATION_URL");
123 } catch (Exception ex)
125 ex.printStackTrace();
127 // need to get window geometry before we calculate alignment layout
133 param = applet.getParameter("windowWidth");
136 int width = Integer.parseInt(param);
137 DEFAULT_WIDTH = width;
139 param = applet.getParameter("windowHeight");
142 int height = Integer.parseInt(param);
143 DEFAULT_HEIGHT = height;
145 } catch (Exception ex)
149 viewport = new AlignViewport(al, applet);
150 alignPanel = new AlignmentPanel(this, viewport);
151 avc = new jalview.controller.AlignViewController(this, viewport,
153 viewport.updateConservation(alignPanel);
154 viewport.updateConsensus(alignPanel);
156 annotationPanelMenuItem.setState(viewport.showAnnotation);
157 displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
158 followMouseOverFlag.setState(viewport.getFollowHighlight());
159 showGroupConsensus.setState(viewport.isShowGroupConsensus());
160 showGroupConservation.setState(viewport.isShowGroupConservation());
161 showConsensusHistogram.setState(viewport.isShowConsensusHistogram());
162 showSequenceLogo.setState(viewport.isShowSequenceLogo());
163 normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
164 applyToAllGroups.setState(viewport.getColourAppliesToAllGroups());
166 seqLimits.setState(viewport.showJVSuffix);
170 String param = applet.getParameter("sortBy");
173 if (param.equalsIgnoreCase("Id"))
175 sortIDMenuItem_actionPerformed();
177 else if (param.equalsIgnoreCase("Pairwise Identity"))
179 sortPairwiseMenuItem_actionPerformed();
181 else if (param.equalsIgnoreCase("Length"))
183 sortLengthMenuItem_actionPerformed();
187 param = applet.getParameter("wrap");
190 if (param.equalsIgnoreCase("true"))
192 wrapMenuItem.setState(true);
193 wrapMenuItem_actionPerformed();
196 param = applet.getParameter("centrecolumnlabels");
199 centreColumnLabelFlag.setState(true);
200 centreColumnLabelFlag_stateChanged();
204 if (viewport.getAlignment().isNucleotide())
206 viewport.updateStrucConsensus(alignPanel);
207 if (viewport.getAlignment().hasRNAStructure())
209 RNAHelixColour.setEnabled(true);
213 RNAHelixColour.setEnabled(false);
218 RNAHelixColour.setEnabled(false);
219 purinePyrimidineColour.setEnabled(false);
221 // Some JVMS send keyevents to Top frame or lowest panel,
222 // Havent worked out why yet. So add to both this frame and seqCanvas for
224 this.addKeyListener(this);
225 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
226 alignPanel.idPanel.idCanvas.addKeyListener(this);
227 alignPanel.scalePanel.addKeyListener(this);
228 alignPanel.annotationPanel.addKeyListener(this);
229 alignPanel.annotationPanelHolder.addKeyListener(this);
230 alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
231 alignPanel.alabels.addKeyListener(this);
232 createAlignFrameWindow(embedded, title);
235 alignPanel.adjustAnnotationHeight();
236 alignPanel.paintAlignment(true);
239 public AlignViewport getAlignViewport()
244 public SeqCanvas getSeqcanvas()
246 return alignPanel.seqPanel.seqCanvas;
250 * Load a features file onto the alignment
253 * file URL, content, or other resolvable path
255 * is protocol for accessing data referred to by file
258 public boolean parseFeaturesFile(String file, String type)
260 return parseFeaturesFile(file, type, true);
264 * Load a features file onto the alignment
267 * file URL, content, or other resolvable path
269 * is protocol for accessing data referred to by file
270 * @param autoenabledisplay
271 * when true, display features flag will be automatically enabled if
272 * features are loaded
273 * @return true if data parsed as a features file
275 public boolean parseFeaturesFile(String file, String type,
276 boolean autoenabledisplay)
278 // TODO: test if importing a features file onto an alignment which already
279 // has features with links overwrites the original links.
281 Hashtable featureLinks = new Hashtable();
282 boolean featuresFile = false;
285 featuresFile = new jalview.io.FeaturesFile(file, type)
286 .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
287 .getFeatureRenderer().featureColours, featureLinks,
288 true, viewport.applet.getDefaultParameter(
289 "relaxedidmatch", false));
290 } catch (Exception ex)
292 ex.printStackTrace();
297 if (featureLinks.size() > 0)
299 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
301 if (autoenabledisplay)
303 viewport.showSequenceFeatures = true;
304 sequenceFeatures.setState(true);
306 if (viewport.featureSettings != null)
308 viewport.featureSettings.refreshTable();
310 alignPanel.paintAlignment(true);
311 statusBar.setText(MessageManager
312 .getString("label.successfully_added_features_alignment"));
318 public void keyPressed(KeyEvent evt)
320 if (viewport.cursorMode
321 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
322 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
323 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
324 && Character.isDigit(evt.getKeyChar()))
326 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
329 switch (evt.getKeyCode())
331 case 27: // escape key
332 deselectAllSequenceMenuItem_actionPerformed();
334 alignPanel.alabels.cancelDrag();
337 if (evt.isControlDown() || evt.isMetaDown())
339 cut_actionPerformed();
343 if (viewport.cursorMode && !evt.isControlDown())
345 alignPanel.seqPanel.setCursorColumn();
347 if (evt.isControlDown() || evt.isMetaDown())
349 copy_actionPerformed();
353 if (evt.isControlDown())
355 paste(evt.isShiftDown());
359 if (evt.isControlDown() || evt.isMetaDown())
361 selectAllSequenceMenuItem_actionPerformed();
364 case KeyEvent.VK_DOWN:
365 if (viewport.cursorMode)
367 alignPanel.seqPanel.moveCursor(0, 1);
371 moveSelectedSequences(false);
376 if (viewport.cursorMode)
378 alignPanel.seqPanel.moveCursor(0, -1);
382 moveSelectedSequences(true);
386 case KeyEvent.VK_LEFT:
387 if (evt.isAltDown() || !viewport.cursorMode)
389 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
393 alignPanel.seqPanel.moveCursor(-1, 0);
397 case KeyEvent.VK_RIGHT:
398 if (evt.isAltDown() || !viewport.cursorMode)
400 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
404 alignPanel.seqPanel.moveCursor(1, 0);
408 case KeyEvent.VK_SPACE:
409 if (viewport.cursorMode)
411 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
412 || evt.isShiftDown() || evt.isAltDown());
416 case KeyEvent.VK_DELETE:
417 case KeyEvent.VK_BACK_SPACE:
418 if (viewport.cursorMode)
420 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
421 || evt.isShiftDown() || evt.isAltDown());
425 cut_actionPerformed();
426 alignPanel.seqPanel.seqCanvas.repaint();
431 if (viewport.cursorMode)
433 alignPanel.seqPanel.setCursorRow();
437 if (viewport.cursorMode)
439 alignPanel.seqPanel.setCursorPosition();
443 case KeyEvent.VK_ENTER:
444 case KeyEvent.VK_COMMA:
445 if (viewport.cursorMode)
447 alignPanel.seqPanel.setCursorRowAndColumn();
452 if (viewport.cursorMode)
454 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
458 if (viewport.cursorMode)
460 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
465 viewport.cursorMode = !viewport.cursorMode;
466 statusBar.setText(MessageManager.formatMessage(
467 "label.keyboard_editing_mode", new String[]
468 { (viewport.cursorMode ? "on" : "off") }));
469 if (viewport.cursorMode)
471 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
472 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
477 if (evt.isControlDown())
479 findMenuItem_actionPerformed();
485 boolean toggleSeqs = !evt.isControlDown();
486 boolean toggleCols = !evt.isShiftDown();
487 toggleHiddenRegions(toggleSeqs, toggleCols);
491 case KeyEvent.VK_PAGE_UP:
492 if (viewport.wrapAlignment)
494 alignPanel.scrollUp(true);
498 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
499 - viewport.endSeq + viewport.startSeq);
503 case KeyEvent.VK_PAGE_DOWN:
504 if (viewport.wrapAlignment)
506 alignPanel.scrollUp(false);
510 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
511 + viewport.endSeq - viewport.startSeq);
516 if (evt.isControlDown())
518 undoMenuItem_actionPerformed();
523 if (evt.isControlDown())
525 redoMenuItem_actionPerformed();
530 if (evt.isControlDown())
537 if (evt.isControlDown())
539 trimAlignment(false);
544 if (evt.isControlDown())
546 if (evt.isShiftDown())
548 this.removeAllGapsMenuItem_actionPerformed();
552 removeGappedColumnMenuItem_actionPerformed();
557 if (evt.isControlDown())
561 invertColSel_actionPerformed();
565 invertSequenceMenuItem_actionPerformed();
571 if (evt.isControlDown())
573 if (evt.isShiftDown())
575 this.unGroup_actionPerformed();
579 this.createGroup_actionPerformed();
585 if (evt.isControlDown())
587 this.deleteGroups_actionPerformed();
592 if (evt.isControlDown())
599 alignPanel.paintAlignment(true);
603 * called by key handler and the hide all/show all menu items
608 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
610 boolean hide = false;
611 SequenceGroup sg = viewport.getSelectionGroup();
612 if (!toggleSeqs && !toggleCols)
614 // Hide everything by the current selection - this is a hack - we do the
615 // invert and then hide
616 // first check that there will be visible columns after the invert.
617 if ((viewport.getColumnSelection() != null
618 && viewport.getColumnSelection().getSelected() != null && viewport
619 .getColumnSelection().getSelected().size() > 0)
620 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
623 // now invert the sequence set, if required - empty selection implies
624 // that no hiding is required.
627 invertSequenceMenuItem_actionPerformed();
628 sg = viewport.getSelectionGroup();
632 viewport.expandColSelection(sg, true);
633 // finally invert the column selection and get the new sequence
634 // selection and indicate it should be hidden.
635 invertColSel_actionPerformed();
642 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
645 viewport.hideAllSelectedSeqs();
647 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
650 viewport.showAllHiddenSeqs();
656 if (viewport.getColumnSelection().getSelected().size() > 0)
658 viewport.hideSelectedColumns();
661 viewport.setSelectionGroup(sg);
666 viewport.showAllHiddenColumns();
672 public void keyReleased(KeyEvent evt)
677 public void keyTyped(KeyEvent evt)
682 public void itemStateChanged(ItemEvent evt)
684 if (evt.getSource() == displayNonconservedMenuItem)
686 displayNonconservedMenuItem_actionPerformed();
688 else if (evt.getSource() == colourTextMenuItem)
690 colourTextMenuItem_actionPerformed();
692 else if (evt.getSource() == wrapMenuItem)
694 wrapMenuItem_actionPerformed();
696 else if (evt.getSource() == scaleAbove)
698 viewport.setScaleAboveWrapped(scaleAbove.getState());
700 else if (evt.getSource() == scaleLeft)
702 viewport.setScaleLeftWrapped(scaleLeft.getState());
704 else if (evt.getSource() == scaleRight)
706 viewport.setScaleRightWrapped(scaleRight.getState());
708 else if (evt.getSource() == seqLimits)
710 seqLimits_itemStateChanged();
712 else if (evt.getSource() == viewBoxesMenuItem)
714 viewport.setShowBoxes(viewBoxesMenuItem.getState());
716 else if (evt.getSource() == viewTextMenuItem)
718 viewport.setShowText(viewTextMenuItem.getState());
720 else if (evt.getSource() == renderGapsMenuItem)
722 viewport.setRenderGaps(renderGapsMenuItem.getState());
724 else if (evt.getSource() == annotationPanelMenuItem)
726 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
727 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
729 else if (evt.getSource() == sequenceFeatures)
731 viewport.showSequenceFeatures(sequenceFeatures.getState());
732 alignPanel.seqPanel.seqCanvas.repaint();
734 else if (evt.getSource() == conservationMenuItem)
736 conservationMenuItem_actionPerformed();
738 else if (evt.getSource() == abovePIDThreshold)
740 abovePIDThreshold_actionPerformed();
742 else if (evt.getSource() == applyToAllGroups)
744 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
746 else if (evt.getSource() == autoCalculate)
748 viewport.autoCalculateConsensus = autoCalculate.getState();
750 else if (evt.getSource() == sortByTree)
752 viewport.sortByTree = sortByTree.getState();
754 else if (evt.getSource() == this.centreColumnLabelFlag)
756 centreColumnLabelFlag_stateChanged();
758 else if (evt.getSource() == this.followMouseOverFlag)
760 mouseOverFlag_stateChanged();
762 else if (evt.getSource() == showGroupConsensus)
764 showGroupConsensus_actionPerformed();
766 else if (evt.getSource() == showGroupConservation)
768 showGroupConservation_actionPerformed();
770 else if (evt.getSource() == showSequenceLogo)
772 showSequenceLogo_actionPerformed();
774 else if (evt.getSource() == normSequenceLogo)
776 normSequenceLogo_actionPerformed();
778 else if (evt.getSource() == showConsensusHistogram)
780 showConsensusHistogram_actionPerformed();
782 else if (evt.getSource() == applyAutoAnnotationSettings)
784 applyAutoAnnotationSettings_actionPerformed();
786 alignPanel.paintAlignment(true);
789 private void mouseOverFlag_stateChanged()
791 viewport.followHighlight = followMouseOverFlag.getState();
792 // TODO: could kick the scrollTo mechanism to reset view for current
796 private void centreColumnLabelFlag_stateChanged()
798 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
799 this.alignPanel.annotationPanel.repaint();
803 public void actionPerformed(ActionEvent evt)
805 Object source = evt.getSource();
807 if (source == inputText)
809 inputText_actionPerformed();
811 else if (source == loadTree)
813 loadTree_actionPerformed();
815 else if (source == loadApplication)
817 launchFullApplication();
819 else if (source == loadAnnotations)
823 else if (source == outputAnnotations)
825 outputAnnotations(true);
827 else if (source == outputFeatures)
829 outputFeatures(true, "Jalview");
831 else if (source == closeMenuItem)
833 closeMenuItem_actionPerformed();
835 else if (source == copy)
837 copy_actionPerformed();
839 else if (source == undoMenuItem)
841 undoMenuItem_actionPerformed();
843 else if (source == redoMenuItem)
845 redoMenuItem_actionPerformed();
847 else if (source == inputText)
849 inputText_actionPerformed();
851 else if (source == closeMenuItem)
853 closeMenuItem_actionPerformed();
855 else if (source == undoMenuItem)
857 undoMenuItem_actionPerformed();
859 else if (source == redoMenuItem)
861 redoMenuItem_actionPerformed();
863 else if (source == copy)
865 copy_actionPerformed();
867 else if (source == pasteNew)
869 pasteNew_actionPerformed();
871 else if (source == pasteThis)
873 pasteThis_actionPerformed();
875 else if (source == cut)
877 cut_actionPerformed();
879 else if (source == delete)
881 delete_actionPerformed();
883 else if (source == grpsFromSelection)
885 makeGrpsFromSelection_actionPerformed();
887 else if (source == deleteGroups)
889 deleteGroups_actionPerformed();
891 else if (source == selectAllSequenceMenuItem)
893 selectAllSequenceMenuItem_actionPerformed();
895 else if (source == deselectAllSequenceMenuItem)
897 deselectAllSequenceMenuItem_actionPerformed();
899 else if (source == invertSequenceMenuItem)
901 invertSequenceMenuItem_actionPerformed();
903 else if (source == invertColSel)
905 viewport.invertColumnSelection();
906 alignPanel.paintAlignment(true);
908 else if (source == remove2LeftMenuItem)
912 else if (source == remove2RightMenuItem)
914 trimAlignment(false);
916 else if (source == removeGappedColumnMenuItem)
918 removeGappedColumnMenuItem_actionPerformed();
920 else if (source == removeAllGapsMenuItem)
922 removeAllGapsMenuItem_actionPerformed();
924 else if (source == findMenuItem)
926 findMenuItem_actionPerformed();
928 else if (source == font)
930 new FontChooser(alignPanel);
932 else if (source == newView)
936 else if (source == showColumns)
938 viewport.showAllHiddenColumns();
939 alignPanel.paintAlignment(true);
941 else if (source == showSeqs)
943 viewport.showAllHiddenSeqs();
944 alignPanel.paintAlignment(true);
946 else if (source == hideColumns)
948 viewport.hideSelectedColumns();
949 alignPanel.paintAlignment(true);
951 else if (source == hideSequences
952 && viewport.getSelectionGroup() != null)
954 viewport.hideAllSelectedSeqs();
955 alignPanel.paintAlignment(true);
957 else if (source == hideAllButSelection)
959 toggleHiddenRegions(false, false);
960 alignPanel.paintAlignment(true);
962 else if (source == hideAllSelection)
964 SequenceGroup sg = viewport.getSelectionGroup();
965 viewport.expandColSelection(sg, false);
966 viewport.hideAllSelectedSeqs();
967 viewport.hideSelectedColumns();
968 alignPanel.paintAlignment(true);
970 else if (source == showAllHidden)
972 viewport.showAllHiddenColumns();
973 viewport.showAllHiddenSeqs();
974 alignPanel.paintAlignment(true);
976 else if (source == showGroupConsensus)
978 showGroupConsensus_actionPerformed();
980 else if (source == showGroupConservation)
982 showGroupConservation_actionPerformed();
984 else if (source == showSequenceLogo)
986 showSequenceLogo_actionPerformed();
988 else if (source == normSequenceLogo)
990 normSequenceLogo_actionPerformed();
992 else if (source == showConsensusHistogram)
994 showConsensusHistogram_actionPerformed();
996 else if (source == applyAutoAnnotationSettings)
998 applyAutoAnnotationSettings_actionPerformed();
1000 else if (source == featureSettings)
1002 new FeatureSettings(alignPanel);
1004 else if (source == alProperties)
1006 StringBuffer contents = new jalview.io.AlignmentProperties(
1007 viewport.getAlignment()).formatAsString();
1008 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1009 cap.setText(contents.toString());
1010 Frame frame = new Frame();
1012 jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
1013 "label.alignment_properties", new String[]
1014 { getTitle() }), 400, 250);
1016 else if (source == overviewMenuItem)
1018 overviewMenuItem_actionPerformed();
1020 else if (source == noColourmenuItem)
1024 else if (source == clustalColour)
1026 abovePIDThreshold.setState(false);
1027 changeColour(new ClustalxColourScheme(viewport.getAlignment(), null));
1029 else if (source == zappoColour)
1031 changeColour(new ZappoColourScheme());
1033 else if (source == taylorColour)
1035 changeColour(new TaylorColourScheme());
1037 else if (source == hydrophobicityColour)
1039 changeColour(new HydrophobicColourScheme());
1041 else if (source == helixColour)
1043 changeColour(new HelixColourScheme());
1045 else if (source == strandColour)
1047 changeColour(new StrandColourScheme());
1049 else if (source == turnColour)
1051 changeColour(new TurnColourScheme());
1053 else if (source == buriedColour)
1055 changeColour(new BuriedColourScheme());
1057 else if (source == nucleotideColour)
1059 changeColour(new NucleotideColourScheme());
1061 else if (source == purinePyrimidineColour)
1063 changeColour(new PurinePyrimidineColourScheme());
1065 else if (source == RNAInteractionColour)
1067 changeColour(new RNAInteractionColourScheme());
1069 else if (source == RNAHelixColour)
1071 new RNAHelicesColourChooser(viewport, alignPanel);
1073 else if (source == modifyPID)
1075 modifyPID_actionPerformed();
1077 else if (source == modifyConservation)
1079 modifyConservation_actionPerformed();
1081 else if (source == userDefinedColour)
1083 new UserDefinedColours(alignPanel, null);
1085 else if (source == PIDColour)
1087 changeColour(new PIDColourScheme());
1089 else if (source == BLOSUM62Colour)
1091 changeColour(new Blosum62ColourScheme());
1093 else if (source == tcoffeeColour)
1095 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
1097 else if (source == annotationColour)
1099 new AnnotationColourChooser(viewport, alignPanel);
1101 else if (source == sortPairwiseMenuItem)
1103 sortPairwiseMenuItem_actionPerformed();
1105 else if (source == sortIDMenuItem)
1107 sortIDMenuItem_actionPerformed();
1109 else if (source == sortLengthMenuItem)
1111 sortLengthMenuItem_actionPerformed();
1113 else if (source == sortGroupMenuItem)
1115 sortGroupMenuItem_actionPerformed();
1117 else if (source == removeRedundancyMenuItem)
1119 removeRedundancyMenuItem_actionPerformed();
1121 else if (source == pairwiseAlignmentMenuItem)
1123 pairwiseAlignmentMenuItem_actionPerformed();
1125 else if (source == PCAMenuItem)
1127 PCAMenuItem_actionPerformed();
1129 else if (source == averageDistanceTreeMenuItem)
1131 averageDistanceTreeMenuItem_actionPerformed();
1133 else if (source == neighbourTreeMenuItem)
1135 neighbourTreeMenuItem_actionPerformed();
1137 else if (source == njTreeBlosumMenuItem)
1139 njTreeBlosumMenuItem_actionPerformed();
1141 else if (source == avDistanceTreeBlosumMenuItem)
1143 avTreeBlosumMenuItem_actionPerformed();
1145 else if (source == documentation)
1147 documentation_actionPerformed();
1149 else if (source == about)
1151 about_actionPerformed();
1156 public void inputText_actionPerformed()
1158 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1159 Frame frame = new Frame();
1161 jalview.bin.JalviewLite.addFrame(frame,
1162 MessageManager.getString("label.input_cut_paste"), 500, 500);
1165 protected void outputText_actionPerformed(ActionEvent e)
1167 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1168 Frame frame = new Frame();
1170 jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
1171 "label.alignment_output_command", new String[]
1172 { e.getActionCommand() }), 600, 500);
1173 cap.setText(new AppletFormatAdapter().formatSequences(
1174 e.getActionCommand(), viewport.getAlignment(),
1175 viewport.showJVSuffix));
1178 public void loadAnnotations()
1180 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1181 cap.setText(MessageManager
1182 .getString("label.paste_features_annotations_Tcoffee_here"));
1183 cap.setAnnotationImport();
1184 Frame frame = new Frame();
1186 jalview.bin.JalviewLite.addFrame(frame,
1187 MessageManager.getString("action.paste_annotations"), 400, 300);
1191 public String outputAnnotations(boolean displayTextbox)
1193 String annotation = new AnnotationFile().printAnnotations(
1194 viewport.showAnnotation ? viewport.getAlignment()
1195 .getAlignmentAnnotation() : null, viewport
1196 .getAlignment().getGroups(), ((Alignment) viewport
1197 .getAlignment()).alignmentProperties);
1201 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1202 Frame frame = new Frame();
1204 jalview.bin.JalviewLite.addFrame(frame,
1205 MessageManager.getString("label.annotations"), 600, 500);
1206 cap.setText(annotation);
1212 private Hashtable getDisplayedFeatureCols()
1214 if (alignPanel.getFeatureRenderer() != null
1215 && viewport.featuresDisplayed != null)
1217 FeatureRenderer fr = alignPanel.getFeatureRenderer();
1218 Hashtable fcols = new Hashtable();
1219 Enumeration en = viewport.featuresDisplayed.keys();
1220 while (en.hasMoreElements())
1222 Object col = en.nextElement();
1223 fcols.put(col, fr.featureColours.get(col));
1230 public String outputFeatures(boolean displayTextbox, String format)
1233 if (format.equalsIgnoreCase("Jalview"))
1235 features = new FeaturesFile().printJalviewFormat(viewport
1236 .getAlignment().getSequencesArray(),
1237 getDisplayedFeatureCols());
1241 features = new FeaturesFile().printGFFFormat(viewport.getAlignment()
1242 .getSequencesArray(), getDisplayedFeatureCols());
1247 boolean frimport = false;
1248 if (features == null || features.equals("No Features Visible"))
1250 features = "# No features visible - paste some and import them here.";
1254 CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);
1257 cap.setAnnotationImport();
1259 Frame frame = new Frame();
1261 jalview.bin.JalviewLite.addFrame(frame,
1262 MessageManager.getString("label.features"), 600, 500);
1263 cap.setText(features);
1267 if (features == null)
1276 void launchFullApplication()
1278 StringBuffer url = new StringBuffer(jalviewServletURL);
1281 + appendProtocol(viewport.applet.getParameter("file")));
1283 if (viewport.applet.getParameter("features") != null)
1285 url.append("&features=");
1286 url.append(appendProtocol(viewport.applet.getParameter("features")));
1289 if (viewport.applet.getParameter("annotations") != null)
1291 url.append("&annotations=");
1292 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
1295 if (viewport.applet.getParameter("jnetfile") != null)
1297 url.append("&annotations=");
1298 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1301 if (viewport.applet.getParameter("defaultColour") != null)
1303 url.append("&colour="
1304 + removeWhiteSpace(viewport.applet
1305 .getParameter("defaultColour")));
1308 if (viewport.applet.getParameter("userDefinedColour") != null)
1310 url.append("&colour="
1311 + removeWhiteSpace(viewport.applet
1312 .getParameter("userDefinedColour")));
1314 if (viewport.applet.getParameter("tree") != null)
1317 + appendProtocol(viewport.applet.getParameter("tree")));
1319 if (viewport.applet.getParameter("treeFile") != null)
1322 + appendProtocol(viewport.applet.getParameter("treeFile")));
1325 showURL(url.toString(), "FULL_APP");
1328 String removeWhiteSpace(String colour)
1330 StringBuffer sb = new StringBuffer();
1331 for (int i = 0; i < colour.length(); i++)
1333 if (Character.isWhitespace(colour.charAt(i)))
1339 sb.append(colour.charAt(i));
1343 return sb.toString();
1346 String appendProtocol(String url)
1351 url = URLEncoder.encode(url);
1354 * When we finally deprecate 1.1 compatibility, we can start to use
1355 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1356 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1357 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1358 * ex.printStackTrace(); }
1360 catch (java.net.MalformedURLException ex)
1362 url = viewport.applet.getCodeBase() + url;
1367 public void closeMenuItem_actionPerformed()
1369 PaintRefresher.RemoveComponent(alignPanel);
1370 if (alignPanel.seqPanel != null
1371 && alignPanel.seqPanel.seqCanvas != null)
1373 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1375 if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null)
1377 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1380 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1395 void updateEditMenuBar()
1398 if (viewport.historyList.size() > 0)
1400 undoMenuItem.setEnabled(true);
1401 CommandI command = (CommandI) viewport.historyList.peek();
1402 undoMenuItem.setLabel(MessageManager.formatMessage(
1403 "label.undo_command", new String[]
1404 { command.getDescription() }));
1408 undoMenuItem.setEnabled(false);
1409 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
1412 if (viewport.redoList.size() > 0)
1414 redoMenuItem.setEnabled(true);
1416 CommandI command = (CommandI) viewport.redoList.peek();
1417 redoMenuItem.setLabel(MessageManager.formatMessage(
1418 "label.redo_command", new String[]
1419 { command.getDescription() }));
1423 redoMenuItem.setEnabled(false);
1424 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
1431 public void addHistoryItem(CommandI command)
1433 if (command.getSize() > 0)
1435 viewport.historyList.push(command);
1436 viewport.redoList.removeAllElements();
1437 updateEditMenuBar();
1438 viewport.updateHiddenColumns();
1443 * TODO: JAL-1104 DOCUMENT ME!
1448 protected void undoMenuItem_actionPerformed()
1450 if (viewport.historyList.size() < 1)
1455 CommandI command = (CommandI) viewport.historyList.pop();
1456 viewport.redoList.push(command);
1457 command.undoCommand(null);
1459 AlignViewport originalSource = getOriginatingSource(command);
1461 if (originalSource != viewport)
1464 .println("Warning: Viewport object mismatch whilst undoing");
1466 originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns =
1467 // viewport.getColumnSelection().getHiddenColumns()
1469 updateEditMenuBar();
1470 originalSource.firePropertyChange("alignment", null, originalSource
1471 .getAlignment().getSequences());
1475 * TODO: JAL-1104 DOCUMENT ME!
1480 protected void redoMenuItem_actionPerformed()
1482 if (viewport.redoList.size() < 1)
1487 CommandI command = (CommandI) viewport.redoList.pop();
1488 viewport.historyList.push(command);
1489 command.doCommand(null);
1491 AlignViewport originalSource = getOriginatingSource(command);
1493 if (originalSource != viewport)
1496 .println("Warning: Viewport object mismatch whilst re-doing");
1498 originalSource.updateHiddenColumns(); // sethasHiddenColumns(); =
1499 // viewport.getColumnSelection().getHiddenColumns()
1502 updateEditMenuBar();
1503 originalSource.firePropertyChange("alignment", null, originalSource
1504 .getAlignment().getSequences());
1507 AlignViewport getOriginatingSource(CommandI command)
1509 AlignViewport originalSource = null;
1510 // For sequence removal and addition, we need to fire
1511 // the property change event FROM the viewport where the
1512 // original alignment was altered
1513 AlignmentI al = null;
1514 if (command instanceof EditCommand)
1516 EditCommand editCommand = (EditCommand) command;
1517 al = editCommand.getAlignment();
1518 Vector comps = (Vector) PaintRefresher.components.get(viewport
1519 .getSequenceSetId());
1520 for (int i = 0; i < comps.size(); i++)
1522 if (comps.elementAt(i) instanceof AlignmentPanel)
1524 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1526 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1533 if (originalSource == null)
1535 // The original view is closed, we must validate
1536 // the current view against the closed view first
1539 PaintRefresher.validateSequences(al, viewport.getAlignment());
1542 originalSource = viewport;
1545 return originalSource;
1548 public void moveSelectedSequences(boolean up)
1550 SequenceGroup sg = viewport.getSelectionGroup();
1555 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1556 up ? null : viewport.getHiddenRepSequences(), up);
1557 alignPanel.paintAlignment(true);
1560 synchronized void slideSequences(boolean right, int size)
1562 List<SequenceI> sg = new Vector<SequenceI>();
1563 if (viewport.cursorMode)
1565 sg.add(viewport.getAlignment().getSequenceAt(
1566 alignPanel.seqPanel.seqCanvas.cursorY));
1568 else if (viewport.getSelectionGroup() != null
1569 && viewport.getSelectionGroup().getSize() != viewport
1570 .getAlignment().getHeight())
1572 sg = viewport.getSelectionGroup().getSequences(
1573 viewport.getHiddenRepSequences());
1581 Vector<SequenceI> invertGroup = new Vector();
1583 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1585 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1587 invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));
1591 SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);
1593 SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup
1595 for (int i = 0; i < invertGroup.size(); i++)
1597 seqs2[i] = invertGroup.elementAt(i);
1600 SlideSequencesCommand ssc;
1603 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1604 size, viewport.getGapCharacter());
1608 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1609 size, viewport.getGapCharacter());
1612 int groupAdjustment = 0;
1613 if (ssc.getGapsInsertedBegin() && right)
1615 if (viewport.cursorMode)
1617 alignPanel.seqPanel.moveCursor(size, 0);
1621 groupAdjustment = size;
1624 else if (!ssc.getGapsInsertedBegin() && !right)
1626 if (viewport.cursorMode)
1628 alignPanel.seqPanel.moveCursor(-size, 0);
1632 groupAdjustment = -size;
1636 if (groupAdjustment != 0)
1638 viewport.getSelectionGroup().setStartRes(
1639 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1640 viewport.getSelectionGroup().setEndRes(
1641 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1644 boolean appendHistoryItem = false;
1645 if (viewport.historyList != null && viewport.historyList.size() > 0
1646 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1648 appendHistoryItem = ssc
1649 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1653 if (!appendHistoryItem)
1655 addHistoryItem(ssc);
1661 static StringBuffer copiedSequences;
1663 static Vector copiedHiddenColumns;
1665 protected void copy_actionPerformed()
1667 if (viewport.getSelectionGroup() == null)
1672 SequenceGroup sg = viewport.getSelectionGroup();
1673 copiedSequences = new StringBuffer();
1674 Hashtable orderedSeqs = new Hashtable();
1675 for (int i = 0; i < sg.getSize(); i++)
1677 SequenceI seq = sg.getSequenceAt(i);
1678 int index = viewport.getAlignment().findIndex(seq);
1679 orderedSeqs.put(index + "", seq);
1682 int index = 0, startRes, endRes;
1685 if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null)
1687 copiedHiddenColumns = new Vector();
1688 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1689 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1692 int[] region = (int[]) viewport.getColumnSelection()
1693 .getHiddenColumns().elementAt(i);
1695 copiedHiddenColumns.addElement(new int[]
1696 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1701 copiedHiddenColumns = null;
1704 for (int i = 0; i < sg.getSize(); i++)
1706 SequenceI seq = null;
1710 if (orderedSeqs.containsKey(index + ""))
1712 seq = (SequenceI) orderedSeqs.get(index + "");
1724 // Returns residue following index if gap
1725 startRes = seq.findPosition(sg.getStartRes());
1728 // Need to find the residue preceeding index if gap
1731 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1733 ch = seq.getCharAt(j);
1734 if (!jalview.util.Comparison.isGap((ch)))
1742 endRes += seq.getStart() - 1;
1745 copiedSequences.append(seq.getName()
1751 + seq.getSequenceAsString(sg.getStartRes(),
1752 sg.getEndRes() + 1) + "\n");
1757 protected void pasteNew_actionPerformed()
1762 protected void pasteThis_actionPerformed()
1767 void paste(boolean newAlignment)
1772 if (copiedSequences == null)
1777 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1778 Vector seqs = new Vector();
1779 while (st.hasMoreElements())
1781 String name = st.nextToken();
1782 int start = Integer.parseInt(st.nextToken());
1783 int end = Integer.parseInt(st.nextToken());
1784 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1786 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1787 for (int i = 0; i < seqs.size(); i++)
1789 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1794 String newtitle = MessageManager.getString("label.copied_sequences");
1795 if (getTitle().startsWith(MessageManager.getString("label.copied_sequences")))
1797 newtitle = getTitle();
1801 newtitle = newtitle.concat(MessageManager.formatMessage("label.from_msname", new String[]{getTitle()}));
1803 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1804 viewport.applet, newtitle, false);
1805 if (copiedHiddenColumns != null)
1807 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1809 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1810 af.viewport.hideColumns(region[0], region[1]);
1814 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1819 addSequences(newSeqs);
1822 } catch (Exception ex)
1824 } // could be anything being pasted in here
1828 void addSequences(SequenceI[] seqs)
1830 for (int i = 0; i < seqs.length; i++)
1832 viewport.getAlignment().addSequence(seqs[i]);
1836 addHistoryItem(new EditCommand(MessageManager.getString("label.add_sequences"), EditCommand.PASTE,
1837 seqs, 0, viewport.getAlignment().getWidth(),
1838 viewport.getAlignment()));
1840 viewport.setEndSeq(viewport.getAlignment().getHeight());
1841 viewport.getAlignment().getWidth();
1842 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1847 protected void cut_actionPerformed()
1849 copy_actionPerformed();
1850 delete_actionPerformed();
1853 protected void delete_actionPerformed()
1856 SequenceGroup sg = viewport.getSelectionGroup();
1862 Vector seqs = new Vector();
1864 for (int i = 0; i < sg.getSize(); i++)
1866 seq = sg.getSequenceAt(i);
1867 seqs.addElement(seq);
1870 // If the cut affects all sequences, remove highlighted columns
1871 if (sg.getSize() == viewport.getAlignment().getHeight())
1873 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1874 sg.getEndRes() + 1);
1877 SequenceI[] cut = new SequenceI[seqs.size()];
1878 for (int i = 0; i < seqs.size(); i++)
1880 cut[i] = (SequenceI) seqs.elementAt(i);
1884 * //ADD HISTORY ITEM
1886 addHistoryItem(new EditCommand(MessageManager.getString("label.cut_sequences"), EditCommand.CUT, cut,
1887 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1888 viewport.getAlignment()));
1890 viewport.setSelectionGroup(null);
1891 viewport.getAlignment().deleteGroup(sg);
1893 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1896 if (viewport.getAlignment().getHeight() < 1)
1898 this.setVisible(false);
1900 viewport.sendSelection();
1904 * group consensus toggled
1907 protected void showGroupConsensus_actionPerformed()
1909 viewport.setShowGroupConsensus(showGroupConsensus.getState());
1910 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1915 * group conservation toggled.
1917 protected void showGroupConservation_actionPerformed()
1919 viewport.setShowGroupConservation(showGroupConservation.getState());
1920 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1927 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
1928 * .event.ActionEvent)
1930 protected void showConsensusHistogram_actionPerformed()
1932 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
1933 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1940 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
1941 * .event.ActionEvent)
1943 protected void showSequenceLogo_actionPerformed()
1945 viewport.setShowSequenceLogo(showSequenceLogo.getState());
1946 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1949 protected void normSequenceLogo_actionPerformed()
1951 showSequenceLogo.setState(true);
1952 viewport.setShowSequenceLogo(true);
1953 viewport.setNormaliseSequenceLogo(normSequenceLogo.getState());
1954 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1957 protected void applyAutoAnnotationSettings_actionPerformed()
1959 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1962 protected void makeGrpsFromSelection_actionPerformed()
1964 if (avc.makeGroupsFromSelection())
1966 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1967 alignPanel.updateAnnotation();
1968 alignPanel.paintAlignment(true);
1972 protected void createGroup_actionPerformed()
1977 protected void unGroup_actionPerformed()
1981 alignPanel.alignmentChanged();
1985 protected void deleteGroups_actionPerformed()
1987 if (avc.deleteGroups())
1989 alignPanel.alignmentChanged();
1993 public void selectAllSequenceMenuItem_actionPerformed()
1995 SequenceGroup sg = new SequenceGroup();
1996 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1998 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
2000 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
2001 viewport.setSelectionGroup(sg);
2002 alignPanel.paintAlignment(true);
2003 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2004 viewport.sendSelection();
2007 public void deselectAllSequenceMenuItem_actionPerformed()
2009 if (viewport.cursorMode)
2011 alignPanel.seqPanel.keyboardNo1 = null;
2012 alignPanel.seqPanel.keyboardNo2 = null;
2014 viewport.setSelectionGroup(null);
2015 viewport.getColumnSelection().clear();
2016 viewport.setSelectionGroup(null);
2017 alignPanel.idPanel.idCanvas.searchResults = null;
2018 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
2019 alignPanel.paintAlignment(true);
2020 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2021 viewport.sendSelection();
2024 public void invertSequenceMenuItem_actionPerformed()
2026 SequenceGroup sg = viewport.getSelectionGroup();
2027 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2029 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
2032 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2033 viewport.sendSelection();
2036 public void invertColSel_actionPerformed()
2038 viewport.invertColumnSelection();
2039 alignPanel.paintAlignment(true);
2040 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2041 viewport.sendSelection();
2044 void trimAlignment(boolean trimLeft)
2046 ColumnSelection colSel = viewport.getColumnSelection();
2049 if (colSel.size() > 0)
2053 column = colSel.getMin();
2057 column = colSel.getMax();
2061 if (viewport.getSelectionGroup() != null)
2063 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2064 viewport.getHiddenRepSequences());
2068 seqs = viewport.getAlignment().getSequencesArray();
2071 TrimRegionCommand trimRegion;
2074 trimRegion = new TrimRegionCommand("Remove Left",
2075 TrimRegionCommand.TRIM_LEFT, seqs, column,
2076 viewport.getAlignment(), viewport.getColumnSelection(),
2077 viewport.getSelectionGroup());
2078 viewport.setStartRes(0);
2082 trimRegion = new TrimRegionCommand("Remove Right",
2083 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2084 viewport.getAlignment(), viewport.getColumnSelection(),
2085 viewport.getSelectionGroup());
2088 statusBar.setText(MessageManager.formatMessage(
2089 "label.removed_columns", new String[]
2090 { Integer.valueOf(trimRegion.getSize()).toString() }));
2091 addHistoryItem(trimRegion);
2093 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2095 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2096 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2098 viewport.getAlignment().deleteGroup(sg);
2102 viewport.firePropertyChange("alignment", null, viewport
2103 .getAlignment().getSequences());
2107 public void removeGappedColumnMenuItem_actionPerformed()
2109 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2112 if (viewport.getSelectionGroup() != null)
2114 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2115 viewport.getHiddenRepSequences());
2116 start = viewport.getSelectionGroup().getStartRes();
2117 end = viewport.getSelectionGroup().getEndRes();
2121 seqs = viewport.getAlignment().getSequencesArray();
2124 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2125 "Remove Gapped Columns", seqs, start, end,
2126 viewport.getAlignment());
2128 addHistoryItem(removeGapCols);
2130 statusBar.setText(MessageManager.formatMessage(
2131 "label.removed_empty_columns", new String[]
2132 { Integer.valueOf(removeGapCols.getSize()).toString() }));
2134 // This is to maintain viewport position on first residue
2135 // of first sequence
2136 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2137 int startRes = seq.findPosition(viewport.startRes);
2138 // ShiftList shifts;
2139 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2140 // edit.alColumnChanges=shifts.getInverse();
2141 // if (viewport.hasHiddenColumns)
2142 // viewport.getColumnSelection().compensateForEdits(shifts);
2143 viewport.setStartRes(seq.findIndex(startRes) - 1);
2144 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2149 public void removeAllGapsMenuItem_actionPerformed()
2151 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2154 if (viewport.getSelectionGroup() != null)
2156 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2157 viewport.getHiddenRepSequences());
2158 start = viewport.getSelectionGroup().getStartRes();
2159 end = viewport.getSelectionGroup().getEndRes();
2163 seqs = viewport.getAlignment().getSequencesArray();
2166 // This is to maintain viewport position on first residue
2167 // of first sequence
2168 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2169 int startRes = seq.findPosition(viewport.startRes);
2171 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2172 viewport.getAlignment()));
2174 viewport.setStartRes(seq.findIndex(startRes) - 1);
2176 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2181 public void findMenuItem_actionPerformed()
2183 new Finder(alignPanel);
2187 * create a new view derived from the current view
2190 * @return frame for the new view
2192 public AlignFrame newView(String viewtitle)
2195 if (viewport.hasHiddenRows())
2197 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
2198 .getFullAlignment().getSequencesArray());
2202 newal = new Alignment(viewport.getAlignment().getSequencesArray());
2205 if (viewport.getAlignment().getAlignmentAnnotation() != null)
2207 for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++)
2209 if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated)
2211 newal.addAnnotation(viewport.getAlignment()
2212 .getAlignmentAnnotation()[i]);
2217 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
2219 newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId());
2220 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
2221 PaintRefresher.Register(newaf.alignPanel,
2222 newaf.alignPanel.av.getSequenceSetId());
2224 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
2225 newaf.alignPanel.av.getSequenceSetId());
2226 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
2227 newaf.alignPanel.av.getSequenceSetId());
2229 Vector comps = (Vector) PaintRefresher.components.get(viewport
2230 .getSequenceSetId());
2232 for (int i = 0; i < comps.size(); i++)
2234 if (comps.elementAt(i) instanceof AlignmentPanel)
2240 String title = new String(this.getTitle());
2241 if (viewtitle != null)
2243 title = viewtitle + " ( " + title + ")";
2247 if (title.indexOf("(View") > -1)
2249 title = title.substring(0, title.indexOf("(View"));
2251 title += "(View " + viewSize + ")";
2254 newaf.setTitle(title.toString());
2256 newaf.viewport.historyList = viewport.historyList;
2257 newaf.viewport.redoList = viewport.redoList;
2263 * @return list of feature groups on the view
2265 public String[] getFeatureGroups()
2267 FeatureRenderer fr = null;
2268 if (alignPanel != null
2269 && (fr = alignPanel.getFeatureRenderer()) != null)
2271 return fr.getGroups();
2277 * get sequence feature groups that are hidden or shown
2283 public String[] getFeatureGroupsOfState(boolean visible)
2285 FeatureRenderer fr = null;
2286 if (alignPanel != null
2287 && (fr = alignPanel.getFeatureRenderer()) != null)
2289 return fr.getGroups(visible);
2295 * Change the display state for the given feature groups
2298 * list of group strings
2300 * visible or invisible
2302 public void setFeatureGroupState(String[] groups, boolean state)
2304 FeatureRenderer fr = null;
2305 this.sequenceFeatures.setState(true);
2306 viewport.showSequenceFeatures(true);
2307 if (alignPanel != null
2308 && (fr = alignPanel.getFeatureRenderer()) != null)
2310 fr.setGroupState(groups, state);
2311 alignPanel.seqPanel.seqCanvas.repaint();
2312 if (alignPanel.overviewPanel != null)
2314 alignPanel.overviewPanel.updateOverviewImage();
2319 public void seqLimits_itemStateChanged()
2321 viewport.setShowJVSuffix(seqLimits.getState());
2322 alignPanel.fontChanged();
2323 alignPanel.paintAlignment(true);
2326 protected void colourTextMenuItem_actionPerformed()
2328 viewport.setColourText(colourTextMenuItem.getState());
2329 alignPanel.paintAlignment(true);
2332 protected void displayNonconservedMenuItem_actionPerformed()
2334 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2335 alignPanel.paintAlignment(true);
2338 protected void wrapMenuItem_actionPerformed()
2340 viewport.setWrapAlignment(wrapMenuItem.getState());
2341 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2342 scaleAbove.setEnabled(wrapMenuItem.getState());
2343 scaleLeft.setEnabled(wrapMenuItem.getState());
2344 scaleRight.setEnabled(wrapMenuItem.getState());
2345 alignPanel.paintAlignment(true);
2348 public void overviewMenuItem_actionPerformed()
2350 if (alignPanel.overviewPanel != null)
2355 Frame frame = new Frame();
2356 OverviewPanel overview = new OverviewPanel(alignPanel);
2357 frame.add(overview);
2358 // +50 must allow for applet frame window
2359 jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
2360 "label.overview_params", new String[]
2361 { this.getTitle() }), overview.getPreferredSize().width,
2362 overview.getPreferredSize().height + 50);
2365 final AlignmentPanel ap = alignPanel;
2366 frame.addWindowListener(new WindowAdapter()
2369 public void windowClosing(WindowEvent e)
2373 ap.setOverviewPanel(null);
2378 alignPanel.setOverviewPanel(overview);
2382 void changeColour(ColourSchemeI cs)
2388 if (viewport.getAbovePIDThreshold())
2390 viewport.setThreshold(SliderPanel.setPIDSliderSource(alignPanel,
2394 if (viewport.getConservationSelected())
2396 cs.setConservationApplied(true);
2397 viewport.setIncrement(SliderPanel.setConservationSlider(alignPanel,
2402 cs.setConservationApplied(false);
2405 viewport.setGlobalColourScheme(cs);
2407 if (alignPanel.getOverviewPanel() != null)
2409 alignPanel.getOverviewPanel().updateOverviewImage();
2412 jalview.structure.StructureSelectionManager
2413 .getStructureSelectionManager(viewport.applet)
2414 .sequenceColoursChanged(alignPanel);
2416 alignPanel.paintAlignment(true);
2419 protected void modifyPID_actionPerformed()
2421 if (viewport.getAbovePIDThreshold()
2422 && viewport.getGlobalColourScheme() != null)
2424 SliderPanel.setPIDSliderSource(alignPanel,
2425 viewport.getGlobalColourScheme(), "Background");
2426 SliderPanel.showPIDSlider();
2430 protected void modifyConservation_actionPerformed()
2432 if (viewport.getConservationSelected()
2433 && viewport.getGlobalColourScheme() != null)
2435 SliderPanel.setConservationSlider(alignPanel,
2436 viewport.getGlobalColourScheme(), "Background");
2437 SliderPanel.showConservationSlider();
2441 protected void conservationMenuItem_actionPerformed()
2443 viewport.setConservationSelected(conservationMenuItem.getState());
2445 viewport.setAbovePIDThreshold(false);
2446 abovePIDThreshold.setState(false);
2448 changeColour(viewport.getGlobalColourScheme());
2450 modifyConservation_actionPerformed();
2453 public void abovePIDThreshold_actionPerformed()
2455 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2457 conservationMenuItem.setState(false);
2458 viewport.setConservationSelected(false);
2460 changeColour(viewport.getGlobalColourScheme());
2462 modifyPID_actionPerformed();
2465 public void sortPairwiseMenuItem_actionPerformed()
2467 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2468 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2469 .getAlignment().getSequenceAt(0), null);
2471 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2472 viewport.getAlignment()));
2473 alignPanel.paintAlignment(true);
2476 public void sortIDMenuItem_actionPerformed()
2478 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2479 AlignmentSorter.sortByID(viewport.getAlignment());
2480 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2481 viewport.getAlignment()));
2482 alignPanel.paintAlignment(true);
2485 public void sortLengthMenuItem_actionPerformed()
2487 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2488 AlignmentSorter.sortByLength(viewport.getAlignment());
2489 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
2490 viewport.getAlignment()));
2491 alignPanel.paintAlignment(true);
2494 public void sortGroupMenuItem_actionPerformed()
2496 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2497 AlignmentSorter.sortByGroup(viewport.getAlignment());
2498 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2499 viewport.getAlignment()));
2500 alignPanel.paintAlignment(true);
2504 public void removeRedundancyMenuItem_actionPerformed()
2506 new RedundancyPanel(alignPanel);
2509 public void pairwiseAlignmentMenuItem_actionPerformed()
2511 if (viewport.getSelectionGroup() != null
2512 && viewport.getSelectionGroup().getSize() > 1)
2514 Frame frame = new Frame();
2515 frame.add(new PairwiseAlignPanel(alignPanel));
2516 jalview.bin.JalviewLite.addFrame(frame,
2517 MessageManager.getString("action.pairwise_alignment"), 600,
2522 public void PCAMenuItem_actionPerformed()
2524 // are the sequences aligned?
2525 if (!viewport.getAlignment().isAligned(false))
2528 int Width = viewport.getAlignment().getWidth();
2530 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2532 current = viewport.getAlignment().getSequenceAt(i);
2534 if (current.getLength() < Width)
2536 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2539 alignPanel.paintAlignment(true);
2542 if ((viewport.getSelectionGroup() != null
2543 && viewport.getSelectionGroup().getSize() < 4 && viewport
2544 .getSelectionGroup().getSize() > 0)
2545 || viewport.getAlignment().getHeight() < 4)
2552 new PCAPanel(viewport);
2553 } catch (java.lang.OutOfMemoryError ex)
2559 public void averageDistanceTreeMenuItem_actionPerformed()
2561 NewTreePanel("AV", "PID", "Average distance tree using PID");
2564 public void neighbourTreeMenuItem_actionPerformed()
2566 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2569 protected void njTreeBlosumMenuItem_actionPerformed()
2571 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2574 protected void avTreeBlosumMenuItem_actionPerformed()
2576 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2579 void NewTreePanel(String type, String pwType, String title)
2581 // are the sequences aligned?
2582 if (!viewport.getAlignment().isAligned(false))
2585 int Width = viewport.getAlignment().getWidth();
2587 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2589 current = viewport.getAlignment().getSequenceAt(i);
2591 if (current.getLength() < Width)
2593 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2596 alignPanel.paintAlignment(true);
2600 if ((viewport.getSelectionGroup() != null && viewport
2601 .getSelectionGroup().getSize() > 1)
2602 || (viewport.getAlignment().getHeight() > 1))
2604 final TreePanel tp = new TreePanel(alignPanel, type, pwType);
2606 addTreeMenuItem(tp, title);
2608 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2612 void loadTree_actionPerformed()
2614 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2615 cap.setText(MessageManager.getString("label.paste_newick_tree_file"));
2616 cap.setTreeImport();
2617 Frame frame = new Frame();
2619 jalview.bin.JalviewLite.addFrame(frame,
2620 MessageManager.getString("label.paste_newick_file"), 400, 300);
2623 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2625 TreePanel tp = new TreePanel(alignPanel, treeFile,
2626 MessageManager.getString("label.load_tree_from_file"), tree);
2627 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2628 addTreeMenuItem(tp, treeFile);
2632 * sort the alignment using the given treePanel
2635 * tree used to sort view
2637 * string used for undo event name
2639 public void sortByTree(TreePanel treePanel, String title)
2641 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2643 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2644 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2645 // HistoryItem.SORT));
2646 addHistoryItem(new OrderCommand(MessageManager.formatMessage(
2647 "label.order_by_params", new String[]
2648 { title }), oldOrder, viewport.getAlignment()));
2649 alignPanel.paintAlignment(true);
2653 * Do any automatic reordering of the alignment and add the necessary bits to
2654 * the menu structure for the new tree
2659 protected void addTreeMenuItem(final TreePanel treePanel,
2662 final MenuItem item = new MenuItem(title);
2663 sortByTreeMenu.add(item);
2664 item.addActionListener(new java.awt.event.ActionListener()
2667 public void actionPerformed(ActionEvent evt)
2669 sortByTree(treePanel, title); // treePanel.getTitle());
2673 treePanel.addWindowListener(new WindowAdapter()
2676 public void windowOpened(WindowEvent e)
2678 if (viewport.sortByTree)
2680 sortByTree(treePanel, title);
2682 super.windowOpened(e);
2686 public void windowClosing(WindowEvent e)
2688 sortByTreeMenu.remove(item);
2693 public boolean sortBy(AlignmentOrder alorder, String undoname)
2695 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2696 if (viewport.applet.debug)
2698 System.err.println("Sorting " + alorder.getOrder().size()
2699 + " in alignment '" + getTitle() + "'");
2701 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
2702 if (undoname != null)
2704 addHistoryItem(new OrderCommand(undoname, oldOrder,
2705 viewport.getAlignment()));
2707 alignPanel.paintAlignment(true);
2711 protected void documentation_actionPerformed()
2713 alignPanel.av.applet.openJalviewHelpUrl();
2716 protected void about_actionPerformed()
2719 class AboutPanel extends Canvas
2725 public AboutPanel(String version, String builddate)
2727 this.version = version;
2728 this.builddate = builddate;
2732 public void paint(Graphics g)
2734 g.setColor(Color.white);
2735 g.fillRect(0, 0, getSize().width, getSize().height);
2736 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2737 FontMetrics fm = g.getFontMetrics();
2738 int fh = fm.getHeight();
2740 g.setColor(Color.black);
2741 // TODO: update this text for each release or centrally store it for
2742 // lite and application
2743 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2744 g.drawString(MessageManager.formatMessage(
2745 "label.jalviewLite_release", new String[]
2746 { version }), x, y += fh);
2747 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2748 g.drawString(MessageManager.formatMessage(
2749 "label.jaview_build_date", new String[]
2750 { builddate }), x, y += fh);
2751 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2752 g.drawString(MessageManager.getString("label.jalview_authors_1"),
2754 g.drawString(MessageManager.getString("label.jalview_authors_2"),
2755 x + 50, y += fh + 8);
2757 MessageManager.getString("label.jalview_dev_managers"), x,
2759 g.drawString(MessageManager
2760 .getString("label.jalview_distribution_lists"), x, y += fh);
2761 g.drawString(MessageManager.getString("label.jalview_please_cite"),
2764 MessageManager.getString("label.jalview_cite_1_authors"),
2767 MessageManager.getString("label.jalview_cite_1_title"), x,
2769 g.drawString(MessageManager.getString("label.jalview_cite_1_ref"),
2774 Frame frame = new Frame();
2775 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2777 jalview.bin.JalviewLite.addFrame(frame,
2778 MessageManager.getString("label.jalview"), 580, 220);
2782 public void showURL(String url, String target)
2784 if (viewport.applet == null)
2786 System.out.println("Not running as applet - no browser available.");
2790 viewport.applet.showURL(url, target);
2794 // ////////////////////////////////////////////////////////////////////////////////
2795 // JBuilder Graphics here
2797 MenuBar alignFrameMenuBar = new MenuBar();
2799 Menu fileMenu = new Menu(MessageManager.getString("action.file"));
2801 MenuItem loadApplication = new MenuItem(
2802 MessageManager.getString("label.view_full_application"));
2804 MenuItem loadTree = new MenuItem(
2805 MessageManager.getString("label.load_associated_tree"));
2807 MenuItem loadAnnotations = new MenuItem(
2808 MessageManager.getString("label.load_features_annotations"));
2810 MenuItem outputFeatures = new MenuItem(
2811 MessageManager.getString("label.export_features").concat("..."));
2813 MenuItem outputAnnotations = new MenuItem(
2814 MessageManager.getString("label.export_annotations").concat("..."));
2816 MenuItem closeMenuItem = new MenuItem(
2817 MessageManager.getString("action.close"));
2819 Menu editMenu = new Menu(MessageManager.getString("action.edit"));
2821 Menu viewMenu = new Menu(MessageManager.getString("action.view"));
2823 Menu colourMenu = new Menu(MessageManager.getString("action.colour"));
2825 Menu calculateMenu = new Menu(
2826 MessageManager.getString("action.calculate"));
2828 MenuItem selectAllSequenceMenuItem = new MenuItem(
2829 MessageManager.getString("action.select_all"));
2831 MenuItem deselectAllSequenceMenuItem = new MenuItem(
2832 MessageManager.getString("action.deselect_all"));
2834 MenuItem invertSequenceMenuItem = new MenuItem(
2835 MessageManager.getString("action.invert_selection"));
2837 MenuItem remove2LeftMenuItem = new MenuItem();
2839 MenuItem remove2RightMenuItem = new MenuItem();
2841 MenuItem removeGappedColumnMenuItem = new MenuItem();
2843 MenuItem removeAllGapsMenuItem = new MenuItem();
2845 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2847 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2849 MenuItem sortPairwiseMenuItem = new MenuItem();
2851 MenuItem sortIDMenuItem = new MenuItem();
2853 MenuItem sortLengthMenuItem = new MenuItem();
2855 MenuItem sortGroupMenuItem = new MenuItem();
2857 MenuItem removeRedundancyMenuItem = new MenuItem();
2859 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2861 MenuItem PCAMenuItem = new MenuItem();
2863 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2865 MenuItem neighbourTreeMenuItem = new MenuItem();
2867 BorderLayout borderLayout1 = new BorderLayout();
2869 public Label statusBar = new Label();
2871 Menu outputTextboxMenu = new Menu();
2873 MenuItem clustalColour = new MenuItem();
2875 MenuItem zappoColour = new MenuItem();
2877 MenuItem taylorColour = new MenuItem();
2879 MenuItem hydrophobicityColour = new MenuItem();
2881 MenuItem helixColour = new MenuItem();
2883 MenuItem strandColour = new MenuItem();
2885 MenuItem turnColour = new MenuItem();
2887 MenuItem buriedColour = new MenuItem();
2889 MenuItem purinePyrimidineColour = new MenuItem();
2891 MenuItem RNAInteractionColour = new MenuItem();
2893 MenuItem RNAHelixColour = new MenuItem();
2895 MenuItem userDefinedColour = new MenuItem();
2897 MenuItem PIDColour = new MenuItem();
2899 MenuItem BLOSUM62Colour = new MenuItem();
2901 MenuItem tcoffeeColour = new MenuItem();
2903 MenuItem njTreeBlosumMenuItem = new MenuItem();
2905 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2907 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2909 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2911 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2913 MenuItem alProperties = new MenuItem(
2914 MessageManager.getString("label.alignment_props"));
2916 MenuItem overviewMenuItem = new MenuItem();
2918 MenuItem undoMenuItem = new MenuItem();
2920 MenuItem redoMenuItem = new MenuItem();
2922 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2924 MenuItem noColourmenuItem = new MenuItem();
2926 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2928 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2930 MenuItem findMenuItem = new MenuItem();
2932 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2934 MenuItem nucleotideColour = new MenuItem();
2936 MenuItem deleteGroups = new MenuItem();
2938 MenuItem grpsFromSelection = new MenuItem();
2940 MenuItem createGroup = new MenuItem();
2942 MenuItem unGroup = new MenuItem();
2944 MenuItem delete = new MenuItem();
2946 MenuItem copy = new MenuItem();
2948 MenuItem cut = new MenuItem();
2950 Menu pasteMenu = new Menu();
2952 MenuItem pasteNew = new MenuItem();
2954 MenuItem pasteThis = new MenuItem();
2956 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2958 MenuItem font = new MenuItem();
2960 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2962 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2964 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2966 MenuItem modifyPID = new MenuItem();
2968 MenuItem modifyConservation = new MenuItem();
2970 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2971 "Autocalculate Consensus", true);
2973 CheckboxMenuItem sortByTree = new CheckboxMenuItem(
2974 "Sort Alignment With New Tree", true);
2976 Menu sortByTreeMenu = new Menu();
2978 Menu sort = new Menu();
2980 Menu calculate = new Menu();
2982 MenuItem inputText = new MenuItem();
2984 Menu helpMenu = new Menu();
2986 MenuItem documentation = new MenuItem();
2988 MenuItem about = new MenuItem();
2990 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2992 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2994 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2996 Menu autoAnnMenu = new Menu();
2998 CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem();
3000 CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
3002 CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem();
3004 CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem();
3006 CheckboxMenuItem showGroupConservation = new CheckboxMenuItem();
3008 CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem();
3010 private void jbInit() throws Exception
3013 setMenuBar(alignFrameMenuBar);
3017 // dynamically fill save as menu with available formats
3018 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
3021 item = new MenuItem(
3022 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
3024 item.addActionListener(new java.awt.event.ActionListener()
3027 public void actionPerformed(ActionEvent e)
3029 outputText_actionPerformed(e);
3033 outputTextboxMenu.add(item);
3035 closeMenuItem.addActionListener(this);
3036 loadApplication.addActionListener(this);
3038 loadTree.addActionListener(this);
3039 loadAnnotations.addActionListener(this);
3040 outputFeatures.addActionListener(this);
3041 outputAnnotations.addActionListener(this);
3042 selectAllSequenceMenuItem.addActionListener(this);
3043 deselectAllSequenceMenuItem.addActionListener(this);
3044 invertSequenceMenuItem.addActionListener(this);
3045 remove2LeftMenuItem.setLabel(MessageManager
3046 .getString("action.remove_left"));
3047 remove2LeftMenuItem.addActionListener(this);
3048 remove2RightMenuItem.setLabel(MessageManager
3049 .getString("action.remove_right"));
3050 remove2RightMenuItem.addActionListener(this);
3051 removeGappedColumnMenuItem.setLabel(MessageManager
3052 .getString("action.remove_empty_columns"));
3053 removeGappedColumnMenuItem.addActionListener(this);
3054 removeAllGapsMenuItem.setLabel(MessageManager
3055 .getString("action.remove_all_gaps"));
3056 removeAllGapsMenuItem.addActionListener(this);
3057 viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
3058 viewBoxesMenuItem.setState(true);
3059 viewBoxesMenuItem.addItemListener(this);
3060 viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
3061 viewTextMenuItem.setState(true);
3062 viewTextMenuItem.addItemListener(this);
3063 sortPairwiseMenuItem.setLabel(MessageManager
3064 .getString("action.by_pairwise_id"));
3065 sortPairwiseMenuItem.addActionListener(this);
3066 sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
3067 sortIDMenuItem.addActionListener(this);
3068 sortLengthMenuItem.setLabel(MessageManager
3069 .getString("action.by_length"));
3070 sortLengthMenuItem.addActionListener(this);
3071 sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
3072 sortGroupMenuItem.addActionListener(this);
3073 removeRedundancyMenuItem.setLabel(MessageManager
3074 .getString("action.remove_redundancy").concat("..."));
3075 removeRedundancyMenuItem.addActionListener(this);
3076 pairwiseAlignmentMenuItem.setLabel(MessageManager
3077 .getString("action.pairwise_alignment"));
3078 pairwiseAlignmentMenuItem.addActionListener(this);
3079 PCAMenuItem.setLabel(MessageManager
3080 .getString("label.principal_component_analysis"));
3081 PCAMenuItem.addActionListener(this);
3082 averageDistanceTreeMenuItem.setLabel(MessageManager
3083 .getString("label.average_distance_identity"));
3084 averageDistanceTreeMenuItem.addActionListener(this);
3085 neighbourTreeMenuItem.setLabel(MessageManager
3086 .getString("label.neighbour_joining_identity"));
3087 neighbourTreeMenuItem.addActionListener(this);
3088 statusBar.setBackground(Color.white);
3089 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
3090 statusBar.setText(MessageManager.getString("label.status_bar"));
3091 outputTextboxMenu.setLabel(MessageManager
3092 .getString("label.out_to_textbox"));
3093 clustalColour.setLabel(MessageManager.getString("label.clustalx"));
3095 clustalColour.addActionListener(this);
3096 zappoColour.setLabel(MessageManager.getString("label.zappo"));
3097 zappoColour.addActionListener(this);
3098 taylorColour.setLabel(MessageManager.getString("label.taylor"));
3099 taylorColour.addActionListener(this);
3100 hydrophobicityColour.setLabel(MessageManager
3101 .getString("label.hydrophobicity"));
3102 hydrophobicityColour.addActionListener(this);
3104 .setLabel(MessageManager.getString("label.helix_propensity"));
3105 helixColour.addActionListener(this);
3106 strandColour.setLabel(MessageManager
3107 .getString("label.strand_propensity"));
3108 strandColour.addActionListener(this);
3109 turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
3110 turnColour.addActionListener(this);
3111 buriedColour.setLabel(MessageManager.getString("label.buried_index"));
3112 buriedColour.addActionListener(this);
3113 purinePyrimidineColour.setLabel(MessageManager
3114 .getString("label.purine_pyrimidine"));
3115 purinePyrimidineColour.addActionListener(this);
3116 RNAInteractionColour.setLabel(MessageManager
3117 .getString("label.rna_interaction"));
3118 RNAInteractionColour.addActionListener(this);
3119 RNAHelixColour.setLabel(MessageManager
3120 .getString("action.by_rna_helixes"));
3121 RNAHelixColour.addActionListener(this);
3122 userDefinedColour.setLabel(MessageManager
3123 .getString("action.user_defined"));
3124 userDefinedColour.addActionListener(this);
3125 PIDColour.setLabel(MessageManager
3126 .getString("label.percentage_identity"));
3127 PIDColour.addActionListener(this);
3128 BLOSUM62Colour.setLabel(MessageManager
3129 .getString("label.blosum62_score"));
3130 BLOSUM62Colour.addActionListener(this);
3132 .setLabel(MessageManager.getString("label.tcoffee_scores"));
3133 tcoffeeColour.setEnabled(false); // it will enabled only if a score file is
3135 tcoffeeColour.addActionListener(this);
3136 avDistanceTreeBlosumMenuItem.setLabel(MessageManager
3137 .getString("label.average_distance_bloslum62"));
3138 avDistanceTreeBlosumMenuItem.addActionListener(this);
3139 njTreeBlosumMenuItem.setLabel(MessageManager
3140 .getString("label.neighbour_blosum62"));
3141 njTreeBlosumMenuItem.addActionListener(this);
3142 annotationPanelMenuItem.setLabel(MessageManager
3143 .getString("label.show_annotations"));
3144 annotationPanelMenuItem.addItemListener(this);
3145 colourTextMenuItem.setLabel(MessageManager
3146 .getString("label.colour_text"));
3147 colourTextMenuItem.addItemListener(this);
3148 displayNonconservedMenuItem.setLabel(MessageManager
3149 .getString("label.show_non_conversed"));
3150 displayNonconservedMenuItem.addItemListener(this);
3151 alProperties.addActionListener(this);
3152 overviewMenuItem.setLabel(MessageManager
3153 .getString("label.overview_window"));
3154 overviewMenuItem.addActionListener(this);
3155 undoMenuItem.setEnabled(false);
3156 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
3157 undoMenuItem.addActionListener(this);
3158 redoMenuItem.setEnabled(false);
3159 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
3160 redoMenuItem.addActionListener(this);
3161 conservationMenuItem.setLabel(MessageManager
3162 .getString("action.by_conservation"));
3163 conservationMenuItem.addItemListener(this);
3164 noColourmenuItem.setLabel(MessageManager.getString("label.none"));
3165 noColourmenuItem.addActionListener(this);
3166 wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
3167 wrapMenuItem.addItemListener(this);
3168 renderGapsMenuItem.setLabel(MessageManager
3169 .getString("action.show_gaps"));
3170 renderGapsMenuItem.setState(true);
3171 renderGapsMenuItem.addItemListener(this);
3172 findMenuItem.setLabel(MessageManager.getString("action.find"));
3173 findMenuItem.addActionListener(this);
3174 abovePIDThreshold.setLabel(MessageManager
3175 .getString("label.above_identity_threshold"));
3176 abovePIDThreshold.addItemListener(this);
3177 nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
3178 nucleotideColour.addActionListener(this);
3179 deleteGroups.setLabel(MessageManager
3180 .getString("action.undefine_groups"));
3181 deleteGroups.addActionListener(this);
3182 grpsFromSelection.setLabel(MessageManager
3183 .getString("action.make_groups_selection"));
3184 grpsFromSelection.addActionListener(this);
3185 createGroup.setLabel(MessageManager.getString("action.create_group"));
3186 unGroup.setLabel(MessageManager.getString("action.remove_group"));
3187 copy.setLabel(MessageManager.getString("action.copy"));
3188 copy.addActionListener(this);
3189 cut.setLabel(MessageManager.getString("action.cut"));
3190 cut.addActionListener(this);
3191 delete.setLabel(MessageManager.getString("action.delete"));
3192 delete.addActionListener(this);
3193 pasteMenu.setLabel(MessageManager.getString("action.paste"));
3194 pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
3195 pasteNew.addActionListener(this);
3196 pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
3197 pasteThis.addActionListener(this);
3198 applyToAllGroups.setLabel(MessageManager
3199 .getString("label.apply_colour_to_all_groups"));
3200 applyToAllGroups.setState(true);
3201 applyToAllGroups.addItemListener(this);
3202 font.setLabel(MessageManager.getString("action.font"));
3203 font.addActionListener(this);
3204 scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
3205 scaleAbove.setState(true);
3206 scaleAbove.setEnabled(false);
3207 scaleAbove.addItemListener(this);
3208 scaleLeft.setEnabled(false);
3209 scaleLeft.setState(true);
3210 scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
3211 scaleLeft.addItemListener(this);
3212 scaleRight.setEnabled(false);
3213 scaleRight.setState(true);
3214 scaleRight.setLabel(MessageManager.getString("action.scale_right"));
3215 scaleRight.addItemListener(this);
3216 modifyPID.setLabel(MessageManager
3217 .getString("label.modify_identity_thereshold"));
3218 modifyPID.addActionListener(this);
3219 modifyConservation.setLabel(MessageManager
3220 .getString("label.modify_conservation_thereshold"));
3221 modifyConservation.addActionListener(this);
3222 sortByTreeMenu.setLabel(MessageManager
3223 .getString("action.by_tree_order"));
3224 sort.setLabel(MessageManager.getString("action.sort"));
3225 calculate.setLabel(MessageManager.getString("action.calculate_tree"));
3226 autoCalculate.addItemListener(this);
3227 sortByTree.addItemListener(this);
3229 .setLabel(MessageManager.getString("label.input_from_textbox"));
3230 inputText.addActionListener(this);
3231 centreColumnLabelFlag.setLabel(MessageManager
3232 .getString("label.centre_column_labels"));
3233 centreColumnLabelFlag.addItemListener(this);
3234 followMouseOverFlag.setLabel(MessageManager
3235 .getString("label.automatic_scrolling"));
3236 followMouseOverFlag.addItemListener(this);
3237 helpMenu.setLabel(MessageManager.getString("action.help"));
3238 documentation.setLabel(MessageManager.getString("label.documentation"));
3239 documentation.addActionListener(this);
3241 about.setLabel(MessageManager.getString("label.about"));
3242 about.addActionListener(this);
3243 seqLimits.setState(true);
3244 seqLimits.setLabel(MessageManager
3245 .getString("label.show_sequence_limits"));
3246 seqLimits.addItemListener(this);
3247 featureSettings.setLabel(MessageManager
3248 .getString("label.feature_settings"));
3249 featureSettings.addActionListener(this);
3250 sequenceFeatures.setLabel(MessageManager
3251 .getString("label.sequence_features"));
3252 sequenceFeatures.addItemListener(this);
3253 sequenceFeatures.setState(false);
3254 annotationColour.setLabel(MessageManager
3255 .getString("action.by_annotation"));
3256 annotationColour.addActionListener(this);
3257 invertSequenceMenuItem.setLabel(MessageManager
3258 .getString("action.invert_sequence_selection"));
3259 invertColSel.setLabel(MessageManager
3260 .getString("action.invert_column_selection"));
3261 menu1.setLabel(MessageManager.getString("action.show"));
3262 showColumns.setLabel(MessageManager.getString("label.all_columns"));
3263 showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
3264 menu2.setLabel(MessageManager.getString("action.hide"));
3266 .setLabel(MessageManager.getString("label.selected_columns"));
3267 hideSequences.setLabel(MessageManager
3268 .getString("label.selected_sequences"));
3269 hideAllButSelection.setLabel(MessageManager
3270 .getString("label.all_but_selected_region"));
3271 hideAllSelection.setLabel(MessageManager
3272 .getString("label.selected_region"));
3273 showAllHidden.setLabel(MessageManager
3274 .getString("label.all_sequences_columns"));
3275 showGroupConsensus.setLabel(MessageManager
3276 .getString("label.group_consensus"));
3277 showGroupConservation.setLabel(MessageManager
3278 .getString("label.group_conservation"));
3279 showConsensusHistogram.setLabel(MessageManager
3280 .getString("label.show_consensus_histogram"));
3281 showSequenceLogo.setLabel(MessageManager
3282 .getString("label.show_consensus_logo"));
3283 normSequenceLogo.setLabel(MessageManager
3284 .getString("label.norm_consensus_logo"));
3285 applyAutoAnnotationSettings.setLabel(MessageManager
3286 .getString("label.apply_all_groups"));
3287 applyAutoAnnotationSettings.setState(true);
3288 autoAnnMenu.setLabel(MessageManager
3289 .getString("label.autocalculated_annotation"));
3291 invertColSel.addActionListener(this);
3292 showColumns.addActionListener(this);
3293 showSeqs.addActionListener(this);
3294 hideColumns.addActionListener(this);
3295 hideSequences.addActionListener(this);
3296 hideAllButSelection.addActionListener(this);
3297 hideAllSelection.addActionListener(this);
3298 showAllHidden.addActionListener(this);
3299 showGroupConsensus.addItemListener(this);
3300 showGroupConservation.addItemListener(this);
3301 showConsensusHistogram.addItemListener(this);
3302 showSequenceLogo.addItemListener(this);
3303 normSequenceLogo.addItemListener(this);
3305 applyAutoAnnotationSettings.addItemListener(this);
3306 formatMenu.setLabel(MessageManager.getString("action.format"));
3307 selectMenu.setLabel(MessageManager.getString("action.select"));
3308 newView.setLabel(MessageManager.getString("action.new_view"));
3309 newView.addActionListener(this);
3310 alignFrameMenuBar.add(fileMenu);
3311 alignFrameMenuBar.add(editMenu);
3312 alignFrameMenuBar.add(selectMenu);
3313 alignFrameMenuBar.add(viewMenu);
3314 alignFrameMenuBar.add(formatMenu);
3315 alignFrameMenuBar.add(colourMenu);
3316 alignFrameMenuBar.add(calculateMenu);
3317 alignFrameMenuBar.add(helpMenu);
3319 fileMenu.add(inputText);
3320 fileMenu.add(loadTree);
3321 fileMenu.add(loadAnnotations);
3323 fileMenu.addSeparator();
3324 fileMenu.add(outputTextboxMenu);
3325 fileMenu.add(outputFeatures);
3326 fileMenu.add(outputAnnotations);
3328 if (jalviewServletURL != null)
3330 fileMenu.add(loadApplication);
3333 fileMenu.addSeparator();
3334 fileMenu.add(closeMenuItem);
3336 editMenu.add(undoMenuItem);
3337 editMenu.add(redoMenuItem);
3340 editMenu.add(pasteMenu);
3341 editMenu.add(delete);
3342 editMenu.addSeparator();
3343 editMenu.add(remove2LeftMenuItem);
3344 editMenu.add(remove2RightMenuItem);
3345 editMenu.add(removeGappedColumnMenuItem);
3346 editMenu.add(removeAllGapsMenuItem);
3347 editMenu.add(removeRedundancyMenuItem);
3348 viewMenu.add(newView);
3349 viewMenu.addSeparator();
3350 viewMenu.add(menu1);
3351 viewMenu.add(menu2);
3352 viewMenu.addSeparator();
3353 viewMenu.add(followMouseOverFlag);
3354 viewMenu.add(annotationPanelMenuItem);
3355 autoAnnMenu.add(applyAutoAnnotationSettings);
3356 autoAnnMenu.add(showConsensusHistogram);
3357 autoAnnMenu.add(showSequenceLogo);
3358 autoAnnMenu.add(normSequenceLogo);
3359 autoAnnMenu.addSeparator();
3360 autoAnnMenu.add(showGroupConservation);
3361 autoAnnMenu.add(showGroupConsensus);
3362 viewMenu.add(autoAnnMenu);
3363 viewMenu.addSeparator();
3364 viewMenu.add(sequenceFeatures);
3365 viewMenu.add(featureSettings);
3366 viewMenu.addSeparator();
3367 viewMenu.add(alProperties);
3368 viewMenu.addSeparator();
3369 viewMenu.add(overviewMenuItem);
3370 colourMenu.add(applyToAllGroups);
3371 colourMenu.addSeparator();
3372 colourMenu.add(noColourmenuItem);
3373 colourMenu.add(clustalColour);
3374 colourMenu.add(BLOSUM62Colour);
3375 colourMenu.add(PIDColour);
3376 colourMenu.add(zappoColour);
3377 colourMenu.add(taylorColour);
3378 colourMenu.add(hydrophobicityColour);
3379 colourMenu.add(helixColour);
3380 colourMenu.add(strandColour);
3381 colourMenu.add(turnColour);
3382 colourMenu.add(buriedColour);
3383 colourMenu.add(nucleotideColour);
3384 colourMenu.add(purinePyrimidineColour);
3385 // colourMenu.add(RNAInteractionColour);
3386 colourMenu.add(tcoffeeColour);
3387 colourMenu.add(userDefinedColour);
3388 colourMenu.addSeparator();
3389 colourMenu.add(conservationMenuItem);
3390 colourMenu.add(modifyConservation);
3391 colourMenu.add(abovePIDThreshold);
3392 colourMenu.add(modifyPID);
3393 colourMenu.add(annotationColour);
3394 colourMenu.add(RNAHelixColour);
3395 calculateMenu.add(sort);
3396 calculateMenu.add(calculate);
3397 calculateMenu.addSeparator();
3398 calculateMenu.add(pairwiseAlignmentMenuItem);
3399 calculateMenu.add(PCAMenuItem);
3400 calculateMenu.add(autoCalculate);
3401 calculateMenu.add(sortByTree);
3402 this.add(statusBar, BorderLayout.SOUTH);
3403 pasteMenu.add(pasteNew);
3404 pasteMenu.add(pasteThis);
3405 sort.add(sortIDMenuItem);
3406 sort.add(sortLengthMenuItem);
3407 sort.add(sortByTreeMenu);
3408 sort.add(sortGroupMenuItem);
3409 sort.add(sortPairwiseMenuItem);
3410 calculate.add(averageDistanceTreeMenuItem);
3411 calculate.add(neighbourTreeMenuItem);
3412 calculate.add(avDistanceTreeBlosumMenuItem);
3413 calculate.add(njTreeBlosumMenuItem);
3414 helpMenu.add(documentation);
3415 helpMenu.add(about);
3416 menu1.add(showColumns);
3417 menu1.add(showSeqs);
3418 menu1.add(showAllHidden);
3419 menu2.add(hideColumns);
3420 menu2.add(hideSequences);
3421 menu2.add(hideAllSelection);
3422 menu2.add(hideAllButSelection);
3423 formatMenu.add(font);
3424 formatMenu.add(seqLimits);
3425 formatMenu.add(wrapMenuItem);
3426 formatMenu.add(scaleAbove);
3427 formatMenu.add(scaleLeft);
3428 formatMenu.add(scaleRight);
3429 formatMenu.add(viewBoxesMenuItem);
3430 formatMenu.add(viewTextMenuItem);
3431 formatMenu.add(colourTextMenuItem);
3432 formatMenu.add(displayNonconservedMenuItem);
3433 formatMenu.add(renderGapsMenuItem);
3434 formatMenu.add(centreColumnLabelFlag);
3435 selectMenu.add(findMenuItem);
3436 selectMenu.addSeparator();
3437 selectMenu.add(selectAllSequenceMenuItem);
3438 selectMenu.add(deselectAllSequenceMenuItem);
3439 selectMenu.add(invertSequenceMenuItem);
3440 selectMenu.add(invertColSel);
3441 selectMenu.add(createGroup);
3442 selectMenu.add(unGroup);
3443 selectMenu.add(grpsFromSelection);
3444 selectMenu.add(deleteGroups);
3448 public void setStatus(String string)
3450 statusBar.setText(string);
3453 MenuItem featureSettings = new MenuItem();
3455 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3457 MenuItem annotationColour = new MenuItem();
3459 MenuItem invertColSel = new MenuItem();
3461 Menu menu1 = new Menu();
3463 MenuItem showColumns = new MenuItem();
3465 MenuItem showSeqs = new MenuItem();
3467 Menu menu2 = new Menu();
3469 MenuItem hideColumns = new MenuItem();
3471 MenuItem hideSequences = new MenuItem();
3473 MenuItem hideAllButSelection = new MenuItem();
3475 MenuItem hideAllSelection = new MenuItem();
3477 MenuItem showAllHidden = new MenuItem();
3479 Menu formatMenu = new Menu();
3481 Menu selectMenu = new Menu();
3483 MenuItem newView = new MenuItem();
3486 * Attach the alignFrame panels after embedding menus, if necessary. This used
3487 * to be called setEmbedded, but is now creates the dropdown menus in a
3488 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3490 * @param reallyEmbedded
3491 * true to attach the view to the applet area on the page rather than
3494 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3499 // Explicly build the embedded menu panel for the on-page applet
3501 // view cannot be closed if its actually on the page
3502 fileMenu.remove(closeMenuItem);
3503 fileMenu.remove(3); // Remove Seperator
3504 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3505 Font.PLAIN, 11, false); // use our own fonts.
3506 // and actually add the components to the applet area
3507 viewport.applet.setLayout(new BorderLayout());
3508 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3509 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3510 alignPanel.setSize(viewport.applet.getSize().width,
3511 viewport.applet.getSize().height - embeddedMenu.HEIGHT
3512 - statusBar.HEIGHT);
3513 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3514 final AlignFrame me = this;
3515 viewport.applet.addFocusListener(new FocusListener()
3519 public void focusLost(FocusEvent e)
3521 if (me.viewport.applet.currentAlignFrame == me)
3523 me.viewport.applet.currentAlignFrame = null;
3528 public void focusGained(FocusEvent e)
3530 me.viewport.applet.currentAlignFrame = me;
3533 viewport.applet.validate();
3538 // test and embed menu bar if necessary.
3540 if (embedMenuIfNeeded(alignPanel))
3542 // adjust for status bar height too
3543 alignPanel.setSize(getSize().width, getSize().height
3544 - statusBar.HEIGHT);
3546 add(statusBar, BorderLayout.SOUTH);
3547 add(alignPanel, BorderLayout.CENTER);
3548 // and register with the applet so it can pass external API calls to us
3549 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
3555 * create a new binding between structures in an existing jmol viewer instance
3556 * and an alignpanel with sequences that have existing PDBFile entries. Note,
3557 * this does not open a new Jmol window, or modify the display of the
3558 * structures in the original jmol window. Note This method doesn't work
3559 * without an additional javascript library to exchange messages between the
3560 * distinct applets. See http://issues.jalview.org/browse/JAL-621
3563 * JmolViewer instance
3564 * @param sequenceIds
3565 * - sequence Ids to search for associations
3567 public SequenceStructureBinding addStructureViewInstance(
3568 Object jmolviewer, String[] sequenceIds)
3570 org.jmol.api.JmolViewer viewer = null;
3573 viewer = (org.jmol.api.JmolViewer) jmolviewer;
3574 } catch (ClassCastException ex)
3576 System.err.println("Unsupported viewer object :"
3577 + jmolviewer.getClass());
3581 System.err.println("Can't use this object as a structure viewer:"
3582 + jmolviewer.getClass());
3585 SequenceI[] seqs = null;
3586 if (sequenceIds == null || sequenceIds.length == 0)
3588 seqs = viewport.getAlignment().getSequencesArray();
3592 Vector sqi = new Vector();
3593 AlignmentI al = viewport.getAlignment();
3594 for (int sid = 0; sid < sequenceIds.length; sid++)
3596 SequenceI sq = al.findName(sequenceIds[sid]);
3604 seqs = new SequenceI[sqi.size()];
3605 for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++)
3607 seqs[sid] = (SequenceI) sqi.elementAt(sid);
3616 // TODO: search for a jmv that involves viewer
3618 { // create a new viewer/jalview binding.
3619 jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][]
3627 * bind a pdb file to a sequence in the current view
3630 * - sequenceId within the dataset.
3631 * @param pdbEntryString
3632 * - the short name for the PDB file
3634 * - pdb file - either a URL or a valid PDB file.
3635 * @return true if binding was as success TODO: consider making an exception
3636 * structure for indicating when PDB parsing or sequenceId location
3639 public boolean addPdbFile(String sequenceId, String pdbEntryString,
3642 SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId);
3643 boolean needtoadd = false;
3644 if (toaddpdb != null)
3646 Vector pdbe = toaddpdb.getPDBId();
3647 PDBEntry pdbentry = null;
3648 if (pdbe != null && pdbe.size() > 0)
3650 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
3652 pdbentry = (PDBEntry) pdbe.elementAt(pe);
3653 if (!pdbentry.getId().equals(pdbEntryString)
3654 && !pdbentry.getFile().equals(pdbFile))
3664 if (pdbentry == null)
3666 pdbentry = new PDBEntry();
3667 pdbentry.setId(pdbEntryString);
3668 pdbentry.setFile(pdbFile);
3669 needtoadd = true; // add this new entry to sequence.
3671 // resolve data source
3672 // TODO: this code should be a refactored to an io package
3673 String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB");
3674 if (protocol == null)
3680 // make a note of the access mode and add
3681 if (pdbentry.getProperty() == null)
3683 pdbentry.setProperty(new Hashtable());
3685 pdbentry.getProperty().put("protocol", protocol);
3686 toaddpdb.addPDBId(pdbentry);
3687 alignPanel.getStructureSelectionManager()
3688 .registerPDBEntry(pdbentry);
3694 private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains)
3698 Vector sequences = new Vector();
3699 for (int i = 0; i < seqs.length; i++)
3701 if (seqs[i] != null)
3703 sequences.addElement(new Object[]
3704 { seqs[i], (chains != null) ? chains[i] : null });
3707 seqs = new SequenceI[sequences.size()];
3708 chains = new String[sequences.size()];
3709 for (int i = 0, isize = sequences.size(); i < isize; i++)
3711 Object[] oj = (Object[]) sequences.elementAt(i);
3713 seqs[i] = (SequenceI) oj[0];
3714 chains[i] = (String) oj[1];
3722 public void newStructureView(JalviewLite applet, PDBEntry pdb,
3723 SequenceI[] seqs, String[] chains, String protocol)
3725 // Scrub any null sequences from the array
3726 Object[] sqch = cleanSeqChainArrays(seqs, chains);
3727 seqs = (SequenceI[]) sqch[0];
3728 chains = (String[]) sqch[1];
3729 if (seqs == null || seqs.length == 0)
3732 .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to.");
3734 if (protocol == null || protocol.trim().length() == 0
3735 || protocol.equals("null"))
3737 protocol = (String) pdb.getProperty().get("protocol");
3738 if (protocol == null)
3740 System.err.println("Couldn't work out protocol to open structure: "
3745 if (applet.useXtrnalSviewer)
3747 // register the association(s) and quit, don't create any windows.
3748 if (StructureSelectionManager.getStructureSelectionManager(applet)
3749 .setMapping(seqs, chains, pdb.getFile(), protocol) == null)
3751 System.err.println("Failed to map " + pdb.getFile() + " ("
3752 + protocol + ") to any sequences");
3756 if (applet.isAlignPdbStructures() && applet.jmolAvailable)
3758 // can only do alignments with Jmol
3759 // find the last jmol window assigned to this alignment
3760 jalview.appletgui.AppletJmol ajm = null, tajm;
3761 Vector jmols = applet
3762 .getAppletWindow(jalview.appletgui.AppletJmol.class);
3763 for (int i = 0, iSize = jmols.size(); i < iSize; i++)
3765 tajm = (jalview.appletgui.AppletJmol) jmols.elementAt(i);
3766 if (tajm.ap.alignFrame == this)
3775 .println("Incremental adding and aligning structure to existing Jmol view not yet implemented.");
3776 // try and add the pdb structure
3781 // otherwise, create a new window
3782 if (applet.jmolAvailable)
3784 new jalview.appletgui.AppletJmol(pdb, seqs, chains, alignPanel,
3786 applet.lastFrameX += 40;
3787 applet.lastFrameY += 40;
3791 new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol);
3796 public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb,
3797 SequenceI[][] seqs, String[][] chains, String[] protocols)
3799 // TODO Auto-generated method stub
3800 System.err.println("Aligned Structure View: Not yet implemented.");
3804 * modify the current selection, providing the user has not made a selection
3808 * - sequences from this alignment
3810 * - columns to be selected on the alignment
3812 public void select(SequenceGroup sel, ColumnSelection csel)
3814 alignPanel.seqPanel.selection(sel, csel, null);
3817 public void scrollTo(int row, int column)
3819 alignPanel.seqPanel.scrollTo(row, column);
3822 public void scrollToRow(int row)
3824 alignPanel.seqPanel.scrollToRow(row);
3827 public void scrollToColumn(int column)
3829 alignPanel.seqPanel.scrollToColumn(column);
3833 * @return the alignments unique ID.
3835 public String getSequenceSetId()
3837 return viewport.getSequenceSetId();
3841 * Load the (T-Coffee) score file from the specified url
3844 * File/URL/T-COFFEE score file contents
3845 * @throws IOException
3846 * @return true if alignment was annotated with data from source
3848 public boolean loadScoreFile(String source) throws IOException
3851 TCoffeeScoreFile file = new TCoffeeScoreFile(source,
3852 AppletFormatAdapter.checkProtocol(source));
3853 if (!file.isValid())
3855 // TODO: raise dialog for gui
3856 System.err.println("Problems parsing T-Coffee scores: "
3857 + file.getWarningMessage());
3858 System.err.println("Origin was:\n" + source);
3863 * check that the score matrix matches the alignment dimensions
3866 if ((aln = viewport.getAlignment()) != null
3867 && (aln.getHeight() != file.getHeight() || aln.getWidth() != file
3870 // TODO: raise a dialog box here rather than bomb out.
3872 .println("The scores matrix does not match the alignment dimensions");
3876 // TODO add parameter to indicate if matching should be done
3877 if (file.annotateAlignment(alignPanel.getAlignment(), false))
3879 alignPanel.fontChanged();
3880 tcoffeeColour.setEnabled(true);
3881 // switch to this color
3882 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
3887 System.err.println("Problems resolving T-Coffee scores:");
3888 if (file.getWarningMessage() != null)
3890 System.err.println(file.getWarningMessage());