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 alignPanel.paintAlignment(true);
183 public void keyPressed(KeyEvent evt)
185 if (viewport.cursorMode
186 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
187 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
188 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
189 && Character.isDigit(evt.getKeyChar()))
190 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
192 switch (evt.getKeyCode())
194 case 27: // escape key
195 deselectAllSequenceMenuItem_actionPerformed();
198 if (evt.isControlDown() || evt.isMetaDown())
200 cut_actionPerformed();
204 if (viewport.cursorMode && !evt.isControlDown())
206 alignPanel.seqPanel.setCursorColumn();
208 if (evt.isControlDown() || evt.isMetaDown())
210 copy_actionPerformed();
214 if (evt.isControlDown())
216 paste(evt.isShiftDown());
220 if (evt.isControlDown() || evt.isMetaDown())
222 selectAllSequenceMenuItem_actionPerformed();
225 case KeyEvent.VK_DOWN:
226 if (viewport.cursorMode)
228 alignPanel.seqPanel.moveCursor(0, 1);
232 moveSelectedSequences(false);
237 if (viewport.cursorMode)
239 alignPanel.seqPanel.moveCursor(0, -1);
243 moveSelectedSequences(true);
247 case KeyEvent.VK_LEFT:
248 if (evt.isAltDown() || !viewport.cursorMode)
249 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
251 alignPanel.seqPanel.moveCursor(-1, 0);
254 case KeyEvent.VK_RIGHT:
255 if (evt.isAltDown() || !viewport.cursorMode)
256 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
258 alignPanel.seqPanel.moveCursor(1, 0);
261 case KeyEvent.VK_SPACE:
262 if (viewport.cursorMode)
264 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
265 || evt.isShiftDown() || evt.isAltDown());
269 case KeyEvent.VK_DELETE:
270 case KeyEvent.VK_BACK_SPACE:
271 if (viewport.cursorMode)
273 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
274 || evt.isShiftDown() || evt.isAltDown());
278 cut_actionPerformed();
279 alignPanel.seqPanel.seqCanvas.repaint();
284 if (viewport.cursorMode)
286 alignPanel.seqPanel.setCursorRow();
290 if (viewport.cursorMode)
292 alignPanel.seqPanel.setCursorPosition();
296 case KeyEvent.VK_ENTER:
297 case KeyEvent.VK_COMMA:
298 if (viewport.cursorMode)
300 alignPanel.seqPanel.setCursorRowAndColumn();
305 if (viewport.cursorMode)
307 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
311 if (viewport.cursorMode)
313 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
318 viewport.cursorMode = !viewport.cursorMode;
319 statusBar.setText("Keyboard editing mode is "
320 + (viewport.cursorMode ? "on" : "off"));
321 if (viewport.cursorMode)
323 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
324 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
329 if (evt.isControlDown())
331 findMenuItem_actionPerformed();
337 boolean toggleSeqs = !evt.isControlDown();
338 boolean toggleCols = !evt.isShiftDown();
339 boolean hide = false;
340 SequenceGroup sg = viewport.getSelectionGroup();
344 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
347 viewport.hideAllSelectedSeqs();
349 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
351 viewport.showAllHiddenSeqs();
357 if (viewport.colSel.getSelected().size() > 0)
359 viewport.hideSelectedColumns();
362 viewport.selectionGroup = sg;
367 viewport.showAllHiddenColumns();
373 case KeyEvent.VK_PAGE_UP:
374 if (viewport.wrapAlignment)
376 alignPanel.scrollUp(true);
380 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
381 - viewport.endSeq + viewport.startSeq);
385 case KeyEvent.VK_PAGE_DOWN:
386 if (viewport.wrapAlignment)
388 alignPanel.scrollUp(false);
392 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
393 + viewport.endSeq - viewport.startSeq);
398 if (evt.isControlDown())
400 undoMenuItem_actionPerformed();
405 if (evt.isControlDown())
407 redoMenuItem_actionPerformed();
412 if (evt.isControlDown())
419 if (evt.isControlDown())
421 trimAlignment(false);
426 if (evt.isControlDown())
428 if (evt.isShiftDown())
430 this.removeAllGapsMenuItem_actionPerformed();
434 removeGappedColumnMenuItem_actionPerformed();
439 if (evt.isControlDown())
443 viewport.invertColumnSelection();
447 this.invertSequenceMenuItem_actionPerformed();
453 if (evt.isControlDown())
455 this.deleteGroups_actionPerformed();
460 if (evt.isControlDown())
467 alignPanel.paintAlignment(true);
470 public void keyReleased(KeyEvent evt)
474 public void keyTyped(KeyEvent evt)
478 public void itemStateChanged(ItemEvent evt)
480 if (evt.getSource() == displayNonconservedMenuItem)
482 displayNonconservedMenuItem_actionPerformed();
484 else if (evt.getSource() == colourTextMenuItem)
486 colourTextMenuItem_actionPerformed();
488 else if (evt.getSource() == wrapMenuItem)
490 wrapMenuItem_actionPerformed();
492 else if (evt.getSource() == scaleAbove)
494 viewport.setScaleAboveWrapped(scaleAbove.getState());
496 else if (evt.getSource() == scaleLeft)
498 viewport.setScaleLeftWrapped(scaleLeft.getState());
500 else if (evt.getSource() == scaleRight)
502 viewport.setScaleRightWrapped(scaleRight.getState());
504 else if (evt.getSource() == seqLimits)
506 seqLimits_itemStateChanged();
508 else if (evt.getSource() == viewBoxesMenuItem)
510 viewport.setShowBoxes(viewBoxesMenuItem.getState());
512 else if (evt.getSource() == viewTextMenuItem)
514 viewport.setShowText(viewTextMenuItem.getState());
516 else if (evt.getSource() == renderGapsMenuItem)
518 viewport.setRenderGaps(renderGapsMenuItem.getState());
520 else if (evt.getSource() == annotationPanelMenuItem)
522 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
523 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
525 else if (evt.getSource() == sequenceFeatures)
527 viewport.showSequenceFeatures(sequenceFeatures.getState());
528 alignPanel.seqPanel.seqCanvas.repaint();
530 else if (evt.getSource() == conservationMenuItem)
532 conservationMenuItem_actionPerformed();
534 else if (evt.getSource() == abovePIDThreshold)
536 abovePIDThreshold_actionPerformed();
538 else if (evt.getSource() == applyToAllGroups)
540 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
542 else if (evt.getSource() == autoCalculate)
544 viewport.autocalculateConsensus = autoCalculate.getState();
546 else if (evt.getSource() == this.centreColumnLabelFlag)
548 centreColumnLabelFlag_stateChanged();
549 } else if (evt.getSource() == this.followMouseOverFlag)
551 mouseOverFlag_stateChanged();
554 alignPanel.paintAlignment(true);
557 private void mouseOverFlag_stateChanged()
559 viewport.followHighlight = followMouseOverFlag.getState();
560 // TODO: could kick the scrollTo mechanism to reset view for current searchresults.
563 private void centreColumnLabelFlag_stateChanged()
565 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
566 this.alignPanel.annotationPanel.repaint();
569 public void actionPerformed(ActionEvent evt)
571 Object source = evt.getSource();
573 if (source == inputText)
575 inputText_actionPerformed();
577 else if (source == loadTree)
579 loadTree_actionPerformed();
581 else if (source == loadApplication)
583 launchFullApplication();
585 else if (source == loadAnnotations)
589 else if (source == outputAnnotations)
591 outputAnnotations(true);
593 else if (source == outputFeatures)
595 outputFeatures(true, "Jalview");
597 else if (source == closeMenuItem)
599 closeMenuItem_actionPerformed();
601 else if (source == copy)
603 copy_actionPerformed();
605 else if (source == undoMenuItem)
607 undoMenuItem_actionPerformed();
609 else if (source == redoMenuItem)
611 redoMenuItem_actionPerformed();
613 else if (source == inputText)
615 inputText_actionPerformed();
617 else if (source == closeMenuItem)
619 closeMenuItem_actionPerformed();
621 else if (source == undoMenuItem)
623 undoMenuItem_actionPerformed();
625 else if (source == redoMenuItem)
627 redoMenuItem_actionPerformed();
629 else if (source == copy)
631 copy_actionPerformed();
633 else if (source == pasteNew)
635 pasteNew_actionPerformed();
637 else if (source == pasteThis)
639 pasteThis_actionPerformed();
641 else if (source == cut)
643 cut_actionPerformed();
645 else if (source == delete)
647 delete_actionPerformed();
649 else if (source == deleteGroups)
651 deleteGroups_actionPerformed();
653 else if (source == selectAllSequenceMenuItem)
655 selectAllSequenceMenuItem_actionPerformed();
657 else if (source == deselectAllSequenceMenuItem)
659 deselectAllSequenceMenuItem_actionPerformed();
661 else if (source == invertSequenceMenuItem)
663 invertSequenceMenuItem_actionPerformed();
665 else if (source == invertColSel)
667 viewport.invertColumnSelection();
668 alignPanel.paintAlignment(true);
670 else if (source == remove2LeftMenuItem)
674 else if (source == remove2RightMenuItem)
676 trimAlignment(false);
678 else if (source == removeGappedColumnMenuItem)
680 removeGappedColumnMenuItem_actionPerformed();
682 else if (source == removeAllGapsMenuItem)
684 removeAllGapsMenuItem_actionPerformed();
686 else if (source == findMenuItem)
688 findMenuItem_actionPerformed();
690 else if (source == font)
692 new FontChooser(alignPanel);
694 else if (source == newView)
698 else if (source == showColumns)
700 viewport.showAllHiddenColumns();
701 alignPanel.paintAlignment(true);
703 else if (source == showSeqs)
705 viewport.showAllHiddenSeqs();
707 else if (source == hideColumns)
709 viewport.hideSelectedColumns();
710 alignPanel.paintAlignment(true);
712 else if (source == hideSequences
713 && viewport.getSelectionGroup() != null)
715 viewport.hideAllSelectedSeqs();
717 else if (source == featureSettings)
719 new FeatureSettings(alignPanel);
721 else if (source == alProperties)
723 StringBuffer contents = new StringBuffer();
726 int min = Integer.MAX_VALUE, max = 0;
727 for (int i = 0; i < viewport.alignment.getHeight(); i++)
729 int size = viewport.alignment.getSequenceAt(i).getEnd()
730 - viewport.alignment.getSequenceAt(i).getStart();
737 avg = avg / (float) viewport.alignment.getHeight();
739 contents.append("\nSequences: " + viewport.alignment.getHeight());
740 contents.append("\nMinimum Sequence Length: " + min);
741 contents.append("\nMaximum Sequence Length: " + max);
742 contents.append("\nAverage Length: " + (int) avg);
744 if (((Alignment) viewport.alignment).alignmentProperties != null)
746 Hashtable props = ((Alignment) viewport.alignment).alignmentProperties;
747 Enumeration en = props.keys();
748 while (en.hasMoreElements())
750 String key = en.nextElement().toString();
751 contents.append("\n" + key + "\t" + props.get(key));
755 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
756 cap.setText(contents.toString());
757 Frame frame = new Frame();
759 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
760 + getTitle(), 400, 250);
762 else if (source == overviewMenuItem)
764 overviewMenuItem_actionPerformed();
766 else if (source == noColourmenuItem)
770 else if (source == clustalColour)
772 abovePIDThreshold.setState(false);
773 changeColour(new ClustalxColourScheme(viewport.alignment
774 .getSequences(), viewport.alignment.getWidth()));
776 else if (source == zappoColour)
778 changeColour(new ZappoColourScheme());
780 else if (source == taylorColour)
782 changeColour(new TaylorColourScheme());
784 else if (source == hydrophobicityColour)
786 changeColour(new HydrophobicColourScheme());
788 else if (source == helixColour)
790 changeColour(new HelixColourScheme());
792 else if (source == strandColour)
794 changeColour(new StrandColourScheme());
796 else if (source == turnColour)
798 changeColour(new TurnColourScheme());
800 else if (source == buriedColour)
802 changeColour(new BuriedColourScheme());
804 else if (source == nucleotideColour)
806 changeColour(new NucleotideColourScheme());
808 else if (source == modifyPID)
810 modifyPID_actionPerformed();
812 else if (source == modifyConservation)
814 modifyConservation_actionPerformed();
816 else if (source == userDefinedColour)
818 new UserDefinedColours(alignPanel, null);
820 else if (source == PIDColour)
822 changeColour(new PIDColourScheme());
824 else if (source == BLOSUM62Colour)
826 changeColour(new Blosum62ColourScheme());
828 else if (source == annotationColour)
830 new AnnotationColourChooser(viewport, alignPanel);
832 else if (source == sortPairwiseMenuItem)
834 sortPairwiseMenuItem_actionPerformed();
836 else if (source == sortIDMenuItem)
838 sortIDMenuItem_actionPerformed();
840 else if (source == sortGroupMenuItem)
842 sortGroupMenuItem_actionPerformed();
844 else if (source == removeRedundancyMenuItem)
846 removeRedundancyMenuItem_actionPerformed();
848 else if (source == pairwiseAlignmentMenuItem)
850 pairwiseAlignmentMenuItem_actionPerformed();
852 else if (source == PCAMenuItem)
854 PCAMenuItem_actionPerformed();
856 else if (source == averageDistanceTreeMenuItem)
858 averageDistanceTreeMenuItem_actionPerformed();
860 else if (source == neighbourTreeMenuItem)
862 neighbourTreeMenuItem_actionPerformed();
864 else if (source == njTreeBlosumMenuItem)
866 njTreeBlosumMenuItem_actionPerformed();
868 else if (source == avDistanceTreeBlosumMenuItem)
870 avTreeBlosumMenuItem_actionPerformed();
872 else if (source == documentation)
874 documentation_actionPerformed();
876 else if (source == about)
878 about_actionPerformed();
883 public void inputText_actionPerformed()
885 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
886 Frame frame = new Frame();
888 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
891 protected void outputText_actionPerformed(ActionEvent e)
893 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
894 Frame frame = new Frame();
896 jalview.bin.JalviewLite.addFrame(frame, "Alignment output - "
897 + e.getActionCommand(), 600, 500);
898 cap.setText(new AppletFormatAdapter().formatSequences(e
899 .getActionCommand(), viewport.getAlignment(),
900 viewport.showJVSuffix));
903 public void loadAnnotations()
905 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
906 cap.setText("Paste your features / annotations file here.");
907 cap.setAnnotationImport();
908 Frame frame = new Frame();
910 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
914 public String outputAnnotations(boolean displayTextbox)
916 String annotation = new AnnotationFile().printAnnotations(
917 viewport.showAnnotation ? viewport.alignment
918 .getAlignmentAnnotation() : null, viewport.alignment
920 ((Alignment) viewport.alignment).alignmentProperties);
924 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
925 Frame frame = new Frame();
927 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
928 cap.setText(annotation);
934 private Hashtable getDisplayedFeatureCols()
936 if (alignPanel.getFeatureRenderer()!=null) {
937 FeatureRenderer fr = alignPanel.getFeatureRenderer();
938 Hashtable fcols = new Hashtable();
939 Enumeration en = viewport.featuresDisplayed.keys();
940 while (en.hasMoreElements())
942 Object col = en.nextElement();
943 fcols.put(col,fr.featureColours.get(col));
950 public String outputFeatures(boolean displayTextbox, String format)
953 if (format.equalsIgnoreCase("Jalview"))
955 features = new FeaturesFile().printJalviewFormat(viewport.alignment
956 .getSequencesArray(), getDisplayedFeatureCols());
960 features = new FeaturesFile().printGFFFormat(viewport.alignment
961 .getSequencesArray(), getDisplayedFeatureCols());
966 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
967 Frame frame = new Frame();
969 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
971 cap.setText(features);
977 void launchFullApplication()
979 StringBuffer url = new StringBuffer(jalviewServletURL);
982 + appendProtocol(viewport.applet.getParameter("file")));
984 if (viewport.applet.getParameter("features") != null)
986 url.append("&features=");
987 url.append(appendProtocol(viewport.applet.getParameter("features")));
990 if (viewport.applet.getParameter("annotations") != null)
992 url.append("&annotations=");
994 .append(appendProtocol(viewport.applet
995 .getParameter("annotations")));
998 if (viewport.applet.getParameter("jnetfile") != null)
1000 url.append("&annotations=");
1001 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1004 if (viewport.applet.getParameter("defaultColour") != null)
1006 url.append("&colour="
1007 + removeWhiteSpace(viewport.applet
1008 .getParameter("defaultColour")));
1011 if (viewport.applet.getParameter("userDefinedColour") != null)
1013 url.append("&colour="
1014 + removeWhiteSpace(viewport.applet
1015 .getParameter("userDefinedColour")));
1017 if (viewport.applet.getParameter("tree") != null)
1020 + appendProtocol(viewport.applet.getParameter("tree")));
1022 if (viewport.applet.getParameter("treeFile") != null)
1025 + appendProtocol(viewport.applet.getParameter("treeFile")));
1028 showURL(url.toString(), "FULL_APP");
1031 String removeWhiteSpace(String colour)
1033 StringBuffer sb = new StringBuffer();
1034 for (int i = 0; i < colour.length(); i++)
1036 if (Character.isWhitespace(colour.charAt(i)))
1042 sb.append(colour.charAt(i));
1046 return sb.toString();
1049 String appendProtocol(String url)
1054 url = URLEncoder.encode(url);
1057 * When we finally deprecate 1.1 compatibility, we can start to use
1058 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1059 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1060 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1061 * ex.printStackTrace(); }
1063 catch (java.net.MalformedURLException ex)
1065 url = viewport.applet.getCodeBase() + url;
1070 public void closeMenuItem_actionPerformed()
1072 PaintRefresher.RemoveComponent(alignPanel);
1073 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1074 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1076 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1087 void updateEditMenuBar()
1090 if (viewport.historyList.size() > 0)
1092 undoMenuItem.setEnabled(true);
1093 CommandI command = (CommandI) viewport.historyList.peek();
1094 undoMenuItem.setLabel("Undo " + command.getDescription());
1098 undoMenuItem.setEnabled(false);
1099 undoMenuItem.setLabel("Undo");
1102 if (viewport.redoList.size() > 0)
1104 redoMenuItem.setEnabled(true);
1106 CommandI command = (CommandI) viewport.redoList.peek();
1107 redoMenuItem.setLabel("Redo " + command.getDescription());
1111 redoMenuItem.setEnabled(false);
1112 redoMenuItem.setLabel("Redo");
1116 public void addHistoryItem(CommandI command)
1118 if (command.getSize() > 0)
1120 viewport.historyList.push(command);
1121 viewport.redoList.removeAllElements();
1122 updateEditMenuBar();
1123 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1133 protected void undoMenuItem_actionPerformed()
1135 if (viewport.historyList.size() < 1)
1140 CommandI command = (CommandI) viewport.historyList.pop();
1141 viewport.redoList.push(command);
1142 command.undoCommand(null);
1144 AlignViewport originalSource = getOriginatingSource(command);
1146 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1147 updateEditMenuBar();
1148 originalSource.firePropertyChange("alignment", null,
1149 originalSource.alignment.getSequences());
1158 protected void redoMenuItem_actionPerformed()
1160 if (viewport.redoList.size() < 1)
1165 CommandI command = (CommandI) viewport.redoList.pop();
1166 viewport.historyList.push(command);
1167 command.doCommand(null);
1169 AlignViewport originalSource = getOriginatingSource(command);
1170 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1172 updateEditMenuBar();
1173 originalSource.firePropertyChange("alignment", null,
1174 originalSource.alignment.getSequences());
1177 AlignViewport getOriginatingSource(CommandI command)
1179 AlignViewport originalSource = null;
1180 // For sequence removal and addition, we need to fire
1181 // the property change event FROM the viewport where the
1182 // original alignment was altered
1183 AlignmentI al = null;
1184 if (command instanceof EditCommand)
1186 EditCommand editCommand = (EditCommand) command;
1187 al = editCommand.getAlignment();
1188 Vector comps = (Vector) PaintRefresher.components.get(viewport
1189 .getSequenceSetId());
1190 for (int i = 0; i < comps.size(); i++)
1192 if (comps.elementAt(i) instanceof AlignmentPanel)
1194 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1196 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1203 if (originalSource == null)
1205 // The original view is closed, we must validate
1206 // the current view against the closed view first
1209 PaintRefresher.validateSequences(al, viewport.alignment);
1212 originalSource = viewport;
1215 return originalSource;
1218 public void moveSelectedSequences(boolean up)
1220 SequenceGroup sg = viewport.getSelectionGroup();
1228 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1230 SequenceI seq = viewport.alignment.getSequenceAt(i);
1231 if (!sg.getSequences(null).contains(seq))
1236 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1237 if (sg.getSequences(null).contains(temp))
1242 viewport.alignment.getSequences().setElementAt(temp, i);
1243 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1248 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1250 SequenceI seq = viewport.alignment.getSequenceAt(i);
1251 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1256 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1257 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1262 viewport.alignment.getSequences().setElementAt(temp, i);
1263 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1267 alignPanel.paintAlignment(true);
1270 synchronized void slideSequences(boolean right, int size)
1272 Vector sg = new Vector();
1273 if (viewport.cursorMode)
1275 sg.addElement(viewport.alignment
1276 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1278 else if (viewport.getSelectionGroup() != null
1279 && viewport.getSelectionGroup().getSize() != viewport.alignment
1282 sg = viewport.getSelectionGroup().getSequences(
1283 viewport.hiddenRepSequences);
1291 Vector invertGroup = new Vector();
1293 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1295 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1296 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1299 SequenceI[] seqs1 = new SequenceI[sg.size()];
1300 for (int i = 0; i < sg.size(); i++)
1301 seqs1[i] = (SequenceI) sg.elementAt(i);
1303 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1304 for (int i = 0; i < invertGroup.size(); i++)
1305 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1307 SlideSequencesCommand ssc;
1309 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1310 size, viewport.getGapCharacter());
1312 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1313 size, viewport.getGapCharacter());
1315 int groupAdjustment = 0;
1316 if (ssc.getGapsInsertedBegin() && right)
1318 if (viewport.cursorMode)
1319 alignPanel.seqPanel.moveCursor(size, 0);
1321 groupAdjustment = size;
1323 else if (!ssc.getGapsInsertedBegin() && !right)
1325 if (viewport.cursorMode)
1326 alignPanel.seqPanel.moveCursor(-size, 0);
1328 groupAdjustment = -size;
1331 if (groupAdjustment != 0)
1333 viewport.getSelectionGroup().setStartRes(
1334 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1335 viewport.getSelectionGroup().setEndRes(
1336 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1339 boolean appendHistoryItem = false;
1340 if (viewport.historyList != null && viewport.historyList.size() > 0
1341 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1343 appendHistoryItem = ssc
1344 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1348 if (!appendHistoryItem)
1349 addHistoryItem(ssc);
1354 static StringBuffer copiedSequences;
1356 static Vector copiedHiddenColumns;
1358 protected void copy_actionPerformed()
1360 if (viewport.getSelectionGroup() == null)
1365 SequenceGroup sg = viewport.getSelectionGroup();
1366 copiedSequences = new StringBuffer();
1367 Hashtable orderedSeqs = new Hashtable();
1368 for (int i = 0; i < sg.getSize(); i++)
1370 SequenceI seq = sg.getSequenceAt(i);
1371 int index = viewport.alignment.findIndex(seq);
1372 orderedSeqs.put(index + "", seq);
1375 int index = 0, startRes, endRes;
1378 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1380 copiedHiddenColumns = new Vector();
1381 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1382 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1385 int[] region = (int[]) viewport.getColumnSelection()
1386 .getHiddenColumns().elementAt(i);
1388 copiedHiddenColumns.addElement(new int[]
1389 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1394 copiedHiddenColumns = null;
1397 for (int i = 0; i < sg.getSize(); i++)
1399 SequenceI seq = null;
1403 if (orderedSeqs.containsKey(index + ""))
1405 seq = (SequenceI) orderedSeqs.get(index + "");
1417 // Returns residue following index if gap
1418 startRes = seq.findPosition(sg.getStartRes());
1421 // Need to find the residue preceeding index if gap
1424 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1426 ch = seq.getCharAt(j);
1427 if (!jalview.util.Comparison.isGap((ch)))
1435 endRes += seq.getStart() - 1;
1438 copiedSequences.append(seq.getName()
1444 + seq.getSequenceAsString(sg.getStartRes(),
1445 sg.getEndRes() + 1) + "\n");
1450 protected void pasteNew_actionPerformed()
1455 protected void pasteThis_actionPerformed()
1460 void paste(boolean newAlignment)
1465 if (copiedSequences == null)
1470 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1471 Vector seqs = new Vector();
1472 while (st.hasMoreElements())
1474 String name = st.nextToken();
1475 int start = Integer.parseInt(st.nextToken());
1476 int end = Integer.parseInt(st.nextToken());
1477 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1479 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1480 for (int i = 0; i < seqs.size(); i++)
1482 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1487 String newtitle = new String("Copied sequences");
1488 if (getTitle().startsWith("Copied sequences"))
1490 newtitle = getTitle();
1494 newtitle = newtitle.concat("- from " + getTitle());
1496 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1497 viewport.applet, newtitle, false);
1498 if (copiedHiddenColumns != null)
1500 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1502 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1503 af.viewport.hideColumns(region[0], region[1]);
1507 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1512 addSequences(newSeqs);
1515 } catch (Exception ex)
1517 } // could be anything being pasted in here
1521 void addSequences(SequenceI[] seqs)
1523 for (int i = 0; i < seqs.length; i++)
1525 viewport.alignment.addSequence(seqs[i]);
1529 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1530 seqs, 0, viewport.alignment.getWidth(), viewport.alignment));
1532 viewport.setEndSeq(viewport.alignment.getHeight());
1533 viewport.alignment.getWidth();
1534 viewport.firePropertyChange("alignment", null, viewport.alignment
1539 protected void cut_actionPerformed()
1541 copy_actionPerformed();
1542 delete_actionPerformed();
1545 protected void delete_actionPerformed()
1548 SequenceGroup sg = viewport.getSelectionGroup();
1554 Vector seqs = new Vector();
1556 for (int i = 0; i < sg.getSize(); i++)
1558 seq = sg.getSequenceAt(i);
1559 seqs.addElement(seq);
1562 // If the cut affects all sequences, remove highlighted columns
1563 if (sg.getSize() == viewport.alignment.getHeight())
1565 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1566 sg.getEndRes() + 1);
1569 SequenceI[] cut = new SequenceI[seqs.size()];
1570 for (int i = 0; i < seqs.size(); i++)
1572 cut[i] = (SequenceI) seqs.elementAt(i);
1576 * //ADD HISTORY ITEM
1578 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1579 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1580 viewport.alignment));
1582 viewport.setSelectionGroup(null);
1583 viewport.alignment.deleteGroup(sg);
1585 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1588 if (viewport.getAlignment().getHeight() < 1)
1590 this.setVisible(false);
1594 protected void deleteGroups_actionPerformed()
1596 viewport.alignment.deleteAllGroups();
1597 viewport.sequenceColours = null;
1598 viewport.setSelectionGroup(null);
1600 alignPanel.paintAlignment(true);
1603 public void selectAllSequenceMenuItem_actionPerformed()
1605 SequenceGroup sg = new SequenceGroup();
1606 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1608 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1610 sg.setEndRes(viewport.alignment.getWidth() - 1);
1611 viewport.setSelectionGroup(sg);
1612 alignPanel.paintAlignment(true);
1613 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1616 public void deselectAllSequenceMenuItem_actionPerformed()
1618 if (viewport.cursorMode)
1620 alignPanel.seqPanel.keyboardNo1 = null;
1621 alignPanel.seqPanel.keyboardNo2 = null;
1623 viewport.setSelectionGroup(null);
1624 viewport.getColumnSelection().clear();
1625 viewport.setSelectionGroup(null);
1626 alignPanel.idPanel.idCanvas.searchResults = null;
1627 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1628 alignPanel.paintAlignment(true);
1629 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1632 public void invertSequenceMenuItem_actionPerformed()
1634 SequenceGroup sg = viewport.getSelectionGroup();
1635 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1637 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1640 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1643 void trimAlignment(boolean trimLeft)
1645 ColumnSelection colSel = viewport.getColumnSelection();
1648 if (colSel.size() > 0)
1652 column = colSel.getMin();
1656 column = colSel.getMax();
1660 if (viewport.getSelectionGroup() != null)
1662 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1663 viewport.hiddenRepSequences);
1667 seqs = viewport.alignment.getSequencesArray();
1670 TrimRegionCommand trimRegion;
1673 trimRegion = new TrimRegionCommand("Remove Left",
1674 TrimRegionCommand.TRIM_LEFT, seqs, column,
1675 viewport.alignment, viewport.colSel,
1676 viewport.selectionGroup);
1677 viewport.setStartRes(0);
1681 trimRegion = new TrimRegionCommand("Remove Right",
1682 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1683 viewport.alignment, viewport.colSel,
1684 viewport.selectionGroup);
1687 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1689 addHistoryItem(trimRegion);
1691 Vector groups = viewport.alignment.getGroups();
1693 for (int i = 0; i < groups.size(); i++)
1695 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1697 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1698 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1700 viewport.alignment.deleteGroup(sg);
1704 viewport.firePropertyChange("alignment", null, viewport
1705 .getAlignment().getSequences());
1709 public void removeGappedColumnMenuItem_actionPerformed()
1711 int start = 0, end = viewport.alignment.getWidth() - 1;
1714 if (viewport.getSelectionGroup() != null)
1716 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1717 viewport.hiddenRepSequences);
1718 start = viewport.getSelectionGroup().getStartRes();
1719 end = viewport.getSelectionGroup().getEndRes();
1723 seqs = viewport.alignment.getSequencesArray();
1726 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1727 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1729 addHistoryItem(removeGapCols);
1731 statusBar.setText("Removed " + removeGapCols.getSize()
1732 + " empty columns.");
1734 // This is to maintain viewport position on first residue
1735 // of first sequence
1736 SequenceI seq = viewport.alignment.getSequenceAt(0);
1737 int startRes = seq.findPosition(viewport.startRes);
1738 // ShiftList shifts;
1739 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1740 // edit.alColumnChanges=shifts.getInverse();
1741 // if (viewport.hasHiddenColumns)
1742 // viewport.getColumnSelection().compensateForEdits(shifts);
1743 viewport.setStartRes(seq.findIndex(startRes) - 1);
1744 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1749 public void removeAllGapsMenuItem_actionPerformed()
1751 int start = 0, end = viewport.alignment.getWidth() - 1;
1754 if (viewport.getSelectionGroup() != null)
1756 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1757 viewport.hiddenRepSequences);
1758 start = viewport.getSelectionGroup().getStartRes();
1759 end = viewport.getSelectionGroup().getEndRes();
1763 seqs = viewport.alignment.getSequencesArray();
1766 // This is to maintain viewport position on first residue
1767 // of first sequence
1768 SequenceI seq = viewport.alignment.getSequenceAt(0);
1769 int startRes = seq.findPosition(viewport.startRes);
1771 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1772 viewport.alignment));
1774 viewport.setStartRes(seq.findIndex(startRes) - 1);
1776 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1781 public void findMenuItem_actionPerformed()
1783 new Finder(alignPanel);
1787 * create a new view derived from the current view
1790 * @return frame for the new view
1792 public AlignFrame newView(String viewtitle)
1795 if (viewport.hasHiddenRows)
1797 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1798 .getFullAlignment().getSequencesArray());
1802 newal = new Alignment(viewport.alignment.getSequencesArray());
1805 if (viewport.alignment.getAlignmentAnnotation() != null)
1807 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1809 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1812 .addAnnotation(viewport.alignment
1813 .getAlignmentAnnotation()[i]);
1818 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
1820 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1821 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1822 PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av
1823 .getSequenceSetId());
1825 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1826 newaf.alignPanel.av.getSequenceSetId());
1827 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1828 newaf.alignPanel.av.getSequenceSetId());
1830 Vector comps = (Vector) PaintRefresher.components.get(viewport
1831 .getSequenceSetId());
1833 for (int i = 0; i < comps.size(); i++)
1835 if (comps.elementAt(i) instanceof AlignmentPanel)
1841 String title = new String(this.getTitle());
1842 if (viewtitle != null)
1844 title = viewtitle + " ( " + title + ")";
1848 if (title.indexOf("(View") > -1)
1850 title = title.substring(0, title.indexOf("(View"));
1852 title += "(View " + viewSize + ")";
1855 newaf.setTitle(title.toString());
1857 newaf.viewport.historyList = viewport.historyList;
1858 newaf.viewport.redoList = viewport.redoList;
1864 * @return list of feature groups on the view
1866 public String[] getFeatureGroups()
1868 FeatureRenderer fr = null;
1869 if (alignPanel != null
1870 && (fr = alignPanel.getFeatureRenderer()) != null)
1872 return fr.getGroups();
1878 * get sequence feature groups that are hidden or shown
1884 public String[] getFeatureGroupsOfState(boolean visible)
1886 FeatureRenderer fr = null;
1887 if (alignPanel != null
1888 && (fr = alignPanel.getFeatureRenderer()) != null)
1890 return fr.getGroups(visible);
1896 * Change the display state for the given feature groups
1899 * list of group strings
1901 * visible or invisible
1903 public void setFeatureGroupState(String[] groups, boolean state)
1905 FeatureRenderer fr = null;
1906 this.sequenceFeatures.setState(true);
1907 viewport.showSequenceFeatures(true);
1908 if (alignPanel != null
1909 && (fr = alignPanel.getFeatureRenderer()) != null)
1911 fr.setGroupState(groups, state);
1912 alignPanel.seqPanel.seqCanvas.repaint();
1913 if (alignPanel.overviewPanel != null)
1915 alignPanel.overviewPanel.updateOverviewImage();
1920 public void seqLimits_itemStateChanged()
1922 viewport.setShowJVSuffix(seqLimits.getState());
1923 alignPanel.fontChanged();
1924 alignPanel.paintAlignment(true);
1927 protected void colourTextMenuItem_actionPerformed()
1929 viewport.setColourText(colourTextMenuItem.getState());
1930 alignPanel.paintAlignment(true);
1933 protected void displayNonconservedMenuItem_actionPerformed()
1935 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
1936 alignPanel.paintAlignment(true);
1939 protected void wrapMenuItem_actionPerformed()
1941 viewport.setWrapAlignment(wrapMenuItem.getState());
1942 alignPanel.setWrapAlignment(wrapMenuItem.getState());
1943 scaleAbove.setEnabled(wrapMenuItem.getState());
1944 scaleLeft.setEnabled(wrapMenuItem.getState());
1945 scaleRight.setEnabled(wrapMenuItem.getState());
1946 alignPanel.paintAlignment(true);
1949 public void overviewMenuItem_actionPerformed()
1951 if (alignPanel.overviewPanel != null)
1956 Frame frame = new Frame();
1957 OverviewPanel overview = new OverviewPanel(alignPanel);
1958 frame.add(overview);
1959 // +50 must allow for applet frame window
1960 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
1961 overview.getPreferredSize().width,
1962 overview.getPreferredSize().height + 50);
1965 frame.addWindowListener(new WindowAdapter()
1967 public void windowClosing(WindowEvent e)
1969 alignPanel.setOverviewPanel(null);
1973 alignPanel.setOverviewPanel(overview);
1977 void changeColour(ColourSchemeI cs)
1983 if (viewport.getAbovePIDThreshold())
1985 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
1988 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
1990 viewport.setGlobalColourScheme(cs);
1994 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
1997 if (viewport.getConservationSelected())
2000 Alignment al = (Alignment) viewport.alignment;
2001 Conservation c = new Conservation("All",
2002 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2006 c.verdict(false, viewport.ConsPercGaps);
2008 cs.setConservation(c);
2010 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2016 cs.setConservation(null);
2019 cs.setConsensus(viewport.hconsensus);
2022 viewport.setGlobalColourScheme(cs);
2024 if (viewport.getColourAppliesToAllGroups())
2026 Vector groups = viewport.alignment.getGroups();
2027 for (int i = 0; i < groups.size(); i++)
2029 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2036 if (cs instanceof ClustalxColourScheme)
2038 sg.cs = new ClustalxColourScheme(sg
2039 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2045 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2046 } catch (Exception ex)
2048 ex.printStackTrace();
2053 if (viewport.getAbovePIDThreshold()
2054 || cs instanceof PIDColourScheme
2055 || cs instanceof Blosum62ColourScheme)
2057 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2058 sg.cs.setConsensus(AAFrequency.calculate(sg
2059 .getSequences(viewport.hiddenRepSequences), 0, sg
2064 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2067 if (viewport.getConservationSelected())
2069 Conservation c = new Conservation("Group",
2070 ResidueProperties.propHash, 3, sg
2071 .getSequences(viewport.hiddenRepSequences), 0,
2072 viewport.alignment.getWidth() - 1);
2074 c.verdict(false, viewport.ConsPercGaps);
2075 sg.cs.setConservation(c);
2079 sg.cs.setConservation(null);
2080 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2086 if (alignPanel.getOverviewPanel() != null)
2088 alignPanel.getOverviewPanel().updateOverviewImage();
2091 jalview.structure.StructureSelectionManager
2092 .getStructureSelectionManager().sequenceColoursChanged(
2095 alignPanel.paintAlignment(true);
2098 protected void modifyPID_actionPerformed()
2100 if (viewport.getAbovePIDThreshold()
2101 && viewport.globalColourScheme != null)
2103 SliderPanel.setPIDSliderSource(alignPanel, viewport
2104 .getGlobalColourScheme(), "Background");
2105 SliderPanel.showPIDSlider();
2109 protected void modifyConservation_actionPerformed()
2111 if (viewport.getConservationSelected()
2112 && viewport.globalColourScheme != null)
2114 SliderPanel.setConservationSlider(alignPanel,
2115 viewport.globalColourScheme, "Background");
2116 SliderPanel.showConservationSlider();
2120 protected void conservationMenuItem_actionPerformed()
2122 viewport.setConservationSelected(conservationMenuItem.getState());
2124 viewport.setAbovePIDThreshold(false);
2125 abovePIDThreshold.setState(false);
2127 changeColour(viewport.getGlobalColourScheme());
2129 modifyConservation_actionPerformed();
2132 public void abovePIDThreshold_actionPerformed()
2134 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2136 conservationMenuItem.setState(false);
2137 viewport.setConservationSelected(false);
2139 changeColour(viewport.getGlobalColourScheme());
2141 modifyPID_actionPerformed();
2143 public void sortPairwiseMenuItem_actionPerformed()
2145 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2146 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2147 .getAlignment().getSequenceAt(0), null);
2149 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2150 viewport.alignment));
2151 alignPanel.paintAlignment(true);
2154 public void sortIDMenuItem_actionPerformed()
2156 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2157 AlignmentSorter.sortByID(viewport.getAlignment());
2158 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2159 viewport.alignment));
2160 alignPanel.paintAlignment(true);
2163 public void sortGroupMenuItem_actionPerformed()
2165 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2166 AlignmentSorter.sortByGroup(viewport.getAlignment());
2167 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2168 viewport.alignment));
2169 alignPanel.paintAlignment(true);
2173 public void removeRedundancyMenuItem_actionPerformed()
2175 new RedundancyPanel(alignPanel);
2178 public void pairwiseAlignmentMenuItem_actionPerformed()
2180 if (viewport.getSelectionGroup() != null
2181 && viewport.getSelectionGroup().getSize() > 1)
2183 Frame frame = new Frame();
2184 frame.add(new PairwiseAlignPanel(alignPanel));
2185 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2190 public void PCAMenuItem_actionPerformed()
2192 // are the sequences aligned?
2193 if (!viewport.alignment.isAligned())
2196 int Width = viewport.getAlignment().getWidth();
2198 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2200 current = viewport.getAlignment().getSequenceAt(i);
2202 if (current.getLength() < Width)
2204 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2207 alignPanel.paintAlignment(true);
2210 if ((viewport.getSelectionGroup() != null
2211 && viewport.getSelectionGroup().getSize() < 4 && viewport
2212 .getSelectionGroup().getSize() > 0)
2213 || viewport.getAlignment().getHeight() < 4)
2220 new PCAPanel(viewport);
2221 } catch (java.lang.OutOfMemoryError ex)
2227 public void averageDistanceTreeMenuItem_actionPerformed()
2229 NewTreePanel("AV", "PID", "Average distance tree using PID");
2232 public void neighbourTreeMenuItem_actionPerformed()
2234 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2237 protected void njTreeBlosumMenuItem_actionPerformed()
2239 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2242 protected void avTreeBlosumMenuItem_actionPerformed()
2244 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2247 void NewTreePanel(String type, String pwType, String title)
2249 // are the sequences aligned?
2250 if (!viewport.alignment.isAligned())
2253 int Width = viewport.getAlignment().getWidth();
2255 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2257 current = viewport.getAlignment().getSequenceAt(i);
2259 if (current.getLength() < Width)
2261 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2264 alignPanel.paintAlignment(true);
2268 if ((viewport.getSelectionGroup() != null && viewport
2269 .getSelectionGroup().getSize() > 1)
2270 || (viewport.getSelectionGroup() == null && viewport.alignment
2273 final TreePanel tp = new TreePanel(viewport, type, pwType);
2275 addTreeMenuItem(tp, title);
2277 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2281 void loadTree_actionPerformed()
2283 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2284 cap.setText("Paste your Newick tree file here.");
2285 cap.setTreeImport();
2286 Frame frame = new Frame();
2288 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2291 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2293 TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree);
2294 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2295 addTreeMenuItem(tp, treeFile);
2298 * sort the alignment using the given treePanel
2299 * @param treePanel tree used to sort view
2300 * @param title string used for undo event name
2302 public void sortByTree(TreePanel treePanel, String title)
2304 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2305 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel
2307 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2308 // HistoryItem.SORT));
2309 addHistoryItem(new OrderCommand("Order by "+title, oldOrder,
2310 viewport.alignment));
2311 alignPanel.paintAlignment(true);
2314 * Do any automatic reordering of the alignment and add the necessary bits to the menu structure for the new tree
2318 protected void addTreeMenuItem(final TreePanel treePanel, final String title)
2320 final MenuItem item = new MenuItem(title);
2321 sortByTreeMenu.add(item);
2322 item.addActionListener(new java.awt.event.ActionListener()
2324 public void actionPerformed(ActionEvent evt)
2326 sortByTree(treePanel, title); // treePanel.getTitle());
2330 treePanel.addWindowListener(new WindowAdapter()
2332 public void windowOpened(WindowEvent e)
2334 if (viewport.sortByTree)
2336 sortByTree(treePanel, title);
2338 super.windowOpened(e);
2341 public void windowClosing(WindowEvent e)
2343 sortByTreeMenu.remove(item);
2348 protected void documentation_actionPerformed()
2350 showURL("http://www.jalview.org/help.html", "HELP");
2353 protected void about_actionPerformed()
2356 class AboutPanel extends Canvas
2360 public AboutPanel(String version)
2362 this.version = version;
2365 public void paint(Graphics g)
2367 g.setColor(Color.white);
2368 g.fillRect(0, 0, getSize().width, getSize().height);
2369 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2370 FontMetrics fm = g.getFontMetrics();
2371 int fh = fm.getHeight();
2373 g.setColor(Color.black);
2374 // TODO: update this text for each release or centrally store it for
2375 // lite and application
2376 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2377 g.drawString("JalviewLite - Release " + version, x, y += fh);
2378 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2381 "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,",
2383 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2386 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2390 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2392 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2394 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",x,y+=fh);
2395 g.drawString("Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",x,y+=fh);
2396 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",x,y+=fh);
2400 String version = "test";
2401 java.net.URL url = getClass().getResource("/.build_properties");
2406 BufferedReader reader = new BufferedReader(new InputStreamReader(
2409 while ((line = reader.readLine()) != null)
2411 if (line.indexOf("VERSION") > -1)
2413 version = line.substring(line.indexOf("=") + 1);
2416 } catch (Exception ex)
2418 ex.printStackTrace();
2422 Frame frame = new Frame();
2423 frame.add(new AboutPanel(version));
2424 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2428 public void showURL(String url, String target)
2430 if (viewport.applet == null)
2432 System.out.println("Not running as applet - no browser available.");
2438 if (url.indexOf(":")==-1)
2440 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to form valid URL
2441 if (url.indexOf("/")==0)
2443 String codebase = viewport.applet.getCodeBase().toString();
2444 url = codebase.substring(0,codebase.length()-viewport.applet.getCodeBase().getFile().length())+url;
2446 url = viewport.applet.getCodeBase()+url;
2448 System.out.println("Show url (prepended codebase): " + url);
2450 System.out.println("Show url: " + url);
2452 viewport.applet.getAppletContext().showDocument(
2453 new java.net.URL(url), target);
2454 } catch (Exception ex)
2456 ex.printStackTrace();
2461 // ////////////////////////////////////////////////////////////////////////////////
2462 // JBuilder Graphics here
2464 MenuBar alignFrameMenuBar = new MenuBar();
2466 Menu fileMenu = new Menu("File");
2468 MenuItem loadApplication = new MenuItem("View in Full Application");
2470 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2472 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2474 MenuItem outputFeatures = new MenuItem("Export Features ...");
2476 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2478 MenuItem closeMenuItem = new MenuItem("Close");
2480 Menu editMenu = new Menu("Edit");
2482 Menu viewMenu = new Menu("View");
2484 Menu colourMenu = new Menu("Colour");
2486 Menu calculateMenu = new Menu("Calculate");
2488 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2490 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2492 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2494 MenuItem remove2LeftMenuItem = new MenuItem();
2496 MenuItem remove2RightMenuItem = new MenuItem();
2498 MenuItem removeGappedColumnMenuItem = new MenuItem();
2500 MenuItem removeAllGapsMenuItem = new MenuItem();
2502 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2504 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2506 MenuItem sortPairwiseMenuItem = new MenuItem();
2508 MenuItem sortIDMenuItem = new MenuItem();
2510 MenuItem sortGroupMenuItem = new MenuItem();
2512 MenuItem removeRedundancyMenuItem = new MenuItem();
2514 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2516 MenuItem PCAMenuItem = new MenuItem();
2518 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2520 MenuItem neighbourTreeMenuItem = new MenuItem();
2522 BorderLayout borderLayout1 = new BorderLayout();
2524 public Label statusBar = new Label();
2526 Menu outputTextboxMenu = new Menu();
2528 MenuItem clustalColour = new MenuItem();
2530 MenuItem zappoColour = new MenuItem();
2532 MenuItem taylorColour = new MenuItem();
2534 MenuItem hydrophobicityColour = new MenuItem();
2536 MenuItem helixColour = new MenuItem();
2538 MenuItem strandColour = new MenuItem();
2540 MenuItem turnColour = new MenuItem();
2542 MenuItem buriedColour = new MenuItem();
2544 MenuItem userDefinedColour = new MenuItem();
2546 MenuItem PIDColour = new MenuItem();
2548 MenuItem BLOSUM62Colour = new MenuItem();
2550 MenuItem njTreeBlosumMenuItem = new MenuItem();
2552 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2554 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2556 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2558 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2560 MenuItem alProperties = new MenuItem("Alignment Properties...");
2562 MenuItem overviewMenuItem = new MenuItem();
2564 MenuItem undoMenuItem = new MenuItem();
2566 MenuItem redoMenuItem = new MenuItem();
2568 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2570 MenuItem noColourmenuItem = new MenuItem();
2572 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2574 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2576 MenuItem findMenuItem = new MenuItem();
2578 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2580 MenuItem nucleotideColour = new MenuItem();
2582 MenuItem deleteGroups = new MenuItem();
2584 MenuItem delete = new MenuItem();
2586 MenuItem copy = new MenuItem();
2588 MenuItem cut = new MenuItem();
2590 Menu pasteMenu = new Menu();
2592 MenuItem pasteNew = new MenuItem();
2594 MenuItem pasteThis = new MenuItem();
2596 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2598 MenuItem font = new MenuItem();
2600 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2602 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2604 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2606 MenuItem modifyPID = new MenuItem();
2608 MenuItem modifyConservation = new MenuItem();
2610 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2611 "Autocalculate Consensus", true);
2613 Menu sortByTreeMenu = new Menu();
2615 Menu sort = new Menu();
2617 Menu calculate = new Menu();
2619 MenuItem inputText = new MenuItem();
2621 Menu helpMenu = new Menu();
2623 MenuItem documentation = new MenuItem();
2625 MenuItem about = new MenuItem();
2627 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2629 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2631 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2633 private void jbInit() throws Exception
2636 setMenuBar(alignFrameMenuBar);
2640 // dynamically fill save as menu with available formats
2641 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2644 item = new MenuItem(
2645 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2647 item.addActionListener(new java.awt.event.ActionListener()
2649 public void actionPerformed(ActionEvent e)
2651 outputText_actionPerformed(e);
2655 outputTextboxMenu.add(item);
2657 closeMenuItem.addActionListener(this);
2658 loadApplication.addActionListener(this);
2660 loadTree.addActionListener(this);
2661 loadAnnotations.addActionListener(this);
2662 outputFeatures.addActionListener(this);
2663 outputAnnotations.addActionListener(this);
2664 selectAllSequenceMenuItem.addActionListener(this);
2665 deselectAllSequenceMenuItem.addActionListener(this);
2666 invertSequenceMenuItem.addActionListener(this);
2667 remove2LeftMenuItem.setLabel("Remove Left");
2668 remove2LeftMenuItem.addActionListener(this);
2669 remove2RightMenuItem.setLabel("Remove Right");
2670 remove2RightMenuItem.addActionListener(this);
2671 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2672 removeGappedColumnMenuItem.addActionListener(this);
2673 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2674 removeAllGapsMenuItem.addActionListener(this);
2675 viewBoxesMenuItem.setLabel("Boxes");
2676 viewBoxesMenuItem.setState(true);
2677 viewBoxesMenuItem.addItemListener(this);
2678 viewTextMenuItem.setLabel("Text");
2679 viewTextMenuItem.setState(true);
2680 viewTextMenuItem.addItemListener(this);
2681 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2682 sortPairwiseMenuItem.addActionListener(this);
2683 sortIDMenuItem.setLabel("by ID");
2684 sortIDMenuItem.addActionListener(this);
2685 sortGroupMenuItem.setLabel("by Group");
2686 sortGroupMenuItem.addActionListener(this);
2687 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2688 removeRedundancyMenuItem.addActionListener(this);
2689 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2690 pairwiseAlignmentMenuItem.addActionListener(this);
2691 PCAMenuItem.setLabel("Principal Component Analysis");
2692 PCAMenuItem.addActionListener(this);
2693 averageDistanceTreeMenuItem
2694 .setLabel("Average Distance Using % Identity");
2695 averageDistanceTreeMenuItem.addActionListener(this);
2696 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2697 neighbourTreeMenuItem.addActionListener(this);
2698 statusBar.setBackground(Color.white);
2699 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2700 statusBar.setText("Status bar");
2701 outputTextboxMenu.setLabel("Output to Textbox");
2702 clustalColour.setLabel("Clustalx");
2704 clustalColour.addActionListener(this);
2705 zappoColour.setLabel("Zappo");
2706 zappoColour.addActionListener(this);
2707 taylorColour.setLabel("Taylor");
2708 taylorColour.addActionListener(this);
2709 hydrophobicityColour.setLabel("Hydrophobicity");
2710 hydrophobicityColour.addActionListener(this);
2711 helixColour.setLabel("Helix Propensity");
2712 helixColour.addActionListener(this);
2713 strandColour.setLabel("Strand Propensity");
2714 strandColour.addActionListener(this);
2715 turnColour.setLabel("Turn Propensity");
2716 turnColour.addActionListener(this);
2717 buriedColour.setLabel("Buried Index");
2718 buriedColour.addActionListener(this);
2719 userDefinedColour.setLabel("User Defined...");
2720 userDefinedColour.addActionListener(this);
2721 PIDColour.setLabel("Percentage Identity");
2722 PIDColour.addActionListener(this);
2723 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2724 BLOSUM62Colour.addActionListener(this);
2725 avDistanceTreeBlosumMenuItem
2726 .setLabel("Average Distance Using BLOSUM62");
2727 avDistanceTreeBlosumMenuItem.addActionListener(this);
2728 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2729 njTreeBlosumMenuItem.addActionListener(this);
2730 annotationPanelMenuItem.setLabel("Show Annotations");
2731 annotationPanelMenuItem.addItemListener(this);
2732 colourTextMenuItem.setLabel("Colour Text");
2733 colourTextMenuItem.addItemListener(this);
2734 displayNonconservedMenuItem.setLabel("Show non-conserved");
2735 displayNonconservedMenuItem.addItemListener(this);
2736 alProperties.addActionListener(this);
2737 overviewMenuItem.setLabel("Overview Window");
2738 overviewMenuItem.addActionListener(this);
2739 undoMenuItem.setEnabled(false);
2740 undoMenuItem.setLabel("Undo");
2741 undoMenuItem.addActionListener(this);
2742 redoMenuItem.setEnabled(false);
2743 redoMenuItem.setLabel("Redo");
2744 redoMenuItem.addActionListener(this);
2745 conservationMenuItem.setLabel("by Conservation");
2746 conservationMenuItem.addItemListener(this);
2747 noColourmenuItem.setLabel("None");
2748 noColourmenuItem.addActionListener(this);
2749 wrapMenuItem.setLabel("Wrap");
2750 wrapMenuItem.addItemListener(this);
2751 renderGapsMenuItem.setLabel("Show Gaps");
2752 renderGapsMenuItem.setState(true);
2753 renderGapsMenuItem.addItemListener(this);
2754 findMenuItem.setLabel("Find...");
2755 findMenuItem.addActionListener(this);
2756 abovePIDThreshold.setLabel("Above Identity Threshold");
2757 abovePIDThreshold.addItemListener(this);
2758 nucleotideColour.setLabel("Nucleotide");
2759 nucleotideColour.addActionListener(this);
2760 deleteGroups.setLabel("Undefine Groups");
2761 deleteGroups.addActionListener(this);
2762 copy.setLabel("Copy");
2763 copy.addActionListener(this);
2764 cut.setLabel("Cut");
2765 cut.addActionListener(this);
2766 delete.setLabel("Delete");
2767 delete.addActionListener(this);
2768 pasteMenu.setLabel("Paste");
2769 pasteNew.setLabel("To New Alignment");
2770 pasteNew.addActionListener(this);
2771 pasteThis.setLabel("Add To This Alignment");
2772 pasteThis.addActionListener(this);
2773 applyToAllGroups.setLabel("Apply Colour To All Groups");
2774 applyToAllGroups.setState(true);
2775 applyToAllGroups.addItemListener(this);
2776 font.setLabel("Font...");
2777 font.addActionListener(this);
2778 scaleAbove.setLabel("Scale Above");
2779 scaleAbove.setState(true);
2780 scaleAbove.setEnabled(false);
2781 scaleAbove.addItemListener(this);
2782 scaleLeft.setEnabled(false);
2783 scaleLeft.setState(true);
2784 scaleLeft.setLabel("Scale Left");
2785 scaleLeft.addItemListener(this);
2786 scaleRight.setEnabled(false);
2787 scaleRight.setState(true);
2788 scaleRight.setLabel("Scale Right");
2789 scaleRight.addItemListener(this);
2790 modifyPID.setLabel("Modify Identity Threshold...");
2791 modifyPID.addActionListener(this);
2792 modifyConservation.setLabel("Modify Conservation Threshold...");
2793 modifyConservation.addActionListener(this);
2794 sortByTreeMenu.setLabel("By Tree Order");
2795 sort.setLabel("Sort");
2796 calculate.setLabel("Calculate Tree");
2797 autoCalculate.addItemListener(this);
2798 inputText.setLabel("Input from textbox");
2799 inputText.addActionListener(this);
2800 centreColumnLabelFlag.setLabel("Centre column labels");
2801 centreColumnLabelFlag.addItemListener(this);
2802 followMouseOverFlag.setLabel("Automatic Scrolling");
2803 followMouseOverFlag.addItemListener(this);
2804 helpMenu.setLabel("Help");
2805 documentation.setLabel("Documentation");
2806 documentation.addActionListener(this);
2808 about.setLabel("About...");
2809 about.addActionListener(this);
2810 seqLimits.setState(true);
2811 seqLimits.setLabel("Show Sequence Limits");
2812 seqLimits.addItemListener(this);
2813 featureSettings.setLabel("Feature Settings...");
2814 featureSettings.addActionListener(this);
2815 sequenceFeatures.setLabel("Sequence Features");
2816 sequenceFeatures.addItemListener(this);
2817 sequenceFeatures.setState(false);
2818 annotationColour.setLabel("by Annotation...");
2819 annotationColour.addActionListener(this);
2820 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2821 invertColSel.setLabel("Invert Column Selection");
2822 menu1.setLabel("Show");
2823 showColumns.setLabel("All Columns ");
2824 showSeqs.setLabel("All Sequences");
2825 menu2.setLabel("Hide");
2826 hideColumns.setLabel("Selected Columns");
2827 hideSequences.setLabel("Selected Sequences");
2828 invertColSel.addActionListener(this);
2829 showColumns.addActionListener(this);
2830 showSeqs.addActionListener(this);
2831 hideColumns.addActionListener(this);
2832 hideSequences.addActionListener(this);
2833 formatMenu.setLabel("Format");
2834 selectMenu.setLabel("Select");
2835 newView.setLabel("New View");
2836 newView.addActionListener(this);
2837 alignFrameMenuBar.add(fileMenu);
2838 alignFrameMenuBar.add(editMenu);
2839 alignFrameMenuBar.add(selectMenu);
2840 alignFrameMenuBar.add(viewMenu);
2841 alignFrameMenuBar.add(formatMenu);
2842 alignFrameMenuBar.add(colourMenu);
2843 alignFrameMenuBar.add(calculateMenu);
2844 alignFrameMenuBar.add(helpMenu);
2846 fileMenu.add(inputText);
2847 fileMenu.add(loadTree);
2848 fileMenu.add(loadAnnotations);
2850 fileMenu.addSeparator();
2851 fileMenu.add(outputTextboxMenu);
2852 fileMenu.add(outputFeatures);
2853 fileMenu.add(outputAnnotations);
2855 if (jalviewServletURL != null)
2857 fileMenu.add(loadApplication);
2860 fileMenu.addSeparator();
2861 fileMenu.add(closeMenuItem);
2863 editMenu.add(undoMenuItem);
2864 editMenu.add(redoMenuItem);
2867 editMenu.add(pasteMenu);
2868 editMenu.add(delete);
2869 editMenu.addSeparator();
2870 editMenu.add(remove2LeftMenuItem);
2871 editMenu.add(remove2RightMenuItem);
2872 editMenu.add(removeGappedColumnMenuItem);
2873 editMenu.add(removeAllGapsMenuItem);
2874 editMenu.add(removeRedundancyMenuItem);
2875 viewMenu.add(newView);
2876 viewMenu.addSeparator();
2877 viewMenu.add(menu1);
2878 viewMenu.add(menu2);
2879 viewMenu.addSeparator();
2880 viewMenu.add(followMouseOverFlag);
2881 viewMenu.add(annotationPanelMenuItem);
2882 viewMenu.addSeparator();
2883 viewMenu.add(sequenceFeatures);
2884 viewMenu.add(featureSettings);
2885 viewMenu.addSeparator();
2886 viewMenu.add(alProperties);
2887 viewMenu.addSeparator();
2888 viewMenu.add(overviewMenuItem);
2889 colourMenu.add(applyToAllGroups);
2890 colourMenu.addSeparator();
2891 colourMenu.add(noColourmenuItem);
2892 colourMenu.add(clustalColour);
2893 colourMenu.add(BLOSUM62Colour);
2894 colourMenu.add(PIDColour);
2895 colourMenu.add(zappoColour);
2896 colourMenu.add(taylorColour);
2897 colourMenu.add(hydrophobicityColour);
2898 colourMenu.add(helixColour);
2899 colourMenu.add(strandColour);
2900 colourMenu.add(turnColour);
2901 colourMenu.add(buriedColour);
2902 colourMenu.add(nucleotideColour);
2903 colourMenu.add(userDefinedColour);
2904 colourMenu.addSeparator();
2905 colourMenu.add(conservationMenuItem);
2906 colourMenu.add(modifyConservation);
2907 colourMenu.add(abovePIDThreshold);
2908 colourMenu.add(modifyPID);
2909 colourMenu.add(annotationColour);
2910 calculateMenu.add(sort);
2911 calculateMenu.add(calculate);
2912 calculateMenu.addSeparator();
2913 calculateMenu.add(pairwiseAlignmentMenuItem);
2914 calculateMenu.add(PCAMenuItem);
2915 calculateMenu.add(autoCalculate);
2916 this.add(statusBar, BorderLayout.SOUTH);
2917 pasteMenu.add(pasteNew);
2918 pasteMenu.add(pasteThis);
2919 sort.add(sortIDMenuItem);
2920 sort.add(sortByTreeMenu);
2921 sort.add(sortGroupMenuItem);
2922 sort.add(sortPairwiseMenuItem);
2923 calculate.add(averageDistanceTreeMenuItem);
2924 calculate.add(neighbourTreeMenuItem);
2925 calculate.add(avDistanceTreeBlosumMenuItem);
2926 calculate.add(njTreeBlosumMenuItem);
2927 helpMenu.add(documentation);
2928 helpMenu.add(about);
2929 menu1.add(showColumns);
2930 menu1.add(showSeqs);
2931 menu2.add(hideColumns);
2932 menu2.add(hideSequences);
2933 formatMenu.add(font);
2934 formatMenu.add(seqLimits);
2935 formatMenu.add(wrapMenuItem);
2936 formatMenu.add(scaleAbove);
2937 formatMenu.add(scaleLeft);
2938 formatMenu.add(scaleRight);
2939 formatMenu.add(viewBoxesMenuItem);
2940 formatMenu.add(viewTextMenuItem);
2941 formatMenu.add(colourTextMenuItem);
2942 formatMenu.add(displayNonconservedMenuItem);
2943 formatMenu.add(renderGapsMenuItem);
2944 formatMenu.add(centreColumnLabelFlag);
2945 selectMenu.add(findMenuItem);
2946 selectMenu.addSeparator();
2947 selectMenu.add(selectAllSequenceMenuItem);
2948 selectMenu.add(deselectAllSequenceMenuItem);
2949 selectMenu.add(invertSequenceMenuItem);
2950 selectMenu.add(invertColSel);
2951 selectMenu.add(deleteGroups);
2954 MenuItem featureSettings = new MenuItem();
2956 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
2958 MenuItem annotationColour = new MenuItem();
2960 MenuItem invertColSel = new MenuItem();
2962 Menu menu1 = new Menu();
2964 MenuItem showColumns = new MenuItem();
2966 MenuItem showSeqs = new MenuItem();
2968 Menu menu2 = new Menu();
2970 MenuItem hideColumns = new MenuItem();
2972 MenuItem hideSequences = new MenuItem();
2974 Menu formatMenu = new Menu();
2976 Menu selectMenu = new Menu();
2978 MenuItem newView = new MenuItem();
2981 * Attach the alignFrame panels after embedding menus, if necessary. This used
2982 * to be called setEmbedded, but is now creates the dropdown menus in a
2983 * platform independent manner to avoid OSX/Mac menu appendage daftness.
2985 * @param reallyEmbedded
2986 * true to attach the view to the applet area on the page
2987 * rather than in a new window
2989 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
2994 // Explicly build the embedded menu panel for the on-page applet
2996 // view cannot be closed if its actually on the page
2997 fileMenu.remove(closeMenuItem);
2998 fileMenu.remove(3); // Remove Seperator
2999 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3000 Font.PLAIN, 10, false); // use our own fonts.
3001 // and actually add the components to the applet area
3002 viewport.applet.setLayout(new BorderLayout());
3003 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3004 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3005 alignPanel.setSize(viewport.applet.getSize().width, viewport.applet
3007 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
3008 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3009 viewport.applet.validate();
3014 // test and embed menu bar if necessary.
3016 if (embedMenuIfNeeded(alignPanel))
3018 // adjust for status bar height too
3019 alignPanel.setSize(getSize().width, getSize().height
3020 - statusBar.HEIGHT);
3022 add(statusBar, BorderLayout.SOUTH);
3023 add(alignPanel, BorderLayout.CENTER);
3024 // and register with the applet so it can pass external API calls to us
3025 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,