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.bin.JalviewLite;
30 import jalview.commands.*;
31 import jalview.datamodel.*;
33 import jalview.schemes.*;
35 public class AlignFrame extends EmbmenuFrame implements ActionListener,
36 ItemListener, KeyListener
38 public AlignmentPanel alignPanel;
40 public AlignViewport viewport;
42 int DEFAULT_WIDTH = 700;
44 int DEFAULT_HEIGHT = 500;
46 String jalviewServletURL;
48 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
49 String title, boolean embedded)
54 jalviewServletURL = applet.getParameter("APPLICATION_URL");
60 } catch (Exception ex)
65 viewport = new AlignViewport(al, applet);
66 alignPanel = new AlignmentPanel(this, viewport);
68 viewport.updateConservation(alignPanel);
69 viewport.updateConsensus(alignPanel);
71 annotationPanelMenuItem.setState(viewport.showAnnotation);
72 displayNonconservedMenuItem.setState(viewport.getShowunconserved());
74 seqLimits.setState(viewport.showJVSuffix);
78 String param = applet.getParameter("sortBy");
81 if (param.equalsIgnoreCase("Id"))
83 sortIDMenuItem_actionPerformed();
85 else if (param.equalsIgnoreCase("Pairwise Identity"))
87 sortPairwiseMenuItem_actionPerformed();
91 param = applet.getParameter("wrap");
94 if (param.equalsIgnoreCase("true"))
96 wrapMenuItem.setState(true);
97 wrapMenuItem_actionPerformed();
100 param = applet.getParameter("centrecolumnlabels");
103 centreColumnLabelFlag.setState(true);
104 centreColumnLabelFlag_stateChanged();
108 param = applet.getParameter("windowWidth");
111 int width = Integer.parseInt(param);
112 DEFAULT_WIDTH = width;
114 param = applet.getParameter("windowHeight");
117 int height = Integer.parseInt(param);
118 DEFAULT_HEIGHT = height;
120 } catch (Exception ex)
126 // Some JVMS send keyevents to Top frame or lowest panel,
127 // Havent worked out why yet. So add to both this frame and seqCanvas for
129 this.addKeyListener(this);
130 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
131 alignPanel.idPanel.idCanvas.addKeyListener(this);
132 alignPanel.scalePanel.addKeyListener(this);
133 alignPanel.annotationPanel.addKeyListener(this);
134 createAlignFrameWindow(embedded, title);
135 alignPanel.validate();
136 alignPanel.paintAlignment(true);
139 public AlignViewport getAlignViewport()
144 public SeqCanvas getSeqcanvas()
146 return alignPanel.seqPanel.seqCanvas;
156 public void parseFeaturesFile(String file, String type)
158 Hashtable featureLinks = new Hashtable();
159 boolean featuresFile = false;
162 featuresFile = new jalview.io.FeaturesFile(file, type).parse(
163 viewport.alignment, alignPanel.seqPanel.seqCanvas
164 .getFeatureRenderer().featureColours, featureLinks,
166 } catch (Exception ex)
168 ex.printStackTrace();
173 if (featureLinks.size() > 0)
175 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
177 viewport.showSequenceFeatures = true;
178 sequenceFeatures.setState(true);
179 if (viewport.featureSettings!=null)
181 viewport.featureSettings.refreshTable();
183 alignPanel.paintAlignment(true);
188 public void keyPressed(KeyEvent evt)
190 if (viewport.cursorMode
191 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
192 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
193 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
194 && Character.isDigit(evt.getKeyChar()))
195 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
197 switch (evt.getKeyCode())
199 case 27: // escape key
200 deselectAllSequenceMenuItem_actionPerformed();
203 if (evt.isControlDown() || evt.isMetaDown())
205 cut_actionPerformed();
209 if (viewport.cursorMode && !evt.isControlDown())
211 alignPanel.seqPanel.setCursorColumn();
213 if (evt.isControlDown() || evt.isMetaDown())
215 copy_actionPerformed();
219 if (evt.isControlDown())
221 paste(evt.isShiftDown());
225 if (evt.isControlDown() || evt.isMetaDown())
227 selectAllSequenceMenuItem_actionPerformed();
230 case KeyEvent.VK_DOWN:
231 if (viewport.cursorMode)
233 alignPanel.seqPanel.moveCursor(0, 1);
237 moveSelectedSequences(false);
242 if (viewport.cursorMode)
244 alignPanel.seqPanel.moveCursor(0, -1);
248 moveSelectedSequences(true);
252 case KeyEvent.VK_LEFT:
253 if (evt.isAltDown() || !viewport.cursorMode)
254 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
256 alignPanel.seqPanel.moveCursor(-1, 0);
259 case KeyEvent.VK_RIGHT:
260 if (evt.isAltDown() || !viewport.cursorMode)
261 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
263 alignPanel.seqPanel.moveCursor(1, 0);
266 case KeyEvent.VK_SPACE:
267 if (viewport.cursorMode)
269 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
270 || evt.isShiftDown() || evt.isAltDown());
274 case KeyEvent.VK_DELETE:
275 case KeyEvent.VK_BACK_SPACE:
276 if (viewport.cursorMode)
278 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
279 || evt.isShiftDown() || evt.isAltDown());
283 cut_actionPerformed();
284 alignPanel.seqPanel.seqCanvas.repaint();
289 if (viewport.cursorMode)
291 alignPanel.seqPanel.setCursorRow();
295 if (viewport.cursorMode)
297 alignPanel.seqPanel.setCursorPosition();
301 case KeyEvent.VK_ENTER:
302 case KeyEvent.VK_COMMA:
303 if (viewport.cursorMode)
305 alignPanel.seqPanel.setCursorRowAndColumn();
310 if (viewport.cursorMode)
312 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
316 if (viewport.cursorMode)
318 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
323 viewport.cursorMode = !viewport.cursorMode;
324 statusBar.setText("Keyboard editing mode is "
325 + (viewport.cursorMode ? "on" : "off"));
326 if (viewport.cursorMode)
328 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
329 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
334 if (evt.isControlDown())
336 findMenuItem_actionPerformed();
342 boolean toggleSeqs = !evt.isControlDown();
343 boolean toggleCols = !evt.isShiftDown();
344 boolean hide = false;
345 SequenceGroup sg = viewport.getSelectionGroup();
349 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
352 viewport.hideAllSelectedSeqs();
354 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
356 viewport.showAllHiddenSeqs();
362 if (viewport.colSel.getSelected().size() > 0)
364 viewport.hideSelectedColumns();
367 viewport.selectionGroup = sg;
372 viewport.showAllHiddenColumns();
378 case KeyEvent.VK_PAGE_UP:
379 if (viewport.wrapAlignment)
381 alignPanel.scrollUp(true);
385 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
386 - viewport.endSeq + viewport.startSeq);
390 case KeyEvent.VK_PAGE_DOWN:
391 if (viewport.wrapAlignment)
393 alignPanel.scrollUp(false);
397 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
398 + viewport.endSeq - viewport.startSeq);
403 if (evt.isControlDown())
405 undoMenuItem_actionPerformed();
410 if (evt.isControlDown())
412 redoMenuItem_actionPerformed();
417 if (evt.isControlDown())
424 if (evt.isControlDown())
426 trimAlignment(false);
431 if (evt.isControlDown())
433 if (evt.isShiftDown())
435 this.removeAllGapsMenuItem_actionPerformed();
439 removeGappedColumnMenuItem_actionPerformed();
444 if (evt.isControlDown())
448 viewport.invertColumnSelection();
452 this.invertSequenceMenuItem_actionPerformed();
458 if (evt.isControlDown())
460 this.deleteGroups_actionPerformed();
465 if (evt.isControlDown())
472 alignPanel.paintAlignment(true);
475 public void keyReleased(KeyEvent evt)
479 public void keyTyped(KeyEvent evt)
483 public void itemStateChanged(ItemEvent evt)
485 if (evt.getSource() == displayNonconservedMenuItem)
487 displayNonconservedMenuItem_actionPerformed();
489 else if (evt.getSource() == colourTextMenuItem)
491 colourTextMenuItem_actionPerformed();
493 else if (evt.getSource() == wrapMenuItem)
495 wrapMenuItem_actionPerformed();
497 else if (evt.getSource() == scaleAbove)
499 viewport.setScaleAboveWrapped(scaleAbove.getState());
501 else if (evt.getSource() == scaleLeft)
503 viewport.setScaleLeftWrapped(scaleLeft.getState());
505 else if (evt.getSource() == scaleRight)
507 viewport.setScaleRightWrapped(scaleRight.getState());
509 else if (evt.getSource() == seqLimits)
511 seqLimits_itemStateChanged();
513 else if (evt.getSource() == viewBoxesMenuItem)
515 viewport.setShowBoxes(viewBoxesMenuItem.getState());
517 else if (evt.getSource() == viewTextMenuItem)
519 viewport.setShowText(viewTextMenuItem.getState());
521 else if (evt.getSource() == renderGapsMenuItem)
523 viewport.setRenderGaps(renderGapsMenuItem.getState());
525 else if (evt.getSource() == annotationPanelMenuItem)
527 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
528 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
530 else if (evt.getSource() == sequenceFeatures)
532 viewport.showSequenceFeatures(sequenceFeatures.getState());
533 alignPanel.seqPanel.seqCanvas.repaint();
535 else if (evt.getSource() == conservationMenuItem)
537 conservationMenuItem_actionPerformed();
539 else if (evt.getSource() == abovePIDThreshold)
541 abovePIDThreshold_actionPerformed();
543 else if (evt.getSource() == applyToAllGroups)
545 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
547 else if (evt.getSource() == autoCalculate)
549 viewport.autocalculateConsensus = autoCalculate.getState();
551 else if (evt.getSource() == this.centreColumnLabelFlag)
553 centreColumnLabelFlag_stateChanged();
554 } else if (evt.getSource() == this.followMouseOverFlag)
556 mouseOverFlag_stateChanged();
559 alignPanel.paintAlignment(true);
562 private void mouseOverFlag_stateChanged()
564 viewport.followHighlight = followMouseOverFlag.getState();
565 // TODO: could kick the scrollTo mechanism to reset view for current searchresults.
568 private void centreColumnLabelFlag_stateChanged()
570 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
571 this.alignPanel.annotationPanel.repaint();
574 public void actionPerformed(ActionEvent evt)
576 Object source = evt.getSource();
578 if (source == inputText)
580 inputText_actionPerformed();
582 else if (source == loadTree)
584 loadTree_actionPerformed();
586 else if (source == loadApplication)
588 launchFullApplication();
590 else if (source == loadAnnotations)
594 else if (source == outputAnnotations)
596 outputAnnotations(true);
598 else if (source == outputFeatures)
600 outputFeatures(true, "Jalview");
602 else if (source == closeMenuItem)
604 closeMenuItem_actionPerformed();
606 else if (source == copy)
608 copy_actionPerformed();
610 else if (source == undoMenuItem)
612 undoMenuItem_actionPerformed();
614 else if (source == redoMenuItem)
616 redoMenuItem_actionPerformed();
618 else if (source == inputText)
620 inputText_actionPerformed();
622 else if (source == closeMenuItem)
624 closeMenuItem_actionPerformed();
626 else if (source == undoMenuItem)
628 undoMenuItem_actionPerformed();
630 else if (source == redoMenuItem)
632 redoMenuItem_actionPerformed();
634 else if (source == copy)
636 copy_actionPerformed();
638 else if (source == pasteNew)
640 pasteNew_actionPerformed();
642 else if (source == pasteThis)
644 pasteThis_actionPerformed();
646 else if (source == cut)
648 cut_actionPerformed();
650 else if (source == delete)
652 delete_actionPerformed();
654 else if (source == deleteGroups)
656 deleteGroups_actionPerformed();
658 else if (source == selectAllSequenceMenuItem)
660 selectAllSequenceMenuItem_actionPerformed();
662 else if (source == deselectAllSequenceMenuItem)
664 deselectAllSequenceMenuItem_actionPerformed();
666 else if (source == invertSequenceMenuItem)
668 invertSequenceMenuItem_actionPerformed();
670 else if (source == invertColSel)
672 viewport.invertColumnSelection();
673 alignPanel.paintAlignment(true);
675 else if (source == remove2LeftMenuItem)
679 else if (source == remove2RightMenuItem)
681 trimAlignment(false);
683 else if (source == removeGappedColumnMenuItem)
685 removeGappedColumnMenuItem_actionPerformed();
687 else if (source == removeAllGapsMenuItem)
689 removeAllGapsMenuItem_actionPerformed();
691 else if (source == findMenuItem)
693 findMenuItem_actionPerformed();
695 else if (source == font)
697 new FontChooser(alignPanel);
699 else if (source == newView)
703 else if (source == showColumns)
705 viewport.showAllHiddenColumns();
706 alignPanel.paintAlignment(true);
708 else if (source == showSeqs)
710 viewport.showAllHiddenSeqs();
712 else if (source == hideColumns)
714 viewport.hideSelectedColumns();
715 alignPanel.paintAlignment(true);
717 else if (source == hideSequences
718 && viewport.getSelectionGroup() != null)
720 viewport.hideAllSelectedSeqs();
722 else if (source == featureSettings)
724 new FeatureSettings(alignPanel);
726 else if (source == alProperties)
728 StringBuffer contents = new StringBuffer();
731 int min = Integer.MAX_VALUE, max = 0;
732 for (int i = 0; i < viewport.alignment.getHeight(); i++)
734 int size = viewport.alignment.getSequenceAt(i).getEnd()
735 - viewport.alignment.getSequenceAt(i).getStart();
742 avg = avg / (float) viewport.alignment.getHeight();
744 contents.append("\nSequences: " + viewport.alignment.getHeight());
745 contents.append("\nMinimum Sequence Length: " + min);
746 contents.append("\nMaximum Sequence Length: " + max);
747 contents.append("\nAverage Length: " + (int) avg);
749 if (((Alignment) viewport.alignment).alignmentProperties != null)
751 Hashtable props = ((Alignment) viewport.alignment).alignmentProperties;
752 Enumeration en = props.keys();
753 while (en.hasMoreElements())
755 String key = en.nextElement().toString();
756 contents.append("\n" + key + "\t" + props.get(key));
760 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
761 cap.setText(contents.toString());
762 Frame frame = new Frame();
764 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
765 + getTitle(), 400, 250);
767 else if (source == overviewMenuItem)
769 overviewMenuItem_actionPerformed();
771 else if (source == noColourmenuItem)
775 else if (source == clustalColour)
777 abovePIDThreshold.setState(false);
778 changeColour(new ClustalxColourScheme(viewport.alignment
779 .getSequences(), viewport.alignment.getWidth()));
781 else if (source == zappoColour)
783 changeColour(new ZappoColourScheme());
785 else if (source == taylorColour)
787 changeColour(new TaylorColourScheme());
789 else if (source == hydrophobicityColour)
791 changeColour(new HydrophobicColourScheme());
793 else if (source == helixColour)
795 changeColour(new HelixColourScheme());
797 else if (source == strandColour)
799 changeColour(new StrandColourScheme());
801 else if (source == turnColour)
803 changeColour(new TurnColourScheme());
805 else if (source == buriedColour)
807 changeColour(new BuriedColourScheme());
809 else if (source == nucleotideColour)
811 changeColour(new NucleotideColourScheme());
813 else if (source == modifyPID)
815 modifyPID_actionPerformed();
817 else if (source == modifyConservation)
819 modifyConservation_actionPerformed();
821 else if (source == userDefinedColour)
823 new UserDefinedColours(alignPanel, null);
825 else if (source == PIDColour)
827 changeColour(new PIDColourScheme());
829 else if (source == BLOSUM62Colour)
831 changeColour(new Blosum62ColourScheme());
833 else if (source == annotationColour)
835 new AnnotationColourChooser(viewport, alignPanel);
837 else if (source == sortPairwiseMenuItem)
839 sortPairwiseMenuItem_actionPerformed();
841 else if (source == sortIDMenuItem)
843 sortIDMenuItem_actionPerformed();
845 else if (source == sortGroupMenuItem)
847 sortGroupMenuItem_actionPerformed();
849 else if (source == removeRedundancyMenuItem)
851 removeRedundancyMenuItem_actionPerformed();
853 else if (source == pairwiseAlignmentMenuItem)
855 pairwiseAlignmentMenuItem_actionPerformed();
857 else if (source == PCAMenuItem)
859 PCAMenuItem_actionPerformed();
861 else if (source == averageDistanceTreeMenuItem)
863 averageDistanceTreeMenuItem_actionPerformed();
865 else if (source == neighbourTreeMenuItem)
867 neighbourTreeMenuItem_actionPerformed();
869 else if (source == njTreeBlosumMenuItem)
871 njTreeBlosumMenuItem_actionPerformed();
873 else if (source == avDistanceTreeBlosumMenuItem)
875 avTreeBlosumMenuItem_actionPerformed();
877 else if (source == documentation)
879 documentation_actionPerformed();
881 else if (source == about)
883 about_actionPerformed();
888 public void inputText_actionPerformed()
890 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
891 Frame frame = new Frame();
893 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
896 protected void outputText_actionPerformed(ActionEvent e)
898 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
899 Frame frame = new Frame();
901 jalview.bin.JalviewLite.addFrame(frame, "Alignment output - "
902 + e.getActionCommand(), 600, 500);
903 cap.setText(new AppletFormatAdapter().formatSequences(e
904 .getActionCommand(), viewport.getAlignment(),
905 viewport.showJVSuffix));
908 public void loadAnnotations()
910 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
911 cap.setText("Paste your features / annotations file here.");
912 cap.setAnnotationImport();
913 Frame frame = new Frame();
915 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
919 public String outputAnnotations(boolean displayTextbox)
921 String annotation = new AnnotationFile().printAnnotations(
922 viewport.showAnnotation ? viewport.alignment
923 .getAlignmentAnnotation() : null, viewport.alignment
925 ((Alignment) viewport.alignment).alignmentProperties);
929 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
930 Frame frame = new Frame();
932 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
933 cap.setText(annotation);
939 private Hashtable getDisplayedFeatureCols()
941 if (alignPanel.getFeatureRenderer()!=null) {
942 FeatureRenderer fr = alignPanel.getFeatureRenderer();
943 Hashtable fcols = new Hashtable();
944 Enumeration en = viewport.featuresDisplayed.keys();
945 while (en.hasMoreElements())
947 Object col = en.nextElement();
948 fcols.put(col,fr.featureColours.get(col));
955 public String outputFeatures(boolean displayTextbox, String format)
958 if (format.equalsIgnoreCase("Jalview"))
960 features = new FeaturesFile().printJalviewFormat(viewport.alignment
961 .getSequencesArray(), getDisplayedFeatureCols());
965 features = new FeaturesFile().printGFFFormat(viewport.alignment
966 .getSequencesArray(), getDisplayedFeatureCols());
971 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
972 Frame frame = new Frame();
974 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
976 cap.setText(features);
982 void launchFullApplication()
984 StringBuffer url = new StringBuffer(jalviewServletURL);
987 + appendProtocol(viewport.applet.getParameter("file")));
989 if (viewport.applet.getParameter("features") != null)
991 url.append("&features=");
992 url.append(appendProtocol(viewport.applet.getParameter("features")));
995 if (viewport.applet.getParameter("annotations") != null)
997 url.append("&annotations=");
999 .append(appendProtocol(viewport.applet
1000 .getParameter("annotations")));
1003 if (viewport.applet.getParameter("jnetfile") != null)
1005 url.append("&annotations=");
1006 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1009 if (viewport.applet.getParameter("defaultColour") != null)
1011 url.append("&colour="
1012 + removeWhiteSpace(viewport.applet
1013 .getParameter("defaultColour")));
1016 if (viewport.applet.getParameter("userDefinedColour") != null)
1018 url.append("&colour="
1019 + removeWhiteSpace(viewport.applet
1020 .getParameter("userDefinedColour")));
1022 if (viewport.applet.getParameter("tree") != null)
1025 + appendProtocol(viewport.applet.getParameter("tree")));
1027 if (viewport.applet.getParameter("treeFile") != null)
1030 + appendProtocol(viewport.applet.getParameter("treeFile")));
1033 showURL(url.toString(), "FULL_APP");
1036 String removeWhiteSpace(String colour)
1038 StringBuffer sb = new StringBuffer();
1039 for (int i = 0; i < colour.length(); i++)
1041 if (Character.isWhitespace(colour.charAt(i)))
1047 sb.append(colour.charAt(i));
1051 return sb.toString();
1054 String appendProtocol(String url)
1059 url = URLEncoder.encode(url);
1062 * When we finally deprecate 1.1 compatibility, we can start to use
1063 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1064 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1065 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1066 * ex.printStackTrace(); }
1068 catch (java.net.MalformedURLException ex)
1070 url = viewport.applet.getCodeBase() + url;
1075 public void closeMenuItem_actionPerformed()
1077 PaintRefresher.RemoveComponent(alignPanel);
1078 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1079 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1081 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1092 void updateEditMenuBar()
1095 if (viewport.historyList.size() > 0)
1097 undoMenuItem.setEnabled(true);
1098 CommandI command = (CommandI) viewport.historyList.peek();
1099 undoMenuItem.setLabel("Undo " + command.getDescription());
1103 undoMenuItem.setEnabled(false);
1104 undoMenuItem.setLabel("Undo");
1107 if (viewport.redoList.size() > 0)
1109 redoMenuItem.setEnabled(true);
1111 CommandI command = (CommandI) viewport.redoList.peek();
1112 redoMenuItem.setLabel("Redo " + command.getDescription());
1116 redoMenuItem.setEnabled(false);
1117 redoMenuItem.setLabel("Redo");
1121 public void addHistoryItem(CommandI command)
1123 if (command.getSize() > 0)
1125 viewport.historyList.push(command);
1126 viewport.redoList.removeAllElements();
1127 updateEditMenuBar();
1128 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1138 protected void undoMenuItem_actionPerformed()
1140 if (viewport.historyList.size() < 1)
1145 CommandI command = (CommandI) viewport.historyList.pop();
1146 viewport.redoList.push(command);
1147 command.undoCommand(null);
1149 AlignViewport originalSource = getOriginatingSource(command);
1151 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1152 updateEditMenuBar();
1153 originalSource.firePropertyChange("alignment", null,
1154 originalSource.alignment.getSequences());
1163 protected void redoMenuItem_actionPerformed()
1165 if (viewport.redoList.size() < 1)
1170 CommandI command = (CommandI) viewport.redoList.pop();
1171 viewport.historyList.push(command);
1172 command.doCommand(null);
1174 AlignViewport originalSource = getOriginatingSource(command);
1175 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1177 updateEditMenuBar();
1178 originalSource.firePropertyChange("alignment", null,
1179 originalSource.alignment.getSequences());
1182 AlignViewport getOriginatingSource(CommandI command)
1184 AlignViewport originalSource = null;
1185 // For sequence removal and addition, we need to fire
1186 // the property change event FROM the viewport where the
1187 // original alignment was altered
1188 AlignmentI al = null;
1189 if (command instanceof EditCommand)
1191 EditCommand editCommand = (EditCommand) command;
1192 al = editCommand.getAlignment();
1193 Vector comps = (Vector) PaintRefresher.components.get(viewport
1194 .getSequenceSetId());
1195 for (int i = 0; i < comps.size(); i++)
1197 if (comps.elementAt(i) instanceof AlignmentPanel)
1199 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1201 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1208 if (originalSource == null)
1210 // The original view is closed, we must validate
1211 // the current view against the closed view first
1214 PaintRefresher.validateSequences(al, viewport.alignment);
1217 originalSource = viewport;
1220 return originalSource;
1223 public void moveSelectedSequences(boolean up)
1225 SequenceGroup sg = viewport.getSelectionGroup();
1233 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1235 SequenceI seq = viewport.alignment.getSequenceAt(i);
1236 if (!sg.getSequences(null).contains(seq))
1241 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1242 if (sg.getSequences(null).contains(temp))
1247 viewport.alignment.getSequences().setElementAt(temp, i);
1248 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1253 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1255 SequenceI seq = viewport.alignment.getSequenceAt(i);
1256 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1261 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1262 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1267 viewport.alignment.getSequences().setElementAt(temp, i);
1268 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1272 alignPanel.paintAlignment(true);
1275 synchronized void slideSequences(boolean right, int size)
1277 Vector sg = new Vector();
1278 if (viewport.cursorMode)
1280 sg.addElement(viewport.alignment
1281 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1283 else if (viewport.getSelectionGroup() != null
1284 && viewport.getSelectionGroup().getSize() != viewport.alignment
1287 sg = viewport.getSelectionGroup().getSequences(
1288 viewport.hiddenRepSequences);
1296 Vector invertGroup = new Vector();
1298 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1300 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1301 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1304 SequenceI[] seqs1 = new SequenceI[sg.size()];
1305 for (int i = 0; i < sg.size(); i++)
1306 seqs1[i] = (SequenceI) sg.elementAt(i);
1308 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1309 for (int i = 0; i < invertGroup.size(); i++)
1310 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1312 SlideSequencesCommand ssc;
1314 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1315 size, viewport.getGapCharacter());
1317 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1318 size, viewport.getGapCharacter());
1320 int groupAdjustment = 0;
1321 if (ssc.getGapsInsertedBegin() && right)
1323 if (viewport.cursorMode)
1324 alignPanel.seqPanel.moveCursor(size, 0);
1326 groupAdjustment = size;
1328 else if (!ssc.getGapsInsertedBegin() && !right)
1330 if (viewport.cursorMode)
1331 alignPanel.seqPanel.moveCursor(-size, 0);
1333 groupAdjustment = -size;
1336 if (groupAdjustment != 0)
1338 viewport.getSelectionGroup().setStartRes(
1339 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1340 viewport.getSelectionGroup().setEndRes(
1341 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1344 boolean appendHistoryItem = false;
1345 if (viewport.historyList != null && viewport.historyList.size() > 0
1346 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1348 appendHistoryItem = ssc
1349 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1353 if (!appendHistoryItem)
1354 addHistoryItem(ssc);
1359 static StringBuffer copiedSequences;
1361 static Vector copiedHiddenColumns;
1363 protected void copy_actionPerformed()
1365 if (viewport.getSelectionGroup() == null)
1370 SequenceGroup sg = viewport.getSelectionGroup();
1371 copiedSequences = new StringBuffer();
1372 Hashtable orderedSeqs = new Hashtable();
1373 for (int i = 0; i < sg.getSize(); i++)
1375 SequenceI seq = sg.getSequenceAt(i);
1376 int index = viewport.alignment.findIndex(seq);
1377 orderedSeqs.put(index + "", seq);
1380 int index = 0, startRes, endRes;
1383 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1385 copiedHiddenColumns = new Vector();
1386 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1387 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1390 int[] region = (int[]) viewport.getColumnSelection()
1391 .getHiddenColumns().elementAt(i);
1393 copiedHiddenColumns.addElement(new int[]
1394 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1399 copiedHiddenColumns = null;
1402 for (int i = 0; i < sg.getSize(); i++)
1404 SequenceI seq = null;
1408 if (orderedSeqs.containsKey(index + ""))
1410 seq = (SequenceI) orderedSeqs.get(index + "");
1422 // Returns residue following index if gap
1423 startRes = seq.findPosition(sg.getStartRes());
1426 // Need to find the residue preceeding index if gap
1429 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1431 ch = seq.getCharAt(j);
1432 if (!jalview.util.Comparison.isGap((ch)))
1440 endRes += seq.getStart() - 1;
1443 copiedSequences.append(seq.getName()
1449 + seq.getSequenceAsString(sg.getStartRes(),
1450 sg.getEndRes() + 1) + "\n");
1455 protected void pasteNew_actionPerformed()
1460 protected void pasteThis_actionPerformed()
1465 void paste(boolean newAlignment)
1470 if (copiedSequences == null)
1475 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1476 Vector seqs = new Vector();
1477 while (st.hasMoreElements())
1479 String name = st.nextToken();
1480 int start = Integer.parseInt(st.nextToken());
1481 int end = Integer.parseInt(st.nextToken());
1482 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1484 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1485 for (int i = 0; i < seqs.size(); i++)
1487 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1492 String newtitle = new String("Copied sequences");
1493 if (getTitle().startsWith("Copied sequences"))
1495 newtitle = getTitle();
1499 newtitle = newtitle.concat("- from " + getTitle());
1501 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1502 viewport.applet, newtitle, false);
1503 if (copiedHiddenColumns != null)
1505 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1507 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1508 af.viewport.hideColumns(region[0], region[1]);
1512 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1517 addSequences(newSeqs);
1520 } catch (Exception ex)
1522 } // could be anything being pasted in here
1526 void addSequences(SequenceI[] seqs)
1528 for (int i = 0; i < seqs.length; i++)
1530 viewport.alignment.addSequence(seqs[i]);
1534 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1535 seqs, 0, viewport.alignment.getWidth(), viewport.alignment));
1537 viewport.setEndSeq(viewport.alignment.getHeight());
1538 viewport.alignment.getWidth();
1539 viewport.firePropertyChange("alignment", null, viewport.alignment
1544 protected void cut_actionPerformed()
1546 copy_actionPerformed();
1547 delete_actionPerformed();
1550 protected void delete_actionPerformed()
1553 SequenceGroup sg = viewport.getSelectionGroup();
1559 Vector seqs = new Vector();
1561 for (int i = 0; i < sg.getSize(); i++)
1563 seq = sg.getSequenceAt(i);
1564 seqs.addElement(seq);
1567 // If the cut affects all sequences, remove highlighted columns
1568 if (sg.getSize() == viewport.alignment.getHeight())
1570 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1571 sg.getEndRes() + 1);
1574 SequenceI[] cut = new SequenceI[seqs.size()];
1575 for (int i = 0; i < seqs.size(); i++)
1577 cut[i] = (SequenceI) seqs.elementAt(i);
1581 * //ADD HISTORY ITEM
1583 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1584 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1585 viewport.alignment));
1587 viewport.setSelectionGroup(null);
1588 viewport.alignment.deleteGroup(sg);
1590 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1593 if (viewport.getAlignment().getHeight() < 1)
1595 this.setVisible(false);
1599 protected void deleteGroups_actionPerformed()
1601 viewport.alignment.deleteAllGroups();
1602 viewport.sequenceColours = null;
1603 viewport.setSelectionGroup(null);
1605 alignPanel.paintAlignment(true);
1608 public void selectAllSequenceMenuItem_actionPerformed()
1610 SequenceGroup sg = new SequenceGroup();
1611 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1613 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1615 sg.setEndRes(viewport.alignment.getWidth() - 1);
1616 viewport.setSelectionGroup(sg);
1617 alignPanel.paintAlignment(true);
1618 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1621 public void deselectAllSequenceMenuItem_actionPerformed()
1623 if (viewport.cursorMode)
1625 alignPanel.seqPanel.keyboardNo1 = null;
1626 alignPanel.seqPanel.keyboardNo2 = null;
1628 viewport.setSelectionGroup(null);
1629 viewport.getColumnSelection().clear();
1630 viewport.setSelectionGroup(null);
1631 alignPanel.idPanel.idCanvas.searchResults = null;
1632 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1633 alignPanel.paintAlignment(true);
1634 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1637 public void invertSequenceMenuItem_actionPerformed()
1639 SequenceGroup sg = viewport.getSelectionGroup();
1640 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1642 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1645 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1648 void trimAlignment(boolean trimLeft)
1650 ColumnSelection colSel = viewport.getColumnSelection();
1653 if (colSel.size() > 0)
1657 column = colSel.getMin();
1661 column = colSel.getMax();
1665 if (viewport.getSelectionGroup() != null)
1667 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1668 viewport.hiddenRepSequences);
1672 seqs = viewport.alignment.getSequencesArray();
1675 TrimRegionCommand trimRegion;
1678 trimRegion = new TrimRegionCommand("Remove Left",
1679 TrimRegionCommand.TRIM_LEFT, seqs, column,
1680 viewport.alignment, viewport.colSel,
1681 viewport.selectionGroup);
1682 viewport.setStartRes(0);
1686 trimRegion = new TrimRegionCommand("Remove Right",
1687 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1688 viewport.alignment, viewport.colSel,
1689 viewport.selectionGroup);
1692 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1694 addHistoryItem(trimRegion);
1696 Vector groups = viewport.alignment.getGroups();
1698 for (int i = 0; i < groups.size(); i++)
1700 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1702 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1703 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1705 viewport.alignment.deleteGroup(sg);
1709 viewport.firePropertyChange("alignment", null, viewport
1710 .getAlignment().getSequences());
1714 public void removeGappedColumnMenuItem_actionPerformed()
1716 int start = 0, end = viewport.alignment.getWidth() - 1;
1719 if (viewport.getSelectionGroup() != null)
1721 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1722 viewport.hiddenRepSequences);
1723 start = viewport.getSelectionGroup().getStartRes();
1724 end = viewport.getSelectionGroup().getEndRes();
1728 seqs = viewport.alignment.getSequencesArray();
1731 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1732 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1734 addHistoryItem(removeGapCols);
1736 statusBar.setText("Removed " + removeGapCols.getSize()
1737 + " empty columns.");
1739 // This is to maintain viewport position on first residue
1740 // of first sequence
1741 SequenceI seq = viewport.alignment.getSequenceAt(0);
1742 int startRes = seq.findPosition(viewport.startRes);
1743 // ShiftList shifts;
1744 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1745 // edit.alColumnChanges=shifts.getInverse();
1746 // if (viewport.hasHiddenColumns)
1747 // viewport.getColumnSelection().compensateForEdits(shifts);
1748 viewport.setStartRes(seq.findIndex(startRes) - 1);
1749 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1754 public void removeAllGapsMenuItem_actionPerformed()
1756 int start = 0, end = viewport.alignment.getWidth() - 1;
1759 if (viewport.getSelectionGroup() != null)
1761 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1762 viewport.hiddenRepSequences);
1763 start = viewport.getSelectionGroup().getStartRes();
1764 end = viewport.getSelectionGroup().getEndRes();
1768 seqs = viewport.alignment.getSequencesArray();
1771 // This is to maintain viewport position on first residue
1772 // of first sequence
1773 SequenceI seq = viewport.alignment.getSequenceAt(0);
1774 int startRes = seq.findPosition(viewport.startRes);
1776 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1777 viewport.alignment));
1779 viewport.setStartRes(seq.findIndex(startRes) - 1);
1781 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1786 public void findMenuItem_actionPerformed()
1788 new Finder(alignPanel);
1792 * create a new view derived from the current view
1795 * @return frame for the new view
1797 public AlignFrame newView(String viewtitle)
1800 if (viewport.hasHiddenRows)
1802 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1803 .getFullAlignment().getSequencesArray());
1807 newal = new Alignment(viewport.alignment.getSequencesArray());
1810 if (viewport.alignment.getAlignmentAnnotation() != null)
1812 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1814 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1817 .addAnnotation(viewport.alignment
1818 .getAlignmentAnnotation()[i]);
1823 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
1825 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1826 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1827 PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av
1828 .getSequenceSetId());
1830 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1831 newaf.alignPanel.av.getSequenceSetId());
1832 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1833 newaf.alignPanel.av.getSequenceSetId());
1835 Vector comps = (Vector) PaintRefresher.components.get(viewport
1836 .getSequenceSetId());
1838 for (int i = 0; i < comps.size(); i++)
1840 if (comps.elementAt(i) instanceof AlignmentPanel)
1846 String title = new String(this.getTitle());
1847 if (viewtitle != null)
1849 title = viewtitle + " ( " + title + ")";
1853 if (title.indexOf("(View") > -1)
1855 title = title.substring(0, title.indexOf("(View"));
1857 title += "(View " + viewSize + ")";
1860 newaf.setTitle(title.toString());
1862 newaf.viewport.historyList = viewport.historyList;
1863 newaf.viewport.redoList = viewport.redoList;
1869 * @return list of feature groups on the view
1871 public String[] getFeatureGroups()
1873 FeatureRenderer fr = null;
1874 if (alignPanel != null
1875 && (fr = alignPanel.getFeatureRenderer()) != null)
1877 return fr.getGroups();
1883 * get sequence feature groups that are hidden or shown
1889 public String[] getFeatureGroupsOfState(boolean visible)
1891 FeatureRenderer fr = null;
1892 if (alignPanel != null
1893 && (fr = alignPanel.getFeatureRenderer()) != null)
1895 return fr.getGroups(visible);
1901 * Change the display state for the given feature groups
1904 * list of group strings
1906 * visible or invisible
1908 public void setFeatureGroupState(String[] groups, boolean state)
1910 FeatureRenderer fr = null;
1911 this.sequenceFeatures.setState(true);
1912 viewport.showSequenceFeatures(true);
1913 if (alignPanel != null
1914 && (fr = alignPanel.getFeatureRenderer()) != null)
1916 fr.setGroupState(groups, state);
1917 alignPanel.seqPanel.seqCanvas.repaint();
1918 if (alignPanel.overviewPanel != null)
1920 alignPanel.overviewPanel.updateOverviewImage();
1925 public void seqLimits_itemStateChanged()
1927 viewport.setShowJVSuffix(seqLimits.getState());
1928 alignPanel.fontChanged();
1929 alignPanel.paintAlignment(true);
1932 protected void colourTextMenuItem_actionPerformed()
1934 viewport.setColourText(colourTextMenuItem.getState());
1935 alignPanel.paintAlignment(true);
1938 protected void displayNonconservedMenuItem_actionPerformed()
1940 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
1941 alignPanel.paintAlignment(true);
1944 protected void wrapMenuItem_actionPerformed()
1946 viewport.setWrapAlignment(wrapMenuItem.getState());
1947 alignPanel.setWrapAlignment(wrapMenuItem.getState());
1948 scaleAbove.setEnabled(wrapMenuItem.getState());
1949 scaleLeft.setEnabled(wrapMenuItem.getState());
1950 scaleRight.setEnabled(wrapMenuItem.getState());
1951 alignPanel.paintAlignment(true);
1954 public void overviewMenuItem_actionPerformed()
1956 if (alignPanel.overviewPanel != null)
1961 Frame frame = new Frame();
1962 OverviewPanel overview = new OverviewPanel(alignPanel);
1963 frame.add(overview);
1964 // +50 must allow for applet frame window
1965 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
1966 overview.getPreferredSize().width,
1967 overview.getPreferredSize().height + 50);
1970 frame.addWindowListener(new WindowAdapter()
1972 public void windowClosing(WindowEvent e)
1974 alignPanel.setOverviewPanel(null);
1978 alignPanel.setOverviewPanel(overview);
1982 void changeColour(ColourSchemeI cs)
1988 if (viewport.getAbovePIDThreshold())
1990 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
1993 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
1995 viewport.setGlobalColourScheme(cs);
1999 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2002 if (viewport.getConservationSelected())
2005 Alignment al = (Alignment) viewport.alignment;
2006 Conservation c = new Conservation("All",
2007 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2011 c.verdict(false, viewport.ConsPercGaps);
2013 cs.setConservation(c);
2015 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2021 cs.setConservation(null);
2024 cs.setConsensus(viewport.hconsensus);
2027 viewport.setGlobalColourScheme(cs);
2029 if (viewport.getColourAppliesToAllGroups())
2031 Vector groups = viewport.alignment.getGroups();
2032 for (int i = 0; i < groups.size(); i++)
2034 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2041 if (cs instanceof ClustalxColourScheme)
2043 sg.cs = new ClustalxColourScheme(sg
2044 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2050 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2051 } catch (Exception ex)
2053 ex.printStackTrace();
2058 if (viewport.getAbovePIDThreshold()
2059 || cs instanceof PIDColourScheme
2060 || cs instanceof Blosum62ColourScheme)
2062 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2063 sg.cs.setConsensus(AAFrequency.calculate(sg
2064 .getSequences(viewport.hiddenRepSequences), 0, sg
2069 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2072 if (viewport.getConservationSelected())
2074 Conservation c = new Conservation("Group",
2075 ResidueProperties.propHash, 3, sg
2076 .getSequences(viewport.hiddenRepSequences), 0,
2077 viewport.alignment.getWidth() - 1);
2079 c.verdict(false, viewport.ConsPercGaps);
2080 sg.cs.setConservation(c);
2084 sg.cs.setConservation(null);
2085 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2091 if (alignPanel.getOverviewPanel() != null)
2093 alignPanel.getOverviewPanel().updateOverviewImage();
2096 jalview.structure.StructureSelectionManager
2097 .getStructureSelectionManager().sequenceColoursChanged(
2100 alignPanel.paintAlignment(true);
2103 protected void modifyPID_actionPerformed()
2105 if (viewport.getAbovePIDThreshold()
2106 && viewport.globalColourScheme != null)
2108 SliderPanel.setPIDSliderSource(alignPanel, viewport
2109 .getGlobalColourScheme(), "Background");
2110 SliderPanel.showPIDSlider();
2114 protected void modifyConservation_actionPerformed()
2116 if (viewport.getConservationSelected()
2117 && viewport.globalColourScheme != null)
2119 SliderPanel.setConservationSlider(alignPanel,
2120 viewport.globalColourScheme, "Background");
2121 SliderPanel.showConservationSlider();
2125 protected void conservationMenuItem_actionPerformed()
2127 viewport.setConservationSelected(conservationMenuItem.getState());
2129 viewport.setAbovePIDThreshold(false);
2130 abovePIDThreshold.setState(false);
2132 changeColour(viewport.getGlobalColourScheme());
2134 modifyConservation_actionPerformed();
2137 public void abovePIDThreshold_actionPerformed()
2139 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2141 conservationMenuItem.setState(false);
2142 viewport.setConservationSelected(false);
2144 changeColour(viewport.getGlobalColourScheme());
2146 modifyPID_actionPerformed();
2148 public void sortPairwiseMenuItem_actionPerformed()
2150 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2151 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2152 .getAlignment().getSequenceAt(0), null);
2154 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2155 viewport.alignment));
2156 alignPanel.paintAlignment(true);
2159 public void sortIDMenuItem_actionPerformed()
2161 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2162 AlignmentSorter.sortByID(viewport.getAlignment());
2163 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
2164 viewport.alignment));
2165 alignPanel.paintAlignment(true);
2168 public void sortGroupMenuItem_actionPerformed()
2170 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2171 AlignmentSorter.sortByGroup(viewport.getAlignment());
2172 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2173 viewport.alignment));
2174 alignPanel.paintAlignment(true);
2178 public void removeRedundancyMenuItem_actionPerformed()
2180 new RedundancyPanel(alignPanel);
2183 public void pairwiseAlignmentMenuItem_actionPerformed()
2185 if (viewport.getSelectionGroup() != null
2186 && viewport.getSelectionGroup().getSize() > 1)
2188 Frame frame = new Frame();
2189 frame.add(new PairwiseAlignPanel(alignPanel));
2190 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2195 public void PCAMenuItem_actionPerformed()
2197 // are the sequences aligned?
2198 if (!viewport.alignment.isAligned())
2201 int Width = viewport.getAlignment().getWidth();
2203 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2205 current = viewport.getAlignment().getSequenceAt(i);
2207 if (current.getLength() < Width)
2209 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2212 alignPanel.paintAlignment(true);
2215 if ((viewport.getSelectionGroup() != null
2216 && viewport.getSelectionGroup().getSize() < 4 && viewport
2217 .getSelectionGroup().getSize() > 0)
2218 || viewport.getAlignment().getHeight() < 4)
2225 new PCAPanel(viewport);
2226 } catch (java.lang.OutOfMemoryError ex)
2232 public void averageDistanceTreeMenuItem_actionPerformed()
2234 NewTreePanel("AV", "PID", "Average distance tree using PID");
2237 public void neighbourTreeMenuItem_actionPerformed()
2239 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2242 protected void njTreeBlosumMenuItem_actionPerformed()
2244 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2247 protected void avTreeBlosumMenuItem_actionPerformed()
2249 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2252 void NewTreePanel(String type, String pwType, String title)
2254 // are the sequences aligned?
2255 if (!viewport.alignment.isAligned())
2258 int Width = viewport.getAlignment().getWidth();
2260 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2262 current = viewport.getAlignment().getSequenceAt(i);
2264 if (current.getLength() < Width)
2266 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2269 alignPanel.paintAlignment(true);
2273 if ((viewport.getSelectionGroup() != null && viewport
2274 .getSelectionGroup().getSize() > 1)
2275 || (viewport.getSelectionGroup() == null && viewport.alignment
2278 final TreePanel tp = new TreePanel(viewport, type, pwType);
2280 addTreeMenuItem(tp, title);
2282 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2286 void loadTree_actionPerformed()
2288 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2289 cap.setText("Paste your Newick tree file here.");
2290 cap.setTreeImport();
2291 Frame frame = new Frame();
2293 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2296 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2298 TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree);
2299 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2300 addTreeMenuItem(tp, treeFile);
2303 * sort the alignment using the given treePanel
2304 * @param treePanel tree used to sort view
2305 * @param title string used for undo event name
2307 public void sortByTree(TreePanel treePanel, String title)
2309 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2310 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel
2312 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2313 // HistoryItem.SORT));
2314 addHistoryItem(new OrderCommand("Order by "+title, oldOrder,
2315 viewport.alignment));
2316 alignPanel.paintAlignment(true);
2319 * Do any automatic reordering of the alignment and add the necessary bits to the menu structure for the new tree
2323 protected void addTreeMenuItem(final TreePanel treePanel, final String title)
2325 final MenuItem item = new MenuItem(title);
2326 sortByTreeMenu.add(item);
2327 item.addActionListener(new java.awt.event.ActionListener()
2329 public void actionPerformed(ActionEvent evt)
2331 sortByTree(treePanel, title); // treePanel.getTitle());
2335 treePanel.addWindowListener(new WindowAdapter()
2337 public void windowOpened(WindowEvent e)
2339 if (viewport.sortByTree)
2341 sortByTree(treePanel, title);
2343 super.windowOpened(e);
2346 public void windowClosing(WindowEvent e)
2348 sortByTreeMenu.remove(item);
2353 protected void documentation_actionPerformed()
2355 showURL("http://www.jalview.org/help.html", "HELP");
2358 protected void about_actionPerformed()
2361 class AboutPanel extends Canvas
2365 public AboutPanel(String version, String builddate)
2367 this.version = version;
2368 this.builddate = builddate;
2371 public void paint(Graphics g)
2373 g.setColor(Color.white);
2374 g.fillRect(0, 0, getSize().width, getSize().height);
2375 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2376 FontMetrics fm = g.getFontMetrics();
2377 int fh = fm.getHeight();
2379 g.setColor(Color.black);
2380 // TODO: update this text for each release or centrally store it for
2381 // lite and application
2382 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2383 g.drawString("JalviewLite - Release " + version, x, y += fh);
2384 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2385 g.drawString("Build date: "+builddate, x, y += fh);
2386 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2389 "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,",
2391 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2394 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2398 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2400 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2402 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",x,y+=fh);
2403 g.drawString("Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",x,y+=fh);
2404 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",x,y+=fh);
2408 Frame frame = new Frame();
2409 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite.getBuildDate()));
2410 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2414 public void showURL(String url, String target)
2416 if (viewport.applet == null)
2418 System.out.println("Not running as applet - no browser available.");
2424 if (url.indexOf(":")==-1)
2426 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to form valid URL
2427 if (url.indexOf("/")==0)
2429 String codebase = viewport.applet.getCodeBase().toString();
2430 url = codebase.substring(0,codebase.length()-viewport.applet.getCodeBase().getFile().length())+url;
2432 url = viewport.applet.getCodeBase()+url;
2434 System.out.println("Show url (prepended codebase): " + url);
2436 System.out.println("Show url: " + url);
2438 viewport.applet.getAppletContext().showDocument(
2439 new java.net.URL(url), target);
2440 } catch (Exception ex)
2442 ex.printStackTrace();
2447 // ////////////////////////////////////////////////////////////////////////////////
2448 // JBuilder Graphics here
2450 MenuBar alignFrameMenuBar = new MenuBar();
2452 Menu fileMenu = new Menu("File");
2454 MenuItem loadApplication = new MenuItem("View in Full Application");
2456 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2458 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2460 MenuItem outputFeatures = new MenuItem("Export Features ...");
2462 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2464 MenuItem closeMenuItem = new MenuItem("Close");
2466 Menu editMenu = new Menu("Edit");
2468 Menu viewMenu = new Menu("View");
2470 Menu colourMenu = new Menu("Colour");
2472 Menu calculateMenu = new Menu("Calculate");
2474 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2476 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2478 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2480 MenuItem remove2LeftMenuItem = new MenuItem();
2482 MenuItem remove2RightMenuItem = new MenuItem();
2484 MenuItem removeGappedColumnMenuItem = new MenuItem();
2486 MenuItem removeAllGapsMenuItem = new MenuItem();
2488 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2490 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2492 MenuItem sortPairwiseMenuItem = new MenuItem();
2494 MenuItem sortIDMenuItem = new MenuItem();
2496 MenuItem sortGroupMenuItem = new MenuItem();
2498 MenuItem removeRedundancyMenuItem = new MenuItem();
2500 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2502 MenuItem PCAMenuItem = new MenuItem();
2504 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2506 MenuItem neighbourTreeMenuItem = new MenuItem();
2508 BorderLayout borderLayout1 = new BorderLayout();
2510 public Label statusBar = new Label();
2512 Menu outputTextboxMenu = new Menu();
2514 MenuItem clustalColour = new MenuItem();
2516 MenuItem zappoColour = new MenuItem();
2518 MenuItem taylorColour = new MenuItem();
2520 MenuItem hydrophobicityColour = new MenuItem();
2522 MenuItem helixColour = new MenuItem();
2524 MenuItem strandColour = new MenuItem();
2526 MenuItem turnColour = new MenuItem();
2528 MenuItem buriedColour = new MenuItem();
2530 MenuItem userDefinedColour = new MenuItem();
2532 MenuItem PIDColour = new MenuItem();
2534 MenuItem BLOSUM62Colour = new MenuItem();
2536 MenuItem njTreeBlosumMenuItem = new MenuItem();
2538 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2540 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2542 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2544 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2546 MenuItem alProperties = new MenuItem("Alignment Properties...");
2548 MenuItem overviewMenuItem = new MenuItem();
2550 MenuItem undoMenuItem = new MenuItem();
2552 MenuItem redoMenuItem = new MenuItem();
2554 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2556 MenuItem noColourmenuItem = new MenuItem();
2558 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2560 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2562 MenuItem findMenuItem = new MenuItem();
2564 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2566 MenuItem nucleotideColour = new MenuItem();
2568 MenuItem deleteGroups = new MenuItem();
2570 MenuItem delete = new MenuItem();
2572 MenuItem copy = new MenuItem();
2574 MenuItem cut = new MenuItem();
2576 Menu pasteMenu = new Menu();
2578 MenuItem pasteNew = new MenuItem();
2580 MenuItem pasteThis = new MenuItem();
2582 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2584 MenuItem font = new MenuItem();
2586 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2588 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2590 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2592 MenuItem modifyPID = new MenuItem();
2594 MenuItem modifyConservation = new MenuItem();
2596 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2597 "Autocalculate Consensus", true);
2599 Menu sortByTreeMenu = new Menu();
2601 Menu sort = new Menu();
2603 Menu calculate = new Menu();
2605 MenuItem inputText = new MenuItem();
2607 Menu helpMenu = new Menu();
2609 MenuItem documentation = new MenuItem();
2611 MenuItem about = new MenuItem();
2613 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2615 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2617 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2619 private void jbInit() throws Exception
2622 setMenuBar(alignFrameMenuBar);
2626 // dynamically fill save as menu with available formats
2627 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2630 item = new MenuItem(
2631 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2633 item.addActionListener(new java.awt.event.ActionListener()
2635 public void actionPerformed(ActionEvent e)
2637 outputText_actionPerformed(e);
2641 outputTextboxMenu.add(item);
2643 closeMenuItem.addActionListener(this);
2644 loadApplication.addActionListener(this);
2646 loadTree.addActionListener(this);
2647 loadAnnotations.addActionListener(this);
2648 outputFeatures.addActionListener(this);
2649 outputAnnotations.addActionListener(this);
2650 selectAllSequenceMenuItem.addActionListener(this);
2651 deselectAllSequenceMenuItem.addActionListener(this);
2652 invertSequenceMenuItem.addActionListener(this);
2653 remove2LeftMenuItem.setLabel("Remove Left");
2654 remove2LeftMenuItem.addActionListener(this);
2655 remove2RightMenuItem.setLabel("Remove Right");
2656 remove2RightMenuItem.addActionListener(this);
2657 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2658 removeGappedColumnMenuItem.addActionListener(this);
2659 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2660 removeAllGapsMenuItem.addActionListener(this);
2661 viewBoxesMenuItem.setLabel("Boxes");
2662 viewBoxesMenuItem.setState(true);
2663 viewBoxesMenuItem.addItemListener(this);
2664 viewTextMenuItem.setLabel("Text");
2665 viewTextMenuItem.setState(true);
2666 viewTextMenuItem.addItemListener(this);
2667 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2668 sortPairwiseMenuItem.addActionListener(this);
2669 sortIDMenuItem.setLabel("by ID");
2670 sortIDMenuItem.addActionListener(this);
2671 sortGroupMenuItem.setLabel("by Group");
2672 sortGroupMenuItem.addActionListener(this);
2673 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2674 removeRedundancyMenuItem.addActionListener(this);
2675 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2676 pairwiseAlignmentMenuItem.addActionListener(this);
2677 PCAMenuItem.setLabel("Principal Component Analysis");
2678 PCAMenuItem.addActionListener(this);
2679 averageDistanceTreeMenuItem
2680 .setLabel("Average Distance Using % Identity");
2681 averageDistanceTreeMenuItem.addActionListener(this);
2682 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2683 neighbourTreeMenuItem.addActionListener(this);
2684 statusBar.setBackground(Color.white);
2685 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2686 statusBar.setText("Status bar");
2687 outputTextboxMenu.setLabel("Output to Textbox");
2688 clustalColour.setLabel("Clustalx");
2690 clustalColour.addActionListener(this);
2691 zappoColour.setLabel("Zappo");
2692 zappoColour.addActionListener(this);
2693 taylorColour.setLabel("Taylor");
2694 taylorColour.addActionListener(this);
2695 hydrophobicityColour.setLabel("Hydrophobicity");
2696 hydrophobicityColour.addActionListener(this);
2697 helixColour.setLabel("Helix Propensity");
2698 helixColour.addActionListener(this);
2699 strandColour.setLabel("Strand Propensity");
2700 strandColour.addActionListener(this);
2701 turnColour.setLabel("Turn Propensity");
2702 turnColour.addActionListener(this);
2703 buriedColour.setLabel("Buried Index");
2704 buriedColour.addActionListener(this);
2705 userDefinedColour.setLabel("User Defined...");
2706 userDefinedColour.addActionListener(this);
2707 PIDColour.setLabel("Percentage Identity");
2708 PIDColour.addActionListener(this);
2709 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2710 BLOSUM62Colour.addActionListener(this);
2711 avDistanceTreeBlosumMenuItem
2712 .setLabel("Average Distance Using BLOSUM62");
2713 avDistanceTreeBlosumMenuItem.addActionListener(this);
2714 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2715 njTreeBlosumMenuItem.addActionListener(this);
2716 annotationPanelMenuItem.setLabel("Show Annotations");
2717 annotationPanelMenuItem.addItemListener(this);
2718 colourTextMenuItem.setLabel("Colour Text");
2719 colourTextMenuItem.addItemListener(this);
2720 displayNonconservedMenuItem.setLabel("Show non-conserved");
2721 displayNonconservedMenuItem.addItemListener(this);
2722 alProperties.addActionListener(this);
2723 overviewMenuItem.setLabel("Overview Window");
2724 overviewMenuItem.addActionListener(this);
2725 undoMenuItem.setEnabled(false);
2726 undoMenuItem.setLabel("Undo");
2727 undoMenuItem.addActionListener(this);
2728 redoMenuItem.setEnabled(false);
2729 redoMenuItem.setLabel("Redo");
2730 redoMenuItem.addActionListener(this);
2731 conservationMenuItem.setLabel("by Conservation");
2732 conservationMenuItem.addItemListener(this);
2733 noColourmenuItem.setLabel("None");
2734 noColourmenuItem.addActionListener(this);
2735 wrapMenuItem.setLabel("Wrap");
2736 wrapMenuItem.addItemListener(this);
2737 renderGapsMenuItem.setLabel("Show Gaps");
2738 renderGapsMenuItem.setState(true);
2739 renderGapsMenuItem.addItemListener(this);
2740 findMenuItem.setLabel("Find...");
2741 findMenuItem.addActionListener(this);
2742 abovePIDThreshold.setLabel("Above Identity Threshold");
2743 abovePIDThreshold.addItemListener(this);
2744 nucleotideColour.setLabel("Nucleotide");
2745 nucleotideColour.addActionListener(this);
2746 deleteGroups.setLabel("Undefine Groups");
2747 deleteGroups.addActionListener(this);
2748 copy.setLabel("Copy");
2749 copy.addActionListener(this);
2750 cut.setLabel("Cut");
2751 cut.addActionListener(this);
2752 delete.setLabel("Delete");
2753 delete.addActionListener(this);
2754 pasteMenu.setLabel("Paste");
2755 pasteNew.setLabel("To New Alignment");
2756 pasteNew.addActionListener(this);
2757 pasteThis.setLabel("Add To This Alignment");
2758 pasteThis.addActionListener(this);
2759 applyToAllGroups.setLabel("Apply Colour To All Groups");
2760 applyToAllGroups.setState(true);
2761 applyToAllGroups.addItemListener(this);
2762 font.setLabel("Font...");
2763 font.addActionListener(this);
2764 scaleAbove.setLabel("Scale Above");
2765 scaleAbove.setState(true);
2766 scaleAbove.setEnabled(false);
2767 scaleAbove.addItemListener(this);
2768 scaleLeft.setEnabled(false);
2769 scaleLeft.setState(true);
2770 scaleLeft.setLabel("Scale Left");
2771 scaleLeft.addItemListener(this);
2772 scaleRight.setEnabled(false);
2773 scaleRight.setState(true);
2774 scaleRight.setLabel("Scale Right");
2775 scaleRight.addItemListener(this);
2776 modifyPID.setLabel("Modify Identity Threshold...");
2777 modifyPID.addActionListener(this);
2778 modifyConservation.setLabel("Modify Conservation Threshold...");
2779 modifyConservation.addActionListener(this);
2780 sortByTreeMenu.setLabel("By Tree Order");
2781 sort.setLabel("Sort");
2782 calculate.setLabel("Calculate Tree");
2783 autoCalculate.addItemListener(this);
2784 inputText.setLabel("Input from textbox");
2785 inputText.addActionListener(this);
2786 centreColumnLabelFlag.setLabel("Centre column labels");
2787 centreColumnLabelFlag.addItemListener(this);
2788 followMouseOverFlag.setLabel("Automatic Scrolling");
2789 followMouseOverFlag.addItemListener(this);
2790 helpMenu.setLabel("Help");
2791 documentation.setLabel("Documentation");
2792 documentation.addActionListener(this);
2794 about.setLabel("About...");
2795 about.addActionListener(this);
2796 seqLimits.setState(true);
2797 seqLimits.setLabel("Show Sequence Limits");
2798 seqLimits.addItemListener(this);
2799 featureSettings.setLabel("Feature Settings...");
2800 featureSettings.addActionListener(this);
2801 sequenceFeatures.setLabel("Sequence Features");
2802 sequenceFeatures.addItemListener(this);
2803 sequenceFeatures.setState(false);
2804 annotationColour.setLabel("by Annotation...");
2805 annotationColour.addActionListener(this);
2806 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2807 invertColSel.setLabel("Invert Column Selection");
2808 menu1.setLabel("Show");
2809 showColumns.setLabel("All Columns ");
2810 showSeqs.setLabel("All Sequences");
2811 menu2.setLabel("Hide");
2812 hideColumns.setLabel("Selected Columns");
2813 hideSequences.setLabel("Selected Sequences");
2814 invertColSel.addActionListener(this);
2815 showColumns.addActionListener(this);
2816 showSeqs.addActionListener(this);
2817 hideColumns.addActionListener(this);
2818 hideSequences.addActionListener(this);
2819 formatMenu.setLabel("Format");
2820 selectMenu.setLabel("Select");
2821 newView.setLabel("New View");
2822 newView.addActionListener(this);
2823 alignFrameMenuBar.add(fileMenu);
2824 alignFrameMenuBar.add(editMenu);
2825 alignFrameMenuBar.add(selectMenu);
2826 alignFrameMenuBar.add(viewMenu);
2827 alignFrameMenuBar.add(formatMenu);
2828 alignFrameMenuBar.add(colourMenu);
2829 alignFrameMenuBar.add(calculateMenu);
2830 alignFrameMenuBar.add(helpMenu);
2832 fileMenu.add(inputText);
2833 fileMenu.add(loadTree);
2834 fileMenu.add(loadAnnotations);
2836 fileMenu.addSeparator();
2837 fileMenu.add(outputTextboxMenu);
2838 fileMenu.add(outputFeatures);
2839 fileMenu.add(outputAnnotations);
2841 if (jalviewServletURL != null)
2843 fileMenu.add(loadApplication);
2846 fileMenu.addSeparator();
2847 fileMenu.add(closeMenuItem);
2849 editMenu.add(undoMenuItem);
2850 editMenu.add(redoMenuItem);
2853 editMenu.add(pasteMenu);
2854 editMenu.add(delete);
2855 editMenu.addSeparator();
2856 editMenu.add(remove2LeftMenuItem);
2857 editMenu.add(remove2RightMenuItem);
2858 editMenu.add(removeGappedColumnMenuItem);
2859 editMenu.add(removeAllGapsMenuItem);
2860 editMenu.add(removeRedundancyMenuItem);
2861 viewMenu.add(newView);
2862 viewMenu.addSeparator();
2863 viewMenu.add(menu1);
2864 viewMenu.add(menu2);
2865 viewMenu.addSeparator();
2866 viewMenu.add(followMouseOverFlag);
2867 viewMenu.add(annotationPanelMenuItem);
2868 viewMenu.addSeparator();
2869 viewMenu.add(sequenceFeatures);
2870 viewMenu.add(featureSettings);
2871 viewMenu.addSeparator();
2872 viewMenu.add(alProperties);
2873 viewMenu.addSeparator();
2874 viewMenu.add(overviewMenuItem);
2875 colourMenu.add(applyToAllGroups);
2876 colourMenu.addSeparator();
2877 colourMenu.add(noColourmenuItem);
2878 colourMenu.add(clustalColour);
2879 colourMenu.add(BLOSUM62Colour);
2880 colourMenu.add(PIDColour);
2881 colourMenu.add(zappoColour);
2882 colourMenu.add(taylorColour);
2883 colourMenu.add(hydrophobicityColour);
2884 colourMenu.add(helixColour);
2885 colourMenu.add(strandColour);
2886 colourMenu.add(turnColour);
2887 colourMenu.add(buriedColour);
2888 colourMenu.add(nucleotideColour);
2889 colourMenu.add(userDefinedColour);
2890 colourMenu.addSeparator();
2891 colourMenu.add(conservationMenuItem);
2892 colourMenu.add(modifyConservation);
2893 colourMenu.add(abovePIDThreshold);
2894 colourMenu.add(modifyPID);
2895 colourMenu.add(annotationColour);
2896 calculateMenu.add(sort);
2897 calculateMenu.add(calculate);
2898 calculateMenu.addSeparator();
2899 calculateMenu.add(pairwiseAlignmentMenuItem);
2900 calculateMenu.add(PCAMenuItem);
2901 calculateMenu.add(autoCalculate);
2902 this.add(statusBar, BorderLayout.SOUTH);
2903 pasteMenu.add(pasteNew);
2904 pasteMenu.add(pasteThis);
2905 sort.add(sortIDMenuItem);
2906 sort.add(sortByTreeMenu);
2907 sort.add(sortGroupMenuItem);
2908 sort.add(sortPairwiseMenuItem);
2909 calculate.add(averageDistanceTreeMenuItem);
2910 calculate.add(neighbourTreeMenuItem);
2911 calculate.add(avDistanceTreeBlosumMenuItem);
2912 calculate.add(njTreeBlosumMenuItem);
2913 helpMenu.add(documentation);
2914 helpMenu.add(about);
2915 menu1.add(showColumns);
2916 menu1.add(showSeqs);
2917 menu2.add(hideColumns);
2918 menu2.add(hideSequences);
2919 formatMenu.add(font);
2920 formatMenu.add(seqLimits);
2921 formatMenu.add(wrapMenuItem);
2922 formatMenu.add(scaleAbove);
2923 formatMenu.add(scaleLeft);
2924 formatMenu.add(scaleRight);
2925 formatMenu.add(viewBoxesMenuItem);
2926 formatMenu.add(viewTextMenuItem);
2927 formatMenu.add(colourTextMenuItem);
2928 formatMenu.add(displayNonconservedMenuItem);
2929 formatMenu.add(renderGapsMenuItem);
2930 formatMenu.add(centreColumnLabelFlag);
2931 selectMenu.add(findMenuItem);
2932 selectMenu.addSeparator();
2933 selectMenu.add(selectAllSequenceMenuItem);
2934 selectMenu.add(deselectAllSequenceMenuItem);
2935 selectMenu.add(invertSequenceMenuItem);
2936 selectMenu.add(invertColSel);
2937 selectMenu.add(deleteGroups);
2940 MenuItem featureSettings = new MenuItem();
2942 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
2944 MenuItem annotationColour = new MenuItem();
2946 MenuItem invertColSel = new MenuItem();
2948 Menu menu1 = new Menu();
2950 MenuItem showColumns = new MenuItem();
2952 MenuItem showSeqs = new MenuItem();
2954 Menu menu2 = new Menu();
2956 MenuItem hideColumns = new MenuItem();
2958 MenuItem hideSequences = new MenuItem();
2960 Menu formatMenu = new Menu();
2962 Menu selectMenu = new Menu();
2964 MenuItem newView = new MenuItem();
2967 * Attach the alignFrame panels after embedding menus, if necessary. This used
2968 * to be called setEmbedded, but is now creates the dropdown menus in a
2969 * platform independent manner to avoid OSX/Mac menu appendage daftness.
2971 * @param reallyEmbedded
2972 * true to attach the view to the applet area on the page
2973 * rather than in a new window
2975 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
2980 // Explicly build the embedded menu panel for the on-page applet
2982 // view cannot be closed if its actually on the page
2983 fileMenu.remove(closeMenuItem);
2984 fileMenu.remove(3); // Remove Seperator
2985 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
2986 Font.PLAIN, 10, false); // use our own fonts.
2987 // and actually add the components to the applet area
2988 viewport.applet.setLayout(new BorderLayout());
2989 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
2990 viewport.applet.add(statusBar, BorderLayout.SOUTH);
2991 alignPanel.setSize(viewport.applet.getSize().width, viewport.applet
2993 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
2994 viewport.applet.add(alignPanel, BorderLayout.CENTER);
2995 viewport.applet.validate();
3000 // test and embed menu bar if necessary.
3002 if (embedMenuIfNeeded(alignPanel))
3004 // adjust for status bar height too
3005 alignPanel.setSize(getSize().width, getSize().height
3006 - statusBar.HEIGHT);
3008 add(statusBar, BorderLayout.SOUTH);
3009 add(alignPanel, BorderLayout.CENTER);
3010 // and register with the applet so it can pass external API calls to us
3011 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,