2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, 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;
25 import java.awt.event.*;
27 import jalview.analysis.*;
28 import jalview.bin.JalviewLite;
29 import jalview.commands.*;
30 import jalview.datamodel.*;
32 import jalview.schemes.*;
34 public class AlignFrame extends EmbmenuFrame implements ActionListener,
35 ItemListener, KeyListener
37 public AlignmentPanel alignPanel;
39 public AlignViewport viewport;
41 int DEFAULT_WIDTH = 700;
43 int DEFAULT_HEIGHT = 500;
45 String jalviewServletURL;
47 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
48 String title, boolean embedded)
53 jalviewServletURL = applet.getParameter("APPLICATION_URL");
59 } catch (Exception ex)
64 viewport = new AlignViewport(al, applet);
65 alignPanel = new AlignmentPanel(this, viewport);
67 viewport.updateConservation(alignPanel);
68 viewport.updateConsensus(alignPanel);
70 annotationPanelMenuItem.setState(viewport.showAnnotation);
71 displayNonconservedMenuItem.setState(viewport.getShowunconserved());
73 seqLimits.setState(viewport.showJVSuffix);
77 String param = applet.getParameter("sortBy");
80 if (param.equalsIgnoreCase("Id"))
82 sortIDMenuItem_actionPerformed();
84 else if (param.equalsIgnoreCase("Pairwise Identity"))
86 sortPairwiseMenuItem_actionPerformed();
88 else if (param.equalsIgnoreCase("Length"))
90 sortLengthMenuItem_actionPerformed();
94 param = applet.getParameter("wrap");
97 if (param.equalsIgnoreCase("true"))
99 wrapMenuItem.setState(true);
100 wrapMenuItem_actionPerformed();
103 param = applet.getParameter("centrecolumnlabels");
106 centreColumnLabelFlag.setState(true);
107 centreColumnLabelFlag_stateChanged();
111 param = applet.getParameter("windowWidth");
114 int width = Integer.parseInt(param);
115 DEFAULT_WIDTH = width;
117 param = applet.getParameter("windowHeight");
120 int height = Integer.parseInt(param);
121 DEFAULT_HEIGHT = height;
123 } catch (Exception ex)
129 // Some JVMS send keyevents to Top frame or lowest panel,
130 // Havent worked out why yet. So add to both this frame and seqCanvas for
132 this.addKeyListener(this);
133 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
134 alignPanel.idPanel.idCanvas.addKeyListener(this);
135 alignPanel.scalePanel.addKeyListener(this);
136 alignPanel.annotationPanel.addKeyListener(this);
137 createAlignFrameWindow(embedded, title);
138 alignPanel.validate();
139 alignPanel.paintAlignment(true);
142 public AlignViewport getAlignViewport()
147 public SeqCanvas getSeqcanvas()
149 return alignPanel.seqPanel.seqCanvas;
159 public void parseFeaturesFile(String file, String type)
161 Hashtable featureLinks = new Hashtable();
162 boolean featuresFile = false;
165 featuresFile = new jalview.io.FeaturesFile(file, type).parse(
166 viewport.alignment, alignPanel.seqPanel.seqCanvas
167 .getFeatureRenderer().featureColours, featureLinks,
169 } catch (Exception ex)
171 ex.printStackTrace();
176 if (featureLinks.size() > 0)
178 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
180 viewport.showSequenceFeatures = true;
181 sequenceFeatures.setState(true);
182 if (viewport.featureSettings != null)
184 viewport.featureSettings.refreshTable();
186 alignPanel.paintAlignment(true);
191 public void keyPressed(KeyEvent evt)
193 if (viewport.cursorMode
194 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
195 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
196 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
197 && Character.isDigit(evt.getKeyChar()))
198 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
200 switch (evt.getKeyCode())
202 case 27: // escape key
203 deselectAllSequenceMenuItem_actionPerformed();
206 if (evt.isControlDown() || evt.isMetaDown())
208 cut_actionPerformed();
212 if (viewport.cursorMode && !evt.isControlDown())
214 alignPanel.seqPanel.setCursorColumn();
216 if (evt.isControlDown() || evt.isMetaDown())
218 copy_actionPerformed();
222 if (evt.isControlDown())
224 paste(evt.isShiftDown());
228 if (evt.isControlDown() || evt.isMetaDown())
230 selectAllSequenceMenuItem_actionPerformed();
233 case KeyEvent.VK_DOWN:
234 if (viewport.cursorMode)
236 alignPanel.seqPanel.moveCursor(0, 1);
240 moveSelectedSequences(false);
245 if (viewport.cursorMode)
247 alignPanel.seqPanel.moveCursor(0, -1);
251 moveSelectedSequences(true);
255 case KeyEvent.VK_LEFT:
256 if (evt.isAltDown() || !viewport.cursorMode)
257 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
259 alignPanel.seqPanel.moveCursor(-1, 0);
262 case KeyEvent.VK_RIGHT:
263 if (evt.isAltDown() || !viewport.cursorMode)
264 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
266 alignPanel.seqPanel.moveCursor(1, 0);
269 case KeyEvent.VK_SPACE:
270 if (viewport.cursorMode)
272 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
273 || evt.isShiftDown() || evt.isAltDown());
277 case KeyEvent.VK_DELETE:
278 case KeyEvent.VK_BACK_SPACE:
279 if (viewport.cursorMode)
281 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
282 || evt.isShiftDown() || evt.isAltDown());
286 cut_actionPerformed();
287 alignPanel.seqPanel.seqCanvas.repaint();
292 if (viewport.cursorMode)
294 alignPanel.seqPanel.setCursorRow();
298 if (viewport.cursorMode)
300 alignPanel.seqPanel.setCursorPosition();
304 case KeyEvent.VK_ENTER:
305 case KeyEvent.VK_COMMA:
306 if (viewport.cursorMode)
308 alignPanel.seqPanel.setCursorRowAndColumn();
313 if (viewport.cursorMode)
315 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
319 if (viewport.cursorMode)
321 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
326 viewport.cursorMode = !viewport.cursorMode;
327 statusBar.setText("Keyboard editing mode is "
328 + (viewport.cursorMode ? "on" : "off"));
329 if (viewport.cursorMode)
331 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
332 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
337 if (evt.isControlDown())
339 findMenuItem_actionPerformed();
345 boolean toggleSeqs = !evt.isControlDown();
346 boolean toggleCols = !evt.isShiftDown();
347 toggleHiddenRegions(toggleSeqs, toggleCols);
351 case KeyEvent.VK_PAGE_UP:
352 if (viewport.wrapAlignment)
354 alignPanel.scrollUp(true);
358 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
359 - viewport.endSeq + viewport.startSeq);
363 case KeyEvent.VK_PAGE_DOWN:
364 if (viewport.wrapAlignment)
366 alignPanel.scrollUp(false);
370 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
371 + viewport.endSeq - viewport.startSeq);
376 if (evt.isControlDown())
378 undoMenuItem_actionPerformed();
383 if (evt.isControlDown())
385 redoMenuItem_actionPerformed();
390 if (evt.isControlDown())
397 if (evt.isControlDown())
399 trimAlignment(false);
404 if (evt.isControlDown())
406 if (evt.isShiftDown())
408 this.removeAllGapsMenuItem_actionPerformed();
412 removeGappedColumnMenuItem_actionPerformed();
417 if (evt.isControlDown())
421 invertColSel_actionPerformed();
425 invertSequenceMenuItem_actionPerformed();
431 if (evt.isControlDown())
433 this.deleteGroups_actionPerformed();
438 if (evt.isControlDown())
445 alignPanel.paintAlignment(true);
449 * called by key handler and the hide all/show all menu items
454 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
456 boolean hide = false;
457 SequenceGroup sg = viewport.getSelectionGroup();
458 if (!toggleSeqs && !toggleCols)
460 // Hide everything by the current selection - this is a hack - we do the
461 // invert and then hide
462 // first check that there will be visible columns after the invert.
463 if ((viewport.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel
464 .getSelected().size() > 0)
465 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
468 // now invert the sequence set, if required - empty selection implies
469 // that no hiding is required.
472 invertSequenceMenuItem_actionPerformed();
473 sg = viewport.getSelectionGroup();
477 viewport.expandColSelection(sg, true);
478 // finally invert the column selection and get the new sequence
479 // selection and indicate it should be hidden.
480 invertColSel_actionPerformed();
487 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
490 viewport.hideAllSelectedSeqs();
492 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
494 viewport.showAllHiddenSeqs();
500 if (viewport.colSel.getSelected().size() > 0)
502 viewport.hideSelectedColumns();
505 viewport.selectionGroup = sg;
510 viewport.showAllHiddenColumns();
515 public void keyReleased(KeyEvent evt)
519 public void keyTyped(KeyEvent evt)
523 public void itemStateChanged(ItemEvent evt)
525 if (evt.getSource() == displayNonconservedMenuItem)
527 displayNonconservedMenuItem_actionPerformed();
529 else if (evt.getSource() == colourTextMenuItem)
531 colourTextMenuItem_actionPerformed();
533 else if (evt.getSource() == wrapMenuItem)
535 wrapMenuItem_actionPerformed();
537 else if (evt.getSource() == scaleAbove)
539 viewport.setScaleAboveWrapped(scaleAbove.getState());
541 else if (evt.getSource() == scaleLeft)
543 viewport.setScaleLeftWrapped(scaleLeft.getState());
545 else if (evt.getSource() == scaleRight)
547 viewport.setScaleRightWrapped(scaleRight.getState());
549 else if (evt.getSource() == seqLimits)
551 seqLimits_itemStateChanged();
553 else if (evt.getSource() == viewBoxesMenuItem)
555 viewport.setShowBoxes(viewBoxesMenuItem.getState());
557 else if (evt.getSource() == viewTextMenuItem)
559 viewport.setShowText(viewTextMenuItem.getState());
561 else if (evt.getSource() == renderGapsMenuItem)
563 viewport.setRenderGaps(renderGapsMenuItem.getState());
565 else if (evt.getSource() == annotationPanelMenuItem)
567 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
568 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
570 else if (evt.getSource() == sequenceFeatures)
572 viewport.showSequenceFeatures(sequenceFeatures.getState());
573 alignPanel.seqPanel.seqCanvas.repaint();
575 else if (evt.getSource() == conservationMenuItem)
577 conservationMenuItem_actionPerformed();
579 else if (evt.getSource() == abovePIDThreshold)
581 abovePIDThreshold_actionPerformed();
583 else if (evt.getSource() == applyToAllGroups)
585 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
587 else if (evt.getSource() == autoCalculate)
589 viewport.autocalculateConsensus = autoCalculate.getState();
591 else if (evt.getSource() == this.centreColumnLabelFlag)
593 centreColumnLabelFlag_stateChanged();
595 else if (evt.getSource() == this.followMouseOverFlag)
597 mouseOverFlag_stateChanged();
600 alignPanel.paintAlignment(true);
603 private void mouseOverFlag_stateChanged()
605 viewport.followHighlight = followMouseOverFlag.getState();
606 // TODO: could kick the scrollTo mechanism to reset view for current
610 private void centreColumnLabelFlag_stateChanged()
612 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
613 this.alignPanel.annotationPanel.repaint();
616 public void actionPerformed(ActionEvent evt)
618 Object source = evt.getSource();
620 if (source == inputText)
622 inputText_actionPerformed();
624 else if (source == loadTree)
626 loadTree_actionPerformed();
628 else if (source == loadApplication)
630 launchFullApplication();
632 else if (source == loadAnnotations)
636 else if (source == outputAnnotations)
638 outputAnnotations(true);
640 else if (source == outputFeatures)
642 outputFeatures(true, "Jalview");
644 else if (source == closeMenuItem)
646 closeMenuItem_actionPerformed();
648 else if (source == copy)
650 copy_actionPerformed();
652 else if (source == undoMenuItem)
654 undoMenuItem_actionPerformed();
656 else if (source == redoMenuItem)
658 redoMenuItem_actionPerformed();
660 else if (source == inputText)
662 inputText_actionPerformed();
664 else if (source == closeMenuItem)
666 closeMenuItem_actionPerformed();
668 else if (source == undoMenuItem)
670 undoMenuItem_actionPerformed();
672 else if (source == redoMenuItem)
674 redoMenuItem_actionPerformed();
676 else if (source == copy)
678 copy_actionPerformed();
680 else if (source == pasteNew)
682 pasteNew_actionPerformed();
684 else if (source == pasteThis)
686 pasteThis_actionPerformed();
688 else if (source == cut)
690 cut_actionPerformed();
692 else if (source == delete)
694 delete_actionPerformed();
696 else if (source == grpsFromSelection)
698 makeGrpsFromSelection_actionPerformed();
700 else if (source == deleteGroups)
702 deleteGroups_actionPerformed();
704 else if (source == selectAllSequenceMenuItem)
706 selectAllSequenceMenuItem_actionPerformed();
708 else if (source == deselectAllSequenceMenuItem)
710 deselectAllSequenceMenuItem_actionPerformed();
712 else if (source == invertSequenceMenuItem)
714 invertSequenceMenuItem_actionPerformed();
716 else if (source == invertColSel)
718 viewport.invertColumnSelection();
719 alignPanel.paintAlignment(true);
721 else if (source == remove2LeftMenuItem)
725 else if (source == remove2RightMenuItem)
727 trimAlignment(false);
729 else if (source == removeGappedColumnMenuItem)
731 removeGappedColumnMenuItem_actionPerformed();
733 else if (source == removeAllGapsMenuItem)
735 removeAllGapsMenuItem_actionPerformed();
737 else if (source == findMenuItem)
739 findMenuItem_actionPerformed();
741 else if (source == font)
743 new FontChooser(alignPanel);
745 else if (source == newView)
749 else if (source == showColumns)
751 viewport.showAllHiddenColumns();
752 alignPanel.paintAlignment(true);
754 else if (source == showSeqs)
756 viewport.showAllHiddenSeqs();
757 alignPanel.paintAlignment(true);
759 else if (source == hideColumns)
761 viewport.hideSelectedColumns();
762 alignPanel.paintAlignment(true);
764 else if (source == hideSequences
765 && viewport.getSelectionGroup() != null)
767 viewport.hideAllSelectedSeqs();
768 alignPanel.paintAlignment(true);
770 else if (source == hideAllButSelection)
772 toggleHiddenRegions(false, false);
773 alignPanel.paintAlignment(true);
775 else if (source == hideAllSelection)
777 SequenceGroup sg = viewport.getSelectionGroup();
778 viewport.expandColSelection(sg, false);
779 viewport.hideAllSelectedSeqs();
780 viewport.hideSelectedColumns();
781 alignPanel.paintAlignment(true);
783 else if (source == showAllHidden)
785 viewport.showAllHiddenColumns();
786 viewport.showAllHiddenSeqs();
787 alignPanel.paintAlignment(true);
789 else if (source == featureSettings)
791 new FeatureSettings(alignPanel);
793 else if (source == alProperties)
795 StringBuffer contents = new StringBuffer();
798 int min = Integer.MAX_VALUE, max = 0;
799 for (int i = 0; i < viewport.alignment.getHeight(); i++)
801 int size = viewport.alignment.getSequenceAt(i).getEnd()
802 - viewport.alignment.getSequenceAt(i).getStart();
809 avg = avg / (float) viewport.alignment.getHeight();
811 contents.append("\nSequences: " + viewport.alignment.getHeight());
812 contents.append("\nMinimum Sequence Length: " + min);
813 contents.append("\nMaximum Sequence Length: " + max);
814 contents.append("\nAverage Length: " + (int) avg);
816 if (((Alignment) viewport.alignment).alignmentProperties != null)
818 Hashtable props = ((Alignment) viewport.alignment).alignmentProperties;
819 Enumeration en = props.keys();
820 while (en.hasMoreElements())
822 String key = en.nextElement().toString();
823 contents.append("\n" + key + "\t" + props.get(key));
827 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
828 cap.setText(contents.toString());
829 Frame frame = new Frame();
831 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
832 + getTitle(), 400, 250);
834 else if (source == overviewMenuItem)
836 overviewMenuItem_actionPerformed();
838 else if (source == noColourmenuItem)
842 else if (source == clustalColour)
844 abovePIDThreshold.setState(false);
845 changeColour(new ClustalxColourScheme(viewport.alignment
846 .getSequences(), viewport.alignment.getWidth()));
848 else if (source == zappoColour)
850 changeColour(new ZappoColourScheme());
852 else if (source == taylorColour)
854 changeColour(new TaylorColourScheme());
856 else if (source == hydrophobicityColour)
858 changeColour(new HydrophobicColourScheme());
860 else if (source == helixColour)
862 changeColour(new HelixColourScheme());
864 else if (source == strandColour)
866 changeColour(new StrandColourScheme());
868 else if (source == turnColour)
870 changeColour(new TurnColourScheme());
872 else if (source == buriedColour)
874 changeColour(new BuriedColourScheme());
876 else if (source == nucleotideColour)
878 changeColour(new NucleotideColourScheme());
880 else if (source == modifyPID)
882 modifyPID_actionPerformed();
884 else if (source == modifyConservation)
886 modifyConservation_actionPerformed();
888 else if (source == userDefinedColour)
890 new UserDefinedColours(alignPanel, null);
892 else if (source == PIDColour)
894 changeColour(new PIDColourScheme());
896 else if (source == BLOSUM62Colour)
898 changeColour(new Blosum62ColourScheme());
900 else if (source == annotationColour)
902 new AnnotationColourChooser(viewport, alignPanel);
904 else if (source == sortPairwiseMenuItem)
906 sortPairwiseMenuItem_actionPerformed();
908 else if (source == sortIDMenuItem)
910 sortIDMenuItem_actionPerformed();
912 else if (source == sortLengthMenuItem)
914 sortLengthMenuItem_actionPerformed();
916 else if (source == sortGroupMenuItem)
918 sortGroupMenuItem_actionPerformed();
920 else if (source == removeRedundancyMenuItem)
922 removeRedundancyMenuItem_actionPerformed();
924 else if (source == pairwiseAlignmentMenuItem)
926 pairwiseAlignmentMenuItem_actionPerformed();
928 else if (source == PCAMenuItem)
930 PCAMenuItem_actionPerformed();
932 else if (source == averageDistanceTreeMenuItem)
934 averageDistanceTreeMenuItem_actionPerformed();
936 else if (source == neighbourTreeMenuItem)
938 neighbourTreeMenuItem_actionPerformed();
940 else if (source == njTreeBlosumMenuItem)
942 njTreeBlosumMenuItem_actionPerformed();
944 else if (source == avDistanceTreeBlosumMenuItem)
946 avTreeBlosumMenuItem_actionPerformed();
948 else if (source == documentation)
950 documentation_actionPerformed();
952 else if (source == about)
954 about_actionPerformed();
959 public void inputText_actionPerformed()
961 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
962 Frame frame = new Frame();
964 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
967 protected void outputText_actionPerformed(ActionEvent e)
969 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
970 Frame frame = new Frame();
972 jalview.bin.JalviewLite.addFrame(frame, "Alignment output - "
973 + e.getActionCommand(), 600, 500);
974 cap.setText(new AppletFormatAdapter().formatSequences(e
975 .getActionCommand(), viewport.getAlignment(),
976 viewport.showJVSuffix));
979 public void loadAnnotations()
981 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
982 cap.setText("Paste your features / annotations file here.");
983 cap.setAnnotationImport();
984 Frame frame = new Frame();
986 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
990 public String outputAnnotations(boolean displayTextbox)
992 String annotation = new AnnotationFile().printAnnotations(
993 viewport.showAnnotation ? viewport.alignment
994 .getAlignmentAnnotation() : null, viewport.alignment
996 ((Alignment) viewport.alignment).alignmentProperties);
1000 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1001 Frame frame = new Frame();
1003 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
1004 cap.setText(annotation);
1010 private Hashtable getDisplayedFeatureCols()
1012 if (alignPanel.getFeatureRenderer() != null)
1014 FeatureRenderer fr = alignPanel.getFeatureRenderer();
1015 Hashtable fcols = new Hashtable();
1016 Enumeration en = viewport.featuresDisplayed.keys();
1017 while (en.hasMoreElements())
1019 Object col = en.nextElement();
1020 fcols.put(col, fr.featureColours.get(col));
1027 public String outputFeatures(boolean displayTextbox, String format)
1030 if (format.equalsIgnoreCase("Jalview"))
1032 features = new FeaturesFile().printJalviewFormat(viewport.alignment
1033 .getSequencesArray(), getDisplayedFeatureCols());
1037 features = new FeaturesFile().printGFFFormat(viewport.alignment
1038 .getSequencesArray(), getDisplayedFeatureCols());
1043 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1044 Frame frame = new Frame();
1046 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
1048 cap.setText(features);
1054 void launchFullApplication()
1056 StringBuffer url = new StringBuffer(jalviewServletURL);
1059 + appendProtocol(viewport.applet.getParameter("file")));
1061 if (viewport.applet.getParameter("features") != null)
1063 url.append("&features=");
1064 url.append(appendProtocol(viewport.applet.getParameter("features")));
1067 if (viewport.applet.getParameter("annotations") != null)
1069 url.append("&annotations=");
1071 .append(appendProtocol(viewport.applet
1072 .getParameter("annotations")));
1075 if (viewport.applet.getParameter("jnetfile") != null)
1077 url.append("&annotations=");
1078 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1081 if (viewport.applet.getParameter("defaultColour") != null)
1083 url.append("&colour="
1084 + removeWhiteSpace(viewport.applet
1085 .getParameter("defaultColour")));
1088 if (viewport.applet.getParameter("userDefinedColour") != null)
1090 url.append("&colour="
1091 + removeWhiteSpace(viewport.applet
1092 .getParameter("userDefinedColour")));
1094 if (viewport.applet.getParameter("tree") != null)
1097 + appendProtocol(viewport.applet.getParameter("tree")));
1099 if (viewport.applet.getParameter("treeFile") != null)
1102 + appendProtocol(viewport.applet.getParameter("treeFile")));
1105 showURL(url.toString(), "FULL_APP");
1108 String removeWhiteSpace(String colour)
1110 StringBuffer sb = new StringBuffer();
1111 for (int i = 0; i < colour.length(); i++)
1113 if (Character.isWhitespace(colour.charAt(i)))
1119 sb.append(colour.charAt(i));
1123 return sb.toString();
1126 String appendProtocol(String url)
1131 url = URLEncoder.encode(url);
1134 * When we finally deprecate 1.1 compatibility, we can start to use
1135 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1136 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1137 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1138 * ex.printStackTrace(); }
1140 catch (java.net.MalformedURLException ex)
1142 url = viewport.applet.getCodeBase() + url;
1147 public void closeMenuItem_actionPerformed()
1149 PaintRefresher.RemoveComponent(alignPanel);
1150 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1151 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1153 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1164 void updateEditMenuBar()
1167 if (viewport.historyList.size() > 0)
1169 undoMenuItem.setEnabled(true);
1170 CommandI command = (CommandI) viewport.historyList.peek();
1171 undoMenuItem.setLabel("Undo " + command.getDescription());
1175 undoMenuItem.setEnabled(false);
1176 undoMenuItem.setLabel("Undo");
1179 if (viewport.redoList.size() > 0)
1181 redoMenuItem.setEnabled(true);
1183 CommandI command = (CommandI) viewport.redoList.peek();
1184 redoMenuItem.setLabel("Redo " + command.getDescription());
1188 redoMenuItem.setEnabled(false);
1189 redoMenuItem.setLabel("Redo");
1193 public void addHistoryItem(CommandI command)
1195 if (command.getSize() > 0)
1197 viewport.historyList.push(command);
1198 viewport.redoList.removeAllElements();
1199 updateEditMenuBar();
1200 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1210 protected void undoMenuItem_actionPerformed()
1212 if (viewport.historyList.size() < 1)
1217 CommandI command = (CommandI) viewport.historyList.pop();
1218 viewport.redoList.push(command);
1219 command.undoCommand(null);
1221 AlignViewport originalSource = getOriginatingSource(command);
1223 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1224 updateEditMenuBar();
1225 originalSource.firePropertyChange("alignment", null,
1226 originalSource.alignment.getSequences());
1235 protected void redoMenuItem_actionPerformed()
1237 if (viewport.redoList.size() < 1)
1242 CommandI command = (CommandI) viewport.redoList.pop();
1243 viewport.historyList.push(command);
1244 command.doCommand(null);
1246 AlignViewport originalSource = getOriginatingSource(command);
1247 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1249 updateEditMenuBar();
1250 originalSource.firePropertyChange("alignment", null,
1251 originalSource.alignment.getSequences());
1254 AlignViewport getOriginatingSource(CommandI command)
1256 AlignViewport originalSource = null;
1257 // For sequence removal and addition, we need to fire
1258 // the property change event FROM the viewport where the
1259 // original alignment was altered
1260 AlignmentI al = null;
1261 if (command instanceof EditCommand)
1263 EditCommand editCommand = (EditCommand) command;
1264 al = editCommand.getAlignment();
1265 Vector comps = (Vector) PaintRefresher.components.get(viewport
1266 .getSequenceSetId());
1267 for (int i = 0; i < comps.size(); i++)
1269 if (comps.elementAt(i) instanceof AlignmentPanel)
1271 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1273 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1280 if (originalSource == null)
1282 // The original view is closed, we must validate
1283 // the current view against the closed view first
1286 PaintRefresher.validateSequences(al, viewport.alignment);
1289 originalSource = viewport;
1292 return originalSource;
1295 public void moveSelectedSequences(boolean up)
1297 SequenceGroup sg = viewport.getSelectionGroup();
1305 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1307 SequenceI seq = viewport.alignment.getSequenceAt(i);
1308 if (!sg.getSequences(null).contains(seq))
1313 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1314 if (sg.getSequences(null).contains(temp))
1319 viewport.alignment.getSequences().setElementAt(temp, i);
1320 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1325 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1327 SequenceI seq = viewport.alignment.getSequenceAt(i);
1328 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1333 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1334 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1339 viewport.alignment.getSequences().setElementAt(temp, i);
1340 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1344 alignPanel.paintAlignment(true);
1347 synchronized void slideSequences(boolean right, int size)
1349 Vector sg = new Vector();
1350 if (viewport.cursorMode)
1352 sg.addElement(viewport.alignment
1353 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1355 else if (viewport.getSelectionGroup() != null
1356 && viewport.getSelectionGroup().getSize() != viewport.alignment
1359 sg = viewport.getSelectionGroup().getSequences(
1360 viewport.hiddenRepSequences);
1368 Vector invertGroup = new Vector();
1370 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1372 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1373 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1376 SequenceI[] seqs1 = new SequenceI[sg.size()];
1377 for (int i = 0; i < sg.size(); i++)
1378 seqs1[i] = (SequenceI) sg.elementAt(i);
1380 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1381 for (int i = 0; i < invertGroup.size(); i++)
1382 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1384 SlideSequencesCommand ssc;
1386 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1387 size, viewport.getGapCharacter());
1389 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1390 size, viewport.getGapCharacter());
1392 int groupAdjustment = 0;
1393 if (ssc.getGapsInsertedBegin() && right)
1395 if (viewport.cursorMode)
1396 alignPanel.seqPanel.moveCursor(size, 0);
1398 groupAdjustment = size;
1400 else if (!ssc.getGapsInsertedBegin() && !right)
1402 if (viewport.cursorMode)
1403 alignPanel.seqPanel.moveCursor(-size, 0);
1405 groupAdjustment = -size;
1408 if (groupAdjustment != 0)
1410 viewport.getSelectionGroup().setStartRes(
1411 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1412 viewport.getSelectionGroup().setEndRes(
1413 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1416 boolean appendHistoryItem = false;
1417 if (viewport.historyList != null && viewport.historyList.size() > 0
1418 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1420 appendHistoryItem = ssc
1421 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1425 if (!appendHistoryItem)
1426 addHistoryItem(ssc);
1431 static StringBuffer copiedSequences;
1433 static Vector copiedHiddenColumns;
1435 protected void copy_actionPerformed()
1437 if (viewport.getSelectionGroup() == null)
1442 SequenceGroup sg = viewport.getSelectionGroup();
1443 copiedSequences = new StringBuffer();
1444 Hashtable orderedSeqs = new Hashtable();
1445 for (int i = 0; i < sg.getSize(); i++)
1447 SequenceI seq = sg.getSequenceAt(i);
1448 int index = viewport.alignment.findIndex(seq);
1449 orderedSeqs.put(index + "", seq);
1452 int index = 0, startRes, endRes;
1455 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1457 copiedHiddenColumns = new Vector();
1458 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1459 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1462 int[] region = (int[]) viewport.getColumnSelection()
1463 .getHiddenColumns().elementAt(i);
1465 copiedHiddenColumns.addElement(new int[]
1466 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1471 copiedHiddenColumns = null;
1474 for (int i = 0; i < sg.getSize(); i++)
1476 SequenceI seq = null;
1480 if (orderedSeqs.containsKey(index + ""))
1482 seq = (SequenceI) orderedSeqs.get(index + "");
1494 // Returns residue following index if gap
1495 startRes = seq.findPosition(sg.getStartRes());
1498 // Need to find the residue preceeding index if gap
1501 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1503 ch = seq.getCharAt(j);
1504 if (!jalview.util.Comparison.isGap((ch)))
1512 endRes += seq.getStart() - 1;
1515 copiedSequences.append(seq.getName()
1521 + seq.getSequenceAsString(sg.getStartRes(),
1522 sg.getEndRes() + 1) + "\n");
1527 protected void pasteNew_actionPerformed()
1532 protected void pasteThis_actionPerformed()
1537 void paste(boolean newAlignment)
1542 if (copiedSequences == null)
1547 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1548 Vector seqs = new Vector();
1549 while (st.hasMoreElements())
1551 String name = st.nextToken();
1552 int start = Integer.parseInt(st.nextToken());
1553 int end = Integer.parseInt(st.nextToken());
1554 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1556 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1557 for (int i = 0; i < seqs.size(); i++)
1559 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1564 String newtitle = new String("Copied sequences");
1565 if (getTitle().startsWith("Copied sequences"))
1567 newtitle = getTitle();
1571 newtitle = newtitle.concat("- from " + getTitle());
1573 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1574 viewport.applet, newtitle, false);
1575 if (copiedHiddenColumns != null)
1577 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1579 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1580 af.viewport.hideColumns(region[0], region[1]);
1584 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1589 addSequences(newSeqs);
1592 } catch (Exception ex)
1594 } // could be anything being pasted in here
1598 void addSequences(SequenceI[] seqs)
1600 for (int i = 0; i < seqs.length; i++)
1602 viewport.alignment.addSequence(seqs[i]);
1606 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1607 seqs, 0, viewport.alignment.getWidth(), viewport.alignment));
1609 viewport.setEndSeq(viewport.alignment.getHeight());
1610 viewport.alignment.getWidth();
1611 viewport.firePropertyChange("alignment", null, viewport.alignment
1616 protected void cut_actionPerformed()
1618 copy_actionPerformed();
1619 delete_actionPerformed();
1622 protected void delete_actionPerformed()
1625 SequenceGroup sg = viewport.getSelectionGroup();
1631 Vector seqs = new Vector();
1633 for (int i = 0; i < sg.getSize(); i++)
1635 seq = sg.getSequenceAt(i);
1636 seqs.addElement(seq);
1639 // If the cut affects all sequences, remove highlighted columns
1640 if (sg.getSize() == viewport.alignment.getHeight())
1642 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1643 sg.getEndRes() + 1);
1646 SequenceI[] cut = new SequenceI[seqs.size()];
1647 for (int i = 0; i < seqs.size(); i++)
1649 cut[i] = (SequenceI) seqs.elementAt(i);
1653 * //ADD HISTORY ITEM
1655 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1656 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1657 viewport.alignment));
1659 viewport.setSelectionGroup(null);
1660 viewport.alignment.deleteGroup(sg);
1662 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1665 if (viewport.getAlignment().getHeight() < 1)
1667 this.setVisible(false);
1671 protected void makeGrpsFromSelection_actionPerformed()
1673 if (viewport.getSelectionGroup() != null)
1675 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
1676 viewport.getSequenceSelection(), viewport.getAlignmentView(
1677 true).getSequenceStrings(viewport.getGapCharacter()),
1678 viewport.alignment.getGroups());
1679 viewport.alignment.deleteAllGroups();
1680 viewport.sequenceColours = null;
1681 viewport.setSelectionGroup(null);
1682 // set view properties for each group
1683 for (int g = 0; g < gps.length; g++)
1685 // gps[g].setShowunconserved(viewport.getShowUnconserved());
1686 gps[g].setIncludeAllConsSymbols(viewport
1687 .isIncludeAllConsensusSymbols());
1688 viewport.alignment.addGroup(gps[g]);
1689 Color col = new Color((int) (Math.random() * 255), (int) (Math
1690 .random() * 255), (int) (Math.random() * 255));
1691 col = col.brighter();
1692 for (Enumeration sq = gps[g].getSequences(null).elements(); sq
1693 .hasMoreElements(); viewport.setSequenceColour(
1694 (SequenceI) sq.nextElement(), col))
1697 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1698 // alignPanel.updateAnnotation();
1699 alignPanel.paintAlignment(true);
1703 protected void deleteGroups_actionPerformed()
1705 viewport.alignment.deleteAllGroups();
1706 viewport.sequenceColours = null;
1707 viewport.setSelectionGroup(null);
1709 alignPanel.paintAlignment(true);
1712 public void selectAllSequenceMenuItem_actionPerformed()
1714 SequenceGroup sg = new SequenceGroup();
1715 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1717 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1719 sg.setEndRes(viewport.alignment.getWidth() - 1);
1720 viewport.setSelectionGroup(sg);
1721 alignPanel.paintAlignment(true);
1722 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1725 public void deselectAllSequenceMenuItem_actionPerformed()
1727 if (viewport.cursorMode)
1729 alignPanel.seqPanel.keyboardNo1 = null;
1730 alignPanel.seqPanel.keyboardNo2 = null;
1732 viewport.setSelectionGroup(null);
1733 viewport.getColumnSelection().clear();
1734 viewport.setSelectionGroup(null);
1735 alignPanel.idPanel.idCanvas.searchResults = null;
1736 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1737 alignPanel.paintAlignment(true);
1738 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1741 public void invertSequenceMenuItem_actionPerformed()
1743 SequenceGroup sg = viewport.getSelectionGroup();
1744 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1746 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1749 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1752 public void invertColSel_actionPerformed()
1754 viewport.invertColumnSelection();
1755 alignPanel.paintAlignment(true);
1756 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1759 void trimAlignment(boolean trimLeft)
1761 ColumnSelection colSel = viewport.getColumnSelection();
1764 if (colSel.size() > 0)
1768 column = colSel.getMin();
1772 column = colSel.getMax();
1776 if (viewport.getSelectionGroup() != null)
1778 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1779 viewport.hiddenRepSequences);
1783 seqs = viewport.alignment.getSequencesArray();
1786 TrimRegionCommand trimRegion;
1789 trimRegion = new TrimRegionCommand("Remove Left",
1790 TrimRegionCommand.TRIM_LEFT, seqs, column,
1791 viewport.alignment, viewport.colSel,
1792 viewport.selectionGroup);
1793 viewport.setStartRes(0);
1797 trimRegion = new TrimRegionCommand("Remove Right",
1798 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1799 viewport.alignment, viewport.colSel,
1800 viewport.selectionGroup);
1803 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1805 addHistoryItem(trimRegion);
1807 Vector groups = viewport.alignment.getGroups();
1809 for (int i = 0; i < groups.size(); i++)
1811 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1813 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1814 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1816 viewport.alignment.deleteGroup(sg);
1820 viewport.firePropertyChange("alignment", null, viewport
1821 .getAlignment().getSequences());
1825 public void removeGappedColumnMenuItem_actionPerformed()
1827 int start = 0, end = viewport.alignment.getWidth() - 1;
1830 if (viewport.getSelectionGroup() != null)
1832 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1833 viewport.hiddenRepSequences);
1834 start = viewport.getSelectionGroup().getStartRes();
1835 end = viewport.getSelectionGroup().getEndRes();
1839 seqs = viewport.alignment.getSequencesArray();
1842 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1843 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1845 addHistoryItem(removeGapCols);
1847 statusBar.setText("Removed " + removeGapCols.getSize()
1848 + " empty columns.");
1850 // This is to maintain viewport position on first residue
1851 // of first sequence
1852 SequenceI seq = viewport.alignment.getSequenceAt(0);
1853 int startRes = seq.findPosition(viewport.startRes);
1854 // ShiftList shifts;
1855 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1856 // edit.alColumnChanges=shifts.getInverse();
1857 // if (viewport.hasHiddenColumns)
1858 // viewport.getColumnSelection().compensateForEdits(shifts);
1859 viewport.setStartRes(seq.findIndex(startRes) - 1);
1860 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1865 public void removeAllGapsMenuItem_actionPerformed()
1867 int start = 0, end = viewport.alignment.getWidth() - 1;
1870 if (viewport.getSelectionGroup() != null)
1872 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1873 viewport.hiddenRepSequences);
1874 start = viewport.getSelectionGroup().getStartRes();
1875 end = viewport.getSelectionGroup().getEndRes();
1879 seqs = viewport.alignment.getSequencesArray();
1882 // This is to maintain viewport position on first residue
1883 // of first sequence
1884 SequenceI seq = viewport.alignment.getSequenceAt(0);
1885 int startRes = seq.findPosition(viewport.startRes);
1887 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1888 viewport.alignment));
1890 viewport.setStartRes(seq.findIndex(startRes) - 1);
1892 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1897 public void findMenuItem_actionPerformed()
1899 new Finder(alignPanel);
1903 * create a new view derived from the current view
1906 * @return frame for the new view
1908 public AlignFrame newView(String viewtitle)
1911 if (viewport.hasHiddenRows)
1913 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1914 .getFullAlignment().getSequencesArray());
1918 newal = new Alignment(viewport.alignment.getSequencesArray());
1921 if (viewport.alignment.getAlignmentAnnotation() != null)
1923 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1925 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1928 .addAnnotation(viewport.alignment
1929 .getAlignmentAnnotation()[i]);
1934 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
1936 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1937 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1938 PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av
1939 .getSequenceSetId());
1941 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1942 newaf.alignPanel.av.getSequenceSetId());
1943 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1944 newaf.alignPanel.av.getSequenceSetId());
1946 Vector comps = (Vector) PaintRefresher.components.get(viewport
1947 .getSequenceSetId());
1949 for (int i = 0; i < comps.size(); i++)
1951 if (comps.elementAt(i) instanceof AlignmentPanel)
1957 String title = new String(this.getTitle());
1958 if (viewtitle != null)
1960 title = viewtitle + " ( " + title + ")";
1964 if (title.indexOf("(View") > -1)
1966 title = title.substring(0, title.indexOf("(View"));
1968 title += "(View " + viewSize + ")";
1971 newaf.setTitle(title.toString());
1973 newaf.viewport.historyList = viewport.historyList;
1974 newaf.viewport.redoList = viewport.redoList;
1980 * @return list of feature groups on the view
1982 public String[] getFeatureGroups()
1984 FeatureRenderer fr = null;
1985 if (alignPanel != null
1986 && (fr = alignPanel.getFeatureRenderer()) != null)
1988 return fr.getGroups();
1994 * get sequence feature groups that are hidden or shown
2000 public String[] getFeatureGroupsOfState(boolean visible)
2002 FeatureRenderer fr = null;
2003 if (alignPanel != null
2004 && (fr = alignPanel.getFeatureRenderer()) != null)
2006 return fr.getGroups(visible);
2012 * Change the display state for the given feature groups
2015 * list of group strings
2017 * visible or invisible
2019 public void setFeatureGroupState(String[] groups, boolean state)
2021 FeatureRenderer fr = null;
2022 this.sequenceFeatures.setState(true);
2023 viewport.showSequenceFeatures(true);
2024 if (alignPanel != null
2025 && (fr = alignPanel.getFeatureRenderer()) != null)
2027 fr.setGroupState(groups, state);
2028 alignPanel.seqPanel.seqCanvas.repaint();
2029 if (alignPanel.overviewPanel != null)
2031 alignPanel.overviewPanel.updateOverviewImage();
2036 public void seqLimits_itemStateChanged()
2038 viewport.setShowJVSuffix(seqLimits.getState());
2039 alignPanel.fontChanged();
2040 alignPanel.paintAlignment(true);
2043 protected void colourTextMenuItem_actionPerformed()
2045 viewport.setColourText(colourTextMenuItem.getState());
2046 alignPanel.paintAlignment(true);
2049 protected void displayNonconservedMenuItem_actionPerformed()
2051 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2052 alignPanel.paintAlignment(true);
2055 protected void wrapMenuItem_actionPerformed()
2057 viewport.setWrapAlignment(wrapMenuItem.getState());
2058 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2059 scaleAbove.setEnabled(wrapMenuItem.getState());
2060 scaleLeft.setEnabled(wrapMenuItem.getState());
2061 scaleRight.setEnabled(wrapMenuItem.getState());
2062 alignPanel.paintAlignment(true);
2065 public void overviewMenuItem_actionPerformed()
2067 if (alignPanel.overviewPanel != null)
2072 Frame frame = new Frame();
2073 OverviewPanel overview = new OverviewPanel(alignPanel);
2074 frame.add(overview);
2075 // +50 must allow for applet frame window
2076 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
2077 overview.getPreferredSize().width,
2078 overview.getPreferredSize().height + 50);
2081 frame.addWindowListener(new WindowAdapter()
2083 public void windowClosing(WindowEvent e)
2085 alignPanel.setOverviewPanel(null);
2089 alignPanel.setOverviewPanel(overview);
2093 void changeColour(ColourSchemeI cs)
2099 if (viewport.getAbovePIDThreshold())
2101 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2104 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2106 viewport.setGlobalColourScheme(cs);
2110 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2113 if (viewport.getConservationSelected())
2116 Alignment al = (Alignment) viewport.alignment;
2117 Conservation c = new Conservation("All",
2118 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2122 c.verdict(false, viewport.ConsPercGaps);
2124 cs.setConservation(c);
2126 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2132 cs.setConservation(null);
2135 cs.setConsensus(viewport.hconsensus);
2138 viewport.setGlobalColourScheme(cs);
2140 if (viewport.getColourAppliesToAllGroups())
2142 Vector groups = viewport.alignment.getGroups();
2143 for (int i = 0; i < groups.size(); i++)
2145 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2152 if (cs instanceof ClustalxColourScheme)
2154 sg.cs = new ClustalxColourScheme(sg
2155 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2161 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2162 } catch (Exception ex)
2164 ex.printStackTrace();
2169 if (viewport.getAbovePIDThreshold()
2170 || cs instanceof PIDColourScheme
2171 || cs instanceof Blosum62ColourScheme)
2173 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2174 sg.cs.setConsensus(AAFrequency.calculate(sg
2175 .getSequences(viewport.hiddenRepSequences), 0, sg
2180 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2183 if (viewport.getConservationSelected())
2185 Conservation c = new Conservation("Group",
2186 ResidueProperties.propHash, 3, sg
2187 .getSequences(viewport.hiddenRepSequences), 0,
2188 viewport.alignment.getWidth() - 1);
2190 c.verdict(false, viewport.ConsPercGaps);
2191 sg.cs.setConservation(c);
2195 sg.cs.setConservation(null);
2196 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2202 if (alignPanel.getOverviewPanel() != null)
2204 alignPanel.getOverviewPanel().updateOverviewImage();
2207 jalview.structure.StructureSelectionManager
2208 .getStructureSelectionManager().sequenceColoursChanged(
2211 alignPanel.paintAlignment(true);
2214 protected void modifyPID_actionPerformed()
2216 if (viewport.getAbovePIDThreshold()
2217 && viewport.globalColourScheme != null)
2219 SliderPanel.setPIDSliderSource(alignPanel, viewport
2220 .getGlobalColourScheme(), "Background");
2221 SliderPanel.showPIDSlider();
2225 protected void modifyConservation_actionPerformed()
2227 if (viewport.getConservationSelected()
2228 && viewport.globalColourScheme != null)
2230 SliderPanel.setConservationSlider(alignPanel,
2231 viewport.globalColourScheme, "Background");
2232 SliderPanel.showConservationSlider();
2236 protected void conservationMenuItem_actionPerformed()
2238 viewport.setConservationSelected(conservationMenuItem.getState());
2240 viewport.setAbovePIDThreshold(false);
2241 abovePIDThreshold.setState(false);
2243 changeColour(viewport.getGlobalColourScheme());
2245 modifyConservation_actionPerformed();
2248 public void abovePIDThreshold_actionPerformed()
2250 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2252 conservationMenuItem.setState(false);
2253 viewport.setConservationSelected(false);
2255 changeColour(viewport.getGlobalColourScheme());
2257 modifyPID_actionPerformed();
2260 public void sortPairwiseMenuItem_actionPerformed()
2262 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2263 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2264 .getAlignment().getSequenceAt(0), null);
2266 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2267 viewport.alignment));
2268 alignPanel.paintAlignment(true);
2271 public void sortIDMenuItem_actionPerformed()
2273 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2274 AlignmentSorter.sortByID(viewport.getAlignment());
2275 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2276 alignPanel.paintAlignment(true);
2279 public void sortLengthMenuItem_actionPerformed()
2281 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2282 AlignmentSorter.sortByLength(viewport.getAlignment());
2283 addHistoryItem(new OrderCommand("Length Sort", oldOrder, viewport.alignment));
2284 alignPanel.paintAlignment(true);
2287 public void sortGroupMenuItem_actionPerformed()
2289 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2290 AlignmentSorter.sortByGroup(viewport.getAlignment());
2291 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2292 viewport.alignment));
2293 alignPanel.paintAlignment(true);
2297 public void removeRedundancyMenuItem_actionPerformed()
2299 new RedundancyPanel(alignPanel);
2302 public void pairwiseAlignmentMenuItem_actionPerformed()
2304 if (viewport.getSelectionGroup() != null
2305 && viewport.getSelectionGroup().getSize() > 1)
2307 Frame frame = new Frame();
2308 frame.add(new PairwiseAlignPanel(alignPanel));
2309 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2314 public void PCAMenuItem_actionPerformed()
2316 // are the sequences aligned?
2317 if (!viewport.alignment.isAligned(false))
2320 int Width = viewport.getAlignment().getWidth();
2322 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2324 current = viewport.getAlignment().getSequenceAt(i);
2326 if (current.getLength() < Width)
2328 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2331 alignPanel.paintAlignment(true);
2334 if ((viewport.getSelectionGroup() != null
2335 && viewport.getSelectionGroup().getSize() < 4 && viewport
2336 .getSelectionGroup().getSize() > 0)
2337 || viewport.getAlignment().getHeight() < 4)
2344 new PCAPanel(viewport);
2345 } catch (java.lang.OutOfMemoryError ex)
2351 public void averageDistanceTreeMenuItem_actionPerformed()
2353 NewTreePanel("AV", "PID", "Average distance tree using PID");
2356 public void neighbourTreeMenuItem_actionPerformed()
2358 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2361 protected void njTreeBlosumMenuItem_actionPerformed()
2363 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2366 protected void avTreeBlosumMenuItem_actionPerformed()
2368 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2371 void NewTreePanel(String type, String pwType, String title)
2373 // are the sequences aligned?
2374 if (!viewport.alignment.isAligned(false))
2377 int Width = viewport.getAlignment().getWidth();
2379 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2381 current = viewport.getAlignment().getSequenceAt(i);
2383 if (current.getLength() < Width)
2385 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2388 alignPanel.paintAlignment(true);
2392 if ((viewport.getSelectionGroup() != null && viewport
2393 .getSelectionGroup().getSize() > 1)
2394 || (viewport.getSelectionGroup() == null && viewport.alignment
2397 final TreePanel tp = new TreePanel(viewport, type, pwType);
2399 addTreeMenuItem(tp, title);
2401 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2405 void loadTree_actionPerformed()
2407 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2408 cap.setText("Paste your Newick tree file here.");
2409 cap.setTreeImport();
2410 Frame frame = new Frame();
2412 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2415 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2417 TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree);
2418 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2419 addTreeMenuItem(tp, treeFile);
2423 * sort the alignment using the given treePanel
2426 * tree used to sort view
2428 * string used for undo event name
2430 public void sortByTree(TreePanel treePanel, String title)
2432 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2434 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2435 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2436 // HistoryItem.SORT));
2437 addHistoryItem(new OrderCommand("Order by " + title, oldOrder,
2438 viewport.alignment));
2439 alignPanel.paintAlignment(true);
2443 * Do any automatic reordering of the alignment and add the necessary bits to
2444 * the menu structure for the new tree
2449 protected void addTreeMenuItem(final TreePanel treePanel,
2452 final MenuItem item = new MenuItem(title);
2453 sortByTreeMenu.add(item);
2454 item.addActionListener(new java.awt.event.ActionListener()
2456 public void actionPerformed(ActionEvent evt)
2458 sortByTree(treePanel, title); // treePanel.getTitle());
2462 treePanel.addWindowListener(new WindowAdapter()
2464 public void windowOpened(WindowEvent e)
2466 if (viewport.sortByTree)
2468 sortByTree(treePanel, title);
2470 super.windowOpened(e);
2473 public void windowClosing(WindowEvent e)
2475 sortByTreeMenu.remove(item);
2480 protected void documentation_actionPerformed()
2482 showURL("http://www.jalview.org/help.html", "HELP");
2485 protected void about_actionPerformed()
2488 class AboutPanel extends Canvas
2494 public AboutPanel(String version, String builddate)
2496 this.version = version;
2497 this.builddate = builddate;
2500 public void paint(Graphics g)
2502 g.setColor(Color.white);
2503 g.fillRect(0, 0, getSize().width, getSize().height);
2504 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2505 FontMetrics fm = g.getFontMetrics();
2506 int fh = fm.getHeight();
2508 g.setColor(Color.black);
2509 // TODO: update this text for each release or centrally store it for
2510 // lite and application
2511 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2512 g.drawString("JalviewLite - Release " + version, x, y += fh);
2513 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2514 g.drawString("Build date: " + builddate, x, y += fh);
2515 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2518 "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,",
2520 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2523 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2527 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2529 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2532 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",
2536 "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",
2538 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",
2543 Frame frame = new Frame();
2544 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2546 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2550 public void showURL(String url, String target)
2552 if (viewport.applet == null)
2554 System.out.println("Not running as applet - no browser available.");
2560 if (url.indexOf(":") == -1)
2562 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to
2564 if (url.indexOf("/") == 0)
2566 String codebase = viewport.applet.getCodeBase().toString();
2567 url = codebase.substring(0, codebase.length()
2568 - viewport.applet.getCodeBase().getFile().length())
2573 url = viewport.applet.getCodeBase() + url;
2575 System.out.println("Show url (prepended codebase): " + url);
2579 System.out.println("Show url: " + url);
2581 viewport.applet.getAppletContext().showDocument(
2582 new java.net.URL(url), target);
2583 } catch (Exception ex)
2585 ex.printStackTrace();
2590 // ////////////////////////////////////////////////////////////////////////////////
2591 // JBuilder Graphics here
2593 MenuBar alignFrameMenuBar = new MenuBar();
2595 Menu fileMenu = new Menu("File");
2597 MenuItem loadApplication = new MenuItem("View in Full Application");
2599 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2601 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2603 MenuItem outputFeatures = new MenuItem("Export Features ...");
2605 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2607 MenuItem closeMenuItem = new MenuItem("Close");
2609 Menu editMenu = new Menu("Edit");
2611 Menu viewMenu = new Menu("View");
2613 Menu colourMenu = new Menu("Colour");
2615 Menu calculateMenu = new Menu("Calculate");
2617 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2619 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2621 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2623 MenuItem remove2LeftMenuItem = new MenuItem();
2625 MenuItem remove2RightMenuItem = new MenuItem();
2627 MenuItem removeGappedColumnMenuItem = new MenuItem();
2629 MenuItem removeAllGapsMenuItem = new MenuItem();
2631 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2633 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2635 MenuItem sortPairwiseMenuItem = new MenuItem();
2637 MenuItem sortIDMenuItem = new MenuItem();
2639 MenuItem sortLengthMenuItem = new MenuItem();
2641 MenuItem sortGroupMenuItem = new MenuItem();
2643 MenuItem removeRedundancyMenuItem = new MenuItem();
2645 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2647 MenuItem PCAMenuItem = new MenuItem();
2649 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2651 MenuItem neighbourTreeMenuItem = new MenuItem();
2653 BorderLayout borderLayout1 = new BorderLayout();
2655 public Label statusBar = new Label();
2657 Menu outputTextboxMenu = new Menu();
2659 MenuItem clustalColour = new MenuItem();
2661 MenuItem zappoColour = new MenuItem();
2663 MenuItem taylorColour = new MenuItem();
2665 MenuItem hydrophobicityColour = new MenuItem();
2667 MenuItem helixColour = new MenuItem();
2669 MenuItem strandColour = new MenuItem();
2671 MenuItem turnColour = new MenuItem();
2673 MenuItem buriedColour = new MenuItem();
2675 MenuItem userDefinedColour = new MenuItem();
2677 MenuItem PIDColour = new MenuItem();
2679 MenuItem BLOSUM62Colour = new MenuItem();
2681 MenuItem njTreeBlosumMenuItem = new MenuItem();
2683 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2685 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2687 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2689 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2691 MenuItem alProperties = new MenuItem("Alignment Properties...");
2693 MenuItem overviewMenuItem = new MenuItem();
2695 MenuItem undoMenuItem = new MenuItem();
2697 MenuItem redoMenuItem = new MenuItem();
2699 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2701 MenuItem noColourmenuItem = new MenuItem();
2703 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2705 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2707 MenuItem findMenuItem = new MenuItem();
2709 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2711 MenuItem nucleotideColour = new MenuItem();
2713 MenuItem deleteGroups = new MenuItem();
2715 MenuItem grpsFromSelection = new MenuItem();
2717 MenuItem delete = new MenuItem();
2719 MenuItem copy = new MenuItem();
2721 MenuItem cut = new MenuItem();
2723 Menu pasteMenu = new Menu();
2725 MenuItem pasteNew = new MenuItem();
2727 MenuItem pasteThis = new MenuItem();
2729 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2731 MenuItem font = new MenuItem();
2733 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2735 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2737 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2739 MenuItem modifyPID = new MenuItem();
2741 MenuItem modifyConservation = new MenuItem();
2743 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2744 "Autocalculate Consensus", true);
2746 Menu sortByTreeMenu = new Menu();
2748 Menu sort = new Menu();
2750 Menu calculate = new Menu();
2752 MenuItem inputText = new MenuItem();
2754 Menu helpMenu = new Menu();
2756 MenuItem documentation = new MenuItem();
2758 MenuItem about = new MenuItem();
2760 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2762 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2764 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2766 private void jbInit() throws Exception
2769 setMenuBar(alignFrameMenuBar);
2773 // dynamically fill save as menu with available formats
2774 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2777 item = new MenuItem(
2778 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2780 item.addActionListener(new java.awt.event.ActionListener()
2782 public void actionPerformed(ActionEvent e)
2784 outputText_actionPerformed(e);
2788 outputTextboxMenu.add(item);
2790 closeMenuItem.addActionListener(this);
2791 loadApplication.addActionListener(this);
2793 loadTree.addActionListener(this);
2794 loadAnnotations.addActionListener(this);
2795 outputFeatures.addActionListener(this);
2796 outputAnnotations.addActionListener(this);
2797 selectAllSequenceMenuItem.addActionListener(this);
2798 deselectAllSequenceMenuItem.addActionListener(this);
2799 invertSequenceMenuItem.addActionListener(this);
2800 remove2LeftMenuItem.setLabel("Remove Left");
2801 remove2LeftMenuItem.addActionListener(this);
2802 remove2RightMenuItem.setLabel("Remove Right");
2803 remove2RightMenuItem.addActionListener(this);
2804 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2805 removeGappedColumnMenuItem.addActionListener(this);
2806 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2807 removeAllGapsMenuItem.addActionListener(this);
2808 viewBoxesMenuItem.setLabel("Boxes");
2809 viewBoxesMenuItem.setState(true);
2810 viewBoxesMenuItem.addItemListener(this);
2811 viewTextMenuItem.setLabel("Text");
2812 viewTextMenuItem.setState(true);
2813 viewTextMenuItem.addItemListener(this);
2814 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2815 sortPairwiseMenuItem.addActionListener(this);
2816 sortIDMenuItem.setLabel("by ID");
2817 sortIDMenuItem.addActionListener(this);
2818 sortLengthMenuItem.setLabel("by Length");
2819 sortLengthMenuItem.addActionListener(this);
2820 sortGroupMenuItem.setLabel("by Group");
2821 sortGroupMenuItem.addActionListener(this);
2822 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2823 removeRedundancyMenuItem.addActionListener(this);
2824 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2825 pairwiseAlignmentMenuItem.addActionListener(this);
2826 PCAMenuItem.setLabel("Principal Component Analysis");
2827 PCAMenuItem.addActionListener(this);
2828 averageDistanceTreeMenuItem
2829 .setLabel("Average Distance Using % Identity");
2830 averageDistanceTreeMenuItem.addActionListener(this);
2831 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2832 neighbourTreeMenuItem.addActionListener(this);
2833 statusBar.setBackground(Color.white);
2834 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2835 statusBar.setText("Status bar");
2836 outputTextboxMenu.setLabel("Output to Textbox");
2837 clustalColour.setLabel("Clustalx");
2839 clustalColour.addActionListener(this);
2840 zappoColour.setLabel("Zappo");
2841 zappoColour.addActionListener(this);
2842 taylorColour.setLabel("Taylor");
2843 taylorColour.addActionListener(this);
2844 hydrophobicityColour.setLabel("Hydrophobicity");
2845 hydrophobicityColour.addActionListener(this);
2846 helixColour.setLabel("Helix Propensity");
2847 helixColour.addActionListener(this);
2848 strandColour.setLabel("Strand Propensity");
2849 strandColour.addActionListener(this);
2850 turnColour.setLabel("Turn Propensity");
2851 turnColour.addActionListener(this);
2852 buriedColour.setLabel("Buried Index");
2853 buriedColour.addActionListener(this);
2854 userDefinedColour.setLabel("User Defined...");
2855 userDefinedColour.addActionListener(this);
2856 PIDColour.setLabel("Percentage Identity");
2857 PIDColour.addActionListener(this);
2858 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2859 BLOSUM62Colour.addActionListener(this);
2860 avDistanceTreeBlosumMenuItem
2861 .setLabel("Average Distance Using BLOSUM62");
2862 avDistanceTreeBlosumMenuItem.addActionListener(this);
2863 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2864 njTreeBlosumMenuItem.addActionListener(this);
2865 annotationPanelMenuItem.setLabel("Show Annotations");
2866 annotationPanelMenuItem.addItemListener(this);
2867 colourTextMenuItem.setLabel("Colour Text");
2868 colourTextMenuItem.addItemListener(this);
2869 displayNonconservedMenuItem.setLabel("Show non-conserved");
2870 displayNonconservedMenuItem.addItemListener(this);
2871 alProperties.addActionListener(this);
2872 overviewMenuItem.setLabel("Overview Window");
2873 overviewMenuItem.addActionListener(this);
2874 undoMenuItem.setEnabled(false);
2875 undoMenuItem.setLabel("Undo");
2876 undoMenuItem.addActionListener(this);
2877 redoMenuItem.setEnabled(false);
2878 redoMenuItem.setLabel("Redo");
2879 redoMenuItem.addActionListener(this);
2880 conservationMenuItem.setLabel("by Conservation");
2881 conservationMenuItem.addItemListener(this);
2882 noColourmenuItem.setLabel("None");
2883 noColourmenuItem.addActionListener(this);
2884 wrapMenuItem.setLabel("Wrap");
2885 wrapMenuItem.addItemListener(this);
2886 renderGapsMenuItem.setLabel("Show Gaps");
2887 renderGapsMenuItem.setState(true);
2888 renderGapsMenuItem.addItemListener(this);
2889 findMenuItem.setLabel("Find...");
2890 findMenuItem.addActionListener(this);
2891 abovePIDThreshold.setLabel("Above Identity Threshold");
2892 abovePIDThreshold.addItemListener(this);
2893 nucleotideColour.setLabel("Nucleotide");
2894 nucleotideColour.addActionListener(this);
2895 deleteGroups.setLabel("Undefine Groups");
2896 deleteGroups.addActionListener(this);
2897 grpsFromSelection.setLabel("Make Groups for selection");
2898 grpsFromSelection.addActionListener(this);
2899 copy.setLabel("Copy");
2900 copy.addActionListener(this);
2901 cut.setLabel("Cut");
2902 cut.addActionListener(this);
2903 delete.setLabel("Delete");
2904 delete.addActionListener(this);
2905 pasteMenu.setLabel("Paste");
2906 pasteNew.setLabel("To New Alignment");
2907 pasteNew.addActionListener(this);
2908 pasteThis.setLabel("Add To This Alignment");
2909 pasteThis.addActionListener(this);
2910 applyToAllGroups.setLabel("Apply Colour To All Groups");
2911 applyToAllGroups.setState(true);
2912 applyToAllGroups.addItemListener(this);
2913 font.setLabel("Font...");
2914 font.addActionListener(this);
2915 scaleAbove.setLabel("Scale Above");
2916 scaleAbove.setState(true);
2917 scaleAbove.setEnabled(false);
2918 scaleAbove.addItemListener(this);
2919 scaleLeft.setEnabled(false);
2920 scaleLeft.setState(true);
2921 scaleLeft.setLabel("Scale Left");
2922 scaleLeft.addItemListener(this);
2923 scaleRight.setEnabled(false);
2924 scaleRight.setState(true);
2925 scaleRight.setLabel("Scale Right");
2926 scaleRight.addItemListener(this);
2927 modifyPID.setLabel("Modify Identity Threshold...");
2928 modifyPID.addActionListener(this);
2929 modifyConservation.setLabel("Modify Conservation Threshold...");
2930 modifyConservation.addActionListener(this);
2931 sortByTreeMenu.setLabel("By Tree Order");
2932 sort.setLabel("Sort");
2933 calculate.setLabel("Calculate Tree");
2934 autoCalculate.addItemListener(this);
2935 inputText.setLabel("Input from textbox");
2936 inputText.addActionListener(this);
2937 centreColumnLabelFlag.setLabel("Centre column labels");
2938 centreColumnLabelFlag.addItemListener(this);
2939 followMouseOverFlag.setLabel("Automatic Scrolling");
2940 followMouseOverFlag.addItemListener(this);
2941 helpMenu.setLabel("Help");
2942 documentation.setLabel("Documentation");
2943 documentation.addActionListener(this);
2945 about.setLabel("About...");
2946 about.addActionListener(this);
2947 seqLimits.setState(true);
2948 seqLimits.setLabel("Show Sequence Limits");
2949 seqLimits.addItemListener(this);
2950 featureSettings.setLabel("Feature Settings...");
2951 featureSettings.addActionListener(this);
2952 sequenceFeatures.setLabel("Sequence Features");
2953 sequenceFeatures.addItemListener(this);
2954 sequenceFeatures.setState(false);
2955 annotationColour.setLabel("by Annotation...");
2956 annotationColour.addActionListener(this);
2957 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2958 invertColSel.setLabel("Invert Column Selection");
2959 menu1.setLabel("Show");
2960 showColumns.setLabel("All Columns ");
2961 showSeqs.setLabel("All Sequences");
2962 menu2.setLabel("Hide");
2963 hideColumns.setLabel("Selected Columns");
2964 hideSequences.setLabel("Selected Sequences");
2965 hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)");
2966 hideAllSelection.setLabel("Selected Region");
2967 showAllHidden.setLabel("All Sequences and Columns");
2968 invertColSel.addActionListener(this);
2969 showColumns.addActionListener(this);
2970 showSeqs.addActionListener(this);
2971 hideColumns.addActionListener(this);
2972 hideSequences.addActionListener(this);
2973 hideAllButSelection.addActionListener(this);
2974 hideAllSelection.addActionListener(this);
2975 showAllHidden.addActionListener(this);
2976 formatMenu.setLabel("Format");
2977 selectMenu.setLabel("Select");
2978 newView.setLabel("New View");
2979 newView.addActionListener(this);
2980 alignFrameMenuBar.add(fileMenu);
2981 alignFrameMenuBar.add(editMenu);
2982 alignFrameMenuBar.add(selectMenu);
2983 alignFrameMenuBar.add(viewMenu);
2984 alignFrameMenuBar.add(formatMenu);
2985 alignFrameMenuBar.add(colourMenu);
2986 alignFrameMenuBar.add(calculateMenu);
2987 alignFrameMenuBar.add(helpMenu);
2989 fileMenu.add(inputText);
2990 fileMenu.add(loadTree);
2991 fileMenu.add(loadAnnotations);
2993 fileMenu.addSeparator();
2994 fileMenu.add(outputTextboxMenu);
2995 fileMenu.add(outputFeatures);
2996 fileMenu.add(outputAnnotations);
2998 if (jalviewServletURL != null)
3000 fileMenu.add(loadApplication);
3003 fileMenu.addSeparator();
3004 fileMenu.add(closeMenuItem);
3006 editMenu.add(undoMenuItem);
3007 editMenu.add(redoMenuItem);
3010 editMenu.add(pasteMenu);
3011 editMenu.add(delete);
3012 editMenu.addSeparator();
3013 editMenu.add(remove2LeftMenuItem);
3014 editMenu.add(remove2RightMenuItem);
3015 editMenu.add(removeGappedColumnMenuItem);
3016 editMenu.add(removeAllGapsMenuItem);
3017 editMenu.add(removeRedundancyMenuItem);
3018 viewMenu.add(newView);
3019 viewMenu.addSeparator();
3020 viewMenu.add(menu1);
3021 viewMenu.add(menu2);
3022 viewMenu.addSeparator();
3023 viewMenu.add(followMouseOverFlag);
3024 viewMenu.add(annotationPanelMenuItem);
3025 viewMenu.addSeparator();
3026 viewMenu.add(sequenceFeatures);
3027 viewMenu.add(featureSettings);
3028 viewMenu.addSeparator();
3029 viewMenu.add(alProperties);
3030 viewMenu.addSeparator();
3031 viewMenu.add(overviewMenuItem);
3032 colourMenu.add(applyToAllGroups);
3033 colourMenu.addSeparator();
3034 colourMenu.add(noColourmenuItem);
3035 colourMenu.add(clustalColour);
3036 colourMenu.add(BLOSUM62Colour);
3037 colourMenu.add(PIDColour);
3038 colourMenu.add(zappoColour);
3039 colourMenu.add(taylorColour);
3040 colourMenu.add(hydrophobicityColour);
3041 colourMenu.add(helixColour);
3042 colourMenu.add(strandColour);
3043 colourMenu.add(turnColour);
3044 colourMenu.add(buriedColour);
3045 colourMenu.add(nucleotideColour);
3046 colourMenu.add(userDefinedColour);
3047 colourMenu.addSeparator();
3048 colourMenu.add(conservationMenuItem);
3049 colourMenu.add(modifyConservation);
3050 colourMenu.add(abovePIDThreshold);
3051 colourMenu.add(modifyPID);
3052 colourMenu.add(annotationColour);
3053 calculateMenu.add(sort);
3054 calculateMenu.add(calculate);
3055 calculateMenu.addSeparator();
3056 calculateMenu.add(pairwiseAlignmentMenuItem);
3057 calculateMenu.add(PCAMenuItem);
3058 calculateMenu.add(autoCalculate);
3059 this.add(statusBar, BorderLayout.SOUTH);
3060 pasteMenu.add(pasteNew);
3061 pasteMenu.add(pasteThis);
3062 sort.add(sortIDMenuItem);
3063 sort.add(sortLengthMenuItem);
3064 sort.add(sortByTreeMenu);
3065 sort.add(sortGroupMenuItem);
3066 sort.add(sortPairwiseMenuItem);
3067 calculate.add(averageDistanceTreeMenuItem);
3068 calculate.add(neighbourTreeMenuItem);
3069 calculate.add(avDistanceTreeBlosumMenuItem);
3070 calculate.add(njTreeBlosumMenuItem);
3071 helpMenu.add(documentation);
3072 helpMenu.add(about);
3073 menu1.add(showColumns);
3074 menu1.add(showSeqs);
3075 menu1.add(showAllHidden);
3076 menu2.add(hideColumns);
3077 menu2.add(hideSequences);
3078 menu2.add(hideAllSelection);
3079 menu2.add(hideAllButSelection);
3080 formatMenu.add(font);
3081 formatMenu.add(seqLimits);
3082 formatMenu.add(wrapMenuItem);
3083 formatMenu.add(scaleAbove);
3084 formatMenu.add(scaleLeft);
3085 formatMenu.add(scaleRight);
3086 formatMenu.add(viewBoxesMenuItem);
3087 formatMenu.add(viewTextMenuItem);
3088 formatMenu.add(colourTextMenuItem);
3089 formatMenu.add(displayNonconservedMenuItem);
3090 formatMenu.add(renderGapsMenuItem);
3091 formatMenu.add(centreColumnLabelFlag);
3092 selectMenu.add(findMenuItem);
3093 selectMenu.addSeparator();
3094 selectMenu.add(selectAllSequenceMenuItem);
3095 selectMenu.add(deselectAllSequenceMenuItem);
3096 selectMenu.add(invertSequenceMenuItem);
3097 selectMenu.add(invertColSel);
3098 selectMenu.add(grpsFromSelection);
3099 selectMenu.add(deleteGroups);
3103 MenuItem featureSettings = new MenuItem();
3105 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3107 MenuItem annotationColour = new MenuItem();
3109 MenuItem invertColSel = new MenuItem();
3111 Menu menu1 = new Menu();
3113 MenuItem showColumns = new MenuItem();
3115 MenuItem showSeqs = new MenuItem();
3117 Menu menu2 = new Menu();
3119 MenuItem hideColumns = new MenuItem();
3121 MenuItem hideSequences = new MenuItem();
3123 MenuItem hideAllButSelection = new MenuItem();
3125 MenuItem hideAllSelection = new MenuItem();
3127 MenuItem showAllHidden = new MenuItem();
3129 Menu formatMenu = new Menu();
3131 Menu selectMenu = new Menu();
3133 MenuItem newView = new MenuItem();
3136 * Attach the alignFrame panels after embedding menus, if necessary. This used
3137 * to be called setEmbedded, but is now creates the dropdown menus in a
3138 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3140 * @param reallyEmbedded
3141 * true to attach the view to the applet area on the page rather than
3144 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3149 // Explicly build the embedded menu panel for the on-page applet
3151 // view cannot be closed if its actually on the page
3152 fileMenu.remove(closeMenuItem);
3153 fileMenu.remove(3); // Remove Seperator
3154 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3155 Font.PLAIN, 10, false); // use our own fonts.
3156 // and actually add the components to the applet area
3157 viewport.applet.setLayout(new BorderLayout());
3158 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3159 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3160 alignPanel.setSize(viewport.applet.getSize().width, viewport.applet
3162 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
3163 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3164 viewport.applet.validate();
3169 // test and embed menu bar if necessary.
3171 if (embedMenuIfNeeded(alignPanel))
3173 // adjust for status bar height too
3174 alignPanel.setSize(getSize().width, getSize().height
3175 - statusBar.HEIGHT);
3177 add(statusBar, BorderLayout.SOUTH);
3178 add(alignPanel, BorderLayout.CENTER);
3179 // and register with the applet so it can pass external API calls to us
3180 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,