2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
18 package jalview.appletgui;
20 import jalview.analysis.AlignmentSorter;
21 import jalview.analysis.Conservation;
22 import jalview.api.SequenceStructureBinding;
23 import jalview.bin.JalviewLite;
24 import jalview.commands.CommandI;
25 import jalview.commands.EditCommand;
26 import jalview.commands.OrderCommand;
27 import jalview.commands.RemoveGapColCommand;
28 import jalview.commands.RemoveGapsCommand;
29 import jalview.commands.SlideSequencesCommand;
30 import jalview.commands.TrimRegionCommand;
31 import jalview.datamodel.Alignment;
32 import jalview.datamodel.AlignmentI;
33 import jalview.datamodel.AlignmentOrder;
34 import jalview.datamodel.ColumnSelection;
35 import jalview.datamodel.PDBEntry;
36 import jalview.datamodel.Sequence;
37 import jalview.datamodel.SequenceGroup;
38 import jalview.datamodel.SequenceI;
39 import jalview.io.AnnotationFile;
40 import jalview.io.AppletFormatAdapter;
41 import jalview.io.FeaturesFile;
42 import jalview.io.TCoffeeScoreFile;
43 import jalview.schemes.Blosum62ColourScheme;
44 import jalview.schemes.BuriedColourScheme;
45 import jalview.schemes.ClustalxColourScheme;
46 import jalview.schemes.ColourSchemeI;
47 import jalview.schemes.HelixColourScheme;
48 import jalview.schemes.HydrophobicColourScheme;
49 import jalview.schemes.NucleotideColourScheme;
50 import jalview.schemes.PIDColourScheme;
51 import jalview.schemes.PurinePyrimidineColourScheme;
52 import jalview.schemes.RNAHelicesColourChooser;
53 import jalview.schemes.ResidueProperties;
54 import jalview.schemes.StrandColourScheme;
55 import jalview.schemes.TCoffeeColourScheme;
56 import jalview.schemes.TaylorColourScheme;
57 import jalview.schemes.TurnColourScheme;
58 import jalview.schemes.ZappoColourScheme;
59 import jalview.structure.StructureSelectionManager;
60 import jalview.util.MessageManager;
62 import java.awt.BorderLayout;
63 import java.awt.Canvas;
64 import java.awt.CheckboxMenuItem;
65 import java.awt.Color;
67 import java.awt.FontMetrics;
68 import java.awt.Frame;
69 import java.awt.Graphics;
70 import java.awt.Label;
72 import java.awt.MenuBar;
73 import java.awt.MenuItem;
74 import java.awt.event.ActionEvent;
75 import java.awt.event.ActionListener;
76 import java.awt.event.FocusEvent;
77 import java.awt.event.FocusListener;
78 import java.awt.event.ItemEvent;
79 import java.awt.event.ItemListener;
80 import java.awt.event.KeyEvent;
81 import java.awt.event.KeyListener;
82 import java.awt.event.WindowAdapter;
83 import java.awt.event.WindowEvent;
84 import java.io.IOException;
86 import java.net.URLEncoder;
87 import java.util.Enumeration;
88 import java.util.Hashtable;
89 import java.util.List;
90 import java.util.StringTokenizer;
91 import java.util.Vector;
93 public class AlignFrame extends EmbmenuFrame implements ActionListener,
94 ItemListener, KeyListener
96 public AlignmentPanel alignPanel;
98 public AlignViewport viewport;
100 int DEFAULT_WIDTH = 700;
102 int DEFAULT_HEIGHT = 500;
104 String jalviewServletURL;
106 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
107 String title, boolean embedded)
111 jalviewServletURL = applet.getParameter("APPLICATION_URL");
117 } catch (Exception ex)
119 ex.printStackTrace();
122 viewport = new AlignViewport(al, applet);
123 alignPanel = new AlignmentPanel(this, viewport);
125 viewport.updateConservation(alignPanel);
126 viewport.updateConsensus(alignPanel);
128 annotationPanelMenuItem.setState(viewport.showAnnotation);
129 displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
130 followMouseOverFlag.setState(viewport.getFollowHighlight());
131 showGroupConsensus.setState(viewport.isShowGroupConsensus());
132 showGroupConservation.setState(viewport.isShowGroupConservation());
133 showConsensusHistogram.setState(viewport.isShowConsensusHistogram());
134 showSequenceLogo.setState(viewport.isShowSequenceLogo());
135 normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
137 seqLimits.setState(viewport.showJVSuffix);
141 String param = applet.getParameter("sortBy");
144 if (param.equalsIgnoreCase("Id"))
146 sortIDMenuItem_actionPerformed();
148 else if (param.equalsIgnoreCase("Pairwise Identity"))
150 sortPairwiseMenuItem_actionPerformed();
152 else if (param.equalsIgnoreCase("Length"))
154 sortLengthMenuItem_actionPerformed();
158 param = applet.getParameter("wrap");
161 if (param.equalsIgnoreCase("true"))
163 wrapMenuItem.setState(true);
164 wrapMenuItem_actionPerformed();
167 param = applet.getParameter("centrecolumnlabels");
170 centreColumnLabelFlag.setState(true);
171 centreColumnLabelFlag_stateChanged();
175 param = applet.getParameter("windowWidth");
178 int width = Integer.parseInt(param);
179 DEFAULT_WIDTH = width;
181 param = applet.getParameter("windowHeight");
184 int height = Integer.parseInt(param);
185 DEFAULT_HEIGHT = height;
187 } catch (Exception ex)
192 if (viewport.getAlignment().isNucleotide())
194 viewport.updateStrucConsensus(alignPanel);
195 if (viewport.getAlignment().hasRNAStructure())
197 RNAHelixColour.setEnabled(true);
201 RNAHelixColour.setEnabled(false);
206 RNAHelixColour.setEnabled(false);
207 purinePyrimidineColour.setEnabled(false);
209 // Some JVMS send keyevents to Top frame or lowest panel,
210 // Havent worked out why yet. So add to both this frame and seqCanvas for
212 this.addKeyListener(this);
213 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
214 alignPanel.idPanel.idCanvas.addKeyListener(this);
215 alignPanel.scalePanel.addKeyListener(this);
216 alignPanel.annotationPanel.addKeyListener(this);
217 alignPanel.annotationPanelHolder.addKeyListener(this);
218 alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
219 alignPanel.alabels.addKeyListener(this);
220 createAlignFrameWindow(embedded, title);
223 alignPanel.adjustAnnotationHeight();
224 alignPanel.paintAlignment(true);
227 public AlignViewport getAlignViewport()
232 public SeqCanvas getSeqcanvas()
234 return alignPanel.seqPanel.seqCanvas;
238 * Load a features file onto the alignment
241 * file URL, content, or other resolvable path
243 * is protocol for accessing data referred to by file
246 public boolean parseFeaturesFile(String file, String type)
248 return parseFeaturesFile(file, type, true);
252 * Load a features file onto the alignment
255 * file URL, content, or other resolvable path
257 * is protocol for accessing data referred to by file
258 * @param autoenabledisplay
259 * when true, display features flag will be automatically enabled if
260 * features are loaded
261 * @return true if data parsed as a features file
263 public boolean parseFeaturesFile(String file, String type,
264 boolean autoenabledisplay)
266 // TODO: test if importing a features file onto an alignment which already
267 // has features with links overwrites the original links.
269 Hashtable featureLinks = new Hashtable();
270 boolean featuresFile = false;
273 featuresFile = new jalview.io.FeaturesFile(file, type)
274 .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
275 .getFeatureRenderer().featureColours, featureLinks,
276 true, viewport.applet.getDefaultParameter(
277 "relaxedidmatch", false));
278 } catch (Exception ex)
280 ex.printStackTrace();
285 if (featureLinks.size() > 0)
287 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
289 if (autoenabledisplay)
291 viewport.showSequenceFeatures = true;
292 sequenceFeatures.setState(true);
294 if (viewport.featureSettings != null)
296 viewport.featureSettings.refreshTable();
298 alignPanel.paintAlignment(true);
299 statusBar.setText(MessageManager.getString("label.successfully_added_features_alignment"));
305 public void keyPressed(KeyEvent evt)
307 if (viewport.cursorMode
308 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
309 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
310 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
311 && Character.isDigit(evt.getKeyChar()))
312 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
314 switch (evt.getKeyCode())
316 case 27: // escape key
317 deselectAllSequenceMenuItem_actionPerformed();
319 alignPanel.alabels.cancelDrag();
322 if (evt.isControlDown() || evt.isMetaDown())
324 cut_actionPerformed();
328 if (viewport.cursorMode && !evt.isControlDown())
330 alignPanel.seqPanel.setCursorColumn();
332 if (evt.isControlDown() || evt.isMetaDown())
334 copy_actionPerformed();
338 if (evt.isControlDown())
340 paste(evt.isShiftDown());
344 if (evt.isControlDown() || evt.isMetaDown())
346 selectAllSequenceMenuItem_actionPerformed();
349 case KeyEvent.VK_DOWN:
350 if (viewport.cursorMode)
352 alignPanel.seqPanel.moveCursor(0, 1);
356 moveSelectedSequences(false);
361 if (viewport.cursorMode)
363 alignPanel.seqPanel.moveCursor(0, -1);
367 moveSelectedSequences(true);
371 case KeyEvent.VK_LEFT:
372 if (evt.isAltDown() || !viewport.cursorMode)
373 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
375 alignPanel.seqPanel.moveCursor(-1, 0);
378 case KeyEvent.VK_RIGHT:
379 if (evt.isAltDown() || !viewport.cursorMode)
380 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
382 alignPanel.seqPanel.moveCursor(1, 0);
385 case KeyEvent.VK_SPACE:
386 if (viewport.cursorMode)
388 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
389 || evt.isShiftDown() || evt.isAltDown());
393 case KeyEvent.VK_DELETE:
394 case KeyEvent.VK_BACK_SPACE:
395 if (viewport.cursorMode)
397 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
398 || evt.isShiftDown() || evt.isAltDown());
402 cut_actionPerformed();
403 alignPanel.seqPanel.seqCanvas.repaint();
408 if (viewport.cursorMode)
410 alignPanel.seqPanel.setCursorRow();
414 if (viewport.cursorMode)
416 alignPanel.seqPanel.setCursorPosition();
420 case KeyEvent.VK_ENTER:
421 case KeyEvent.VK_COMMA:
422 if (viewport.cursorMode)
424 alignPanel.seqPanel.setCursorRowAndColumn();
429 if (viewport.cursorMode)
431 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
435 if (viewport.cursorMode)
437 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
442 viewport.cursorMode = !viewport.cursorMode;
443 statusBar.setText(MessageManager.formatMessage("label.keyboard_editing_mode", new String[]{(viewport.cursorMode ? "on" : "off")}));
444 if (viewport.cursorMode)
446 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
447 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
452 if (evt.isControlDown())
454 findMenuItem_actionPerformed();
460 boolean toggleSeqs = !evt.isControlDown();
461 boolean toggleCols = !evt.isShiftDown();
462 toggleHiddenRegions(toggleSeqs, toggleCols);
466 case KeyEvent.VK_PAGE_UP:
467 if (viewport.wrapAlignment)
469 alignPanel.scrollUp(true);
473 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
474 - viewport.endSeq + viewport.startSeq);
478 case KeyEvent.VK_PAGE_DOWN:
479 if (viewport.wrapAlignment)
481 alignPanel.scrollUp(false);
485 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
486 + viewport.endSeq - viewport.startSeq);
491 if (evt.isControlDown())
493 undoMenuItem_actionPerformed();
498 if (evt.isControlDown())
500 redoMenuItem_actionPerformed();
505 if (evt.isControlDown())
512 if (evt.isControlDown())
514 trimAlignment(false);
519 if (evt.isControlDown())
521 if (evt.isShiftDown())
523 this.removeAllGapsMenuItem_actionPerformed();
527 removeGappedColumnMenuItem_actionPerformed();
532 if (evt.isControlDown())
536 invertColSel_actionPerformed();
540 invertSequenceMenuItem_actionPerformed();
546 if (evt.isControlDown())
548 this.deleteGroups_actionPerformed();
553 if (evt.isControlDown())
560 alignPanel.paintAlignment(true);
564 * called by key handler and the hide all/show all menu items
569 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
571 boolean hide = false;
572 SequenceGroup sg = viewport.getSelectionGroup();
573 if (!toggleSeqs && !toggleCols)
575 // Hide everything by the current selection - this is a hack - we do the
576 // invert and then hide
577 // first check that there will be visible columns after the invert.
578 if ((viewport.getColumnSelection() != null
579 && viewport.getColumnSelection().getSelected() != null && viewport
580 .getColumnSelection().getSelected().size() > 0)
581 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
584 // now invert the sequence set, if required - empty selection implies
585 // that no hiding is required.
588 invertSequenceMenuItem_actionPerformed();
589 sg = viewport.getSelectionGroup();
593 viewport.expandColSelection(sg, true);
594 // finally invert the column selection and get the new sequence
595 // selection and indicate it should be hidden.
596 invertColSel_actionPerformed();
603 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
606 viewport.hideAllSelectedSeqs();
608 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
611 viewport.showAllHiddenSeqs();
617 if (viewport.getColumnSelection().getSelected().size() > 0)
619 viewport.hideSelectedColumns();
622 viewport.setSelectionGroup(sg);
627 viewport.showAllHiddenColumns();
633 public void keyReleased(KeyEvent evt)
638 public void keyTyped(KeyEvent evt)
643 public void itemStateChanged(ItemEvent evt)
645 if (evt.getSource() == displayNonconservedMenuItem)
647 displayNonconservedMenuItem_actionPerformed();
649 else if (evt.getSource() == colourTextMenuItem)
651 colourTextMenuItem_actionPerformed();
653 else if (evt.getSource() == wrapMenuItem)
655 wrapMenuItem_actionPerformed();
657 else if (evt.getSource() == scaleAbove)
659 viewport.setScaleAboveWrapped(scaleAbove.getState());
661 else if (evt.getSource() == scaleLeft)
663 viewport.setScaleLeftWrapped(scaleLeft.getState());
665 else if (evt.getSource() == scaleRight)
667 viewport.setScaleRightWrapped(scaleRight.getState());
669 else if (evt.getSource() == seqLimits)
671 seqLimits_itemStateChanged();
673 else if (evt.getSource() == viewBoxesMenuItem)
675 viewport.setShowBoxes(viewBoxesMenuItem.getState());
677 else if (evt.getSource() == viewTextMenuItem)
679 viewport.setShowText(viewTextMenuItem.getState());
681 else if (evt.getSource() == renderGapsMenuItem)
683 viewport.setRenderGaps(renderGapsMenuItem.getState());
685 else if (evt.getSource() == annotationPanelMenuItem)
687 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
688 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
690 else if (evt.getSource() == sequenceFeatures)
692 viewport.showSequenceFeatures(sequenceFeatures.getState());
693 alignPanel.seqPanel.seqCanvas.repaint();
695 else if (evt.getSource() == conservationMenuItem)
697 conservationMenuItem_actionPerformed();
699 else if (evt.getSource() == abovePIDThreshold)
701 abovePIDThreshold_actionPerformed();
703 else if (evt.getSource() == applyToAllGroups)
705 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
707 else if (evt.getSource() == autoCalculate)
709 viewport.autoCalculateConsensus = autoCalculate.getState();
711 else if (evt.getSource() == sortByTree)
713 viewport.sortByTree = sortByTree.getState();
715 else if (evt.getSource() == this.centreColumnLabelFlag)
717 centreColumnLabelFlag_stateChanged();
719 else if (evt.getSource() == this.followMouseOverFlag)
721 mouseOverFlag_stateChanged();
723 else if (evt.getSource() == showGroupConsensus)
725 showGroupConsensus_actionPerformed();
727 else if (evt.getSource() == showGroupConservation)
729 showGroupConservation_actionPerformed();
731 else if (evt.getSource() == showSequenceLogo)
733 showSequenceLogo_actionPerformed();
735 else if (evt.getSource() == normSequenceLogo)
737 normSequenceLogo_actionPerformed();
739 else if (evt.getSource() == showConsensusHistogram)
741 showConsensusHistogram_actionPerformed();
743 else if (evt.getSource() == applyAutoAnnotationSettings)
745 applyAutoAnnotationSettings_actionPerformed();
747 alignPanel.paintAlignment(true);
750 private void mouseOverFlag_stateChanged()
752 viewport.followHighlight = followMouseOverFlag.getState();
753 // TODO: could kick the scrollTo mechanism to reset view for current
757 private void centreColumnLabelFlag_stateChanged()
759 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
760 this.alignPanel.annotationPanel.repaint();
764 public void actionPerformed(ActionEvent evt)
766 Object source = evt.getSource();
768 if (source == inputText)
770 inputText_actionPerformed();
772 else if (source == loadTree)
774 loadTree_actionPerformed();
776 else if (source == loadApplication)
778 launchFullApplication();
780 else if (source == loadAnnotations)
784 else if (source == outputAnnotations)
786 outputAnnotations(true);
788 else if (source == outputFeatures)
790 outputFeatures(true, "Jalview");
792 else if (source == closeMenuItem)
794 closeMenuItem_actionPerformed();
796 else if (source == copy)
798 copy_actionPerformed();
800 else if (source == undoMenuItem)
802 undoMenuItem_actionPerformed();
804 else if (source == redoMenuItem)
806 redoMenuItem_actionPerformed();
808 else if (source == inputText)
810 inputText_actionPerformed();
812 else if (source == closeMenuItem)
814 closeMenuItem_actionPerformed();
816 else if (source == undoMenuItem)
818 undoMenuItem_actionPerformed();
820 else if (source == redoMenuItem)
822 redoMenuItem_actionPerformed();
824 else if (source == copy)
826 copy_actionPerformed();
828 else if (source == pasteNew)
830 pasteNew_actionPerformed();
832 else if (source == pasteThis)
834 pasteThis_actionPerformed();
836 else if (source == cut)
838 cut_actionPerformed();
840 else if (source == delete)
842 delete_actionPerformed();
844 else if (source == grpsFromSelection)
846 makeGrpsFromSelection_actionPerformed();
848 else if (source == deleteGroups)
850 deleteGroups_actionPerformed();
852 else if (source == selectAllSequenceMenuItem)
854 selectAllSequenceMenuItem_actionPerformed();
856 else if (source == deselectAllSequenceMenuItem)
858 deselectAllSequenceMenuItem_actionPerformed();
860 else if (source == invertSequenceMenuItem)
862 invertSequenceMenuItem_actionPerformed();
864 else if (source == invertColSel)
866 viewport.invertColumnSelection();
867 alignPanel.paintAlignment(true);
869 else if (source == remove2LeftMenuItem)
873 else if (source == remove2RightMenuItem)
875 trimAlignment(false);
877 else if (source == removeGappedColumnMenuItem)
879 removeGappedColumnMenuItem_actionPerformed();
881 else if (source == removeAllGapsMenuItem)
883 removeAllGapsMenuItem_actionPerformed();
885 else if (source == findMenuItem)
887 findMenuItem_actionPerformed();
889 else if (source == font)
891 new FontChooser(alignPanel);
893 else if (source == newView)
897 else if (source == showColumns)
899 viewport.showAllHiddenColumns();
900 alignPanel.paintAlignment(true);
902 else if (source == showSeqs)
904 viewport.showAllHiddenSeqs();
905 alignPanel.paintAlignment(true);
907 else if (source == hideColumns)
909 viewport.hideSelectedColumns();
910 alignPanel.paintAlignment(true);
912 else if (source == hideSequences
913 && viewport.getSelectionGroup() != null)
915 viewport.hideAllSelectedSeqs();
916 alignPanel.paintAlignment(true);
918 else if (source == hideAllButSelection)
920 toggleHiddenRegions(false, false);
921 alignPanel.paintAlignment(true);
923 else if (source == hideAllSelection)
925 SequenceGroup sg = viewport.getSelectionGroup();
926 viewport.expandColSelection(sg, false);
927 viewport.hideAllSelectedSeqs();
928 viewport.hideSelectedColumns();
929 alignPanel.paintAlignment(true);
931 else if (source == showAllHidden)
933 viewport.showAllHiddenColumns();
934 viewport.showAllHiddenSeqs();
935 alignPanel.paintAlignment(true);
937 else if (source == showGroupConsensus)
939 showGroupConsensus_actionPerformed();
941 else if (source == showGroupConservation)
943 showGroupConservation_actionPerformed();
945 else if (source == showSequenceLogo)
947 showSequenceLogo_actionPerformed();
949 else if (source == normSequenceLogo)
951 normSequenceLogo_actionPerformed();
953 else if (source == showConsensusHistogram)
955 showConsensusHistogram_actionPerformed();
957 else if (source == applyAutoAnnotationSettings)
959 applyAutoAnnotationSettings_actionPerformed();
961 else if (source == featureSettings)
963 new FeatureSettings(alignPanel);
965 else if (source == alProperties)
967 StringBuffer contents = new jalview.io.AlignmentProperties(
968 viewport.getAlignment()).formatAsString();
969 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
970 cap.setText(contents.toString());
971 Frame frame = new Frame();
973 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
974 + getTitle(), 400, 250);
976 else if (source == overviewMenuItem)
978 overviewMenuItem_actionPerformed();
980 else if (source == noColourmenuItem)
984 else if (source == clustalColour)
986 abovePIDThreshold.setState(false);
987 changeColour(new ClustalxColourScheme(viewport.getAlignment(), null));
989 else if (source == zappoColour)
991 changeColour(new ZappoColourScheme());
993 else if (source == taylorColour)
995 changeColour(new TaylorColourScheme());
997 else if (source == hydrophobicityColour)
999 changeColour(new HydrophobicColourScheme());
1001 else if (source == helixColour)
1003 changeColour(new HelixColourScheme());
1005 else if (source == strandColour)
1007 changeColour(new StrandColourScheme());
1009 else if (source == turnColour)
1011 changeColour(new TurnColourScheme());
1013 else if (source == buriedColour)
1015 changeColour(new BuriedColourScheme());
1017 else if (source == nucleotideColour)
1019 changeColour(new NucleotideColourScheme());
1021 else if (source == purinePyrimidineColour)
1023 changeColour(new PurinePyrimidineColourScheme());
1025 else if (source == RNAHelixColour)
1027 new RNAHelicesColourChooser(viewport, alignPanel);
1029 else if (source == modifyPID)
1031 modifyPID_actionPerformed();
1033 else if (source == modifyConservation)
1035 modifyConservation_actionPerformed();
1037 else if (source == userDefinedColour)
1039 new UserDefinedColours(alignPanel, null);
1041 else if (source == PIDColour)
1043 changeColour(new PIDColourScheme());
1045 else if (source == BLOSUM62Colour)
1047 changeColour(new Blosum62ColourScheme());
1049 else if (source == tcoffeeColour)
1051 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
1053 else if (source == annotationColour)
1055 new AnnotationColourChooser(viewport, alignPanel);
1057 else if (source == sortPairwiseMenuItem)
1059 sortPairwiseMenuItem_actionPerformed();
1061 else if (source == sortIDMenuItem)
1063 sortIDMenuItem_actionPerformed();
1065 else if (source == sortLengthMenuItem)
1067 sortLengthMenuItem_actionPerformed();
1069 else if (source == sortGroupMenuItem)
1071 sortGroupMenuItem_actionPerformed();
1073 else if (source == removeRedundancyMenuItem)
1075 removeRedundancyMenuItem_actionPerformed();
1077 else if (source == pairwiseAlignmentMenuItem)
1079 pairwiseAlignmentMenuItem_actionPerformed();
1081 else if (source == PCAMenuItem)
1083 PCAMenuItem_actionPerformed();
1085 else if (source == averageDistanceTreeMenuItem)
1087 averageDistanceTreeMenuItem_actionPerformed();
1089 else if (source == neighbourTreeMenuItem)
1091 neighbourTreeMenuItem_actionPerformed();
1093 else if (source == njTreeBlosumMenuItem)
1095 njTreeBlosumMenuItem_actionPerformed();
1097 else if (source == avDistanceTreeBlosumMenuItem)
1099 avTreeBlosumMenuItem_actionPerformed();
1101 else if (source == documentation)
1103 documentation_actionPerformed();
1105 else if (source == about)
1107 about_actionPerformed();
1112 public void inputText_actionPerformed()
1114 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1115 Frame frame = new Frame();
1117 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
1120 protected void outputText_actionPerformed(ActionEvent e)
1122 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1123 Frame frame = new Frame();
1125 jalview.bin.JalviewLite.addFrame(frame,
1126 "Alignment output - " + e.getActionCommand(), 600, 500);
1127 cap.setText(new AppletFormatAdapter().formatSequences(
1128 e.getActionCommand(), viewport.getAlignment(),
1129 viewport.showJVSuffix));
1132 public void loadAnnotations()
1134 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
1135 cap.setText(MessageManager.getString("label.paste_features_annotations_Tcoffee_here"));
1136 cap.setAnnotationImport();
1137 Frame frame = new Frame();
1139 jalview.bin.JalviewLite.addFrame(frame, MessageManager.getString("action.paste_annotations"), 400, 300);
1143 public String outputAnnotations(boolean displayTextbox)
1145 String annotation = new AnnotationFile().printAnnotations(
1146 viewport.showAnnotation ? viewport.getAlignment()
1147 .getAlignmentAnnotation() : null, viewport
1148 .getAlignment().getGroups(), ((Alignment) viewport
1149 .getAlignment()).alignmentProperties);
1153 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1154 Frame frame = new Frame();
1156 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
1157 cap.setText(annotation);
1163 private Hashtable getDisplayedFeatureCols()
1165 if (alignPanel.getFeatureRenderer() != null
1166 && viewport.featuresDisplayed != null)
1168 FeatureRenderer fr = alignPanel.getFeatureRenderer();
1169 Hashtable fcols = new Hashtable();
1170 Enumeration en = viewport.featuresDisplayed.keys();
1171 while (en.hasMoreElements())
1173 Object col = en.nextElement();
1174 fcols.put(col, fr.featureColours.get(col));
1181 public String outputFeatures(boolean displayTextbox, String format)
1184 if (format.equalsIgnoreCase("Jalview"))
1186 features = new FeaturesFile().printJalviewFormat(viewport
1187 .getAlignment().getSequencesArray(),
1188 getDisplayedFeatureCols());
1192 features = new FeaturesFile().printGFFFormat(viewport.getAlignment()
1193 .getSequencesArray(), getDisplayedFeatureCols());
1198 boolean frimport = false;
1199 if (features == null || features.equals("No Features Visible"))
1201 features = "# No features visible - paste some and import them here.";
1205 CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);
1208 cap.setAnnotationImport();
1210 Frame frame = new Frame();
1212 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
1213 cap.setText(features);
1217 if (features == null)
1224 void launchFullApplication()
1226 StringBuffer url = new StringBuffer(jalviewServletURL);
1229 + appendProtocol(viewport.applet.getParameter("file")));
1231 if (viewport.applet.getParameter("features") != null)
1233 url.append("&features=");
1234 url.append(appendProtocol(viewport.applet.getParameter("features")));
1237 if (viewport.applet.getParameter("annotations") != null)
1239 url.append("&annotations=");
1240 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
1243 if (viewport.applet.getParameter("jnetfile") != null)
1245 url.append("&annotations=");
1246 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1249 if (viewport.applet.getParameter("defaultColour") != null)
1251 url.append("&colour="
1252 + removeWhiteSpace(viewport.applet
1253 .getParameter("defaultColour")));
1256 if (viewport.applet.getParameter("userDefinedColour") != null)
1258 url.append("&colour="
1259 + removeWhiteSpace(viewport.applet
1260 .getParameter("userDefinedColour")));
1262 if (viewport.applet.getParameter("tree") != null)
1265 + appendProtocol(viewport.applet.getParameter("tree")));
1267 if (viewport.applet.getParameter("treeFile") != null)
1270 + appendProtocol(viewport.applet.getParameter("treeFile")));
1273 showURL(url.toString(), "FULL_APP");
1276 String removeWhiteSpace(String colour)
1278 StringBuffer sb = new StringBuffer();
1279 for (int i = 0; i < colour.length(); i++)
1281 if (Character.isWhitespace(colour.charAt(i)))
1287 sb.append(colour.charAt(i));
1291 return sb.toString();
1294 String appendProtocol(String url)
1299 url = URLEncoder.encode(url);
1302 * When we finally deprecate 1.1 compatibility, we can start to use
1303 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1304 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1305 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1306 * ex.printStackTrace(); }
1308 catch (java.net.MalformedURLException ex)
1310 url = viewport.applet.getCodeBase() + url;
1315 public void closeMenuItem_actionPerformed()
1317 PaintRefresher.RemoveComponent(alignPanel);
1318 if (alignPanel.seqPanel != null
1319 && alignPanel.seqPanel.seqCanvas != null)
1321 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1323 if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null)
1325 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1328 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1343 void updateEditMenuBar()
1346 if (viewport.historyList.size() > 0)
1348 undoMenuItem.setEnabled(true);
1349 CommandI command = (CommandI) viewport.historyList.peek();
1350 undoMenuItem.setLabel(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));
1354 undoMenuItem.setEnabled(false);
1355 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
1358 if (viewport.redoList.size() > 0)
1360 redoMenuItem.setEnabled(true);
1362 CommandI command = (CommandI) viewport.redoList.peek();
1363 redoMenuItem.setLabel(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));
1367 redoMenuItem.setEnabled(false);
1368 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
1375 public void addHistoryItem(CommandI command)
1377 if (command.getSize() > 0)
1379 viewport.historyList.push(command);
1380 viewport.redoList.removeAllElements();
1381 updateEditMenuBar();
1382 viewport.updateHiddenColumns();
1387 * TODO: JAL-1104 DOCUMENT ME!
1392 protected void undoMenuItem_actionPerformed()
1394 if (viewport.historyList.size() < 1)
1399 CommandI command = (CommandI) viewport.historyList.pop();
1400 viewport.redoList.push(command);
1401 command.undoCommand(null);
1403 AlignViewport originalSource = getOriginatingSource(command);
1405 if (originalSource != viewport)
1408 .println("Warning: Viewport object mismatch whilst undoing");
1410 originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns =
1411 // viewport.getColumnSelection().getHiddenColumns()
1413 updateEditMenuBar();
1414 originalSource.firePropertyChange("alignment", null, originalSource
1415 .getAlignment().getSequences());
1419 * TODO: JAL-1104 DOCUMENT ME!
1424 protected void redoMenuItem_actionPerformed()
1426 if (viewport.redoList.size() < 1)
1431 CommandI command = (CommandI) viewport.redoList.pop();
1432 viewport.historyList.push(command);
1433 command.doCommand(null);
1435 AlignViewport originalSource = getOriginatingSource(command);
1437 if (originalSource != viewport)
1440 .println("Warning: Viewport object mismatch whilst re-doing");
1442 originalSource.updateHiddenColumns(); // sethasHiddenColumns(); =
1443 // viewport.getColumnSelection().getHiddenColumns()
1446 updateEditMenuBar();
1447 originalSource.firePropertyChange("alignment", null, originalSource
1448 .getAlignment().getSequences());
1451 AlignViewport getOriginatingSource(CommandI command)
1453 AlignViewport originalSource = null;
1454 // For sequence removal and addition, we need to fire
1455 // the property change event FROM the viewport where the
1456 // original alignment was altered
1457 AlignmentI al = null;
1458 if (command instanceof EditCommand)
1460 EditCommand editCommand = (EditCommand) command;
1461 al = editCommand.getAlignment();
1462 Vector comps = (Vector) PaintRefresher.components.get(viewport
1463 .getSequenceSetId());
1464 for (int i = 0; i < comps.size(); i++)
1466 if (comps.elementAt(i) instanceof AlignmentPanel)
1468 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1470 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1477 if (originalSource == null)
1479 // The original view is closed, we must validate
1480 // the current view against the closed view first
1483 PaintRefresher.validateSequences(al, viewport.getAlignment());
1486 originalSource = viewport;
1489 return originalSource;
1492 public void moveSelectedSequences(boolean up)
1494 SequenceGroup sg = viewport.getSelectionGroup();
1499 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1500 up ? null : viewport.getHiddenRepSequences(), up);
1501 alignPanel.paintAlignment(true);
1504 synchronized void slideSequences(boolean right, int size)
1506 List<SequenceI> sg = new Vector<SequenceI>();
1507 if (viewport.cursorMode)
1509 sg.add(viewport.getAlignment().getSequenceAt(
1510 alignPanel.seqPanel.seqCanvas.cursorY));
1512 else if (viewport.getSelectionGroup() != null
1513 && viewport.getSelectionGroup().getSize() != viewport
1514 .getAlignment().getHeight())
1516 sg = viewport.getSelectionGroup().getSequences(
1517 viewport.getHiddenRepSequences());
1525 Vector<SequenceI> invertGroup = new Vector();
1527 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1529 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1530 invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));
1533 SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);
1535 SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup
1537 for (int i = 0; i < invertGroup.size(); i++)
1538 seqs2[i] = invertGroup.elementAt(i);
1540 SlideSequencesCommand ssc;
1542 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1543 size, viewport.getGapCharacter());
1545 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1546 size, viewport.getGapCharacter());
1548 int groupAdjustment = 0;
1549 if (ssc.getGapsInsertedBegin() && right)
1551 if (viewport.cursorMode)
1552 alignPanel.seqPanel.moveCursor(size, 0);
1554 groupAdjustment = size;
1556 else if (!ssc.getGapsInsertedBegin() && !right)
1558 if (viewport.cursorMode)
1559 alignPanel.seqPanel.moveCursor(-size, 0);
1561 groupAdjustment = -size;
1564 if (groupAdjustment != 0)
1566 viewport.getSelectionGroup().setStartRes(
1567 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1568 viewport.getSelectionGroup().setEndRes(
1569 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1572 boolean appendHistoryItem = false;
1573 if (viewport.historyList != null && viewport.historyList.size() > 0
1574 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1576 appendHistoryItem = ssc
1577 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1581 if (!appendHistoryItem)
1582 addHistoryItem(ssc);
1587 static StringBuffer copiedSequences;
1589 static Vector copiedHiddenColumns;
1591 protected void copy_actionPerformed()
1593 if (viewport.getSelectionGroup() == null)
1598 SequenceGroup sg = viewport.getSelectionGroup();
1599 copiedSequences = new StringBuffer();
1600 Hashtable orderedSeqs = new Hashtable();
1601 for (int i = 0; i < sg.getSize(); i++)
1603 SequenceI seq = sg.getSequenceAt(i);
1604 int index = viewport.getAlignment().findIndex(seq);
1605 orderedSeqs.put(index + "", seq);
1608 int index = 0, startRes, endRes;
1611 if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null)
1613 copiedHiddenColumns = new Vector();
1614 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1615 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1618 int[] region = (int[]) viewport.getColumnSelection()
1619 .getHiddenColumns().elementAt(i);
1621 copiedHiddenColumns.addElement(new int[]
1622 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1627 copiedHiddenColumns = null;
1630 for (int i = 0; i < sg.getSize(); i++)
1632 SequenceI seq = null;
1636 if (orderedSeqs.containsKey(index + ""))
1638 seq = (SequenceI) orderedSeqs.get(index + "");
1650 // Returns residue following index if gap
1651 startRes = seq.findPosition(sg.getStartRes());
1654 // Need to find the residue preceeding index if gap
1657 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1659 ch = seq.getCharAt(j);
1660 if (!jalview.util.Comparison.isGap((ch)))
1668 endRes += seq.getStart() - 1;
1671 copiedSequences.append(seq.getName()
1677 + seq.getSequenceAsString(sg.getStartRes(),
1678 sg.getEndRes() + 1) + "\n");
1683 protected void pasteNew_actionPerformed()
1688 protected void pasteThis_actionPerformed()
1693 void paste(boolean newAlignment)
1698 if (copiedSequences == null)
1703 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1704 Vector seqs = new Vector();
1705 while (st.hasMoreElements())
1707 String name = st.nextToken();
1708 int start = Integer.parseInt(st.nextToken());
1709 int end = Integer.parseInt(st.nextToken());
1710 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1712 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1713 for (int i = 0; i < seqs.size(); i++)
1715 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1720 String newtitle = new String("Copied sequences");
1721 if (getTitle().startsWith("Copied sequences"))
1723 newtitle = getTitle();
1727 newtitle = newtitle.concat("- from " + getTitle());
1729 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1730 viewport.applet, newtitle, false);
1731 if (copiedHiddenColumns != null)
1733 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1735 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1736 af.viewport.hideColumns(region[0], region[1]);
1740 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1745 addSequences(newSeqs);
1748 } catch (Exception ex)
1750 } // could be anything being pasted in here
1754 void addSequences(SequenceI[] seqs)
1756 for (int i = 0; i < seqs.length; i++)
1758 viewport.getAlignment().addSequence(seqs[i]);
1762 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1763 seqs, 0, viewport.getAlignment().getWidth(),
1764 viewport.getAlignment()));
1766 viewport.setEndSeq(viewport.getAlignment().getHeight());
1767 viewport.getAlignment().getWidth();
1768 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1773 protected void cut_actionPerformed()
1775 copy_actionPerformed();
1776 delete_actionPerformed();
1779 protected void delete_actionPerformed()
1782 SequenceGroup sg = viewport.getSelectionGroup();
1788 Vector seqs = new Vector();
1790 for (int i = 0; i < sg.getSize(); i++)
1792 seq = sg.getSequenceAt(i);
1793 seqs.addElement(seq);
1796 // If the cut affects all sequences, remove highlighted columns
1797 if (sg.getSize() == viewport.getAlignment().getHeight())
1799 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1800 sg.getEndRes() + 1);
1803 SequenceI[] cut = new SequenceI[seqs.size()];
1804 for (int i = 0; i < seqs.size(); i++)
1806 cut[i] = (SequenceI) seqs.elementAt(i);
1810 * //ADD HISTORY ITEM
1812 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1813 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1814 viewport.getAlignment()));
1816 viewport.setSelectionGroup(null);
1817 viewport.getAlignment().deleteGroup(sg);
1819 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1822 if (viewport.getAlignment().getHeight() < 1)
1824 this.setVisible(false);
1826 viewport.sendSelection();
1830 * group consensus toggled
1833 protected void showGroupConsensus_actionPerformed()
1835 viewport.setShowGroupConsensus(showGroupConsensus.getState());
1836 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1841 * group conservation toggled.
1843 protected void showGroupConservation_actionPerformed()
1845 viewport.setShowGroupConservation(showGroupConservation.getState());
1846 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1853 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
1854 * .event.ActionEvent)
1856 protected void showConsensusHistogram_actionPerformed()
1858 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
1859 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1866 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
1867 * .event.ActionEvent)
1869 protected void showSequenceLogo_actionPerformed()
1871 viewport.setShowSequenceLogo(showSequenceLogo.getState());
1872 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1875 protected void normSequenceLogo_actionPerformed()
1877 showSequenceLogo.setState(true);
1878 viewport.setShowSequenceLogo(true);
1879 viewport.setNormaliseSequenceLogo(normSequenceLogo.getState());
1880 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1883 protected void applyAutoAnnotationSettings_actionPerformed()
1885 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1888 protected void makeGrpsFromSelection_actionPerformed()
1890 if (viewport.getSelectionGroup() != null)
1892 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
1893 viewport.getSequenceSelection(),
1894 viewport.getAlignmentView(true).getSequenceStrings(
1895 viewport.getGapCharacter()), viewport.getAlignment()
1897 viewport.getAlignment().deleteAllGroups();
1898 viewport.sequenceColours = null;
1899 viewport.setSelectionGroup(null);
1900 // set view properties for each group
1901 for (int g = 0; g < gps.length; g++)
1903 // gps[g].setShowunconserved(viewport.getShowUnconserved());
1904 gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
1905 viewport.getAlignment().addGroup(gps[g]);
1906 Color col = new Color((int) (Math.random() * 255),
1907 (int) (Math.random() * 255), (int) (Math.random() * 255));
1908 col = col.brighter();
1909 for (SequenceI sq : gps[g].getSequences(null))
1910 viewport.setSequenceColour(sq, col);
1912 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1913 alignPanel.updateAnnotation();
1914 alignPanel.paintAlignment(true);
1918 protected void deleteGroups_actionPerformed()
1920 viewport.getAlignment().deleteAllGroups();
1921 viewport.sequenceColours = null;
1922 viewport.setSelectionGroup(null);
1924 alignPanel.paintAlignment(true);
1927 public void selectAllSequenceMenuItem_actionPerformed()
1929 SequenceGroup sg = new SequenceGroup();
1930 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1932 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1934 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
1935 viewport.setSelectionGroup(sg);
1936 alignPanel.paintAlignment(true);
1937 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1938 viewport.sendSelection();
1941 public void deselectAllSequenceMenuItem_actionPerformed()
1943 if (viewport.cursorMode)
1945 alignPanel.seqPanel.keyboardNo1 = null;
1946 alignPanel.seqPanel.keyboardNo2 = null;
1948 viewport.setSelectionGroup(null);
1949 viewport.getColumnSelection().clear();
1950 viewport.setSelectionGroup(null);
1951 alignPanel.idPanel.idCanvas.searchResults = null;
1952 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1953 alignPanel.paintAlignment(true);
1954 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1955 viewport.sendSelection();
1958 public void invertSequenceMenuItem_actionPerformed()
1960 SequenceGroup sg = viewport.getSelectionGroup();
1961 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1963 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1966 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1967 viewport.sendSelection();
1970 public void invertColSel_actionPerformed()
1972 viewport.invertColumnSelection();
1973 alignPanel.paintAlignment(true);
1974 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1975 viewport.sendSelection();
1978 void trimAlignment(boolean trimLeft)
1980 ColumnSelection colSel = viewport.getColumnSelection();
1983 if (colSel.size() > 0)
1987 column = colSel.getMin();
1991 column = colSel.getMax();
1995 if (viewport.getSelectionGroup() != null)
1997 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1998 viewport.getHiddenRepSequences());
2002 seqs = viewport.getAlignment().getSequencesArray();
2005 TrimRegionCommand trimRegion;
2008 trimRegion = new TrimRegionCommand("Remove Left",
2009 TrimRegionCommand.TRIM_LEFT, seqs, column,
2010 viewport.getAlignment(), viewport.getColumnSelection(),
2011 viewport.getSelectionGroup());
2012 viewport.setStartRes(0);
2016 trimRegion = new TrimRegionCommand("Remove Right",
2017 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2018 viewport.getAlignment(), viewport.getColumnSelection(),
2019 viewport.getSelectionGroup());
2022 statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));
2023 addHistoryItem(trimRegion);
2025 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2027 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2028 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2030 viewport.getAlignment().deleteGroup(sg);
2034 viewport.firePropertyChange("alignment", null, viewport
2035 .getAlignment().getSequences());
2039 public void removeGappedColumnMenuItem_actionPerformed()
2041 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2044 if (viewport.getSelectionGroup() != null)
2046 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2047 viewport.getHiddenRepSequences());
2048 start = viewport.getSelectionGroup().getStartRes();
2049 end = viewport.getSelectionGroup().getEndRes();
2053 seqs = viewport.getAlignment().getSequencesArray();
2056 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2057 "Remove Gapped Columns", seqs, start, end,
2058 viewport.getAlignment());
2060 addHistoryItem(removeGapCols);
2062 statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));
2064 // This is to maintain viewport position on first residue
2065 // of first sequence
2066 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2067 int startRes = seq.findPosition(viewport.startRes);
2068 // ShiftList shifts;
2069 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2070 // edit.alColumnChanges=shifts.getInverse();
2071 // if (viewport.hasHiddenColumns)
2072 // viewport.getColumnSelection().compensateForEdits(shifts);
2073 viewport.setStartRes(seq.findIndex(startRes) - 1);
2074 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2079 public void removeAllGapsMenuItem_actionPerformed()
2081 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2084 if (viewport.getSelectionGroup() != null)
2086 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2087 viewport.getHiddenRepSequences());
2088 start = viewport.getSelectionGroup().getStartRes();
2089 end = viewport.getSelectionGroup().getEndRes();
2093 seqs = viewport.getAlignment().getSequencesArray();
2096 // This is to maintain viewport position on first residue
2097 // of first sequence
2098 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2099 int startRes = seq.findPosition(viewport.startRes);
2101 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2102 viewport.getAlignment()));
2104 viewport.setStartRes(seq.findIndex(startRes) - 1);
2106 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2111 public void findMenuItem_actionPerformed()
2113 new Finder(alignPanel);
2117 * create a new view derived from the current view
2120 * @return frame for the new view
2122 public AlignFrame newView(String viewtitle)
2125 if (viewport.hasHiddenRows())
2127 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
2128 .getFullAlignment().getSequencesArray());
2132 newal = new Alignment(viewport.getAlignment().getSequencesArray());
2135 if (viewport.getAlignment().getAlignmentAnnotation() != null)
2137 for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++)
2139 if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated)
2141 newal.addAnnotation(viewport.getAlignment()
2142 .getAlignmentAnnotation()[i]);
2147 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
2149 newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId());
2150 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
2151 PaintRefresher.Register(newaf.alignPanel,
2152 newaf.alignPanel.av.getSequenceSetId());
2154 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
2155 newaf.alignPanel.av.getSequenceSetId());
2156 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
2157 newaf.alignPanel.av.getSequenceSetId());
2159 Vector comps = (Vector) PaintRefresher.components.get(viewport
2160 .getSequenceSetId());
2162 for (int i = 0; i < comps.size(); i++)
2164 if (comps.elementAt(i) instanceof AlignmentPanel)
2170 String title = new String(this.getTitle());
2171 if (viewtitle != null)
2173 title = viewtitle + " ( " + title + ")";
2177 if (title.indexOf("(View") > -1)
2179 title = title.substring(0, title.indexOf("(View"));
2181 title += "(View " + viewSize + ")";
2184 newaf.setTitle(title.toString());
2186 newaf.viewport.historyList = viewport.historyList;
2187 newaf.viewport.redoList = viewport.redoList;
2193 * @return list of feature groups on the view
2195 public String[] getFeatureGroups()
2197 FeatureRenderer fr = null;
2198 if (alignPanel != null
2199 && (fr = alignPanel.getFeatureRenderer()) != null)
2201 return fr.getGroups();
2207 * get sequence feature groups that are hidden or shown
2213 public String[] getFeatureGroupsOfState(boolean visible)
2215 FeatureRenderer fr = null;
2216 if (alignPanel != null
2217 && (fr = alignPanel.getFeatureRenderer()) != null)
2219 return fr.getGroups(visible);
2225 * Change the display state for the given feature groups
2228 * list of group strings
2230 * visible or invisible
2232 public void setFeatureGroupState(String[] groups, boolean state)
2234 FeatureRenderer fr = null;
2235 this.sequenceFeatures.setState(true);
2236 viewport.showSequenceFeatures(true);
2237 if (alignPanel != null
2238 && (fr = alignPanel.getFeatureRenderer()) != null)
2240 fr.setGroupState(groups, state);
2241 alignPanel.seqPanel.seqCanvas.repaint();
2242 if (alignPanel.overviewPanel != null)
2244 alignPanel.overviewPanel.updateOverviewImage();
2249 public void seqLimits_itemStateChanged()
2251 viewport.setShowJVSuffix(seqLimits.getState());
2252 alignPanel.fontChanged();
2253 alignPanel.paintAlignment(true);
2256 protected void colourTextMenuItem_actionPerformed()
2258 viewport.setColourText(colourTextMenuItem.getState());
2259 alignPanel.paintAlignment(true);
2262 protected void displayNonconservedMenuItem_actionPerformed()
2264 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2265 alignPanel.paintAlignment(true);
2268 protected void wrapMenuItem_actionPerformed()
2270 viewport.setWrapAlignment(wrapMenuItem.getState());
2271 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2272 scaleAbove.setEnabled(wrapMenuItem.getState());
2273 scaleLeft.setEnabled(wrapMenuItem.getState());
2274 scaleRight.setEnabled(wrapMenuItem.getState());
2275 alignPanel.paintAlignment(true);
2278 public void overviewMenuItem_actionPerformed()
2280 if (alignPanel.overviewPanel != null)
2285 Frame frame = new Frame();
2286 OverviewPanel overview = new OverviewPanel(alignPanel);
2287 frame.add(overview);
2288 // +50 must allow for applet frame window
2289 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
2290 overview.getPreferredSize().width,
2291 overview.getPreferredSize().height + 50);
2294 final AlignmentPanel ap = alignPanel;
2295 frame.addWindowListener(new WindowAdapter()
2298 public void windowClosing(WindowEvent e)
2302 ap.setOverviewPanel(null);
2307 alignPanel.setOverviewPanel(overview);
2311 void changeColour(ColourSchemeI cs)
2317 if (viewport.getAbovePIDThreshold())
2319 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2322 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2324 viewport.setGlobalColourScheme(cs);
2328 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2331 if (viewport.getConservationSelected())
2334 Alignment al = (Alignment) viewport.getAlignment();
2335 Conservation c = new Conservation("All",
2336 ResidueProperties.propHash, 3, al.getSequences(), 0,
2340 c.verdict(false, viewport.getConsPercGaps());
2342 cs.setConservation(c);
2344 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2350 cs.setConservation(null);
2353 cs.setConsensus(viewport.getSequenceConsensusHash());
2356 viewport.setGlobalColourScheme(cs);
2358 if (alignPanel.getOverviewPanel() != null)
2360 alignPanel.getOverviewPanel().updateOverviewImage();
2363 jalview.structure.StructureSelectionManager
2364 .getStructureSelectionManager(viewport.applet)
2365 .sequenceColoursChanged(alignPanel);
2367 alignPanel.paintAlignment(true);
2370 protected void modifyPID_actionPerformed()
2372 if (viewport.getAbovePIDThreshold()
2373 && viewport.getGlobalColourScheme() != null)
2375 SliderPanel.setPIDSliderSource(alignPanel,
2376 viewport.getGlobalColourScheme(), "Background");
2377 SliderPanel.showPIDSlider();
2381 protected void modifyConservation_actionPerformed()
2383 if (viewport.getConservationSelected()
2384 && viewport.getGlobalColourScheme() != null)
2386 SliderPanel.setConservationSlider(alignPanel,
2387 viewport.getGlobalColourScheme(), "Background");
2388 SliderPanel.showConservationSlider();
2392 protected void conservationMenuItem_actionPerformed()
2394 viewport.setConservationSelected(conservationMenuItem.getState());
2396 viewport.setAbovePIDThreshold(false);
2397 abovePIDThreshold.setState(false);
2399 changeColour(viewport.getGlobalColourScheme());
2401 modifyConservation_actionPerformed();
2404 public void abovePIDThreshold_actionPerformed()
2406 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2408 conservationMenuItem.setState(false);
2409 viewport.setConservationSelected(false);
2411 changeColour(viewport.getGlobalColourScheme());
2413 modifyPID_actionPerformed();
2416 public void sortPairwiseMenuItem_actionPerformed()
2418 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2419 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2420 .getAlignment().getSequenceAt(0), null);
2422 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2423 viewport.getAlignment()));
2424 alignPanel.paintAlignment(true);
2427 public void sortIDMenuItem_actionPerformed()
2429 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2430 AlignmentSorter.sortByID(viewport.getAlignment());
2431 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2432 viewport.getAlignment()));
2433 alignPanel.paintAlignment(true);
2436 public void sortLengthMenuItem_actionPerformed()
2438 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2439 AlignmentSorter.sortByLength(viewport.getAlignment());
2440 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
2441 viewport.getAlignment()));
2442 alignPanel.paintAlignment(true);
2445 public void sortGroupMenuItem_actionPerformed()
2447 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2448 AlignmentSorter.sortByGroup(viewport.getAlignment());
2449 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2450 viewport.getAlignment()));
2451 alignPanel.paintAlignment(true);
2455 public void removeRedundancyMenuItem_actionPerformed()
2457 new RedundancyPanel(alignPanel);
2460 public void pairwiseAlignmentMenuItem_actionPerformed()
2462 if (viewport.getSelectionGroup() != null
2463 && viewport.getSelectionGroup().getSize() > 1)
2465 Frame frame = new Frame();
2466 frame.add(new PairwiseAlignPanel(alignPanel));
2467 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2472 public void PCAMenuItem_actionPerformed()
2474 // are the sequences aligned?
2475 if (!viewport.getAlignment().isAligned(false))
2478 int Width = viewport.getAlignment().getWidth();
2480 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2482 current = viewport.getAlignment().getSequenceAt(i);
2484 if (current.getLength() < Width)
2486 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2489 alignPanel.paintAlignment(true);
2492 if ((viewport.getSelectionGroup() != null
2493 && viewport.getSelectionGroup().getSize() < 4 && viewport
2494 .getSelectionGroup().getSize() > 0)
2495 || viewport.getAlignment().getHeight() < 4)
2502 new PCAPanel(viewport);
2503 } catch (java.lang.OutOfMemoryError ex)
2509 public void averageDistanceTreeMenuItem_actionPerformed()
2511 NewTreePanel("AV", "PID", "Average distance tree using PID");
2514 public void neighbourTreeMenuItem_actionPerformed()
2516 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2519 protected void njTreeBlosumMenuItem_actionPerformed()
2521 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2524 protected void avTreeBlosumMenuItem_actionPerformed()
2526 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2529 void NewTreePanel(String type, String pwType, String title)
2531 // are the sequences aligned?
2532 if (!viewport.getAlignment().isAligned(false))
2535 int Width = viewport.getAlignment().getWidth();
2537 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2539 current = viewport.getAlignment().getSequenceAt(i);
2541 if (current.getLength() < Width)
2543 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2546 alignPanel.paintAlignment(true);
2550 if ((viewport.getSelectionGroup() != null && viewport
2551 .getSelectionGroup().getSize() > 1)
2552 || (viewport.getAlignment().getHeight() > 1))
2554 final TreePanel tp = new TreePanel(alignPanel, type, pwType);
2556 addTreeMenuItem(tp, title);
2558 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2562 void loadTree_actionPerformed()
2564 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2565 cap.setText(MessageManager.getString("label.paste_newick_tree_file"));
2566 cap.setTreeImport();
2567 Frame frame = new Frame();
2569 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2572 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2574 TreePanel tp = new TreePanel(alignPanel, treeFile, "From File - ", tree);
2575 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2576 addTreeMenuItem(tp, treeFile);
2580 * sort the alignment using the given treePanel
2583 * tree used to sort view
2585 * string used for undo event name
2587 public void sortByTree(TreePanel treePanel, String title)
2589 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2591 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2592 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2593 // HistoryItem.SORT));
2594 addHistoryItem(new OrderCommand(MessageManager.formatMessage("label.order_by_params", new String[]{title}), oldOrder,
2595 viewport.getAlignment()));
2596 alignPanel.paintAlignment(true);
2600 * Do any automatic reordering of the alignment and add the necessary bits to
2601 * the menu structure for the new tree
2606 protected void addTreeMenuItem(final TreePanel treePanel,
2609 final MenuItem item = new MenuItem(title);
2610 sortByTreeMenu.add(item);
2611 item.addActionListener(new java.awt.event.ActionListener()
2614 public void actionPerformed(ActionEvent evt)
2616 sortByTree(treePanel, title); // treePanel.getTitle());
2620 treePanel.addWindowListener(new WindowAdapter()
2623 public void windowOpened(WindowEvent e)
2625 if (viewport.sortByTree)
2627 sortByTree(treePanel, title);
2629 super.windowOpened(e);
2633 public void windowClosing(WindowEvent e)
2635 sortByTreeMenu.remove(item);
2640 public boolean sortBy(AlignmentOrder alorder, String undoname)
2642 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2643 if (viewport.applet.debug)
2645 System.err.println("Sorting " + alorder.getOrder().size()
2646 + " in alignment '" + getTitle() + "'");
2648 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
2649 if (undoname != null)
2651 addHistoryItem(new OrderCommand(undoname, oldOrder,
2652 viewport.getAlignment()));
2654 alignPanel.paintAlignment(true);
2658 protected void documentation_actionPerformed()
2660 alignPanel.av.applet.openJalviewHelpUrl();
2663 protected void about_actionPerformed()
2666 class AboutPanel extends Canvas
2672 public AboutPanel(String version, String builddate)
2674 this.version = version;
2675 this.builddate = builddate;
2679 public void paint(Graphics g)
2681 g.setColor(Color.white);
2682 g.fillRect(0, 0, getSize().width, getSize().height);
2683 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2684 FontMetrics fm = g.getFontMetrics();
2685 int fh = fm.getHeight();
2687 g.setColor(Color.black);
2688 // TODO: update this text for each release or centrally store it for
2689 // lite and application
2690 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2691 g.drawString("JalviewLite - Release " + version, x, y += fh);
2692 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2693 g.drawString("Build date: " + builddate, x, y += fh);
2694 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2696 "Authors: Jim Procter, Andrew Waterhouse, Jan Engelhardt, Lauren Lui,",
2698 g.drawString("Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton.", x + 50, y += fh+8);
2700 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2703 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2705 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2707 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",
2710 "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",
2712 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",
2717 Frame frame = new Frame();
2718 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2720 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2724 public void showURL(String url, String target)
2726 if (viewport.applet == null)
2728 System.out.println("Not running as applet - no browser available.");
2732 viewport.applet.showURL(url, target);
2736 // ////////////////////////////////////////////////////////////////////////////////
2737 // JBuilder Graphics here
2739 MenuBar alignFrameMenuBar = new MenuBar();
2741 Menu fileMenu = new Menu("File");
2743 MenuItem loadApplication = new MenuItem("View in Full Application");
2745 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2747 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2749 MenuItem outputFeatures = new MenuItem("Export Features ...");
2751 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2753 MenuItem closeMenuItem = new MenuItem("Close");
2755 Menu editMenu = new Menu("Edit");
2757 Menu viewMenu = new Menu("View");
2759 Menu colourMenu = new Menu("Colour");
2761 Menu calculateMenu = new Menu("Calculate");
2763 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2765 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2767 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2769 MenuItem remove2LeftMenuItem = new MenuItem();
2771 MenuItem remove2RightMenuItem = new MenuItem();
2773 MenuItem removeGappedColumnMenuItem = new MenuItem();
2775 MenuItem removeAllGapsMenuItem = new MenuItem();
2777 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2779 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2781 MenuItem sortPairwiseMenuItem = new MenuItem();
2783 MenuItem sortIDMenuItem = new MenuItem();
2785 MenuItem sortLengthMenuItem = new MenuItem();
2787 MenuItem sortGroupMenuItem = new MenuItem();
2789 MenuItem removeRedundancyMenuItem = new MenuItem();
2791 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2793 MenuItem PCAMenuItem = new MenuItem();
2795 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2797 MenuItem neighbourTreeMenuItem = new MenuItem();
2799 BorderLayout borderLayout1 = new BorderLayout();
2801 public Label statusBar = new Label();
2803 Menu outputTextboxMenu = new Menu();
2805 MenuItem clustalColour = new MenuItem();
2807 MenuItem zappoColour = new MenuItem();
2809 MenuItem taylorColour = new MenuItem();
2811 MenuItem hydrophobicityColour = new MenuItem();
2813 MenuItem helixColour = new MenuItem();
2815 MenuItem strandColour = new MenuItem();
2817 MenuItem turnColour = new MenuItem();
2819 MenuItem buriedColour = new MenuItem();
2821 MenuItem purinePyrimidineColour = new MenuItem();
2823 MenuItem RNAHelixColour = new MenuItem();
2825 MenuItem userDefinedColour = new MenuItem();
2827 MenuItem PIDColour = new MenuItem();
2829 MenuItem BLOSUM62Colour = new MenuItem();
2831 MenuItem tcoffeeColour = new MenuItem();
2833 MenuItem njTreeBlosumMenuItem = new MenuItem();
2835 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2837 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2839 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2841 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2843 MenuItem alProperties = new MenuItem("Alignment Properties...");
2845 MenuItem overviewMenuItem = new MenuItem();
2847 MenuItem undoMenuItem = new MenuItem();
2849 MenuItem redoMenuItem = new MenuItem();
2851 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2853 MenuItem noColourmenuItem = new MenuItem();
2855 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2857 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2859 MenuItem findMenuItem = new MenuItem();
2861 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2863 MenuItem nucleotideColour = new MenuItem();
2865 MenuItem deleteGroups = new MenuItem();
2867 MenuItem grpsFromSelection = new MenuItem();
2869 MenuItem delete = new MenuItem();
2871 MenuItem copy = new MenuItem();
2873 MenuItem cut = new MenuItem();
2875 Menu pasteMenu = new Menu();
2877 MenuItem pasteNew = new MenuItem();
2879 MenuItem pasteThis = new MenuItem();
2881 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2883 MenuItem font = new MenuItem();
2885 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2887 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2889 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2891 MenuItem modifyPID = new MenuItem();
2893 MenuItem modifyConservation = new MenuItem();
2895 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2896 "Autocalculate Consensus", true);
2898 CheckboxMenuItem sortByTree = new CheckboxMenuItem(
2899 "Sort Alignment With New Tree", true);
2901 Menu sortByTreeMenu = new Menu();
2903 Menu sort = new Menu();
2905 Menu calculate = new Menu();
2907 MenuItem inputText = new MenuItem();
2909 Menu helpMenu = new Menu();
2911 MenuItem documentation = new MenuItem();
2913 MenuItem about = new MenuItem();
2915 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2917 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2919 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2921 Menu autoAnnMenu = new Menu();
2923 CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem();
2925 CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
2927 CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem();
2929 CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem();
2931 CheckboxMenuItem showGroupConservation = new CheckboxMenuItem();
2933 CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem();
2935 private void jbInit() throws Exception
2938 setMenuBar(alignFrameMenuBar);
2942 // dynamically fill save as menu with available formats
2943 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2946 item = new MenuItem(
2947 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2949 item.addActionListener(new java.awt.event.ActionListener()
2952 public void actionPerformed(ActionEvent e)
2954 outputText_actionPerformed(e);
2958 outputTextboxMenu.add(item);
2960 closeMenuItem.addActionListener(this);
2961 loadApplication.addActionListener(this);
2963 loadTree.addActionListener(this);
2964 loadAnnotations.addActionListener(this);
2965 outputFeatures.addActionListener(this);
2966 outputAnnotations.addActionListener(this);
2967 selectAllSequenceMenuItem.addActionListener(this);
2968 deselectAllSequenceMenuItem.addActionListener(this);
2969 invertSequenceMenuItem.addActionListener(this);
2970 remove2LeftMenuItem.setLabel(MessageManager.getString("action.remove_left"));
2971 remove2LeftMenuItem.addActionListener(this);
2972 remove2RightMenuItem.setLabel(MessageManager.getString("action.remove_right"));
2973 remove2RightMenuItem.addActionListener(this);
2974 removeGappedColumnMenuItem.setLabel(MessageManager.getString("action.remove_empty_columns"));
2975 removeGappedColumnMenuItem.addActionListener(this);
2976 removeAllGapsMenuItem.setLabel(MessageManager.getString("action.remove_all_gaps"));
2977 removeAllGapsMenuItem.addActionListener(this);
2978 viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
2979 viewBoxesMenuItem.setState(true);
2980 viewBoxesMenuItem.addItemListener(this);
2981 viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
2982 viewTextMenuItem.setState(true);
2983 viewTextMenuItem.addItemListener(this);
2984 sortPairwiseMenuItem.setLabel(MessageManager.getString("action.by_pairwise_id"));
2985 sortPairwiseMenuItem.addActionListener(this);
2986 sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
2987 sortIDMenuItem.addActionListener(this);
2988 sortLengthMenuItem.setLabel(MessageManager.getString("action.by_length"));
2989 sortLengthMenuItem.addActionListener(this);
2990 sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
2991 sortGroupMenuItem.addActionListener(this);
2992 removeRedundancyMenuItem.setLabel(MessageManager.getString("action.remove_redundancy"));
2993 removeRedundancyMenuItem.addActionListener(this);
2994 pairwiseAlignmentMenuItem.setLabel(MessageManager.getString("action.pairwise_alignment"));
2995 pairwiseAlignmentMenuItem.addActionListener(this);
2996 PCAMenuItem.setLabel(MessageManager.getString("label.principal_component_analysis"));
2997 PCAMenuItem.addActionListener(this);
2998 averageDistanceTreeMenuItem
2999 .setLabel(MessageManager.getString("label.average_distance_identity"));
3000 averageDistanceTreeMenuItem.addActionListener(this);
3001 neighbourTreeMenuItem.setLabel(MessageManager.getString("label.neighbour_joining_identity"));
3002 neighbourTreeMenuItem.addActionListener(this);
3003 statusBar.setBackground(Color.white);
3004 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
3005 statusBar.setText(MessageManager.getString("label.status_bar"));
3006 outputTextboxMenu.setLabel(MessageManager.getString("label.out_to_textbox"));
3007 clustalColour.setLabel(MessageManager.getString("label.clustalx"));
3009 clustalColour.addActionListener(this);
3010 zappoColour.setLabel(MessageManager.getString("label.zappo"));
3011 zappoColour.addActionListener(this);
3012 taylorColour.setLabel(MessageManager.getString("label.taylor"));
3013 taylorColour.addActionListener(this);
3014 hydrophobicityColour.setLabel(MessageManager.getString("label.hydrophobicity"));
3015 hydrophobicityColour.addActionListener(this);
3016 helixColour.setLabel(MessageManager.getString("label.helix_propensity"));
3017 helixColour.addActionListener(this);
3018 strandColour.setLabel(MessageManager.getString("label.strand_propensity"));
3019 strandColour.addActionListener(this);
3020 turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
3021 turnColour.addActionListener(this);
3022 buriedColour.setLabel(MessageManager.getString("label.buried_index"));
3023 buriedColour.addActionListener(this);
3024 purinePyrimidineColour.setLabel(MessageManager.getString("label.purine_pyrimidine"));
3025 purinePyrimidineColour.addActionListener(this);
3026 RNAHelixColour.setLabel(MessageManager.getString("action.by_rna_helixes"));
3027 RNAHelixColour.addActionListener(this);
3028 userDefinedColour.setLabel(MessageManager.getString("action.user_defined"));
3029 userDefinedColour.addActionListener(this);
3030 PIDColour.setLabel(MessageManager.getString("label.percentage_identity"));
3031 PIDColour.addActionListener(this);
3032 BLOSUM62Colour.setLabel(MessageManager.getString("label.blosum62_score"));
3033 BLOSUM62Colour.addActionListener(this);
3034 tcoffeeColour.setLabel(MessageManager.getString("label.tcoffee_scores"));
3035 tcoffeeColour.setEnabled(false); // it will enabled only if a score file is
3037 tcoffeeColour.addActionListener(this);
3038 avDistanceTreeBlosumMenuItem
3039 .setLabel(MessageManager.getString("label.average_distance_bloslum62"));
3040 avDistanceTreeBlosumMenuItem.addActionListener(this);
3041 njTreeBlosumMenuItem.setLabel(MessageManager.getString("label.neighbour_blosum62"));
3042 njTreeBlosumMenuItem.addActionListener(this);
3043 annotationPanelMenuItem.setLabel(MessageManager.getString("label.show_annotations"));
3044 annotationPanelMenuItem.addItemListener(this);
3045 colourTextMenuItem.setLabel(MessageManager.getString("label.colour_text"));
3046 colourTextMenuItem.addItemListener(this);
3047 displayNonconservedMenuItem.setLabel(MessageManager.getString("label.show_non_conversed"));
3048 displayNonconservedMenuItem.addItemListener(this);
3049 alProperties.addActionListener(this);
3050 overviewMenuItem.setLabel(MessageManager.getString("label.overview_window"));
3051 overviewMenuItem.addActionListener(this);
3052 undoMenuItem.setEnabled(false);
3053 undoMenuItem.setLabel(MessageManager.getString("action.undo"));
3054 undoMenuItem.addActionListener(this);
3055 redoMenuItem.setEnabled(false);
3056 redoMenuItem.setLabel(MessageManager.getString("action.redo"));
3057 redoMenuItem.addActionListener(this);
3058 conservationMenuItem.setLabel(MessageManager.getString("action.by_conservation"));
3059 conservationMenuItem.addItemListener(this);
3060 noColourmenuItem.setLabel(MessageManager.getString("label.none"));
3061 noColourmenuItem.addActionListener(this);
3062 wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
3063 wrapMenuItem.addItemListener(this);
3064 renderGapsMenuItem.setLabel(MessageManager.getString("action.show_gaps"));
3065 renderGapsMenuItem.setState(true);
3066 renderGapsMenuItem.addItemListener(this);
3067 findMenuItem.setLabel(MessageManager.getString("action.find"));
3068 findMenuItem.addActionListener(this);
3069 abovePIDThreshold.setLabel(MessageManager.getString("label.above_identity_threshold"));
3070 abovePIDThreshold.addItemListener(this);
3071 nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
3072 nucleotideColour.addActionListener(this);
3073 deleteGroups.setLabel(MessageManager.getString("action.undefine_groups"));
3074 deleteGroups.addActionListener(this);
3075 grpsFromSelection.setLabel(MessageManager.getString("action.make_groups_selection"));
3076 grpsFromSelection.addActionListener(this);
3077 copy.setLabel(MessageManager.getString("action.copy"));
3078 copy.addActionListener(this);
3079 cut.setLabel(MessageManager.getString("action.cut"));
3080 cut.addActionListener(this);
3081 delete.setLabel(MessageManager.getString("action.delete"));
3082 delete.addActionListener(this);
3083 pasteMenu.setLabel(MessageManager.getString("action.paste"));
3084 pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
3085 pasteNew.addActionListener(this);
3086 pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
3087 pasteThis.addActionListener(this);
3088 applyToAllGroups.setLabel(MessageManager.getString("label.apply_colour_to_all_groups"));
3089 applyToAllGroups.setState(true);
3090 applyToAllGroups.addItemListener(this);
3091 font.setLabel(MessageManager.getString("action.font"));
3092 font.addActionListener(this);
3093 scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
3094 scaleAbove.setState(true);
3095 scaleAbove.setEnabled(false);
3096 scaleAbove.addItemListener(this);
3097 scaleLeft.setEnabled(false);
3098 scaleLeft.setState(true);
3099 scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
3100 scaleLeft.addItemListener(this);
3101 scaleRight.setEnabled(false);
3102 scaleRight.setState(true);
3103 scaleRight.setLabel(MessageManager.getString("action.scale_right"));
3104 scaleRight.addItemListener(this);
3105 modifyPID.setLabel(MessageManager.getString("label.modify_identity_thereshold"));
3106 modifyPID.addActionListener(this);
3107 modifyConservation.setLabel(MessageManager.getString("label.modify_conservation_thereshold"));
3108 modifyConservation.addActionListener(this);
3109 sortByTreeMenu.setLabel(MessageManager.getString("action.by_tree_order"));
3110 sort.setLabel(MessageManager.getString("action.sort"));
3111 calculate.setLabel(MessageManager.getString("action.calculate_tree"));
3112 autoCalculate.addItemListener(this);
3113 sortByTree.addItemListener(this);
3114 inputText.setLabel(MessageManager.getString("label.input_from_textbox"));
3115 inputText.addActionListener(this);
3116 centreColumnLabelFlag.setLabel(MessageManager.getString("label.centre_column_labels"));
3117 centreColumnLabelFlag.addItemListener(this);
3118 followMouseOverFlag.setLabel(MessageManager.getString("label.automatic_scrolling"));
3119 followMouseOverFlag.addItemListener(this);
3120 helpMenu.setLabel(MessageManager.getString("action.help"));
3121 documentation.setLabel(MessageManager.getString("label.documentation"));
3122 documentation.addActionListener(this);
3124 about.setLabel(MessageManager.getString("label.about"));
3125 about.addActionListener(this);
3126 seqLimits.setState(true);
3127 seqLimits.setLabel(MessageManager.getString("label.show_sequence_limits"));
3128 seqLimits.addItemListener(this);
3129 featureSettings.setLabel(MessageManager.getString("label.feature_settings"));
3130 featureSettings.addActionListener(this);
3131 sequenceFeatures.setLabel(MessageManager.getString("label.sequence_features"));
3132 sequenceFeatures.addItemListener(this);
3133 sequenceFeatures.setState(false);
3134 annotationColour.setLabel(MessageManager.getString("action.by_annotation"));
3135 annotationColour.addActionListener(this);
3136 invertSequenceMenuItem.setLabel(MessageManager.getString("action.invert_sequence_selection"));
3137 invertColSel.setLabel(MessageManager.getString("action.invert_column_selection"));
3138 menu1.setLabel(MessageManager.getString("action.show"));
3139 showColumns.setLabel(MessageManager.getString("label.all_columns"));
3140 showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
3141 menu2.setLabel(MessageManager.getString("aciton.hide"));
3142 hideColumns.setLabel(MessageManager.getString("label.selected_columns"));
3143 hideSequences.setLabel(MessageManager.getString("label.selected_sequences"));
3144 hideAllButSelection.setLabel(MessageManager.getString("label.all_but_selected_region"));
3145 hideAllSelection.setLabel(MessageManager.getString("label.selected_region"));
3146 showAllHidden.setLabel(MessageManager.getString("label.all_sequences_columns"));
3147 showGroupConsensus.setLabel(MessageManager.getString("label.group_consensus"));
3148 showGroupConservation.setLabel(MessageManager.getString("label.group_conservation"));
3149 showConsensusHistogram.setLabel(MessageManager.getString("label.show_consensus_histogram"));
3150 showSequenceLogo.setLabel(MessageManager.getString("label.show_consensus_logo"));
3151 normSequenceLogo.setLabel(MessageManager.getString("label.norm_consensus_logo"));
3152 applyAutoAnnotationSettings.setLabel(MessageManager.getString("label.apply_all_groups"));
3153 applyAutoAnnotationSettings.setState(true);
3154 autoAnnMenu.setLabel(MessageManager.getString("label.autocalculated_annotation"));
3156 invertColSel.addActionListener(this);
3157 showColumns.addActionListener(this);
3158 showSeqs.addActionListener(this);
3159 hideColumns.addActionListener(this);
3160 hideSequences.addActionListener(this);
3161 hideAllButSelection.addActionListener(this);
3162 hideAllSelection.addActionListener(this);
3163 showAllHidden.addActionListener(this);
3164 showGroupConsensus.addItemListener(this);
3165 showGroupConservation.addItemListener(this);
3166 showConsensusHistogram.addItemListener(this);
3167 showSequenceLogo.addItemListener(this);
3168 normSequenceLogo.addItemListener(this);
3170 applyAutoAnnotationSettings.addItemListener(this);
3171 formatMenu.setLabel(MessageManager.getString("action.format"));
3172 selectMenu.setLabel(MessageManager.getString("action.select"));
3173 newView.setLabel(MessageManager.getString("action.new_view"));
3174 newView.addActionListener(this);
3175 alignFrameMenuBar.add(fileMenu);
3176 alignFrameMenuBar.add(editMenu);
3177 alignFrameMenuBar.add(selectMenu);
3178 alignFrameMenuBar.add(viewMenu);
3179 alignFrameMenuBar.add(formatMenu);
3180 alignFrameMenuBar.add(colourMenu);
3181 alignFrameMenuBar.add(calculateMenu);
3182 alignFrameMenuBar.add(helpMenu);
3184 fileMenu.add(inputText);
3185 fileMenu.add(loadTree);
3186 fileMenu.add(loadAnnotations);
3188 fileMenu.addSeparator();
3189 fileMenu.add(outputTextboxMenu);
3190 fileMenu.add(outputFeatures);
3191 fileMenu.add(outputAnnotations);
3193 if (jalviewServletURL != null)
3195 fileMenu.add(loadApplication);
3198 fileMenu.addSeparator();
3199 fileMenu.add(closeMenuItem);
3201 editMenu.add(undoMenuItem);
3202 editMenu.add(redoMenuItem);
3205 editMenu.add(pasteMenu);
3206 editMenu.add(delete);
3207 editMenu.addSeparator();
3208 editMenu.add(remove2LeftMenuItem);
3209 editMenu.add(remove2RightMenuItem);
3210 editMenu.add(removeGappedColumnMenuItem);
3211 editMenu.add(removeAllGapsMenuItem);
3212 editMenu.add(removeRedundancyMenuItem);
3213 viewMenu.add(newView);
3214 viewMenu.addSeparator();
3215 viewMenu.add(menu1);
3216 viewMenu.add(menu2);
3217 viewMenu.addSeparator();
3218 viewMenu.add(followMouseOverFlag);
3219 viewMenu.add(annotationPanelMenuItem);
3220 autoAnnMenu.add(applyAutoAnnotationSettings);
3221 autoAnnMenu.add(showConsensusHistogram);
3222 autoAnnMenu.add(showSequenceLogo);
3223 autoAnnMenu.add(normSequenceLogo);
3224 autoAnnMenu.addSeparator();
3225 autoAnnMenu.add(showGroupConservation);
3226 autoAnnMenu.add(showGroupConsensus);
3227 viewMenu.add(autoAnnMenu);
3228 viewMenu.addSeparator();
3229 viewMenu.add(sequenceFeatures);
3230 viewMenu.add(featureSettings);
3231 viewMenu.addSeparator();
3232 viewMenu.add(alProperties);
3233 viewMenu.addSeparator();
3234 viewMenu.add(overviewMenuItem);
3235 colourMenu.add(applyToAllGroups);
3236 colourMenu.addSeparator();
3237 colourMenu.add(noColourmenuItem);
3238 colourMenu.add(clustalColour);
3239 colourMenu.add(BLOSUM62Colour);
3240 colourMenu.add(PIDColour);
3241 colourMenu.add(zappoColour);
3242 colourMenu.add(taylorColour);
3243 colourMenu.add(hydrophobicityColour);
3244 colourMenu.add(helixColour);
3245 colourMenu.add(strandColour);
3246 colourMenu.add(turnColour);
3247 colourMenu.add(buriedColour);
3248 colourMenu.add(nucleotideColour);
3249 colourMenu.add(purinePyrimidineColour);
3250 colourMenu.add(tcoffeeColour);
3251 colourMenu.add(userDefinedColour);
3252 colourMenu.addSeparator();
3253 colourMenu.add(conservationMenuItem);
3254 colourMenu.add(modifyConservation);
3255 colourMenu.add(abovePIDThreshold);
3256 colourMenu.add(modifyPID);
3257 colourMenu.add(annotationColour);
3258 colourMenu.add(RNAHelixColour);
3259 calculateMenu.add(sort);
3260 calculateMenu.add(calculate);
3261 calculateMenu.addSeparator();
3262 calculateMenu.add(pairwiseAlignmentMenuItem);
3263 calculateMenu.add(PCAMenuItem);
3264 calculateMenu.add(autoCalculate);
3265 calculateMenu.add(sortByTree);
3266 this.add(statusBar, BorderLayout.SOUTH);
3267 pasteMenu.add(pasteNew);
3268 pasteMenu.add(pasteThis);
3269 sort.add(sortIDMenuItem);
3270 sort.add(sortLengthMenuItem);
3271 sort.add(sortByTreeMenu);
3272 sort.add(sortGroupMenuItem);
3273 sort.add(sortPairwiseMenuItem);
3274 calculate.add(averageDistanceTreeMenuItem);
3275 calculate.add(neighbourTreeMenuItem);
3276 calculate.add(avDistanceTreeBlosumMenuItem);
3277 calculate.add(njTreeBlosumMenuItem);
3278 helpMenu.add(documentation);
3279 helpMenu.add(about);
3280 menu1.add(showColumns);
3281 menu1.add(showSeqs);
3282 menu1.add(showAllHidden);
3283 menu2.add(hideColumns);
3284 menu2.add(hideSequences);
3285 menu2.add(hideAllSelection);
3286 menu2.add(hideAllButSelection);
3287 formatMenu.add(font);
3288 formatMenu.add(seqLimits);
3289 formatMenu.add(wrapMenuItem);
3290 formatMenu.add(scaleAbove);
3291 formatMenu.add(scaleLeft);
3292 formatMenu.add(scaleRight);
3293 formatMenu.add(viewBoxesMenuItem);
3294 formatMenu.add(viewTextMenuItem);
3295 formatMenu.add(colourTextMenuItem);
3296 formatMenu.add(displayNonconservedMenuItem);
3297 formatMenu.add(renderGapsMenuItem);
3298 formatMenu.add(centreColumnLabelFlag);
3299 selectMenu.add(findMenuItem);
3300 selectMenu.addSeparator();
3301 selectMenu.add(selectAllSequenceMenuItem);
3302 selectMenu.add(deselectAllSequenceMenuItem);
3303 selectMenu.add(invertSequenceMenuItem);
3304 selectMenu.add(invertColSel);
3305 selectMenu.add(grpsFromSelection);
3306 selectMenu.add(deleteGroups);
3310 MenuItem featureSettings = new MenuItem();
3312 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3314 MenuItem annotationColour = new MenuItem();
3316 MenuItem invertColSel = new MenuItem();
3318 Menu menu1 = new Menu();
3320 MenuItem showColumns = new MenuItem();
3322 MenuItem showSeqs = new MenuItem();
3324 Menu menu2 = new Menu();
3326 MenuItem hideColumns = new MenuItem();
3328 MenuItem hideSequences = new MenuItem();
3330 MenuItem hideAllButSelection = new MenuItem();
3332 MenuItem hideAllSelection = new MenuItem();
3334 MenuItem showAllHidden = new MenuItem();
3336 Menu formatMenu = new Menu();
3338 Menu selectMenu = new Menu();
3340 MenuItem newView = new MenuItem();
3343 * Attach the alignFrame panels after embedding menus, if necessary. This used
3344 * to be called setEmbedded, but is now creates the dropdown menus in a
3345 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3347 * @param reallyEmbedded
3348 * true to attach the view to the applet area on the page rather than
3351 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3356 // Explicly build the embedded menu panel for the on-page applet
3358 // view cannot be closed if its actually on the page
3359 fileMenu.remove(closeMenuItem);
3360 fileMenu.remove(3); // Remove Seperator
3361 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3362 Font.PLAIN, 10, false); // use our own fonts.
3363 // and actually add the components to the applet area
3364 viewport.applet.setLayout(new BorderLayout());
3365 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3366 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3367 alignPanel.setSize(viewport.applet.getSize().width,
3368 viewport.applet.getSize().height - embeddedMenu.HEIGHT
3369 - statusBar.HEIGHT);
3370 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3371 final AlignFrame me = this;
3372 viewport.applet.addFocusListener(new FocusListener()
3376 public void focusLost(FocusEvent e)
3378 if (me.viewport.applet.currentAlignFrame == me)
3380 me.viewport.applet.currentAlignFrame = null;
3385 public void focusGained(FocusEvent e)
3387 me.viewport.applet.currentAlignFrame = me;
3390 viewport.applet.validate();
3395 // test and embed menu bar if necessary.
3397 if (embedMenuIfNeeded(alignPanel))
3399 // adjust for status bar height too
3400 alignPanel.setSize(getSize().width, getSize().height
3401 - statusBar.HEIGHT);
3403 add(statusBar, BorderLayout.SOUTH);
3404 add(alignPanel, BorderLayout.CENTER);
3405 // and register with the applet so it can pass external API calls to us
3406 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
3412 * create a new binding between structures in an existing jmol viewer instance
3413 * and an alignpanel with sequences that have existing PDBFile entries. Note,
3414 * this does not open a new Jmol window, or modify the display of the
3415 * structures in the original jmol window. Note This method doesn't work
3416 * without an additional javascript library to exchange messages between the
3417 * distinct applets. See http://issues.jalview.org/browse/JAL-621
3420 * JmolViewer instance
3421 * @param sequenceIds
3422 * - sequence Ids to search for associations
3424 public SequenceStructureBinding addStructureViewInstance(
3425 Object jmolviewer, String[] sequenceIds)
3427 org.jmol.api.JmolViewer viewer = null;
3430 viewer = (org.jmol.api.JmolViewer) jmolviewer;
3431 } catch (ClassCastException ex)
3433 System.err.println("Unsupported viewer object :"
3434 + jmolviewer.getClass());
3438 System.err.println("Can't use this object as a structure viewer:"
3439 + jmolviewer.getClass());
3442 SequenceI[] seqs = null;
3443 if (sequenceIds == null || sequenceIds.length == 0)
3445 seqs = viewport.getAlignment().getSequencesArray();
3449 Vector sqi = new Vector();
3450 AlignmentI al = viewport.getAlignment();
3451 for (int sid = 0; sid < sequenceIds.length; sid++)
3453 SequenceI sq = al.findName(sequenceIds[sid]);
3461 seqs = new SequenceI[sqi.size()];
3462 for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++)
3464 seqs[sid] = (SequenceI) sqi.elementAt(sid);
3473 // TODO: search for a jmv that involves viewer
3475 { // create a new viewer/jalview binding.
3476 jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][]
3484 * bind a pdb file to a sequence in the current view
3487 * - sequenceId within the dataset.
3488 * @param pdbEntryString
3489 * - the short name for the PDB file
3491 * - pdb file - either a URL or a valid PDB file.
3492 * @return true if binding was as success TODO: consider making an exception
3493 * structure for indicating when PDB parsing or sequenceId location
3496 public boolean addPdbFile(String sequenceId, String pdbEntryString,
3499 SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId);
3500 boolean needtoadd = false;
3501 if (toaddpdb != null)
3503 Vector pdbe = toaddpdb.getPDBId();
3504 PDBEntry pdbentry = null;
3505 if (pdbe != null && pdbe.size() > 0)
3507 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
3509 pdbentry = (PDBEntry) pdbe.elementAt(pe);
3510 if (!pdbentry.getId().equals(pdbEntryString)
3511 && !pdbentry.getFile().equals(pdbFile))
3521 if (pdbentry == null)
3523 pdbentry = new PDBEntry();
3524 pdbentry.setId(pdbEntryString);
3525 pdbentry.setFile(pdbFile);
3526 needtoadd = true; // add this new entry to sequence.
3528 // resolve data source
3529 // TODO: this code should be a refactored to an io package
3530 String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB");
3531 if (protocol == null)
3537 // make a note of the access mode and add
3538 if (pdbentry.getProperty() == null)
3540 pdbentry.setProperty(new Hashtable());
3542 pdbentry.getProperty().put("protocol", protocol);
3543 toaddpdb.addPDBId(pdbentry);
3549 private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains)
3553 Vector sequences = new Vector();
3554 for (int i = 0; i < seqs.length; i++)
3556 if (seqs[i] != null)
3558 sequences.addElement(new Object[]
3559 { seqs[i], (chains != null) ? chains[i] : null });
3562 seqs = new SequenceI[sequences.size()];
3563 chains = new String[sequences.size()];
3564 for (int i = 0, isize = sequences.size(); i < isize; i++)
3566 Object[] oj = (Object[]) sequences.elementAt(i);
3568 seqs[i] = (SequenceI) oj[0];
3569 chains[i] = (String) oj[1];
3577 public void newStructureView(JalviewLite applet, PDBEntry pdb,
3578 SequenceI[] seqs, String[] chains, String protocol)
3580 // Scrub any null sequences from the array
3581 Object[] sqch = cleanSeqChainArrays(seqs, chains);
3582 seqs = (SequenceI[]) sqch[0];
3583 chains = (String[]) sqch[1];
3584 if (seqs == null || seqs.length == 0)
3587 .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to.");
3589 if (protocol == null || protocol.trim().length() == 0
3590 || protocol.equals("null"))
3592 protocol = (String) pdb.getProperty().get("protocol");
3593 if (protocol == null)
3595 System.err.println("Couldn't work out protocol to open structure: "
3600 if (applet.useXtrnalSviewer)
3602 // register the association(s) and quit, don't create any windows.
3603 if (StructureSelectionManager.getStructureSelectionManager(applet)
3604 .setMapping(seqs, chains, pdb.getFile(), protocol) == null)
3606 System.err.println("Failed to map " + pdb.getFile() + " ("
3607 + protocol + ") to any sequences");
3611 if (applet.isAlignPdbStructures() && applet.jmolAvailable)
3613 // can only do alignments with Jmol
3614 // find the last jmol window assigned to this alignment
3615 jalview.appletgui.AppletJmol ajm = null, tajm;
3616 Vector jmols = applet
3617 .getAppletWindow(jalview.appletgui.AppletJmol.class);
3618 for (int i = 0, iSize = jmols.size(); i < iSize; i++)
3620 tajm = (jalview.appletgui.AppletJmol) jmols.elementAt(i);
3621 if (tajm.ap.alignFrame == this)
3630 .println("Incremental adding and aligning structure to existing Jmol view not yet implemented.");
3631 // try and add the pdb structure
3636 // otherwise, create a new window
3637 if (applet.jmolAvailable)
3639 new jalview.appletgui.AppletJmol(pdb, seqs, chains, alignPanel,
3641 applet.lastFrameX += 40;
3642 applet.lastFrameY += 40;
3646 new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol);
3651 public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb,
3652 SequenceI[][] seqs, String[][] chains, String[] protocols)
3654 // TODO Auto-generated method stub
3655 System.err.println("Aligned Structure View: Not yet implemented.");
3659 * modify the current selection, providing the user has not made a selection
3663 * - sequences from this alignment
3665 * - columns to be selected on the alignment
3667 public void select(SequenceGroup sel, ColumnSelection csel)
3669 alignPanel.seqPanel.selection(sel, csel, null);
3672 public void scrollTo(int row, int column)
3674 alignPanel.seqPanel.scrollTo(row, column);
3677 public void scrollToRow(int row)
3679 alignPanel.seqPanel.scrollToRow(row);
3682 public void scrollToColumn(int column)
3684 alignPanel.seqPanel.scrollToColumn(column);
3688 * @return the alignments unique ID.
3690 public String getSequenceSetId()
3692 return viewport.getSequenceSetId();
3696 * Load the (T-Coffee) score file from the specified url
3699 * File/URL/T-COFFEE score file contents
3700 * @throws IOException
3701 * @return true if alignment was annotated with data from source
3703 public boolean loadScoreFile(String source) throws IOException
3706 TCoffeeScoreFile file = new TCoffeeScoreFile(source,
3707 AppletFormatAdapter.checkProtocol(source));
3708 if (!file.isValid())
3710 // TODO: raise dialog for gui
3711 System.err.println("Problems parsing T-Coffee scores: "
3712 + file.getWarningMessage());
3713 System.err.println("Origin was:\n" + source);
3718 * check that the score matrix matches the alignment dimensions
3721 if ((aln = viewport.getAlignment()) != null
3722 && (aln.getHeight() != file.getHeight() || aln.getWidth() != file
3725 // TODO: raise a dialog box here rather than bomb out.
3727 .println("The scores matrix does not match the alignment dimensions");
3731 // TODO add parameter to indicate if matching should be done
3732 if (file.annotateAlignment(alignPanel.getAlignment(), false))
3734 alignPanel.fontChanged();
3735 tcoffeeColour.setEnabled(true);
3736 // switch to this color
3737 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
3742 System.err.println("Problems resolving T-Coffee scores:");
3743 if (file.getWarningMessage() != null)
3745 System.err.println(file.getWarningMessage());