2 * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
3 * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 package jalview.appletgui;
26 import java.awt.event.*;
28 import jalview.analysis.*;
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();
90 param = applet.getParameter("wrap");
93 if (param.equalsIgnoreCase("true"))
95 wrapMenuItem.setState(true);
96 wrapMenuItem_actionPerformed();
99 param = applet.getParameter("centrecolumnlabels");
102 centreColumnLabelFlag.setState(true);
103 centreColumnLabelFlag_stateChanged();
107 param = applet.getParameter("windowWidth");
110 int width = Integer.parseInt(param);
111 DEFAULT_WIDTH = width;
113 param = applet.getParameter("windowHeight");
116 int height = Integer.parseInt(param);
117 DEFAULT_HEIGHT = height;
119 } catch (Exception ex)
125 // Some JVMS send keyevents to Top frame or lowest panel,
126 // Havent worked out why yet. So add to both this frame and seqCanvas for
128 this.addKeyListener(this);
129 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
130 alignPanel.idPanel.idCanvas.addKeyListener(this);
131 alignPanel.scalePanel.addKeyListener(this);
132 alignPanel.annotationPanel.addKeyListener(this);
133 createAlignFrameWindow(embedded, title);
134 alignPanel.validate();
135 alignPanel.paintAlignment(true);
138 public AlignViewport getAlignViewport()
143 public SeqCanvas getSeqcanvas()
145 return alignPanel.seqPanel.seqCanvas;
155 public void parseFeaturesFile(String file, String type)
157 Hashtable featureLinks = new Hashtable();
158 boolean featuresFile = false;
161 featuresFile = new jalview.io.FeaturesFile(file, type).parse(
162 viewport.alignment, alignPanel.seqPanel.seqCanvas
163 .getFeatureRenderer().featureColours, featureLinks,
165 } catch (Exception ex)
167 ex.printStackTrace();
172 if (featureLinks.size() > 0)
174 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
176 viewport.showSequenceFeatures = true;
177 sequenceFeatures.setState(true);
178 if (viewport.featureSettings!=null)
180 viewport.featureSettings.refreshTable();
182 alignPanel.paintAlignment(true);
187 public void keyPressed(KeyEvent evt)
189 if (viewport.cursorMode
190 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
191 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
192 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
193 && Character.isDigit(evt.getKeyChar()))
194 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
196 switch (evt.getKeyCode())
198 case 27: // escape key
199 deselectAllSequenceMenuItem_actionPerformed();
202 if (evt.isControlDown() || evt.isMetaDown())
204 cut_actionPerformed();
208 if (viewport.cursorMode && !evt.isControlDown())
210 alignPanel.seqPanel.setCursorColumn();
212 if (evt.isControlDown() || evt.isMetaDown())
214 copy_actionPerformed();
218 if (evt.isControlDown())
220 paste(evt.isShiftDown());
224 if (evt.isControlDown() || evt.isMetaDown())
226 selectAllSequenceMenuItem_actionPerformed();
229 case KeyEvent.VK_DOWN:
230 if (viewport.cursorMode)
232 alignPanel.seqPanel.moveCursor(0, 1);
236 moveSelectedSequences(false);
241 if (viewport.cursorMode)
243 alignPanel.seqPanel.moveCursor(0, -1);
247 moveSelectedSequences(true);
251 case KeyEvent.VK_LEFT:
252 if (evt.isAltDown() || !viewport.cursorMode)
253 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
255 alignPanel.seqPanel.moveCursor(-1, 0);
258 case KeyEvent.VK_RIGHT:
259 if (evt.isAltDown() || !viewport.cursorMode)
260 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
262 alignPanel.seqPanel.moveCursor(1, 0);
265 case KeyEvent.VK_SPACE:
266 if (viewport.cursorMode)
268 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
269 || evt.isShiftDown() || evt.isAltDown());
273 case KeyEvent.VK_DELETE:
274 case KeyEvent.VK_BACK_SPACE:
275 if (viewport.cursorMode)
277 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
278 || evt.isShiftDown() || evt.isAltDown());
282 cut_actionPerformed();
283 alignPanel.seqPanel.seqCanvas.repaint();
288 if (viewport.cursorMode)
290 alignPanel.seqPanel.setCursorRow();
294 if (viewport.cursorMode)
296 alignPanel.seqPanel.setCursorPosition();
300 case KeyEvent.VK_ENTER:
301 case KeyEvent.VK_COMMA:
302 if (viewport.cursorMode)
304 alignPanel.seqPanel.setCursorRowAndColumn();
309 if (viewport.cursorMode)
311 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
315 if (viewport.cursorMode)
317 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
322 viewport.cursorMode = !viewport.cursorMode;
323 statusBar.setText("Keyboard editing mode is "
324 + (viewport.cursorMode ? "on" : "off"));
325 if (viewport.cursorMode)
327 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
328 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
333 if (evt.isControlDown())
335 findMenuItem_actionPerformed();
341 boolean toggleSeqs = !evt.isControlDown();
342 boolean toggleCols = !evt.isShiftDown();
343 boolean hide = false;
344 SequenceGroup sg = viewport.getSelectionGroup();
348 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
351 viewport.hideAllSelectedSeqs();
353 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
355 viewport.showAllHiddenSeqs();
361 if (viewport.colSel.getSelected().size() > 0)
363 viewport.hideSelectedColumns();
366 viewport.selectionGroup = sg;
371 viewport.showAllHiddenColumns();
377 case KeyEvent.VK_PAGE_UP:
378 if (viewport.wrapAlignment)
380 alignPanel.scrollUp(true);
384 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
385 - viewport.endSeq + viewport.startSeq);
389 case KeyEvent.VK_PAGE_DOWN:
390 if (viewport.wrapAlignment)
392 alignPanel.scrollUp(false);
396 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
397 + viewport.endSeq - viewport.startSeq);
402 if (evt.isControlDown())
404 undoMenuItem_actionPerformed();
409 if (evt.isControlDown())
411 redoMenuItem_actionPerformed();
416 if (evt.isControlDown())
423 if (evt.isControlDown())
425 trimAlignment(false);
430 if (evt.isControlDown())
432 if (evt.isShiftDown())
434 this.removeAllGapsMenuItem_actionPerformed();
438 removeGappedColumnMenuItem_actionPerformed();
443 if (evt.isControlDown())
447 viewport.invertColumnSelection();
451 this.invertSequenceMenuItem_actionPerformed();
457 if (evt.isControlDown())
459 this.deleteGroups_actionPerformed();
464 if (evt.isControlDown())
471 alignPanel.paintAlignment(true);
474 public void keyReleased(KeyEvent evt)
478 public void keyTyped(KeyEvent evt)
482 public void itemStateChanged(ItemEvent evt)
484 if (evt.getSource() == displayNonconservedMenuItem)
486 displayNonconservedMenuItem_actionPerformed();
488 else if (evt.getSource() == colourTextMenuItem)
490 colourTextMenuItem_actionPerformed();
492 else if (evt.getSource() == wrapMenuItem)
494 wrapMenuItem_actionPerformed();
496 else if (evt.getSource() == scaleAbove)
498 viewport.setScaleAboveWrapped(scaleAbove.getState());
500 else if (evt.getSource() == scaleLeft)
502 viewport.setScaleLeftWrapped(scaleLeft.getState());
504 else if (evt.getSource() == scaleRight)
506 viewport.setScaleRightWrapped(scaleRight.getState());
508 else if (evt.getSource() == seqLimits)
510 seqLimits_itemStateChanged();
512 else if (evt.getSource() == viewBoxesMenuItem)
514 viewport.setShowBoxes(viewBoxesMenuItem.getState());
516 else if (evt.getSource() == viewTextMenuItem)
518 viewport.setShowText(viewTextMenuItem.getState());
520 else if (evt.getSource() == renderGapsMenuItem)
522 viewport.setRenderGaps(renderGapsMenuItem.getState());
524 else if (evt.getSource() == annotationPanelMenuItem)
526 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
527 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
529 else if (evt.getSource() == sequenceFeatures)
531 viewport.showSequenceFeatures(sequenceFeatures.getState());
532 alignPanel.seqPanel.seqCanvas.repaint();
534 else if (evt.getSource() == conservationMenuItem)
536 conservationMenuItem_actionPerformed();
538 else if (evt.getSource() == abovePIDThreshold)
540 abovePIDThreshold_actionPerformed();
542 else if (evt.getSource() == applyToAllGroups)
544 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
546 else if (evt.getSource() == autoCalculate)
548 viewport.autocalculateConsensus = autoCalculate.getState();
550 else if (evt.getSource() == this.centreColumnLabelFlag)
552 centreColumnLabelFlag_stateChanged();
553 } else if (evt.getSource() == this.followMouseOverFlag)
555 mouseOverFlag_stateChanged();
558 alignPanel.paintAlignment(true);
561 private void mouseOverFlag_stateChanged()
563 viewport.followHighlight = followMouseOverFlag.getState();
564 // TODO: could kick the scrollTo mechanism to reset view for current searchresults.
567 private void centreColumnLabelFlag_stateChanged()
569 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
570 this.alignPanel.annotationPanel.repaint();
573 public void actionPerformed(ActionEvent evt)
575 Object source = evt.getSource();
577 if (source == inputText)
579 inputText_actionPerformed();
581 else if (source == loadTree)
583 loadTree_actionPerformed();
585 else if (source == loadApplication)
587 launchFullApplication();
589 else if (source == loadAnnotations)
593 else if (source == outputAnnotations)
595 outputAnnotations(true);
597 else if (source == outputFeatures)
599 outputFeatures(true, "Jalview");
601 else if (source == closeMenuItem)
603 closeMenuItem_actionPerformed();
605 else if (source == copy)
607 copy_actionPerformed();
609 else if (source == undoMenuItem)
611 undoMenuItem_actionPerformed();
613 else if (source == redoMenuItem)
615 redoMenuItem_actionPerformed();
617 else if (source == inputText)
619 inputText_actionPerformed();
621 else if (source == closeMenuItem)
623 closeMenuItem_actionPerformed();
625 else if (source == undoMenuItem)
627 undoMenuItem_actionPerformed();
629 else if (source == redoMenuItem)
631 redoMenuItem_actionPerformed();
633 else if (source == copy)
635 copy_actionPerformed();
637 else if (source == pasteNew)
639 pasteNew_actionPerformed();
641 else if (source == pasteThis)
643 pasteThis_actionPerformed();
645 else if (source == cut)
647 cut_actionPerformed();
649 else if (source == delete)
651 delete_actionPerformed();
653 else if (source == deleteGroups)
655 deleteGroups_actionPerformed();
657 else if (source == selectAllSequenceMenuItem)
659 selectAllSequenceMenuItem_actionPerformed();
661 else if (source == deselectAllSequenceMenuItem)
663 deselectAllSequenceMenuItem_actionPerformed();
665 else if (source == invertSequenceMenuItem)
667 invertSequenceMenuItem_actionPerformed();
669 else if (source == invertColSel)
671 viewport.invertColumnSelection();
672 alignPanel.paintAlignment(true);
674 else if (source == remove2LeftMenuItem)
678 else if (source == remove2RightMenuItem)
680 trimAlignment(false);
682 else if (source == removeGappedColumnMenuItem)
684 removeGappedColumnMenuItem_actionPerformed();
686 else if (source == removeAllGapsMenuItem)
688 removeAllGapsMenuItem_actionPerformed();
690 else if (source == findMenuItem)
692 findMenuItem_actionPerformed();
694 else if (source == font)
696 new FontChooser(alignPanel);
698 else if (source == newView)
702 else if (source == showColumns)
704 viewport.showAllHiddenColumns();
705 alignPanel.paintAlignment(true);
707 else if (source == showSeqs)
709 viewport.showAllHiddenSeqs();
711 else if (source == hideColumns)
713 viewport.hideSelectedColumns();
714 alignPanel.paintAlignment(true);
716 else if (source == hideSequences
717 && viewport.getSelectionGroup() != null)
719 viewport.hideAllSelectedSeqs();
721 else if (source == featureSettings)
723 new FeatureSettings(alignPanel);
725 else if (source == alProperties)
727 StringBuffer contents = new StringBuffer();
730 int min = Integer.MAX_VALUE, max = 0;
731 for (int i = 0; i < viewport.alignment.getHeight(); i++)
733 int size = viewport.alignment.getSequenceAt(i).getEnd()
734 - viewport.alignment.getSequenceAt(i).getStart();
741 avg = avg / (float) viewport.alignment.getHeight();
743 contents.append("\nSequences: " + viewport.alignment.getHeight());
744 contents.append("\nMinimum Sequence Length: " + min);
745 contents.append("\nMaximum Sequence Length: " + max);
746 contents.append("\nAverage Length: " + (int) avg);
748 if (((Alignment) viewport.alignment).alignmentProperties != null)
750 Hashtable props = ((Alignment) viewport.alignment).alignmentProperties;
751 Enumeration en = props.keys();
752 while (en.hasMoreElements())
754 String key = en.nextElement().toString();
755 contents.append("\n" + key + "\t" + props.get(key));
759 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
760 cap.setText(contents.toString());
761 Frame frame = new Frame();
763 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
764 + getTitle(), 400, 250);
766 else if (source == overviewMenuItem)
768 overviewMenuItem_actionPerformed();
770 else if (source == noColourmenuItem)
774 else if (source == clustalColour)
776 abovePIDThreshold.setState(false);
777 changeColour(new ClustalxColourScheme(viewport.alignment
778 .getSequences(), viewport.alignment.getWidth()));
780 else if (source == zappoColour)
782 changeColour(new ZappoColourScheme());
784 else if (source == taylorColour)
786 changeColour(new TaylorColourScheme());
788 else if (source == hydrophobicityColour)
790 changeColour(new HydrophobicColourScheme());
792 else if (source == helixColour)
794 changeColour(new HelixColourScheme());
796 else if (source == strandColour)
798 changeColour(new StrandColourScheme());
800 else if (source == turnColour)
802 changeColour(new TurnColourScheme());
804 else if (source == buriedColour)
806 changeColour(new BuriedColourScheme());
808 else if (source == nucleotideColour)
810 changeColour(new NucleotideColourScheme());
812 else if (source == modifyPID)
814 modifyPID_actionPerformed();
816 else if (source == modifyConservation)
818 modifyConservation_actionPerformed();
820 else if (source == userDefinedColour)
822 new UserDefinedColours(alignPanel, null);
824 else if (source == PIDColour)
826 changeColour(new PIDColourScheme());
828 else if (source == BLOSUM62Colour)
830 changeColour(new Blosum62ColourScheme());
832 else if (source == annotationColour)
834 new AnnotationColourChooser(viewport, alignPanel);
836 else if (source == sortPairwiseMenuItem)
838 sortPairwiseMenuItem_actionPerformed();
840 else if (source == sortIDMenuItem)
842 sortIDMenuItem_actionPerformed();
844 else if (source == sortGroupMenuItem)
846 sortGroupMenuItem_actionPerformed();
848 else if (source == removeRedundancyMenuItem)
850 removeRedundancyMenuItem_actionPerformed();
852 else if (source == pairwiseAlignmentMenuItem)
854 pairwiseAlignmentMenuItem_actionPerformed();
856 else if (source == PCAMenuItem)
858 PCAMenuItem_actionPerformed();
860 else if (source == averageDistanceTreeMenuItem)
862 averageDistanceTreeMenuItem_actionPerformed();
864 else if (source == neighbourTreeMenuItem)
866 neighbourTreeMenuItem_actionPerformed();
868 else if (source == njTreeBlosumMenuItem)
870 njTreeBlosumMenuItem_actionPerformed();
872 else if (source == avDistanceTreeBlosumMenuItem)
874 avTreeBlosumMenuItem_actionPerformed();
876 else if (source == documentation)
878 documentation_actionPerformed();
880 else if (source == about)
882 about_actionPerformed();
887 public void inputText_actionPerformed()
889 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
890 Frame frame = new Frame();
892 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
895 protected void outputText_actionPerformed(ActionEvent e)
897 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
898 Frame frame = new Frame();
900 jalview.bin.JalviewLite.addFrame(frame, "Alignment output - "
901 + e.getActionCommand(), 600, 500);
902 cap.setText(new AppletFormatAdapter().formatSequences(e
903 .getActionCommand(), viewport.getAlignment(),
904 viewport.showJVSuffix));
907 public void loadAnnotations()
909 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
910 cap.setText("Paste your features / annotations file here.");
911 cap.setAnnotationImport();
912 Frame frame = new Frame();
914 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
918 public String outputAnnotations(boolean displayTextbox)
920 String annotation = new AnnotationFile().printAnnotations(
921 viewport.showAnnotation ? viewport.alignment
922 .getAlignmentAnnotation() : null, viewport.alignment
924 ((Alignment) viewport.alignment).alignmentProperties);
928 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
929 Frame frame = new Frame();
931 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
932 cap.setText(annotation);
938 private Hashtable getDisplayedFeatureCols()
940 if (alignPanel.getFeatureRenderer()!=null) {
941 FeatureRenderer fr = alignPanel.getFeatureRenderer();
942 Hashtable fcols = new Hashtable();
943 Enumeration en = viewport.featuresDisplayed.keys();
944 while (en.hasMoreElements())
946 Object col = en.nextElement();
947 fcols.put(col,fr.featureColours.get(col));
954 public String outputFeatures(boolean displayTextbox, String format)
957 if (format.equalsIgnoreCase("Jalview"))
959 features = new FeaturesFile().printJalviewFormat(viewport.alignment
960 .getSequencesArray(), getDisplayedFeatureCols());
964 features = new FeaturesFile().printGFFFormat(viewport.alignment
965 .getSequencesArray(), getDisplayedFeatureCols());
970 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
971 Frame frame = new Frame();
973 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
975 cap.setText(features);
981 void launchFullApplication()
983 StringBuffer url = new StringBuffer(jalviewServletURL);
986 + appendProtocol(viewport.applet.getParameter("file")));
988 if (viewport.applet.getParameter("features") != null)
990 url.append("&features=");
991 url.append(appendProtocol(viewport.applet.getParameter("features")));
994 if (viewport.applet.getParameter("annotations") != null)
996 url.append("&annotations=");
998 .append(appendProtocol(viewport.applet
999 .getParameter("annotations")));
1002 if (viewport.applet.getParameter("jnetfile") != null)
1004 url.append("&annotations=");
1005 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1008 if (viewport.applet.getParameter("defaultColour") != null)
1010 url.append("&colour="
1011 + removeWhiteSpace(viewport.applet
1012 .getParameter("defaultColour")));
1015 if (viewport.applet.getParameter("userDefinedColour") != null)
1017 url.append("&colour="
1018 + removeWhiteSpace(viewport.applet
1019 .getParameter("userDefinedColour")));
1021 if (viewport.applet.getParameter("tree") != null)
1024 + appendProtocol(viewport.applet.getParameter("tree")));
1026 if (viewport.applet.getParameter("treeFile") != null)
1029 + appendProtocol(viewport.applet.getParameter("treeFile")));
1032 showURL(url.toString(), "FULL_APP");
1035 String removeWhiteSpace(String colour)
1037 StringBuffer sb = new StringBuffer();
1038 for (int i = 0; i < colour.length(); i++)
1040 if (Character.isWhitespace(colour.charAt(i)))
1046 sb.append(colour.charAt(i));
1050 return sb.toString();
1053 String appendProtocol(String url)
1058 url = URLEncoder.encode(url);
1061 * When we finally deprecate 1.1 compatibility, we can start to use
1062 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1063 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1064 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1065 * ex.printStackTrace(); }
1067 catch (java.net.MalformedURLException ex)
1069 url = viewport.applet.getCodeBase() + url;
1074 public void closeMenuItem_actionPerformed()
1076 PaintRefresher.RemoveComponent(alignPanel);
1077 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1078 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1080 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1091 void updateEditMenuBar()
1094 if (viewport.historyList.size() > 0)
1096 undoMenuItem.setEnabled(true);
1097 CommandI command = (CommandI) viewport.historyList.peek();
1098 undoMenuItem.setLabel("Undo " + command.getDescription());
1102 undoMenuItem.setEnabled(false);
1103 undoMenuItem.setLabel("Undo");
1106 if (viewport.redoList.size() > 0)
1108 redoMenuItem.setEnabled(true);
1110 CommandI command = (CommandI) viewport.redoList.peek();
1111 redoMenuItem.setLabel("Redo " + command.getDescription());
1115 redoMenuItem.setEnabled(false);
1116 redoMenuItem.setLabel("Redo");
1120 public void addHistoryItem(CommandI command)
1122 if (command.getSize() > 0)
1124 viewport.historyList.push(command);
1125 viewport.redoList.removeAllElements();
1126 updateEditMenuBar();
1127 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1137 protected void undoMenuItem_actionPerformed()
1139 if (viewport.historyList.size() < 1)
1144 CommandI command = (CommandI) viewport.historyList.pop();
1145 viewport.redoList.push(command);
1146 command.undoCommand(null);
1148 AlignViewport originalSource = getOriginatingSource(command);
1150 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1151 updateEditMenuBar();
1152 originalSource.firePropertyChange("alignment", null,
1153 originalSource.alignment.getSequences());
1162 protected void redoMenuItem_actionPerformed()
1164 if (viewport.redoList.size() < 1)
1169 CommandI command = (CommandI) viewport.redoList.pop();
1170 viewport.historyList.push(command);
1171 command.doCommand(null);
1173 AlignViewport originalSource = getOriginatingSource(command);
1174 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1176 updateEditMenuBar();
1177 originalSource.firePropertyChange("alignment", null,
1178 originalSource.alignment.getSequences());
1181 AlignViewport getOriginatingSource(CommandI command)
1183 AlignViewport originalSource = null;
1184 // For sequence removal and addition, we need to fire
1185 // the property change event FROM the viewport where the
1186 // original alignment was altered
1187 AlignmentI al = null;
1188 if (command instanceof EditCommand)
1190 EditCommand editCommand = (EditCommand) command;
1191 al = editCommand.getAlignment();
1192 Vector comps = (Vector) PaintRefresher.components.get(viewport
1193 .getSequenceSetId());
1194 for (int i = 0; i < comps.size(); i++)
1196 if (comps.elementAt(i) instanceof AlignmentPanel)
1198 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1200 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1207 if (originalSource == null)
1209 // The original view is closed, we must validate
1210 // the current view against the closed view first
1213 PaintRefresher.validateSequences(al, viewport.alignment);
1216 originalSource = viewport;
1219 return originalSource;
1222 public void moveSelectedSequences(boolean up)
1224 SequenceGroup sg = viewport.getSelectionGroup();
1232 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1234 SequenceI seq = viewport.alignment.getSequenceAt(i);
1235 if (!sg.getSequences(null).contains(seq))
1240 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1241 if (sg.getSequences(null).contains(temp))
1246 viewport.alignment.getSequences().setElementAt(temp, i);
1247 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1252 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1254 SequenceI seq = viewport.alignment.getSequenceAt(i);
1255 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1260 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1261 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1266 viewport.alignment.getSequences().setElementAt(temp, i);
1267 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1271 alignPanel.paintAlignment(true);
1274 synchronized void slideSequences(boolean right, int size)
1276 Vector sg = new Vector();
1277 if (viewport.cursorMode)
1279 sg.addElement(viewport.alignment
1280 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1282 else if (viewport.getSelectionGroup() != null
1283 && viewport.getSelectionGroup().getSize() != viewport.alignment
1286 sg = viewport.getSelectionGroup().getSequences(
1287 viewport.hiddenRepSequences);
1295 Vector invertGroup = new Vector();
1297 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1299 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1300 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1303 SequenceI[] seqs1 = new SequenceI[sg.size()];
1304 for (int i = 0; i < sg.size(); i++)
1305 seqs1[i] = (SequenceI) sg.elementAt(i);
1307 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1308 for (int i = 0; i < invertGroup.size(); i++)
1309 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1311 SlideSequencesCommand ssc;
1313 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1314 size, viewport.getGapCharacter());
1316 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1317 size, viewport.getGapCharacter());
1319 int groupAdjustment = 0;
1320 if (ssc.getGapsInsertedBegin() && right)
1322 if (viewport.cursorMode)
1323 alignPanel.seqPanel.moveCursor(size, 0);
1325 groupAdjustment = size;
1327 else if (!ssc.getGapsInsertedBegin() && !right)
1329 if (viewport.cursorMode)
1330 alignPanel.seqPanel.moveCursor(-size, 0);
1332 groupAdjustment = -size;
1335 if (groupAdjustment != 0)
1337 viewport.getSelectionGroup().setStartRes(
1338 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1339 viewport.getSelectionGroup().setEndRes(
1340 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1343 boolean appendHistoryItem = false;
1344 if (viewport.historyList != null && viewport.historyList.size() > 0
1345 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1347 appendHistoryItem = ssc
1348 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1352 if (!appendHistoryItem)
1353 addHistoryItem(ssc);
1358 static StringBuffer copiedSequences;
1360 static Vector copiedHiddenColumns;
1362 protected void copy_actionPerformed()
1364 if (viewport.getSelectionGroup() == null)
1369 SequenceGroup sg = viewport.getSelectionGroup();
1370 copiedSequences = new StringBuffer();
1371 Hashtable orderedSeqs = new Hashtable();
1372 for (int i = 0; i < sg.getSize(); i++)
1374 SequenceI seq = sg.getSequenceAt(i);
1375 int index = viewport.alignment.findIndex(seq);
1376 orderedSeqs.put(index + "", seq);
1379 int index = 0, startRes, endRes;
1382 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1384 copiedHiddenColumns = new Vector();
1385 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1386 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1389 int[] region = (int[]) viewport.getColumnSelection()
1390 .getHiddenColumns().elementAt(i);
1392 copiedHiddenColumns.addElement(new int[]
1393 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1398 copiedHiddenColumns = null;
1401 for (int i = 0; i < sg.getSize(); i++)
1403 SequenceI seq = null;
1407 if (orderedSeqs.containsKey(index + ""))
1409 seq = (SequenceI) orderedSeqs.get(index + "");
1421 // Returns residue following index if gap
1422 startRes = seq.findPosition(sg.getStartRes());
1425 // Need to find the residue preceeding index if gap
1428 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1430 ch = seq.getCharAt(j);
1431 if (!jalview.util.Comparison.isGap((ch)))
1439 endRes += seq.getStart() - 1;
1442 copiedSequences.append(seq.getName()
1448 + seq.getSequenceAsString(sg.getStartRes(),
1449 sg.getEndRes() + 1) + "\n");
1454 protected void pasteNew_actionPerformed()
1459 protected void pasteThis_actionPerformed()
1464 void paste(boolean newAlignment)
1469 if (copiedSequences == null)
1474 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1475 Vector seqs = new Vector();
1476 while (st.hasMoreElements())
1478 String name = st.nextToken();
1479 int start = Integer.parseInt(st.nextToken());
1480 int end = Integer.parseInt(st.nextToken());
1481 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1483 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1484 for (int i = 0; i < seqs.size(); i++)
1486 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1491 String newtitle = new String("Copied sequences");
1492 if (getTitle().startsWith("Copied sequences"))
1494 newtitle = getTitle();
1498 newtitle = newtitle.concat("- from " + getTitle());
1500 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1501 viewport.applet, newtitle, false);
1502 if (copiedHiddenColumns != null)
1504 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1506 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1507 af.viewport.hideColumns(region[0], region[1]);
1511 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1516 addSequences(newSeqs);
1519 } catch (Exception ex)
1521 } // could be anything being pasted in here
1525 void addSequences(SequenceI[] seqs)
1527 for (int i = 0; i < seqs.length; i++)
1529 viewport.alignment.addSequence(seqs[i]);
1533 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1534 seqs, 0, viewport.alignment.getWidth(), viewport.alignment));
1536 viewport.setEndSeq(viewport.alignment.getHeight());
1537 viewport.alignment.getWidth();
1538 viewport.firePropertyChange("alignment", null, viewport.alignment
1543 protected void cut_actionPerformed()
1545 copy_actionPerformed();
1546 delete_actionPerformed();
1549 protected void delete_actionPerformed()
1552 SequenceGroup sg = viewport.getSelectionGroup();
1558 Vector seqs = new Vector();
1560 for (int i = 0; i < sg.getSize(); i++)
1562 seq = sg.getSequenceAt(i);
1563 seqs.addElement(seq);
1566 // If the cut affects all sequences, remove highlighted columns
1567 if (sg.getSize() == viewport.alignment.getHeight())
1569 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1570 sg.getEndRes() + 1);
1573 SequenceI[] cut = new SequenceI[seqs.size()];
1574 for (int i = 0; i < seqs.size(); i++)
1576 cut[i] = (SequenceI) seqs.elementAt(i);
1580 * //ADD HISTORY ITEM
1582 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1583 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1584 viewport.alignment));
1586 viewport.setSelectionGroup(null);
1587 viewport.alignment.deleteGroup(sg);
1589 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1592 if (viewport.getAlignment().getHeight() < 1)
1594 this.setVisible(false);
1598 protected void deleteGroups_actionPerformed()
1600 viewport.alignment.deleteAllGroups();
1601 viewport.sequenceColours = null;
1602 viewport.setSelectionGroup(null);
1604 alignPanel.paintAlignment(true);
1607 public void selectAllSequenceMenuItem_actionPerformed()
1609 SequenceGroup sg = new SequenceGroup();
1610 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1612 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1614 sg.setEndRes(viewport.alignment.getWidth() - 1);
1615 viewport.setSelectionGroup(sg);
1616 alignPanel.paintAlignment(true);
1617 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1620 public void deselectAllSequenceMenuItem_actionPerformed()
1622 if (viewport.cursorMode)
1624 alignPanel.seqPanel.keyboardNo1 = null;
1625 alignPanel.seqPanel.keyboardNo2 = null;
1627 viewport.setSelectionGroup(null);
1628 viewport.getColumnSelection().clear();
1629 viewport.setSelectionGroup(null);
1630 alignPanel.idPanel.idCanvas.searchResults = null;
1631 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1632 alignPanel.paintAlignment(true);
1633 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1636 public void invertSequenceMenuItem_actionPerformed()
1638 SequenceGroup sg = viewport.getSelectionGroup();
1639 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1641 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1644 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1647 void trimAlignment(boolean trimLeft)
1649 ColumnSelection colSel = viewport.getColumnSelection();
1652 if (colSel.size() > 0)
1656 column = colSel.getMin();
1660 column = colSel.getMax();
1664 if (viewport.getSelectionGroup() != null)
1666 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1667 viewport.hiddenRepSequences);
1671 seqs = viewport.alignment.getSequencesArray();
1674 TrimRegionCommand trimRegion;
1677 trimRegion = new TrimRegionCommand("Remove Left",
1678 TrimRegionCommand.TRIM_LEFT, seqs, column,
1679 viewport.alignment, viewport.colSel,
1680 viewport.selectionGroup);
1681 viewport.setStartRes(0);
1685 trimRegion = new TrimRegionCommand("Remove Right",
1686 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1687 viewport.alignment, viewport.colSel,
1688 viewport.selectionGroup);
1691 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1693 addHistoryItem(trimRegion);
1695 Vector groups = viewport.alignment.getGroups();
1697 for (int i = 0; i < groups.size(); i++)
1699 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1701 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1702 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1704 viewport.alignment.deleteGroup(sg);
1708 viewport.firePropertyChange("alignment", null, viewport
1709 .getAlignment().getSequences());
1713 public void removeGappedColumnMenuItem_actionPerformed()
1715 int start = 0, end = viewport.alignment.getWidth() - 1;
1718 if (viewport.getSelectionGroup() != null)
1720 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1721 viewport.hiddenRepSequences);
1722 start = viewport.getSelectionGroup().getStartRes();
1723 end = viewport.getSelectionGroup().getEndRes();
1727 seqs = viewport.alignment.getSequencesArray();
1730 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1731 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1733 addHistoryItem(removeGapCols);
1735 statusBar.setText("Removed " + removeGapCols.getSize()
1736 + " empty columns.");
1738 // This is to maintain viewport position on first residue
1739 // of first sequence
1740 SequenceI seq = viewport.alignment.getSequenceAt(0);
1741 int startRes = seq.findPosition(viewport.startRes);
1742 // ShiftList shifts;
1743 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1744 // edit.alColumnChanges=shifts.getInverse();
1745 // if (viewport.hasHiddenColumns)
1746 // viewport.getColumnSelection().compensateForEdits(shifts);
1747 viewport.setStartRes(seq.findIndex(startRes) - 1);
1748 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1753 public void removeAllGapsMenuItem_actionPerformed()
1755 int start = 0, end = viewport.alignment.getWidth() - 1;
1758 if (viewport.getSelectionGroup() != null)
1760 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1761 viewport.hiddenRepSequences);
1762 start = viewport.getSelectionGroup().getStartRes();
1763 end = viewport.getSelectionGroup().getEndRes();
1767 seqs = viewport.alignment.getSequencesArray();
1770 // This is to maintain viewport position on first residue
1771 // of first sequence
1772 SequenceI seq = viewport.alignment.getSequenceAt(0);
1773 int startRes = seq.findPosition(viewport.startRes);
1775 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1776 viewport.alignment));
1778 viewport.setStartRes(seq.findIndex(startRes) - 1);
1780 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1785 public void findMenuItem_actionPerformed()
1787 new Finder(alignPanel);
1791 * create a new view derived from the current view
1794 * @return frame for the new view
1796 public AlignFrame newView(String viewtitle)
1799 if (viewport.hasHiddenRows)
1801 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1802 .getFullAlignment().getSequencesArray());
1806 newal = new Alignment(viewport.alignment.getSequencesArray());
1809 if (viewport.alignment.getAlignmentAnnotation() != null)
1811 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1813 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1816 .addAnnotation(viewport.alignment
1817 .getAlignmentAnnotation()[i]);
1822 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
1824 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1825 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1826 PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av
1827 .getSequenceSetId());
1829 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1830 newaf.alignPanel.av.getSequenceSetId());
1831 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1832 newaf.alignPanel.av.getSequenceSetId());
1834 Vector comps = (Vector) PaintRefresher.components.get(viewport
1835 .getSequenceSetId());
1837 for (int i = 0; i < comps.size(); i++)
1839 if (comps.elementAt(i) instanceof AlignmentPanel)
1845 String title = new String(this.getTitle());
1846 if (viewtitle != null)
1848 title = viewtitle + " ( " + title + ")";
1852 if (title.indexOf("(View") > -1)
1854 title = title.substring(0, title.indexOf("(View"));
1856 title += "(View " + viewSize + ")";
1859 newaf.setTitle(title.toString());
1861 newaf.viewport.historyList = viewport.historyList;
1862 newaf.viewport.redoList = viewport.redoList;
1868 * @return list of feature groups on the view
1870 public String[] getFeatureGroups()
1872 FeatureRenderer fr = null;
1873 if (alignPanel != null
1874 && (fr = alignPanel.getFeatureRenderer()) != null)
1876 return fr.getGroups();
1882 * get sequence feature groups that are hidden or shown
1888 public String[] getFeatureGroupsOfState(boolean visible)
1890 FeatureRenderer fr = null;
1891 if (alignPanel != null
1892 && (fr = alignPanel.getFeatureRenderer()) != null)
1894 return fr.getGroups(visible);
1900 * Change the display state for the given feature groups
1903 * list of group strings
1905 * visible or invisible
1907 public void setFeatureGroupState(String[] groups, boolean state)
1909 FeatureRenderer fr = null;
1910 this.sequenceFeatures.setState(true);
1911 viewport.showSequenceFeatures(true);
1912 if (alignPanel != null
1913 && (fr = alignPanel.getFeatureRenderer()) != null)
1915 fr.setGroupState(groups, state);
1916 alignPanel.seqPanel.seqCanvas.repaint();
1917 if (alignPanel.overviewPanel != null)
1919 alignPanel.overviewPanel.updateOverviewImage();
1924 public void seqLimits_itemStateChanged()
1926 viewport.setShowJVSuffix(seqLimits.getState());
1927 alignPanel.fontChanged();
1928 alignPanel.paintAlignment(true);
1931 protected void colourTextMenuItem_actionPerformed()
1933 viewport.setColourText(colourTextMenuItem.getState());
1934 alignPanel.paintAlignment(true);
1937 protected void displayNonconservedMenuItem_actionPerformed()
1939 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
1940 alignPanel.paintAlignment(true);
1943 protected void wrapMenuItem_actionPerformed()
1945 viewport.setWrapAlignment(wrapMenuItem.getState());
1946 alignPanel.setWrapAlignment(wrapMenuItem.getState());
1947 scaleAbove.setEnabled(wrapMenuItem.getState());
1948 scaleLeft.setEnabled(wrapMenuItem.getState());
1949 scaleRight.setEnabled(wrapMenuItem.getState());
1950 alignPanel.paintAlignment(true);
1953 public void overviewMenuItem_actionPerformed()
1955 if (alignPanel.overviewPanel != null)
1960 Frame frame = new Frame();
1961 OverviewPanel overview = new OverviewPanel(alignPanel);
1962 frame.add(overview);
1963 // +50 must allow for applet frame window
1964 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
1965 overview.getPreferredSize().width,
1966 overview.getPreferredSize().height + 50);
1969 frame.addWindowListener(new WindowAdapter()
1971 public void windowClosing(WindowEvent e)
1973 alignPanel.setOverviewPanel(null);
1977 alignPanel.setOverviewPanel(overview);
1981 void changeColour(ColourSchemeI cs)
1987 if (viewport.getAbovePIDThreshold())
1989 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
1992 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
1994 viewport.setGlobalColourScheme(cs);
1998 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2001 if (viewport.getConservationSelected())
2004 Alignment al = (Alignment) viewport.alignment;
2005 Conservation c = new Conservation("All",
2006 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2010 c.verdict(false, viewport.ConsPercGaps);
2012 cs.setConservation(c);
2014 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2020 cs.setConservation(null);
2023 cs.setConsensus(viewport.hconsensus);
2026 viewport.setGlobalColourScheme(cs);
2028 if (viewport.getColourAppliesToAllGroups())
2030 Vector groups = viewport.alignment.getGroups();
2031 for (int i = 0; i < groups.size(); i++)
2033 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2040 if (cs instanceof ClustalxColourScheme)
2042 sg.cs = new ClustalxColourScheme(sg
2043 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2049 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2050 } catch (Exception ex)
2052 ex.printStackTrace();
2057 if (viewport.getAbovePIDThreshold()
2058 || cs instanceof PIDColourScheme
2059 || cs instanceof Blosum62ColourScheme)
2061 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2062 sg.cs.setConsensus(AAFrequency.calculate(sg
2063 .getSequences(viewport.hiddenRepSequences), 0, sg
2068 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2071 if (viewport.getConservationSelected())
2073 Conservation c = new Conservation("Group",
2074 ResidueProperties.propHash, 3, sg
2075 .getSequences(viewport.hiddenRepSequences), 0,
2076 viewport.alignment.getWidth() - 1);
2078 c.verdict(false, viewport.ConsPercGaps);
2079 sg.cs.setConservation(c);
2083 sg.cs.setConservation(null);
2084 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2090 if (alignPanel.getOverviewPanel() != null)
2092 alignPanel.getOverviewPanel().updateOverviewImage();
2095 jalview.structure.StructureSelectionManager
2096 .getStructureSelectionManager().sequenceColoursChanged(
2099 alignPanel.paintAlignment(true);
2102 protected void modifyPID_actionPerformed()
2104 if (viewport.getAbovePIDThreshold()
2105 && viewport.globalColourScheme != null)
2107 SliderPanel.setPIDSliderSource(alignPanel, viewport
2108 .getGlobalColourScheme(), "Background");
2109 SliderPanel.showPIDSlider();
2113 protected void modifyConservation_actionPerformed()
2115 if (viewport.getConservationSelected()
2116 && viewport.globalColourScheme != null)
2118 SliderPanel.setConservationSlider(alignPanel,
2119 viewport.globalColourScheme, "Background");
2120 SliderPanel.showConservationSlider();
2124 protected void conservationMenuItem_actionPerformed()
2126 viewport.setConservationSelected(conservationMenuItem.getState());
2128 viewport.setAbovePIDThreshold(false);
2129 abovePIDThreshold.setState(false);
2131 changeColour(viewport.getGlobalColourScheme());
2133 modifyConservation_actionPerformed();
2136 public void abovePIDThreshold_actionPerformed()
2138 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2140 conservationMenuItem.setState(false);
2141 viewport.setConservationSelected(false);
2143 changeColour(viewport.getGlobalColourScheme());
2145 modifyPID_actionPerformed();
2147 public void sortPairwiseMenuItem_actionPerformed()
2149 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2150 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2151 .getAlignment().getSequenceAt(0), null);
2153 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2154 viewport.alignment));
2155 alignPanel.paintAlignment(true);
2158 public void sortIDMenuItem_actionPerformed()
2160 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2161 AlignmentSorter.sortByID(viewport.getAlignment());
2162 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2163 viewport.alignment));
2164 alignPanel.paintAlignment(true);
2167 public void sortGroupMenuItem_actionPerformed()
2169 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2170 AlignmentSorter.sortByGroup(viewport.getAlignment());
2171 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2172 viewport.alignment));
2173 alignPanel.paintAlignment(true);
2177 public void removeRedundancyMenuItem_actionPerformed()
2179 new RedundancyPanel(alignPanel);
2182 public void pairwiseAlignmentMenuItem_actionPerformed()
2184 if (viewport.getSelectionGroup() != null
2185 && viewport.getSelectionGroup().getSize() > 1)
2187 Frame frame = new Frame();
2188 frame.add(new PairwiseAlignPanel(alignPanel));
2189 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2194 public void PCAMenuItem_actionPerformed()
2196 // are the sequences aligned?
2197 if (!viewport.alignment.isAligned())
2200 int Width = viewport.getAlignment().getWidth();
2202 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2204 current = viewport.getAlignment().getSequenceAt(i);
2206 if (current.getLength() < Width)
2208 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2211 alignPanel.paintAlignment(true);
2214 if ((viewport.getSelectionGroup() != null
2215 && viewport.getSelectionGroup().getSize() < 4 && viewport
2216 .getSelectionGroup().getSize() > 0)
2217 || viewport.getAlignment().getHeight() < 4)
2224 new PCAPanel(viewport);
2225 } catch (java.lang.OutOfMemoryError ex)
2231 public void averageDistanceTreeMenuItem_actionPerformed()
2233 NewTreePanel("AV", "PID", "Average distance tree using PID");
2236 public void neighbourTreeMenuItem_actionPerformed()
2238 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2241 protected void njTreeBlosumMenuItem_actionPerformed()
2243 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2246 protected void avTreeBlosumMenuItem_actionPerformed()
2248 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2251 void NewTreePanel(String type, String pwType, String title)
2253 // are the sequences aligned?
2254 if (!viewport.alignment.isAligned())
2257 int Width = viewport.getAlignment().getWidth();
2259 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2261 current = viewport.getAlignment().getSequenceAt(i);
2263 if (current.getLength() < Width)
2265 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2268 alignPanel.paintAlignment(true);
2272 if ((viewport.getSelectionGroup() != null && viewport
2273 .getSelectionGroup().getSize() > 1)
2274 || (viewport.getSelectionGroup() == null && viewport.alignment
2277 final TreePanel tp = new TreePanel(viewport, type, pwType);
2279 addTreeMenuItem(tp, title);
2281 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2285 void loadTree_actionPerformed()
2287 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2288 cap.setText("Paste your Newick tree file here.");
2289 cap.setTreeImport();
2290 Frame frame = new Frame();
2292 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2295 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2297 TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree);
2298 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2299 addTreeMenuItem(tp, treeFile);
2302 * sort the alignment using the given treePanel
2303 * @param treePanel tree used to sort view
2304 * @param title string used for undo event name
2306 public void sortByTree(TreePanel treePanel, String title)
2308 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2309 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel
2311 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2312 // HistoryItem.SORT));
2313 addHistoryItem(new OrderCommand("Order by "+title, oldOrder,
2314 viewport.alignment));
2315 alignPanel.paintAlignment(true);
2318 * Do any automatic reordering of the alignment and add the necessary bits to the menu structure for the new tree
2322 protected void addTreeMenuItem(final TreePanel treePanel, final String title)
2324 final MenuItem item = new MenuItem(title);
2325 sortByTreeMenu.add(item);
2326 item.addActionListener(new java.awt.event.ActionListener()
2328 public void actionPerformed(ActionEvent evt)
2330 sortByTree(treePanel, title); // treePanel.getTitle());
2334 treePanel.addWindowListener(new WindowAdapter()
2336 public void windowOpened(WindowEvent e)
2338 if (viewport.sortByTree)
2340 sortByTree(treePanel, title);
2342 super.windowOpened(e);
2345 public void windowClosing(WindowEvent e)
2347 sortByTreeMenu.remove(item);
2352 protected void documentation_actionPerformed()
2354 showURL("http://www.jalview.org/help.html", "HELP");
2357 protected void about_actionPerformed()
2360 class AboutPanel extends Canvas
2364 public AboutPanel(String version)
2366 this.version = version;
2369 public void paint(Graphics g)
2371 g.setColor(Color.white);
2372 g.fillRect(0, 0, getSize().width, getSize().height);
2373 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2374 FontMetrics fm = g.getFontMetrics();
2375 int fh = fm.getHeight();
2377 g.setColor(Color.black);
2378 // TODO: update this text for each release or centrally store it for
2379 // lite and application
2380 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2381 g.drawString("JalviewLite - Release " + version, x, y += fh);
2382 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2385 "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,",
2387 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2390 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2394 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2396 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2398 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",x,y+=fh);
2399 g.drawString("Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",x,y+=fh);
2400 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",x,y+=fh);
2404 String version = "test";
2405 java.net.URL url = getClass().getResource("/.build_properties");
2410 BufferedReader reader = new BufferedReader(new InputStreamReader(
2413 while ((line = reader.readLine()) != null)
2415 if (line.indexOf("VERSION") > -1)
2417 version = line.substring(line.indexOf("=") + 1);
2420 } catch (Exception ex)
2422 ex.printStackTrace();
2426 Frame frame = new Frame();
2427 frame.add(new AboutPanel(version));
2428 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2432 public void showURL(String url, String target)
2434 if (viewport.applet == null)
2436 System.out.println("Not running as applet - no browser available.");
2442 if (url.indexOf(":")==-1)
2444 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to form valid URL
2445 if (url.indexOf("/")==0)
2447 String codebase = viewport.applet.getCodeBase().toString();
2448 url = codebase.substring(0,codebase.length()-viewport.applet.getCodeBase().getFile().length())+url;
2450 url = viewport.applet.getCodeBase()+url;
2452 System.out.println("Show url (prepended codebase): " + url);
2454 System.out.println("Show url: " + url);
2456 viewport.applet.getAppletContext().showDocument(
2457 new java.net.URL(url), target);
2458 } catch (Exception ex)
2460 ex.printStackTrace();
2465 // ////////////////////////////////////////////////////////////////////////////////
2466 // JBuilder Graphics here
2468 MenuBar alignFrameMenuBar = new MenuBar();
2470 Menu fileMenu = new Menu("File");
2472 MenuItem loadApplication = new MenuItem("View in Full Application");
2474 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2476 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2478 MenuItem outputFeatures = new MenuItem("Export Features ...");
2480 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2482 MenuItem closeMenuItem = new MenuItem("Close");
2484 Menu editMenu = new Menu("Edit");
2486 Menu viewMenu = new Menu("View");
2488 Menu colourMenu = new Menu("Colour");
2490 Menu calculateMenu = new Menu("Calculate");
2492 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2494 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2496 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2498 MenuItem remove2LeftMenuItem = new MenuItem();
2500 MenuItem remove2RightMenuItem = new MenuItem();
2502 MenuItem removeGappedColumnMenuItem = new MenuItem();
2504 MenuItem removeAllGapsMenuItem = new MenuItem();
2506 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2508 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2510 MenuItem sortPairwiseMenuItem = new MenuItem();
2512 MenuItem sortIDMenuItem = new MenuItem();
2514 MenuItem sortGroupMenuItem = new MenuItem();
2516 MenuItem removeRedundancyMenuItem = new MenuItem();
2518 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2520 MenuItem PCAMenuItem = new MenuItem();
2522 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2524 MenuItem neighbourTreeMenuItem = new MenuItem();
2526 BorderLayout borderLayout1 = new BorderLayout();
2528 public Label statusBar = new Label();
2530 Menu outputTextboxMenu = new Menu();
2532 MenuItem clustalColour = new MenuItem();
2534 MenuItem zappoColour = new MenuItem();
2536 MenuItem taylorColour = new MenuItem();
2538 MenuItem hydrophobicityColour = new MenuItem();
2540 MenuItem helixColour = new MenuItem();
2542 MenuItem strandColour = new MenuItem();
2544 MenuItem turnColour = new MenuItem();
2546 MenuItem buriedColour = new MenuItem();
2548 MenuItem userDefinedColour = new MenuItem();
2550 MenuItem PIDColour = new MenuItem();
2552 MenuItem BLOSUM62Colour = new MenuItem();
2554 MenuItem njTreeBlosumMenuItem = new MenuItem();
2556 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2558 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2560 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2562 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2564 MenuItem alProperties = new MenuItem("Alignment Properties...");
2566 MenuItem overviewMenuItem = new MenuItem();
2568 MenuItem undoMenuItem = new MenuItem();
2570 MenuItem redoMenuItem = new MenuItem();
2572 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2574 MenuItem noColourmenuItem = new MenuItem();
2576 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2578 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2580 MenuItem findMenuItem = new MenuItem();
2582 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2584 MenuItem nucleotideColour = new MenuItem();
2586 MenuItem deleteGroups = new MenuItem();
2588 MenuItem delete = new MenuItem();
2590 MenuItem copy = new MenuItem();
2592 MenuItem cut = new MenuItem();
2594 Menu pasteMenu = new Menu();
2596 MenuItem pasteNew = new MenuItem();
2598 MenuItem pasteThis = new MenuItem();
2600 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2602 MenuItem font = new MenuItem();
2604 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2606 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2608 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2610 MenuItem modifyPID = new MenuItem();
2612 MenuItem modifyConservation = new MenuItem();
2614 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2615 "Autocalculate Consensus", true);
2617 Menu sortByTreeMenu = new Menu();
2619 Menu sort = new Menu();
2621 Menu calculate = new Menu();
2623 MenuItem inputText = new MenuItem();
2625 Menu helpMenu = new Menu();
2627 MenuItem documentation = new MenuItem();
2629 MenuItem about = new MenuItem();
2631 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2633 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2635 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2637 private void jbInit() throws Exception
2640 setMenuBar(alignFrameMenuBar);
2644 // dynamically fill save as menu with available formats
2645 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2648 item = new MenuItem(
2649 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2651 item.addActionListener(new java.awt.event.ActionListener()
2653 public void actionPerformed(ActionEvent e)
2655 outputText_actionPerformed(e);
2659 outputTextboxMenu.add(item);
2661 closeMenuItem.addActionListener(this);
2662 loadApplication.addActionListener(this);
2664 loadTree.addActionListener(this);
2665 loadAnnotations.addActionListener(this);
2666 outputFeatures.addActionListener(this);
2667 outputAnnotations.addActionListener(this);
2668 selectAllSequenceMenuItem.addActionListener(this);
2669 deselectAllSequenceMenuItem.addActionListener(this);
2670 invertSequenceMenuItem.addActionListener(this);
2671 remove2LeftMenuItem.setLabel("Remove Left");
2672 remove2LeftMenuItem.addActionListener(this);
2673 remove2RightMenuItem.setLabel("Remove Right");
2674 remove2RightMenuItem.addActionListener(this);
2675 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2676 removeGappedColumnMenuItem.addActionListener(this);
2677 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2678 removeAllGapsMenuItem.addActionListener(this);
2679 viewBoxesMenuItem.setLabel("Boxes");
2680 viewBoxesMenuItem.setState(true);
2681 viewBoxesMenuItem.addItemListener(this);
2682 viewTextMenuItem.setLabel("Text");
2683 viewTextMenuItem.setState(true);
2684 viewTextMenuItem.addItemListener(this);
2685 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2686 sortPairwiseMenuItem.addActionListener(this);
2687 sortIDMenuItem.setLabel("by ID");
2688 sortIDMenuItem.addActionListener(this);
2689 sortGroupMenuItem.setLabel("by Group");
2690 sortGroupMenuItem.addActionListener(this);
2691 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2692 removeRedundancyMenuItem.addActionListener(this);
2693 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2694 pairwiseAlignmentMenuItem.addActionListener(this);
2695 PCAMenuItem.setLabel("Principal Component Analysis");
2696 PCAMenuItem.addActionListener(this);
2697 averageDistanceTreeMenuItem
2698 .setLabel("Average Distance Using % Identity");
2699 averageDistanceTreeMenuItem.addActionListener(this);
2700 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2701 neighbourTreeMenuItem.addActionListener(this);
2702 statusBar.setBackground(Color.white);
2703 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2704 statusBar.setText("Status bar");
2705 outputTextboxMenu.setLabel("Output to Textbox");
2706 clustalColour.setLabel("Clustalx");
2708 clustalColour.addActionListener(this);
2709 zappoColour.setLabel("Zappo");
2710 zappoColour.addActionListener(this);
2711 taylorColour.setLabel("Taylor");
2712 taylorColour.addActionListener(this);
2713 hydrophobicityColour.setLabel("Hydrophobicity");
2714 hydrophobicityColour.addActionListener(this);
2715 helixColour.setLabel("Helix Propensity");
2716 helixColour.addActionListener(this);
2717 strandColour.setLabel("Strand Propensity");
2718 strandColour.addActionListener(this);
2719 turnColour.setLabel("Turn Propensity");
2720 turnColour.addActionListener(this);
2721 buriedColour.setLabel("Buried Index");
2722 buriedColour.addActionListener(this);
2723 userDefinedColour.setLabel("User Defined...");
2724 userDefinedColour.addActionListener(this);
2725 PIDColour.setLabel("Percentage Identity");
2726 PIDColour.addActionListener(this);
2727 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2728 BLOSUM62Colour.addActionListener(this);
2729 avDistanceTreeBlosumMenuItem
2730 .setLabel("Average Distance Using BLOSUM62");
2731 avDistanceTreeBlosumMenuItem.addActionListener(this);
2732 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2733 njTreeBlosumMenuItem.addActionListener(this);
2734 annotationPanelMenuItem.setLabel("Show Annotations");
2735 annotationPanelMenuItem.addItemListener(this);
2736 colourTextMenuItem.setLabel("Colour Text");
2737 colourTextMenuItem.addItemListener(this);
2738 displayNonconservedMenuItem.setLabel("Show non-conserved");
2739 displayNonconservedMenuItem.addItemListener(this);
2740 alProperties.addActionListener(this);
2741 overviewMenuItem.setLabel("Overview Window");
2742 overviewMenuItem.addActionListener(this);
2743 undoMenuItem.setEnabled(false);
2744 undoMenuItem.setLabel("Undo");
2745 undoMenuItem.addActionListener(this);
2746 redoMenuItem.setEnabled(false);
2747 redoMenuItem.setLabel("Redo");
2748 redoMenuItem.addActionListener(this);
2749 conservationMenuItem.setLabel("by Conservation");
2750 conservationMenuItem.addItemListener(this);
2751 noColourmenuItem.setLabel("None");
2752 noColourmenuItem.addActionListener(this);
2753 wrapMenuItem.setLabel("Wrap");
2754 wrapMenuItem.addItemListener(this);
2755 renderGapsMenuItem.setLabel("Show Gaps");
2756 renderGapsMenuItem.setState(true);
2757 renderGapsMenuItem.addItemListener(this);
2758 findMenuItem.setLabel("Find...");
2759 findMenuItem.addActionListener(this);
2760 abovePIDThreshold.setLabel("Above Identity Threshold");
2761 abovePIDThreshold.addItemListener(this);
2762 nucleotideColour.setLabel("Nucleotide");
2763 nucleotideColour.addActionListener(this);
2764 deleteGroups.setLabel("Undefine Groups");
2765 deleteGroups.addActionListener(this);
2766 copy.setLabel("Copy");
2767 copy.addActionListener(this);
2768 cut.setLabel("Cut");
2769 cut.addActionListener(this);
2770 delete.setLabel("Delete");
2771 delete.addActionListener(this);
2772 pasteMenu.setLabel("Paste");
2773 pasteNew.setLabel("To New Alignment");
2774 pasteNew.addActionListener(this);
2775 pasteThis.setLabel("Add To This Alignment");
2776 pasteThis.addActionListener(this);
2777 applyToAllGroups.setLabel("Apply Colour To All Groups");
2778 applyToAllGroups.setState(true);
2779 applyToAllGroups.addItemListener(this);
2780 font.setLabel("Font...");
2781 font.addActionListener(this);
2782 scaleAbove.setLabel("Scale Above");
2783 scaleAbove.setState(true);
2784 scaleAbove.setEnabled(false);
2785 scaleAbove.addItemListener(this);
2786 scaleLeft.setEnabled(false);
2787 scaleLeft.setState(true);
2788 scaleLeft.setLabel("Scale Left");
2789 scaleLeft.addItemListener(this);
2790 scaleRight.setEnabled(false);
2791 scaleRight.setState(true);
2792 scaleRight.setLabel("Scale Right");
2793 scaleRight.addItemListener(this);
2794 modifyPID.setLabel("Modify Identity Threshold...");
2795 modifyPID.addActionListener(this);
2796 modifyConservation.setLabel("Modify Conservation Threshold...");
2797 modifyConservation.addActionListener(this);
2798 sortByTreeMenu.setLabel("By Tree Order");
2799 sort.setLabel("Sort");
2800 calculate.setLabel("Calculate Tree");
2801 autoCalculate.addItemListener(this);
2802 inputText.setLabel("Input from textbox");
2803 inputText.addActionListener(this);
2804 centreColumnLabelFlag.setLabel("Centre column labels");
2805 centreColumnLabelFlag.addItemListener(this);
2806 followMouseOverFlag.setLabel("Automatic Scrolling");
2807 followMouseOverFlag.addItemListener(this);
2808 helpMenu.setLabel("Help");
2809 documentation.setLabel("Documentation");
2810 documentation.addActionListener(this);
2812 about.setLabel("About...");
2813 about.addActionListener(this);
2814 seqLimits.setState(true);
2815 seqLimits.setLabel("Show Sequence Limits");
2816 seqLimits.addItemListener(this);
2817 featureSettings.setLabel("Feature Settings...");
2818 featureSettings.addActionListener(this);
2819 sequenceFeatures.setLabel("Sequence Features");
2820 sequenceFeatures.addItemListener(this);
2821 sequenceFeatures.setState(false);
2822 annotationColour.setLabel("by Annotation...");
2823 annotationColour.addActionListener(this);
2824 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2825 invertColSel.setLabel("Invert Column Selection");
2826 menu1.setLabel("Show");
2827 showColumns.setLabel("All Columns ");
2828 showSeqs.setLabel("All Sequences");
2829 menu2.setLabel("Hide");
2830 hideColumns.setLabel("Selected Columns");
2831 hideSequences.setLabel("Selected Sequences");
2832 invertColSel.addActionListener(this);
2833 showColumns.addActionListener(this);
2834 showSeqs.addActionListener(this);
2835 hideColumns.addActionListener(this);
2836 hideSequences.addActionListener(this);
2837 formatMenu.setLabel("Format");
2838 selectMenu.setLabel("Select");
2839 newView.setLabel("New View");
2840 newView.addActionListener(this);
2841 alignFrameMenuBar.add(fileMenu);
2842 alignFrameMenuBar.add(editMenu);
2843 alignFrameMenuBar.add(selectMenu);
2844 alignFrameMenuBar.add(viewMenu);
2845 alignFrameMenuBar.add(formatMenu);
2846 alignFrameMenuBar.add(colourMenu);
2847 alignFrameMenuBar.add(calculateMenu);
2848 alignFrameMenuBar.add(helpMenu);
2850 fileMenu.add(inputText);
2851 fileMenu.add(loadTree);
2852 fileMenu.add(loadAnnotations);
2854 fileMenu.addSeparator();
2855 fileMenu.add(outputTextboxMenu);
2856 fileMenu.add(outputFeatures);
2857 fileMenu.add(outputAnnotations);
2859 if (jalviewServletURL != null)
2861 fileMenu.add(loadApplication);
2864 fileMenu.addSeparator();
2865 fileMenu.add(closeMenuItem);
2867 editMenu.add(undoMenuItem);
2868 editMenu.add(redoMenuItem);
2871 editMenu.add(pasteMenu);
2872 editMenu.add(delete);
2873 editMenu.addSeparator();
2874 editMenu.add(remove2LeftMenuItem);
2875 editMenu.add(remove2RightMenuItem);
2876 editMenu.add(removeGappedColumnMenuItem);
2877 editMenu.add(removeAllGapsMenuItem);
2878 editMenu.add(removeRedundancyMenuItem);
2879 viewMenu.add(newView);
2880 viewMenu.addSeparator();
2881 viewMenu.add(menu1);
2882 viewMenu.add(menu2);
2883 viewMenu.addSeparator();
2884 viewMenu.add(followMouseOverFlag);
2885 viewMenu.add(annotationPanelMenuItem);
2886 viewMenu.addSeparator();
2887 viewMenu.add(sequenceFeatures);
2888 viewMenu.add(featureSettings);
2889 viewMenu.addSeparator();
2890 viewMenu.add(alProperties);
2891 viewMenu.addSeparator();
2892 viewMenu.add(overviewMenuItem);
2893 colourMenu.add(applyToAllGroups);
2894 colourMenu.addSeparator();
2895 colourMenu.add(noColourmenuItem);
2896 colourMenu.add(clustalColour);
2897 colourMenu.add(BLOSUM62Colour);
2898 colourMenu.add(PIDColour);
2899 colourMenu.add(zappoColour);
2900 colourMenu.add(taylorColour);
2901 colourMenu.add(hydrophobicityColour);
2902 colourMenu.add(helixColour);
2903 colourMenu.add(strandColour);
2904 colourMenu.add(turnColour);
2905 colourMenu.add(buriedColour);
2906 colourMenu.add(nucleotideColour);
2907 colourMenu.add(userDefinedColour);
2908 colourMenu.addSeparator();
2909 colourMenu.add(conservationMenuItem);
2910 colourMenu.add(modifyConservation);
2911 colourMenu.add(abovePIDThreshold);
2912 colourMenu.add(modifyPID);
2913 colourMenu.add(annotationColour);
2914 calculateMenu.add(sort);
2915 calculateMenu.add(calculate);
2916 calculateMenu.addSeparator();
2917 calculateMenu.add(pairwiseAlignmentMenuItem);
2918 calculateMenu.add(PCAMenuItem);
2919 calculateMenu.add(autoCalculate);
2920 this.add(statusBar, BorderLayout.SOUTH);
2921 pasteMenu.add(pasteNew);
2922 pasteMenu.add(pasteThis);
2923 sort.add(sortIDMenuItem);
2924 sort.add(sortByTreeMenu);
2925 sort.add(sortGroupMenuItem);
2926 sort.add(sortPairwiseMenuItem);
2927 calculate.add(averageDistanceTreeMenuItem);
2928 calculate.add(neighbourTreeMenuItem);
2929 calculate.add(avDistanceTreeBlosumMenuItem);
2930 calculate.add(njTreeBlosumMenuItem);
2931 helpMenu.add(documentation);
2932 helpMenu.add(about);
2933 menu1.add(showColumns);
2934 menu1.add(showSeqs);
2935 menu2.add(hideColumns);
2936 menu2.add(hideSequences);
2937 formatMenu.add(font);
2938 formatMenu.add(seqLimits);
2939 formatMenu.add(wrapMenuItem);
2940 formatMenu.add(scaleAbove);
2941 formatMenu.add(scaleLeft);
2942 formatMenu.add(scaleRight);
2943 formatMenu.add(viewBoxesMenuItem);
2944 formatMenu.add(viewTextMenuItem);
2945 formatMenu.add(colourTextMenuItem);
2946 formatMenu.add(displayNonconservedMenuItem);
2947 formatMenu.add(renderGapsMenuItem);
2948 formatMenu.add(centreColumnLabelFlag);
2949 selectMenu.add(findMenuItem);
2950 selectMenu.addSeparator();
2951 selectMenu.add(selectAllSequenceMenuItem);
2952 selectMenu.add(deselectAllSequenceMenuItem);
2953 selectMenu.add(invertSequenceMenuItem);
2954 selectMenu.add(invertColSel);
2955 selectMenu.add(deleteGroups);
2958 MenuItem featureSettings = new MenuItem();
2960 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
2962 MenuItem annotationColour = new MenuItem();
2964 MenuItem invertColSel = new MenuItem();
2966 Menu menu1 = new Menu();
2968 MenuItem showColumns = new MenuItem();
2970 MenuItem showSeqs = new MenuItem();
2972 Menu menu2 = new Menu();
2974 MenuItem hideColumns = new MenuItem();
2976 MenuItem hideSequences = new MenuItem();
2978 Menu formatMenu = new Menu();
2980 Menu selectMenu = new Menu();
2982 MenuItem newView = new MenuItem();
2985 * Attach the alignFrame panels after embedding menus, if necessary. This used
2986 * to be called setEmbedded, but is now creates the dropdown menus in a
2987 * platform independent manner to avoid OSX/Mac menu appendage daftness.
2989 * @param reallyEmbedded
2990 * true to attach the view to the applet area on the page
2991 * rather than in a new window
2993 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
2998 // Explicly build the embedded menu panel for the on-page applet
3000 // view cannot be closed if its actually on the page
3001 fileMenu.remove(closeMenuItem);
3002 fileMenu.remove(3); // Remove Seperator
3003 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3004 Font.PLAIN, 10, false); // use our own fonts.
3005 // and actually add the components to the applet area
3006 viewport.applet.setLayout(new BorderLayout());
3007 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3008 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3009 alignPanel.setSize(viewport.applet.getSize().width, viewport.applet
3011 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
3012 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3013 viewport.applet.validate();
3018 // test and embed menu bar if necessary.
3020 if (embedMenuIfNeeded(alignPanel))
3022 // adjust for status bar height too
3023 alignPanel.setSize(getSize().width, getSize().height
3024 - statusBar.HEIGHT);
3026 add(statusBar, BorderLayout.SOUTH);
3027 add(alignPanel, BorderLayout.CENTER);
3028 // and register with the applet so it can pass external API calls to us
3029 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,