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].setshowSequenceLogo(viewport.isShowSequenceLogo());
1687 viewport.alignment.addGroup(gps[g]);
1688 Color col = new Color((int) (Math.random() * 255), (int) (Math
1689 .random() * 255), (int) (Math.random() * 255));
1690 col = col.brighter();
1691 for (Enumeration sq = gps[g].getSequences(null).elements(); sq
1692 .hasMoreElements(); viewport.setSequenceColour(
1693 (SequenceI) sq.nextElement(), col))
1696 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1697 // alignPanel.updateAnnotation();
1698 alignPanel.paintAlignment(true);
1702 protected void deleteGroups_actionPerformed()
1704 viewport.alignment.deleteAllGroups();
1705 viewport.sequenceColours = null;
1706 viewport.setSelectionGroup(null);
1708 alignPanel.paintAlignment(true);
1711 public void selectAllSequenceMenuItem_actionPerformed()
1713 SequenceGroup sg = new SequenceGroup();
1714 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1716 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1718 sg.setEndRes(viewport.alignment.getWidth() - 1);
1719 viewport.setSelectionGroup(sg);
1720 alignPanel.paintAlignment(true);
1721 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1724 public void deselectAllSequenceMenuItem_actionPerformed()
1726 if (viewport.cursorMode)
1728 alignPanel.seqPanel.keyboardNo1 = null;
1729 alignPanel.seqPanel.keyboardNo2 = null;
1731 viewport.setSelectionGroup(null);
1732 viewport.getColumnSelection().clear();
1733 viewport.setSelectionGroup(null);
1734 alignPanel.idPanel.idCanvas.searchResults = null;
1735 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1736 alignPanel.paintAlignment(true);
1737 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1740 public void invertSequenceMenuItem_actionPerformed()
1742 SequenceGroup sg = viewport.getSelectionGroup();
1743 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1745 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1748 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1751 public void invertColSel_actionPerformed()
1753 viewport.invertColumnSelection();
1754 alignPanel.paintAlignment(true);
1755 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1758 void trimAlignment(boolean trimLeft)
1760 ColumnSelection colSel = viewport.getColumnSelection();
1763 if (colSel.size() > 0)
1767 column = colSel.getMin();
1771 column = colSel.getMax();
1775 if (viewport.getSelectionGroup() != null)
1777 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1778 viewport.hiddenRepSequences);
1782 seqs = viewport.alignment.getSequencesArray();
1785 TrimRegionCommand trimRegion;
1788 trimRegion = new TrimRegionCommand("Remove Left",
1789 TrimRegionCommand.TRIM_LEFT, seqs, column,
1790 viewport.alignment, viewport.colSel,
1791 viewport.selectionGroup);
1792 viewport.setStartRes(0);
1796 trimRegion = new TrimRegionCommand("Remove Right",
1797 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1798 viewport.alignment, viewport.colSel,
1799 viewport.selectionGroup);
1802 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1804 addHistoryItem(trimRegion);
1806 Vector groups = viewport.alignment.getGroups();
1808 for (int i = 0; i < groups.size(); i++)
1810 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1812 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1813 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1815 viewport.alignment.deleteGroup(sg);
1819 viewport.firePropertyChange("alignment", null, viewport
1820 .getAlignment().getSequences());
1824 public void removeGappedColumnMenuItem_actionPerformed()
1826 int start = 0, end = viewport.alignment.getWidth() - 1;
1829 if (viewport.getSelectionGroup() != null)
1831 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1832 viewport.hiddenRepSequences);
1833 start = viewport.getSelectionGroup().getStartRes();
1834 end = viewport.getSelectionGroup().getEndRes();
1838 seqs = viewport.alignment.getSequencesArray();
1841 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1842 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1844 addHistoryItem(removeGapCols);
1846 statusBar.setText("Removed " + removeGapCols.getSize()
1847 + " empty columns.");
1849 // This is to maintain viewport position on first residue
1850 // of first sequence
1851 SequenceI seq = viewport.alignment.getSequenceAt(0);
1852 int startRes = seq.findPosition(viewport.startRes);
1853 // ShiftList shifts;
1854 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1855 // edit.alColumnChanges=shifts.getInverse();
1856 // if (viewport.hasHiddenColumns)
1857 // viewport.getColumnSelection().compensateForEdits(shifts);
1858 viewport.setStartRes(seq.findIndex(startRes) - 1);
1859 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1864 public void removeAllGapsMenuItem_actionPerformed()
1866 int start = 0, end = viewport.alignment.getWidth() - 1;
1869 if (viewport.getSelectionGroup() != null)
1871 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1872 viewport.hiddenRepSequences);
1873 start = viewport.getSelectionGroup().getStartRes();
1874 end = viewport.getSelectionGroup().getEndRes();
1878 seqs = viewport.alignment.getSequencesArray();
1881 // This is to maintain viewport position on first residue
1882 // of first sequence
1883 SequenceI seq = viewport.alignment.getSequenceAt(0);
1884 int startRes = seq.findPosition(viewport.startRes);
1886 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1887 viewport.alignment));
1889 viewport.setStartRes(seq.findIndex(startRes) - 1);
1891 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1896 public void findMenuItem_actionPerformed()
1898 new Finder(alignPanel);
1902 * create a new view derived from the current view
1905 * @return frame for the new view
1907 public AlignFrame newView(String viewtitle)
1910 if (viewport.hasHiddenRows)
1912 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1913 .getFullAlignment().getSequencesArray());
1917 newal = new Alignment(viewport.alignment.getSequencesArray());
1920 if (viewport.alignment.getAlignmentAnnotation() != null)
1922 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1924 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1927 .addAnnotation(viewport.alignment
1928 .getAlignmentAnnotation()[i]);
1933 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
1935 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1936 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1937 PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av
1938 .getSequenceSetId());
1940 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1941 newaf.alignPanel.av.getSequenceSetId());
1942 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1943 newaf.alignPanel.av.getSequenceSetId());
1945 Vector comps = (Vector) PaintRefresher.components.get(viewport
1946 .getSequenceSetId());
1948 for (int i = 0; i < comps.size(); i++)
1950 if (comps.elementAt(i) instanceof AlignmentPanel)
1956 String title = new String(this.getTitle());
1957 if (viewtitle != null)
1959 title = viewtitle + " ( " + title + ")";
1963 if (title.indexOf("(View") > -1)
1965 title = title.substring(0, title.indexOf("(View"));
1967 title += "(View " + viewSize + ")";
1970 newaf.setTitle(title.toString());
1972 newaf.viewport.historyList = viewport.historyList;
1973 newaf.viewport.redoList = viewport.redoList;
1979 * @return list of feature groups on the view
1981 public String[] getFeatureGroups()
1983 FeatureRenderer fr = null;
1984 if (alignPanel != null
1985 && (fr = alignPanel.getFeatureRenderer()) != null)
1987 return fr.getGroups();
1993 * get sequence feature groups that are hidden or shown
1999 public String[] getFeatureGroupsOfState(boolean visible)
2001 FeatureRenderer fr = null;
2002 if (alignPanel != null
2003 && (fr = alignPanel.getFeatureRenderer()) != null)
2005 return fr.getGroups(visible);
2011 * Change the display state for the given feature groups
2014 * list of group strings
2016 * visible or invisible
2018 public void setFeatureGroupState(String[] groups, boolean state)
2020 FeatureRenderer fr = null;
2021 this.sequenceFeatures.setState(true);
2022 viewport.showSequenceFeatures(true);
2023 if (alignPanel != null
2024 && (fr = alignPanel.getFeatureRenderer()) != null)
2026 fr.setGroupState(groups, state);
2027 alignPanel.seqPanel.seqCanvas.repaint();
2028 if (alignPanel.overviewPanel != null)
2030 alignPanel.overviewPanel.updateOverviewImage();
2035 public void seqLimits_itemStateChanged()
2037 viewport.setShowJVSuffix(seqLimits.getState());
2038 alignPanel.fontChanged();
2039 alignPanel.paintAlignment(true);
2042 protected void colourTextMenuItem_actionPerformed()
2044 viewport.setColourText(colourTextMenuItem.getState());
2045 alignPanel.paintAlignment(true);
2048 protected void displayNonconservedMenuItem_actionPerformed()
2050 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2051 alignPanel.paintAlignment(true);
2054 protected void wrapMenuItem_actionPerformed()
2056 viewport.setWrapAlignment(wrapMenuItem.getState());
2057 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2058 scaleAbove.setEnabled(wrapMenuItem.getState());
2059 scaleLeft.setEnabled(wrapMenuItem.getState());
2060 scaleRight.setEnabled(wrapMenuItem.getState());
2061 alignPanel.paintAlignment(true);
2064 public void overviewMenuItem_actionPerformed()
2066 if (alignPanel.overviewPanel != null)
2071 Frame frame = new Frame();
2072 OverviewPanel overview = new OverviewPanel(alignPanel);
2073 frame.add(overview);
2074 // +50 must allow for applet frame window
2075 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
2076 overview.getPreferredSize().width,
2077 overview.getPreferredSize().height + 50);
2080 frame.addWindowListener(new WindowAdapter()
2082 public void windowClosing(WindowEvent e)
2084 alignPanel.setOverviewPanel(null);
2088 alignPanel.setOverviewPanel(overview);
2092 void changeColour(ColourSchemeI cs)
2098 if (viewport.getAbovePIDThreshold())
2100 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2103 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2105 viewport.setGlobalColourScheme(cs);
2109 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2112 if (viewport.getConservationSelected())
2115 Alignment al = (Alignment) viewport.alignment;
2116 Conservation c = new Conservation("All",
2117 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2121 c.verdict(false, viewport.ConsPercGaps);
2123 cs.setConservation(c);
2125 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2131 cs.setConservation(null);
2134 cs.setConsensus(viewport.hconsensus);
2137 viewport.setGlobalColourScheme(cs);
2139 if (viewport.getColourAppliesToAllGroups())
2141 Vector groups = viewport.alignment.getGroups();
2142 for (int i = 0; i < groups.size(); i++)
2144 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2151 if (cs instanceof ClustalxColourScheme)
2153 sg.cs = new ClustalxColourScheme(sg
2154 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2160 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2161 } catch (Exception ex)
2163 ex.printStackTrace();
2168 if (viewport.getAbovePIDThreshold()
2169 || cs instanceof PIDColourScheme
2170 || cs instanceof Blosum62ColourScheme)
2172 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2173 sg.cs.setConsensus(AAFrequency.calculate(sg
2174 .getSequences(viewport.hiddenRepSequences), 0, sg
2179 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2182 if (viewport.getConservationSelected())
2184 Conservation c = new Conservation("Group",
2185 ResidueProperties.propHash, 3, sg
2186 .getSequences(viewport.hiddenRepSequences), 0,
2187 viewport.alignment.getWidth() - 1);
2189 c.verdict(false, viewport.ConsPercGaps);
2190 sg.cs.setConservation(c);
2194 sg.cs.setConservation(null);
2195 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2201 if (alignPanel.getOverviewPanel() != null)
2203 alignPanel.getOverviewPanel().updateOverviewImage();
2206 jalview.structure.StructureSelectionManager
2207 .getStructureSelectionManager().sequenceColoursChanged(
2210 alignPanel.paintAlignment(true);
2213 protected void modifyPID_actionPerformed()
2215 if (viewport.getAbovePIDThreshold()
2216 && viewport.globalColourScheme != null)
2218 SliderPanel.setPIDSliderSource(alignPanel, viewport
2219 .getGlobalColourScheme(), "Background");
2220 SliderPanel.showPIDSlider();
2224 protected void modifyConservation_actionPerformed()
2226 if (viewport.getConservationSelected()
2227 && viewport.globalColourScheme != null)
2229 SliderPanel.setConservationSlider(alignPanel,
2230 viewport.globalColourScheme, "Background");
2231 SliderPanel.showConservationSlider();
2235 protected void conservationMenuItem_actionPerformed()
2237 viewport.setConservationSelected(conservationMenuItem.getState());
2239 viewport.setAbovePIDThreshold(false);
2240 abovePIDThreshold.setState(false);
2242 changeColour(viewport.getGlobalColourScheme());
2244 modifyConservation_actionPerformed();
2247 public void abovePIDThreshold_actionPerformed()
2249 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2251 conservationMenuItem.setState(false);
2252 viewport.setConservationSelected(false);
2254 changeColour(viewport.getGlobalColourScheme());
2256 modifyPID_actionPerformed();
2259 public void sortPairwiseMenuItem_actionPerformed()
2261 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2262 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2263 .getAlignment().getSequenceAt(0), null);
2265 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2266 viewport.alignment));
2267 alignPanel.paintAlignment(true);
2270 public void sortIDMenuItem_actionPerformed()
2272 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2273 AlignmentSorter.sortByID(viewport.getAlignment());
2274 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2275 alignPanel.paintAlignment(true);
2278 public void sortLengthMenuItem_actionPerformed()
2280 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2281 AlignmentSorter.sortByLength(viewport.getAlignment());
2282 addHistoryItem(new OrderCommand("Length Sort", oldOrder, viewport.alignment));
2283 alignPanel.paintAlignment(true);
2286 public void sortGroupMenuItem_actionPerformed()
2288 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2289 AlignmentSorter.sortByGroup(viewport.getAlignment());
2290 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2291 viewport.alignment));
2292 alignPanel.paintAlignment(true);
2296 public void removeRedundancyMenuItem_actionPerformed()
2298 new RedundancyPanel(alignPanel);
2301 public void pairwiseAlignmentMenuItem_actionPerformed()
2303 if (viewport.getSelectionGroup() != null
2304 && viewport.getSelectionGroup().getSize() > 1)
2306 Frame frame = new Frame();
2307 frame.add(new PairwiseAlignPanel(alignPanel));
2308 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2313 public void PCAMenuItem_actionPerformed()
2315 // are the sequences aligned?
2316 if (!viewport.alignment.isAligned(false))
2319 int Width = viewport.getAlignment().getWidth();
2321 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2323 current = viewport.getAlignment().getSequenceAt(i);
2325 if (current.getLength() < Width)
2327 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2330 alignPanel.paintAlignment(true);
2333 if ((viewport.getSelectionGroup() != null
2334 && viewport.getSelectionGroup().getSize() < 4 && viewport
2335 .getSelectionGroup().getSize() > 0)
2336 || viewport.getAlignment().getHeight() < 4)
2343 new PCAPanel(viewport);
2344 } catch (java.lang.OutOfMemoryError ex)
2350 public void averageDistanceTreeMenuItem_actionPerformed()
2352 NewTreePanel("AV", "PID", "Average distance tree using PID");
2355 public void neighbourTreeMenuItem_actionPerformed()
2357 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2360 protected void njTreeBlosumMenuItem_actionPerformed()
2362 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2365 protected void avTreeBlosumMenuItem_actionPerformed()
2367 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2370 void NewTreePanel(String type, String pwType, String title)
2372 // are the sequences aligned?
2373 if (!viewport.alignment.isAligned(false))
2376 int Width = viewport.getAlignment().getWidth();
2378 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2380 current = viewport.getAlignment().getSequenceAt(i);
2382 if (current.getLength() < Width)
2384 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2387 alignPanel.paintAlignment(true);
2391 if ((viewport.getSelectionGroup() != null && viewport
2392 .getSelectionGroup().getSize() > 1)
2393 || (viewport.getSelectionGroup() == null && viewport.alignment
2396 final TreePanel tp = new TreePanel(viewport, type, pwType);
2398 addTreeMenuItem(tp, title);
2400 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2404 void loadTree_actionPerformed()
2406 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2407 cap.setText("Paste your Newick tree file here.");
2408 cap.setTreeImport();
2409 Frame frame = new Frame();
2411 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2414 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2416 TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree);
2417 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2418 addTreeMenuItem(tp, treeFile);
2422 * sort the alignment using the given treePanel
2425 * tree used to sort view
2427 * string used for undo event name
2429 public void sortByTree(TreePanel treePanel, String title)
2431 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2433 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2434 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2435 // HistoryItem.SORT));
2436 addHistoryItem(new OrderCommand("Order by " + title, oldOrder,
2437 viewport.alignment));
2438 alignPanel.paintAlignment(true);
2442 * Do any automatic reordering of the alignment and add the necessary bits to
2443 * the menu structure for the new tree
2448 protected void addTreeMenuItem(final TreePanel treePanel,
2451 final MenuItem item = new MenuItem(title);
2452 sortByTreeMenu.add(item);
2453 item.addActionListener(new java.awt.event.ActionListener()
2455 public void actionPerformed(ActionEvent evt)
2457 sortByTree(treePanel, title); // treePanel.getTitle());
2461 treePanel.addWindowListener(new WindowAdapter()
2463 public void windowOpened(WindowEvent e)
2465 if (viewport.sortByTree)
2467 sortByTree(treePanel, title);
2469 super.windowOpened(e);
2472 public void windowClosing(WindowEvent e)
2474 sortByTreeMenu.remove(item);
2479 protected void documentation_actionPerformed()
2481 showURL("http://www.jalview.org/help.html", "HELP");
2484 protected void about_actionPerformed()
2487 class AboutPanel extends Canvas
2493 public AboutPanel(String version, String builddate)
2495 this.version = version;
2496 this.builddate = builddate;
2499 public void paint(Graphics g)
2501 g.setColor(Color.white);
2502 g.fillRect(0, 0, getSize().width, getSize().height);
2503 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2504 FontMetrics fm = g.getFontMetrics();
2505 int fh = fm.getHeight();
2507 g.setColor(Color.black);
2508 // TODO: update this text for each release or centrally store it for
2509 // lite and application
2510 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2511 g.drawString("JalviewLite - Release " + version, x, y += fh);
2512 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2513 g.drawString("Build date: " + builddate, x, y += fh);
2514 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2517 "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,",
2519 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2522 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2526 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2528 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2531 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",
2535 "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",
2537 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",
2542 Frame frame = new Frame();
2543 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2545 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2549 public void showURL(String url, String target)
2551 if (viewport.applet == null)
2553 System.out.println("Not running as applet - no browser available.");
2559 if (url.indexOf(":") == -1)
2561 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to
2563 if (url.indexOf("/") == 0)
2565 String codebase = viewport.applet.getCodeBase().toString();
2566 url = codebase.substring(0, codebase.length()
2567 - viewport.applet.getCodeBase().getFile().length())
2572 url = viewport.applet.getCodeBase() + url;
2574 System.out.println("Show url (prepended codebase): " + url);
2578 System.out.println("Show url: " + url);
2580 viewport.applet.getAppletContext().showDocument(
2581 new java.net.URL(url), target);
2582 } catch (Exception ex)
2584 ex.printStackTrace();
2589 // ////////////////////////////////////////////////////////////////////////////////
2590 // JBuilder Graphics here
2592 MenuBar alignFrameMenuBar = new MenuBar();
2594 Menu fileMenu = new Menu("File");
2596 MenuItem loadApplication = new MenuItem("View in Full Application");
2598 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2600 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2602 MenuItem outputFeatures = new MenuItem("Export Features ...");
2604 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2606 MenuItem closeMenuItem = new MenuItem("Close");
2608 Menu editMenu = new Menu("Edit");
2610 Menu viewMenu = new Menu("View");
2612 Menu colourMenu = new Menu("Colour");
2614 Menu calculateMenu = new Menu("Calculate");
2616 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2618 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2620 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2622 MenuItem remove2LeftMenuItem = new MenuItem();
2624 MenuItem remove2RightMenuItem = new MenuItem();
2626 MenuItem removeGappedColumnMenuItem = new MenuItem();
2628 MenuItem removeAllGapsMenuItem = new MenuItem();
2630 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2632 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2634 MenuItem sortPairwiseMenuItem = new MenuItem();
2636 MenuItem sortIDMenuItem = new MenuItem();
2638 MenuItem sortLengthMenuItem = new MenuItem();
2640 MenuItem sortGroupMenuItem = new MenuItem();
2642 MenuItem removeRedundancyMenuItem = new MenuItem();
2644 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2646 MenuItem PCAMenuItem = new MenuItem();
2648 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2650 MenuItem neighbourTreeMenuItem = new MenuItem();
2652 BorderLayout borderLayout1 = new BorderLayout();
2654 public Label statusBar = new Label();
2656 Menu outputTextboxMenu = new Menu();
2658 MenuItem clustalColour = new MenuItem();
2660 MenuItem zappoColour = new MenuItem();
2662 MenuItem taylorColour = new MenuItem();
2664 MenuItem hydrophobicityColour = new MenuItem();
2666 MenuItem helixColour = new MenuItem();
2668 MenuItem strandColour = new MenuItem();
2670 MenuItem turnColour = new MenuItem();
2672 MenuItem buriedColour = new MenuItem();
2674 MenuItem userDefinedColour = new MenuItem();
2676 MenuItem PIDColour = new MenuItem();
2678 MenuItem BLOSUM62Colour = new MenuItem();
2680 MenuItem njTreeBlosumMenuItem = new MenuItem();
2682 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2684 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2686 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2688 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2690 MenuItem alProperties = new MenuItem("Alignment Properties...");
2692 MenuItem overviewMenuItem = new MenuItem();
2694 MenuItem undoMenuItem = new MenuItem();
2696 MenuItem redoMenuItem = new MenuItem();
2698 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2700 MenuItem noColourmenuItem = new MenuItem();
2702 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2704 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2706 MenuItem findMenuItem = new MenuItem();
2708 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2710 MenuItem nucleotideColour = new MenuItem();
2712 MenuItem deleteGroups = new MenuItem();
2714 MenuItem grpsFromSelection = new MenuItem();
2716 MenuItem delete = new MenuItem();
2718 MenuItem copy = new MenuItem();
2720 MenuItem cut = new MenuItem();
2722 Menu pasteMenu = new Menu();
2724 MenuItem pasteNew = new MenuItem();
2726 MenuItem pasteThis = new MenuItem();
2728 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2730 MenuItem font = new MenuItem();
2732 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2734 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2736 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2738 MenuItem modifyPID = new MenuItem();
2740 MenuItem modifyConservation = new MenuItem();
2742 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2743 "Autocalculate Consensus", true);
2745 Menu sortByTreeMenu = new Menu();
2747 Menu sort = new Menu();
2749 Menu calculate = new Menu();
2751 MenuItem inputText = new MenuItem();
2753 Menu helpMenu = new Menu();
2755 MenuItem documentation = new MenuItem();
2757 MenuItem about = new MenuItem();
2759 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2761 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2763 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2765 private void jbInit() throws Exception
2768 setMenuBar(alignFrameMenuBar);
2772 // dynamically fill save as menu with available formats
2773 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2776 item = new MenuItem(
2777 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2779 item.addActionListener(new java.awt.event.ActionListener()
2781 public void actionPerformed(ActionEvent e)
2783 outputText_actionPerformed(e);
2787 outputTextboxMenu.add(item);
2789 closeMenuItem.addActionListener(this);
2790 loadApplication.addActionListener(this);
2792 loadTree.addActionListener(this);
2793 loadAnnotations.addActionListener(this);
2794 outputFeatures.addActionListener(this);
2795 outputAnnotations.addActionListener(this);
2796 selectAllSequenceMenuItem.addActionListener(this);
2797 deselectAllSequenceMenuItem.addActionListener(this);
2798 invertSequenceMenuItem.addActionListener(this);
2799 remove2LeftMenuItem.setLabel("Remove Left");
2800 remove2LeftMenuItem.addActionListener(this);
2801 remove2RightMenuItem.setLabel("Remove Right");
2802 remove2RightMenuItem.addActionListener(this);
2803 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2804 removeGappedColumnMenuItem.addActionListener(this);
2805 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2806 removeAllGapsMenuItem.addActionListener(this);
2807 viewBoxesMenuItem.setLabel("Boxes");
2808 viewBoxesMenuItem.setState(true);
2809 viewBoxesMenuItem.addItemListener(this);
2810 viewTextMenuItem.setLabel("Text");
2811 viewTextMenuItem.setState(true);
2812 viewTextMenuItem.addItemListener(this);
2813 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2814 sortPairwiseMenuItem.addActionListener(this);
2815 sortIDMenuItem.setLabel("by ID");
2816 sortIDMenuItem.addActionListener(this);
2817 sortLengthMenuItem.setLabel("by Length");
2818 sortLengthMenuItem.addActionListener(this);
2819 sortGroupMenuItem.setLabel("by Group");
2820 sortGroupMenuItem.addActionListener(this);
2821 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2822 removeRedundancyMenuItem.addActionListener(this);
2823 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2824 pairwiseAlignmentMenuItem.addActionListener(this);
2825 PCAMenuItem.setLabel("Principal Component Analysis");
2826 PCAMenuItem.addActionListener(this);
2827 averageDistanceTreeMenuItem
2828 .setLabel("Average Distance Using % Identity");
2829 averageDistanceTreeMenuItem.addActionListener(this);
2830 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2831 neighbourTreeMenuItem.addActionListener(this);
2832 statusBar.setBackground(Color.white);
2833 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2834 statusBar.setText("Status bar");
2835 outputTextboxMenu.setLabel("Output to Textbox");
2836 clustalColour.setLabel("Clustalx");
2838 clustalColour.addActionListener(this);
2839 zappoColour.setLabel("Zappo");
2840 zappoColour.addActionListener(this);
2841 taylorColour.setLabel("Taylor");
2842 taylorColour.addActionListener(this);
2843 hydrophobicityColour.setLabel("Hydrophobicity");
2844 hydrophobicityColour.addActionListener(this);
2845 helixColour.setLabel("Helix Propensity");
2846 helixColour.addActionListener(this);
2847 strandColour.setLabel("Strand Propensity");
2848 strandColour.addActionListener(this);
2849 turnColour.setLabel("Turn Propensity");
2850 turnColour.addActionListener(this);
2851 buriedColour.setLabel("Buried Index");
2852 buriedColour.addActionListener(this);
2853 userDefinedColour.setLabel("User Defined...");
2854 userDefinedColour.addActionListener(this);
2855 PIDColour.setLabel("Percentage Identity");
2856 PIDColour.addActionListener(this);
2857 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2858 BLOSUM62Colour.addActionListener(this);
2859 avDistanceTreeBlosumMenuItem
2860 .setLabel("Average Distance Using BLOSUM62");
2861 avDistanceTreeBlosumMenuItem.addActionListener(this);
2862 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2863 njTreeBlosumMenuItem.addActionListener(this);
2864 annotationPanelMenuItem.setLabel("Show Annotations");
2865 annotationPanelMenuItem.addItemListener(this);
2866 colourTextMenuItem.setLabel("Colour Text");
2867 colourTextMenuItem.addItemListener(this);
2868 displayNonconservedMenuItem.setLabel("Show nonconserved");
2869 displayNonconservedMenuItem.addItemListener(this);
2870 alProperties.addActionListener(this);
2871 overviewMenuItem.setLabel("Overview Window");
2872 overviewMenuItem.addActionListener(this);
2873 undoMenuItem.setEnabled(false);
2874 undoMenuItem.setLabel("Undo");
2875 undoMenuItem.addActionListener(this);
2876 redoMenuItem.setEnabled(false);
2877 redoMenuItem.setLabel("Redo");
2878 redoMenuItem.addActionListener(this);
2879 conservationMenuItem.setLabel("by Conservation");
2880 conservationMenuItem.addItemListener(this);
2881 noColourmenuItem.setLabel("None");
2882 noColourmenuItem.addActionListener(this);
2883 wrapMenuItem.setLabel("Wrap");
2884 wrapMenuItem.addItemListener(this);
2885 renderGapsMenuItem.setLabel("Show Gaps");
2886 renderGapsMenuItem.setState(true);
2887 renderGapsMenuItem.addItemListener(this);
2888 findMenuItem.setLabel("Find...");
2889 findMenuItem.addActionListener(this);
2890 abovePIDThreshold.setLabel("Above Identity Threshold");
2891 abovePIDThreshold.addItemListener(this);
2892 nucleotideColour.setLabel("Nucleotide");
2893 nucleotideColour.addActionListener(this);
2894 deleteGroups.setLabel("Undefine Groups");
2895 deleteGroups.addActionListener(this);
2896 grpsFromSelection.setLabel("Make Groups for selection");
2897 grpsFromSelection.addActionListener(this);
2898 copy.setLabel("Copy");
2899 copy.addActionListener(this);
2900 cut.setLabel("Cut");
2901 cut.addActionListener(this);
2902 delete.setLabel("Delete");
2903 delete.addActionListener(this);
2904 pasteMenu.setLabel("Paste");
2905 pasteNew.setLabel("To New Alignment");
2906 pasteNew.addActionListener(this);
2907 pasteThis.setLabel("Add To This Alignment");
2908 pasteThis.addActionListener(this);
2909 applyToAllGroups.setLabel("Apply Colour To All Groups");
2910 applyToAllGroups.setState(true);
2911 applyToAllGroups.addItemListener(this);
2912 font.setLabel("Font...");
2913 font.addActionListener(this);
2914 scaleAbove.setLabel("Scale Above");
2915 scaleAbove.setState(true);
2916 scaleAbove.setEnabled(false);
2917 scaleAbove.addItemListener(this);
2918 scaleLeft.setEnabled(false);
2919 scaleLeft.setState(true);
2920 scaleLeft.setLabel("Scale Left");
2921 scaleLeft.addItemListener(this);
2922 scaleRight.setEnabled(false);
2923 scaleRight.setState(true);
2924 scaleRight.setLabel("Scale Right");
2925 scaleRight.addItemListener(this);
2926 modifyPID.setLabel("Modify Identity Threshold...");
2927 modifyPID.addActionListener(this);
2928 modifyConservation.setLabel("Modify Conservation Threshold...");
2929 modifyConservation.addActionListener(this);
2930 sortByTreeMenu.setLabel("By Tree Order");
2931 sort.setLabel("Sort");
2932 calculate.setLabel("Calculate Tree");
2933 autoCalculate.addItemListener(this);
2934 inputText.setLabel("Input from textbox");
2935 inputText.addActionListener(this);
2936 centreColumnLabelFlag.setLabel("Centre column labels");
2937 centreColumnLabelFlag.addItemListener(this);
2938 followMouseOverFlag.setLabel("Automatic Scrolling");
2939 followMouseOverFlag.addItemListener(this);
2940 helpMenu.setLabel("Help");
2941 documentation.setLabel("Documentation");
2942 documentation.addActionListener(this);
2944 about.setLabel("About...");
2945 about.addActionListener(this);
2946 seqLimits.setState(true);
2947 seqLimits.setLabel("Show Sequence Limits");
2948 seqLimits.addItemListener(this);
2949 featureSettings.setLabel("Feature Settings...");
2950 featureSettings.addActionListener(this);
2951 sequenceFeatures.setLabel("Sequence Features");
2952 sequenceFeatures.addItemListener(this);
2953 sequenceFeatures.setState(false);
2954 annotationColour.setLabel("by Annotation...");
2955 annotationColour.addActionListener(this);
2956 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2957 invertColSel.setLabel("Invert Column Selection");
2958 menu1.setLabel("Show");
2959 showColumns.setLabel("All Columns ");
2960 showSeqs.setLabel("All Sequences");
2961 menu2.setLabel("Hide");
2962 hideColumns.setLabel("Selected Columns");
2963 hideSequences.setLabel("Selected Sequences");
2964 hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)");
2965 hideAllSelection.setLabel("Selected Region");
2966 showAllHidden.setLabel("All Sequences and Columns");
2967 invertColSel.addActionListener(this);
2968 showColumns.addActionListener(this);
2969 showSeqs.addActionListener(this);
2970 hideColumns.addActionListener(this);
2971 hideSequences.addActionListener(this);
2972 hideAllButSelection.addActionListener(this);
2973 hideAllSelection.addActionListener(this);
2974 showAllHidden.addActionListener(this);
2975 formatMenu.setLabel("Format");
2976 selectMenu.setLabel("Select");
2977 newView.setLabel("New View");
2978 newView.addActionListener(this);
2979 alignFrameMenuBar.add(fileMenu);
2980 alignFrameMenuBar.add(editMenu);
2981 alignFrameMenuBar.add(selectMenu);
2982 alignFrameMenuBar.add(viewMenu);
2983 alignFrameMenuBar.add(formatMenu);
2984 alignFrameMenuBar.add(colourMenu);
2985 alignFrameMenuBar.add(calculateMenu);
2986 alignFrameMenuBar.add(helpMenu);
2988 fileMenu.add(inputText);
2989 fileMenu.add(loadTree);
2990 fileMenu.add(loadAnnotations);
2992 fileMenu.addSeparator();
2993 fileMenu.add(outputTextboxMenu);
2994 fileMenu.add(outputFeatures);
2995 fileMenu.add(outputAnnotations);
2997 if (jalviewServletURL != null)
2999 fileMenu.add(loadApplication);
3002 fileMenu.addSeparator();
3003 fileMenu.add(closeMenuItem);
3005 editMenu.add(undoMenuItem);
3006 editMenu.add(redoMenuItem);
3009 editMenu.add(pasteMenu);
3010 editMenu.add(delete);
3011 editMenu.addSeparator();
3012 editMenu.add(remove2LeftMenuItem);
3013 editMenu.add(remove2RightMenuItem);
3014 editMenu.add(removeGappedColumnMenuItem);
3015 editMenu.add(removeAllGapsMenuItem);
3016 editMenu.add(removeRedundancyMenuItem);
3017 viewMenu.add(newView);
3018 viewMenu.addSeparator();
3019 viewMenu.add(menu1);
3020 viewMenu.add(menu2);
3021 viewMenu.addSeparator();
3022 viewMenu.add(followMouseOverFlag);
3023 viewMenu.add(annotationPanelMenuItem);
3024 viewMenu.addSeparator();
3025 viewMenu.add(sequenceFeatures);
3026 viewMenu.add(featureSettings);
3027 viewMenu.addSeparator();
3028 viewMenu.add(alProperties);
3029 viewMenu.addSeparator();
3030 viewMenu.add(overviewMenuItem);
3031 colourMenu.add(applyToAllGroups);
3032 colourMenu.addSeparator();
3033 colourMenu.add(noColourmenuItem);
3034 colourMenu.add(clustalColour);
3035 colourMenu.add(BLOSUM62Colour);
3036 colourMenu.add(PIDColour);
3037 colourMenu.add(zappoColour);
3038 colourMenu.add(taylorColour);
3039 colourMenu.add(hydrophobicityColour);
3040 colourMenu.add(helixColour);
3041 colourMenu.add(strandColour);
3042 colourMenu.add(turnColour);
3043 colourMenu.add(buriedColour);
3044 colourMenu.add(nucleotideColour);
3045 colourMenu.add(userDefinedColour);
3046 colourMenu.addSeparator();
3047 colourMenu.add(conservationMenuItem);
3048 colourMenu.add(modifyConservation);
3049 colourMenu.add(abovePIDThreshold);
3050 colourMenu.add(modifyPID);
3051 colourMenu.add(annotationColour);
3052 calculateMenu.add(sort);
3053 calculateMenu.add(calculate);
3054 calculateMenu.addSeparator();
3055 calculateMenu.add(pairwiseAlignmentMenuItem);
3056 calculateMenu.add(PCAMenuItem);
3057 calculateMenu.add(autoCalculate);
3058 this.add(statusBar, BorderLayout.SOUTH);
3059 pasteMenu.add(pasteNew);
3060 pasteMenu.add(pasteThis);
3061 sort.add(sortIDMenuItem);
3062 sort.add(sortLengthMenuItem);
3063 sort.add(sortByTreeMenu);
3064 sort.add(sortGroupMenuItem);
3065 sort.add(sortPairwiseMenuItem);
3066 calculate.add(averageDistanceTreeMenuItem);
3067 calculate.add(neighbourTreeMenuItem);
3068 calculate.add(avDistanceTreeBlosumMenuItem);
3069 calculate.add(njTreeBlosumMenuItem);
3070 helpMenu.add(documentation);
3071 helpMenu.add(about);
3072 menu1.add(showColumns);
3073 menu1.add(showSeqs);
3074 menu1.add(showAllHidden);
3075 menu2.add(hideColumns);
3076 menu2.add(hideSequences);
3077 menu2.add(hideAllSelection);
3078 menu2.add(hideAllButSelection);
3079 formatMenu.add(font);
3080 formatMenu.add(seqLimits);
3081 formatMenu.add(wrapMenuItem);
3082 formatMenu.add(scaleAbove);
3083 formatMenu.add(scaleLeft);
3084 formatMenu.add(scaleRight);
3085 formatMenu.add(viewBoxesMenuItem);
3086 formatMenu.add(viewTextMenuItem);
3087 formatMenu.add(colourTextMenuItem);
3088 formatMenu.add(displayNonconservedMenuItem);
3089 formatMenu.add(renderGapsMenuItem);
3090 formatMenu.add(centreColumnLabelFlag);
3091 selectMenu.add(findMenuItem);
3092 selectMenu.addSeparator();
3093 selectMenu.add(selectAllSequenceMenuItem);
3094 selectMenu.add(deselectAllSequenceMenuItem);
3095 selectMenu.add(invertSequenceMenuItem);
3096 selectMenu.add(invertColSel);
3097 selectMenu.add(grpsFromSelection);
3098 selectMenu.add(deleteGroups);
3102 MenuItem featureSettings = new MenuItem();
3104 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3106 MenuItem annotationColour = new MenuItem();
3108 MenuItem invertColSel = new MenuItem();
3110 Menu menu1 = new Menu();
3112 MenuItem showColumns = new MenuItem();
3114 MenuItem showSeqs = new MenuItem();
3116 Menu menu2 = new Menu();
3118 MenuItem hideColumns = new MenuItem();
3120 MenuItem hideSequences = new MenuItem();
3122 MenuItem hideAllButSelection = new MenuItem();
3124 MenuItem hideAllSelection = new MenuItem();
3126 MenuItem showAllHidden = new MenuItem();
3128 Menu formatMenu = new Menu();
3130 Menu selectMenu = new Menu();
3132 MenuItem newView = new MenuItem();
3135 * Attach the alignFrame panels after embedding menus, if necessary. This used
3136 * to be called setEmbedded, but is now creates the dropdown menus in a
3137 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3139 * @param reallyEmbedded
3140 * true to attach the view to the applet area on the page rather than
3143 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3148 // Explicly build the embedded menu panel for the on-page applet
3150 // view cannot be closed if its actually on the page
3151 fileMenu.remove(closeMenuItem);
3152 fileMenu.remove(3); // Remove Seperator
3153 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3154 Font.PLAIN, 10, false); // use our own fonts.
3155 // and actually add the components to the applet area
3156 viewport.applet.setLayout(new BorderLayout());
3157 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3158 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3159 alignPanel.setSize(viewport.applet.getSize().width, viewport.applet
3161 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
3162 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3163 viewport.applet.validate();
3168 // test and embed menu bar if necessary.
3170 if (embedMenuIfNeeded(alignPanel))
3172 // adjust for status bar height too
3173 alignPanel.setSize(getSize().width, getSize().height
3174 - statusBar.HEIGHT);
3176 add(statusBar, BorderLayout.SOUTH);
3177 add(alignPanel, BorderLayout.CENTER);
3178 // and register with the applet so it can pass external API calls to us
3179 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,