2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2007 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
20 package jalview.appletgui;
27 import java.awt.event.*;
29 import jalview.analysis.*;
30 import jalview.commands.*;
31 import jalview.datamodel.*;
33 import jalview.schemes.*;
35 public class AlignFrame
36 extends Frame implements ActionListener,
37 ItemListener, KeyListener, MouseListener
39 public AlignmentPanel alignPanel;
40 public AlignViewport viewport;
41 int DEFAULT_WIDTH = 700;
42 int DEFAULT_HEIGHT = 500;
44 String jalviewServletURL;
46 public AlignFrame(AlignmentI al,
47 jalview.bin.JalviewLite applet,
54 jalviewServletURL = applet.getParameter("APPLICATION_URL");
66 viewport = new AlignViewport(al, applet);
67 alignPanel = new AlignmentPanel(this, viewport);
69 viewport.updateConservation(alignPanel);
70 viewport.updateConsensus(alignPanel);
72 annotationPanelMenuItem.setState(viewport.showAnnotation);
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();
103 param = applet.getParameter("windowWidth");
106 int width = Integer.parseInt(param);
107 DEFAULT_WIDTH = width;
109 param = applet.getParameter("windowHeight");
112 int height = Integer.parseInt(param);
113 DEFAULT_HEIGHT = height;
121 //Some JVMS send keyevents to Top frame or lowest panel,
122 //Havent worked out why yet. So add to both this frame and seqCanvas for now
123 this.addKeyListener(this);
124 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
125 alignPanel.idPanel.idCanvas.addKeyListener(this);
126 alignPanel.scalePanel.addKeyListener(this);
127 alignPanel.annotationPanel.addKeyListener(this);
128 createAlignFrameWindow(embedded, title);
129 alignPanel.validate();
130 alignPanel.paintAlignment(true);
133 public AlignViewport getAlignViewport()
138 public SeqCanvas getSeqcanvas()
140 return alignPanel.seqPanel.seqCanvas;
146 * @param String DOCUMENT ME!
149 public void parseFeaturesFile(String file, String type)
151 Hashtable featureLinks = new Hashtable();
152 boolean featuresFile = false;
155 featuresFile = new jalview.io.FeaturesFile(file,
156 type).parse(viewport.alignment,
157 alignPanel.seqPanel.seqCanvas.
158 getFeatureRenderer().featureColours,
164 ex.printStackTrace();
169 if (featureLinks.size() > 0)
171 alignPanel.seqPanel.seqCanvas
172 .getFeatureRenderer().featureLinks = featureLinks;
174 viewport.showSequenceFeatures = true;
175 sequenceFeatures.setState(true);
176 alignPanel.paintAlignment(true);
181 public void keyPressed(KeyEvent evt)
183 if (viewport.cursorMode &&
184 ( (evt.getKeyCode() >= KeyEvent.VK_0 &&
185 evt.getKeyCode() <= KeyEvent.VK_9)
187 (evt.getKeyCode() >= KeyEvent.VK_NUMPAD0 &&
188 evt.getKeyCode() <= KeyEvent.VK_NUMPAD9)
190 && Character.isDigit(evt.getKeyChar()))
191 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
194 switch (evt.getKeyCode())
196 case 27: // escape key
197 deselectAllSequenceMenuItem_actionPerformed();
200 if (evt.isControlDown() || evt.isMetaDown())
202 cut_actionPerformed();
206 if (viewport.cursorMode && !evt.isControlDown())
208 alignPanel.seqPanel.setCursorColumn();
210 if (evt.isControlDown() || evt.isMetaDown())
212 copy_actionPerformed();
216 if (evt.isControlDown())
218 paste(evt.isShiftDown());
222 if (evt.isControlDown() || evt.isMetaDown())
224 selectAllSequenceMenuItem_actionPerformed();
227 case KeyEvent.VK_DOWN:
228 if (viewport.cursorMode)
230 alignPanel.seqPanel.moveCursor(0, 1);
234 moveSelectedSequences(false);
239 if (viewport.cursorMode)
241 alignPanel.seqPanel.moveCursor(0, -1);
245 moveSelectedSequences(true);
249 case KeyEvent.VK_LEFT:
250 if (evt.isAltDown() || !viewport.cursorMode)
251 slideSequences(false,
252 alignPanel.seqPanel.getKeyboardNo1());
254 alignPanel.seqPanel.moveCursor( -1, 0);
257 case KeyEvent.VK_RIGHT:
258 if (evt.isAltDown() || !viewport.cursorMode)
260 alignPanel.seqPanel.getKeyboardNo1());
262 alignPanel.seqPanel.moveCursor( 1, 0);
265 case KeyEvent.VK_SPACE:
266 if (viewport.cursorMode)
268 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
275 case KeyEvent.VK_DELETE:
276 case KeyEvent.VK_BACK_SPACE:
277 if (viewport.cursorMode)
279 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
285 cut_actionPerformed();
286 alignPanel.seqPanel.seqCanvas.repaint();
291 if (viewport.cursorMode)
293 alignPanel.seqPanel.setCursorRow();
297 if (viewport.cursorMode)
299 alignPanel.seqPanel.setCursorPosition();
303 case KeyEvent.VK_ENTER:
304 case KeyEvent.VK_COMMA:
305 if (viewport.cursorMode)
307 alignPanel.seqPanel.setCursorRowAndColumn();
312 if (viewport.cursorMode)
314 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
318 if (viewport.cursorMode)
320 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
325 viewport.cursorMode = !viewport.cursorMode;
326 statusBar.setText("Keyboard editing mode is " +
327 (viewport.cursorMode ? "on" : "off"));
328 if (viewport.cursorMode)
330 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
331 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
336 if (evt.isControlDown())
338 findMenuItem_actionPerformed();
344 boolean toggleSeqs = !evt.isControlDown();
345 boolean toggleCols = !evt.isShiftDown();
346 boolean hide = false;
347 SequenceGroup sg = viewport.getSelectionGroup();
351 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
354 viewport.hideAllSelectedSeqs();
356 else if (! (toggleCols && viewport.colSel.getSelected().size() > 0))
358 viewport.showAllHiddenSeqs();
364 if (viewport.colSel.getSelected().size() > 0)
366 viewport.hideSelectedColumns();
369 viewport.selectionGroup = sg;
374 viewport.showAllHiddenColumns();
380 case KeyEvent.VK_PAGE_UP:
381 if (viewport.wrapAlignment)
383 alignPanel.scrollUp(true);
387 alignPanel.setScrollValues(viewport.startRes,
389 - viewport.endSeq + viewport.startSeq);
393 case KeyEvent.VK_PAGE_DOWN:
394 if (viewport.wrapAlignment)
396 alignPanel.scrollUp(false);
400 alignPanel.setScrollValues(viewport.startRes,
402 + viewport.endSeq - viewport.startSeq);
407 if (evt.isControlDown())
409 undoMenuItem_actionPerformed();
414 if (evt.isControlDown())
416 redoMenuItem_actionPerformed();
421 if (evt.isControlDown())
428 if (evt.isControlDown())
430 trimAlignment(false);
435 if (evt.isControlDown())
437 if (evt.isShiftDown())
439 this.removeAllGapsMenuItem_actionPerformed();
443 removeGappedColumnMenuItem_actionPerformed();
448 if (evt.isControlDown())
452 viewport.invertColumnSelection();
456 this.invertSequenceMenuItem_actionPerformed();
462 if (evt.isControlDown())
464 this.deleteGroups_actionPerformed();
469 if (evt.isControlDown())
476 alignPanel.paintAlignment(true);
479 public void keyReleased(KeyEvent evt)
482 public void keyTyped(KeyEvent evt)
485 public void itemStateChanged(ItemEvent evt)
487 if (evt.getSource() == colourTextMenuItem)
489 colourTextMenuItem_actionPerformed();
491 else if (evt.getSource() == wrapMenuItem)
493 wrapMenuItem_actionPerformed();
495 else if (evt.getSource() == scaleAbove)
497 viewport.setScaleAboveWrapped(scaleAbove.getState());
499 else if (evt.getSource() == scaleLeft)
501 viewport.setScaleLeftWrapped(scaleLeft.getState());
503 else if (evt.getSource() == scaleRight)
505 viewport.setScaleRightWrapped(scaleRight.getState());
507 else if (evt.getSource() == seqLimits)
509 seqLimits_itemStateChanged();
511 else if (evt.getSource() == viewBoxesMenuItem)
513 viewport.setShowBoxes(viewBoxesMenuItem.getState());
515 else if (evt.getSource() == viewTextMenuItem)
517 viewport.setShowText(viewTextMenuItem.getState());
519 else if (evt.getSource() == renderGapsMenuItem)
521 viewport.setRenderGaps(renderGapsMenuItem.getState());
523 else if (evt.getSource() == annotationPanelMenuItem)
525 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
526 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
528 else if (evt.getSource() == sequenceFeatures)
530 viewport.showSequenceFeatures(sequenceFeatures.getState());
531 alignPanel.seqPanel.seqCanvas.repaint();
533 else if (evt.getSource() == conservationMenuItem)
535 conservationMenuItem_actionPerformed();
537 else if (evt.getSource() == abovePIDThreshold)
539 abovePIDThreshold_actionPerformed();
541 else if (evt.getSource() == applyToAllGroups)
543 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
545 else if (evt.getSource() == autoCalculate)
547 viewport.autocalculateConsensus = autoCalculate.getState();
550 alignPanel.paintAlignment(true);
553 public void actionPerformed(ActionEvent evt)
555 Object source = evt.getSource();
557 if (source == inputText)
559 inputText_actionPerformed();
561 else if (source == loadTree)
563 loadTree_actionPerformed();
565 else if (source == loadApplication)
567 launchFullApplication();
569 else if (source == loadAnnotations)
573 else if (source == outputAnnotations)
575 outputAnnotations(true);
577 else if (source == outputFeatures)
579 outputFeatures(true, "Jalview");
581 else if (source == closeMenuItem)
583 closeMenuItem_actionPerformed();
585 else if (source == copy)
587 copy_actionPerformed();
589 else if (source == undoMenuItem)
591 undoMenuItem_actionPerformed();
593 else if (source == redoMenuItem)
595 redoMenuItem_actionPerformed();
597 else if (source == inputText)
599 inputText_actionPerformed();
601 else if (source == closeMenuItem)
603 closeMenuItem_actionPerformed();
605 else if (source == undoMenuItem)
607 undoMenuItem_actionPerformed();
609 else if (source == redoMenuItem)
611 redoMenuItem_actionPerformed();
613 else if (source == copy)
615 copy_actionPerformed();
617 else if (source == pasteNew)
619 pasteNew_actionPerformed();
621 else if (source == pasteThis)
623 pasteThis_actionPerformed();
625 else if (source == cut)
627 cut_actionPerformed();
629 else if (source == delete)
631 delete_actionPerformed();
633 else if (source == deleteGroups)
635 deleteGroups_actionPerformed();
637 else if (source == selectAllSequenceMenuItem)
639 selectAllSequenceMenuItem_actionPerformed();
641 else if (source == deselectAllSequenceMenuItem)
643 deselectAllSequenceMenuItem_actionPerformed();
645 else if (source == invertSequenceMenuItem)
647 invertSequenceMenuItem_actionPerformed();
649 else if (source == invertColSel)
651 viewport.invertColumnSelection();
652 alignPanel.paintAlignment(true);
654 else if (source == remove2LeftMenuItem)
658 else if (source == remove2RightMenuItem)
660 trimAlignment(false);
662 else if (source == removeGappedColumnMenuItem)
664 removeGappedColumnMenuItem_actionPerformed();
666 else if (source == removeAllGapsMenuItem)
668 removeAllGapsMenuItem_actionPerformed();
670 else if (source == findMenuItem)
672 findMenuItem_actionPerformed();
674 else if (source == font)
676 new FontChooser(alignPanel);
678 else if (source == newView)
682 else if (source == showColumns)
684 viewport.showAllHiddenColumns();
685 alignPanel.paintAlignment(true);
687 else if (source == showSeqs)
689 viewport.showAllHiddenSeqs();
691 else if (source == hideColumns)
693 viewport.hideSelectedColumns();
694 alignPanel.paintAlignment(true);
696 else if (source == hideSequences && viewport.getSelectionGroup() != null)
698 viewport.hideAllSelectedSeqs();
700 else if (source == featureSettings)
702 new FeatureSettings(alignPanel);
704 else if(source== alProperties)
706 StringBuffer contents = new StringBuffer();
709 int min=Integer.MAX_VALUE, max=0;
710 for(int i=0; i<viewport.alignment.getHeight(); i++)
712 int size = viewport.alignment.getSequenceAt(i).getEnd()
713 -viewport.alignment.getSequenceAt(i).getStart();
720 avg = avg/(float)viewport.alignment.getHeight();
722 contents.append("\nSequences: "+ viewport.alignment.getHeight());
723 contents.append("\nMinimum Sequence Length: "+min);
724 contents.append("\nMaximum Sequence Length: "+max);
725 contents.append("\nAverage Length: "+(int)avg);
727 if (((Alignment)viewport.alignment).alignmentProperties != null)
729 Hashtable props = ((Alignment)viewport.alignment).alignmentProperties;
730 Enumeration en = props.keys();
731 while(en.hasMoreElements())
733 String key = en.nextElement().toString();
734 contents.append("\n"+key+"\t"+props.get(key));
738 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
739 cap.setText(contents.toString());
740 Frame frame = new Frame();
742 jalview.bin.JalviewLite.addFrame(frame,
743 "Alignment Properties: "+getTitle()
746 else if (source == overviewMenuItem)
748 overviewMenuItem_actionPerformed();
750 else if (source == noColourmenuItem)
754 else if (source == clustalColour)
756 abovePIDThreshold.setState(false);
757 changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),
758 viewport.alignment.getWidth()));
760 else if (source == zappoColour)
762 changeColour(new ZappoColourScheme());
764 else if (source == taylorColour)
766 changeColour(new TaylorColourScheme());
768 else if (source == hydrophobicityColour)
770 changeColour(new HydrophobicColourScheme());
772 else if (source == helixColour)
774 changeColour(new HelixColourScheme());
776 else if (source == strandColour)
778 changeColour(new StrandColourScheme());
780 else if (source == turnColour)
782 changeColour(new TurnColourScheme());
784 else if (source == buriedColour)
786 changeColour(new BuriedColourScheme());
788 else if (source == nucleotideColour)
790 changeColour(new NucleotideColourScheme());
792 else if (source == modifyPID)
794 modifyPID_actionPerformed();
796 else if (source == modifyConservation)
798 modifyConservation_actionPerformed();
800 else if (source == userDefinedColour)
802 new UserDefinedColours(alignPanel, null);
804 else if (source == PIDColour)
806 changeColour(new PIDColourScheme());
808 else if (source == BLOSUM62Colour)
810 changeColour(new Blosum62ColourScheme());
812 else if (source == annotationColour)
814 new AnnotationColourChooser(viewport, alignPanel);
816 else if (source == sortPairwiseMenuItem)
818 sortPairwiseMenuItem_actionPerformed();
820 else if (source == sortIDMenuItem)
822 sortIDMenuItem_actionPerformed();
824 else if (source == sortGroupMenuItem)
826 sortGroupMenuItem_actionPerformed();
828 else if (source == removeRedundancyMenuItem)
830 removeRedundancyMenuItem_actionPerformed();
832 else if (source == pairwiseAlignmentMenuItem)
834 pairwiseAlignmentMenuItem_actionPerformed();
836 else if (source == PCAMenuItem)
838 PCAMenuItem_actionPerformed();
840 else if (source == averageDistanceTreeMenuItem)
842 averageDistanceTreeMenuItem_actionPerformed();
844 else if (source == neighbourTreeMenuItem)
846 neighbourTreeMenuItem_actionPerformed();
848 else if (source == njTreeBlosumMenuItem)
850 njTreeBlosumMenuItem_actionPerformed();
852 else if (source == avDistanceTreeBlosumMenuItem)
854 avTreeBlosumMenuItem_actionPerformed();
856 else if (source == documentation)
858 documentation_actionPerformed();
860 else if (source == about)
862 about_actionPerformed();
867 public void inputText_actionPerformed()
869 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
870 Frame frame = new Frame();
872 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
875 protected void outputText_actionPerformed(ActionEvent e)
877 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
878 Frame frame = new Frame();
880 jalview.bin.JalviewLite.addFrame(frame,
881 "Alignment output - " + e.getActionCommand(),
883 cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),
884 viewport.getAlignment(),
885 viewport.showJVSuffix));
888 public void loadAnnotations()
890 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
891 cap.setText("Paste your features / annotations file here.");
892 cap.setAnnotationImport();
893 Frame frame = new Frame();
895 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
899 public String outputAnnotations(boolean displayTextbox)
901 String annotation = new AnnotationFile().printAnnotations(
902 viewport.showAnnotation ? viewport.alignment.getAlignmentAnnotation() : null,
903 viewport.alignment.getGroups(),
904 ((Alignment) viewport.alignment).alignmentProperties);
908 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
909 Frame frame = new Frame();
911 jalview.bin.JalviewLite.addFrame(frame,
914 cap.setText(annotation);
920 public String outputFeatures(boolean displayTextbox, String format)
923 if (format.equalsIgnoreCase("Jalview"))
925 features = new FeaturesFile().printJalviewFormat(
926 viewport.alignment.getSequencesArray(),
927 viewport.featuresDisplayed);
931 features = new FeaturesFile().printGFFFormat(
932 viewport.alignment.getSequencesArray(),
933 viewport.featuresDisplayed);
938 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
939 Frame frame = new Frame();
941 jalview.bin.JalviewLite.addFrame(frame,
945 cap.setText(features);
951 void launchFullApplication()
953 StringBuffer url = new StringBuffer(jalviewServletURL);
955 url.append("?open=" +
956 appendProtocol(viewport.applet.getParameter("file")));
958 if (viewport.applet.getParameter("features") != null)
960 url.append("&features=");
961 url.append(appendProtocol(viewport.applet.getParameter("features")));
964 if (viewport.applet.getParameter("annotations") != null)
966 url.append("&annotations=");
967 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
970 if (viewport.applet.getParameter("jnetfile") != null)
972 url.append("&annotations=");
973 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
976 if (viewport.applet.getParameter("defaultColour") != null)
978 url.append("&colour=" +
979 removeWhiteSpace(viewport.applet.getParameter("defaultColour"))
983 if (viewport.applet.getParameter("userDefinedColour") != null)
985 url.append("&colour=" +
986 removeWhiteSpace(viewport.applet.getParameter(
987 "userDefinedColour"))
990 if (viewport.applet.getParameter("tree")!=null)
992 url.append("&tree="+appendProtocol(viewport.applet.getParameter("tree")));
994 if (viewport.applet.getParameter("treeFile")!=null)
996 url.append("&tree="+appendProtocol(viewport.applet.getParameter("treeFile")));
999 showURL(url.toString(), "FULL_APP");
1002 String removeWhiteSpace(String colour)
1004 StringBuffer sb = new StringBuffer();
1005 for (int i = 0; i < colour.length(); i++)
1007 if (Character.isWhitespace(colour.charAt(i)))
1013 sb.append(colour.charAt(i));
1017 return sb.toString();
1020 String appendProtocol(String url)
1026 catch (java.net.MalformedURLException ex)
1028 url = viewport.applet.getCodeBase() + url;
1033 public void closeMenuItem_actionPerformed()
1035 PaintRefresher.RemoveComponent(alignPanel);
1036 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1037 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1039 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1050 void updateEditMenuBar()
1053 if (viewport.historyList.size() > 0)
1055 undoMenuItem.setEnabled(true);
1056 CommandI command = (CommandI) viewport.historyList.peek();
1057 undoMenuItem.setLabel("Undo " + command.getDescription());
1061 undoMenuItem.setEnabled(false);
1062 undoMenuItem.setLabel("Undo");
1065 if (viewport.redoList.size() > 0)
1067 redoMenuItem.setEnabled(true);
1069 CommandI command = (CommandI) viewport.redoList.peek();
1070 redoMenuItem.setLabel("Redo " + command.getDescription());
1074 redoMenuItem.setEnabled(false);
1075 redoMenuItem.setLabel("Redo");
1079 public void addHistoryItem(CommandI command)
1081 if (command.getSize() > 0)
1083 viewport.historyList.push(command);
1084 viewport.redoList.removeAllElements();
1085 updateEditMenuBar();
1086 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1092 * @param e DOCUMENT ME!
1094 protected void undoMenuItem_actionPerformed()
1096 if (viewport.historyList.size() < 1)
1101 CommandI command = (CommandI) viewport.historyList.pop();
1102 viewport.redoList.push(command);
1103 command.undoCommand(null);
1105 AlignViewport originalSource = getOriginatingSource(command);
1107 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1108 updateEditMenuBar();
1109 originalSource.firePropertyChange("alignment", null,
1110 originalSource.alignment.getSequences());
1116 * @param e DOCUMENT ME!
1118 protected void redoMenuItem_actionPerformed()
1120 if (viewport.redoList.size() < 1)
1125 CommandI command = (CommandI) viewport.redoList.pop();
1126 viewport.historyList.push(command);
1127 command.doCommand(null);
1129 AlignViewport originalSource = getOriginatingSource(command);
1130 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1132 updateEditMenuBar();
1133 originalSource.firePropertyChange("alignment", null,
1134 originalSource.alignment.getSequences());
1137 AlignViewport getOriginatingSource(CommandI command)
1139 AlignViewport originalSource = null;
1140 //For sequence removal and addition, we need to fire
1141 //the property change event FROM the viewport where the
1142 //original alignment was altered
1143 AlignmentI al = null;
1144 if (command instanceof EditCommand)
1146 EditCommand editCommand = (EditCommand) command;
1147 al = editCommand.getAlignment();
1148 Vector comps = (Vector) PaintRefresher.components
1149 .get(viewport.getSequenceSetId());
1150 for (int i = 0; i < comps.size(); i++)
1152 if (comps.elementAt(i) instanceof AlignmentPanel)
1154 if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)
1156 originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;
1163 if (originalSource == null)
1165 //The original view is closed, we must validate
1166 //the current view against the closed view first
1169 PaintRefresher.validateSequences(al, viewport.alignment);
1172 originalSource = viewport;
1175 return originalSource;
1178 public void moveSelectedSequences(boolean up)
1180 SequenceGroup sg = viewport.getSelectionGroup();
1188 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1190 SequenceI seq = viewport.alignment.getSequenceAt(i);
1191 if (!sg.getSequences(null).contains(seq))
1196 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1197 if (sg.getSequences(null).contains(temp))
1202 viewport.alignment.getSequences().setElementAt(temp, i);
1203 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1208 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1210 SequenceI seq = viewport.alignment.getSequenceAt(i);
1211 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1216 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1217 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1222 viewport.alignment.getSequences().setElementAt(temp, i);
1223 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1227 alignPanel.paintAlignment(true);
1230 synchronized void slideSequences(boolean right, int size)
1232 Vector sg = new Vector();
1233 if(viewport.cursorMode)
1235 sg.addElement(viewport.alignment.getSequenceAt(
1236 alignPanel.seqPanel.seqCanvas.cursorY));
1238 else if(viewport.getSelectionGroup()!=null
1239 && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight())
1241 sg = viewport.getSelectionGroup().getSequences(
1242 viewport.hiddenRepSequences);
1250 Vector invertGroup = new Vector();
1252 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1254 if(!sg.contains(viewport.alignment.getSequenceAt(i)))
1255 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1258 SequenceI[] seqs1 = new SequenceI[sg.size()];
1259 for (int i = 0; i < sg.size(); i++)
1260 seqs1[i] = (SequenceI) sg.elementAt(i);
1262 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1263 for (int i = 0; i < invertGroup.size(); i++)
1264 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1266 SlideSequencesCommand ssc;
1268 ssc = new SlideSequencesCommand("Slide Sequences",
1270 viewport.getGapCharacter()
1273 ssc = new SlideSequencesCommand("Slide Sequences",
1275 viewport.getGapCharacter()
1278 int groupAdjustment = 0;
1279 if (ssc.getGapsInsertedBegin() && right)
1281 if (viewport.cursorMode)
1282 alignPanel.seqPanel.moveCursor(size, 0);
1284 groupAdjustment = size;
1286 else if (!ssc.getGapsInsertedBegin() && !right)
1288 if (viewport.cursorMode)
1289 alignPanel.seqPanel.moveCursor( -size, 0);
1291 groupAdjustment = -size;
1294 if (groupAdjustment != 0)
1296 viewport.getSelectionGroup().setStartRes(
1297 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1298 viewport.getSelectionGroup().setEndRes(
1299 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1303 boolean appendHistoryItem = false;
1304 if(viewport.historyList!=null
1305 && viewport.historyList.size()>0
1306 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1308 appendHistoryItem = ssc.appendSlideCommand(
1309 (SlideSequencesCommand)viewport.historyList.peek())
1313 if(!appendHistoryItem)
1314 addHistoryItem(ssc);
1319 static StringBuffer copiedSequences;
1320 static Vector copiedHiddenColumns;
1321 protected void copy_actionPerformed()
1323 if (viewport.getSelectionGroup() == null)
1328 SequenceGroup sg = viewport.getSelectionGroup();
1329 copiedSequences = new StringBuffer();
1330 Hashtable orderedSeqs = new Hashtable();
1331 for (int i = 0; i < sg.getSize(); i++)
1333 SequenceI seq = sg.getSequenceAt(i);
1334 int index = viewport.alignment.findIndex(seq);
1335 orderedSeqs.put(index + "", seq);
1338 int index = 0, startRes, endRes;
1341 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1343 copiedHiddenColumns = new Vector();
1344 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1345 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();
1348 int[] region = (int[])
1349 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1351 copiedHiddenColumns.addElement(new int[]
1352 {region[0] - hiddenOffset,
1353 region[1] - hiddenOffset});
1358 copiedHiddenColumns = null;
1361 for (int i = 0; i < sg.getSize(); i++)
1363 SequenceI seq = null;
1367 if (orderedSeqs.containsKey(index + ""))
1369 seq = (SequenceI) orderedSeqs.get(index + "");
1381 //Returns residue following index if gap
1382 startRes = seq.findPosition(sg.getStartRes());
1385 //Need to find the residue preceeding index if gap
1388 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1390 ch = seq.getCharAt(j);
1391 if (!jalview.util.Comparison.isGap( (ch)))
1399 endRes += seq.getStart() - 1;
1402 copiedSequences.append(seq.getName() + "\t" +
1405 seq.getSequenceAsString(sg.getStartRes(),
1406 sg.getEndRes() + 1) + "\n");
1411 protected void pasteNew_actionPerformed()
1416 protected void pasteThis_actionPerformed()
1421 void paste(boolean newAlignment)
1426 if (copiedSequences == null)
1431 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1432 Vector seqs = new Vector();
1433 while (st.hasMoreElements())
1435 String name = st.nextToken();
1436 int start = Integer.parseInt(st.nextToken());
1437 int end = Integer.parseInt(st.nextToken());
1438 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1440 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1441 for (int i = 0; i < seqs.size(); i++)
1443 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1448 String newtitle = new String("Copied sequences");
1449 if (getTitle().startsWith("Copied sequences"))
1451 newtitle = getTitle();
1455 newtitle = newtitle.concat("- from " + getTitle());
1457 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1461 if (copiedHiddenColumns != null)
1463 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1465 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1466 af.viewport.hideColumns(region[0], region[1]);
1470 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1475 addSequences(newSeqs);
1479 catch (Exception ex)
1480 {} // could be anything being pasted in here
1484 void addSequences(SequenceI[] seqs)
1486 for (int i = 0; i < seqs.length; i++)
1488 viewport.alignment.addSequence(seqs[i]);
1492 addHistoryItem(new EditCommand(
1497 viewport.alignment.getWidth(),
1501 viewport.setEndSeq(viewport.alignment.getHeight());
1502 viewport.alignment.getWidth();
1503 viewport.firePropertyChange("alignment", null,
1504 viewport.alignment.getSequences());
1508 protected void cut_actionPerformed()
1510 copy_actionPerformed();
1511 delete_actionPerformed();
1514 protected void delete_actionPerformed()
1517 SequenceGroup sg = viewport.getSelectionGroup();
1523 Vector seqs = new Vector();
1525 for (int i = 0; i < sg.getSize(); i++)
1527 seq = sg.getSequenceAt(i);
1528 seqs.addElement(seq);
1531 // If the cut affects all sequences, remove highlighted columns
1532 if (sg.getSize() == viewport.alignment.getHeight())
1534 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1535 sg.getEndRes() + 1);
1538 SequenceI[] cut = new SequenceI[seqs.size()];
1539 for (int i = 0; i < seqs.size(); i++)
1541 cut[i] = (SequenceI) seqs.elementAt(i);
1547 addHistoryItem(new EditCommand("Cut Sequences",
1551 sg.getEndRes() - sg.getStartRes() + 1,
1552 viewport.alignment));
1554 viewport.setSelectionGroup(null);
1555 viewport.alignment.deleteGroup(sg);
1557 viewport.firePropertyChange("alignment", null,
1558 viewport.getAlignment().getSequences());
1560 if (viewport.getAlignment().getHeight() < 1)
1562 this.setVisible(false);
1566 protected void deleteGroups_actionPerformed()
1568 viewport.alignment.deleteAllGroups();
1569 viewport.sequenceColours = null;
1570 viewport.setSelectionGroup(null);
1572 alignPanel.paintAlignment(true);
1575 public void selectAllSequenceMenuItem_actionPerformed()
1577 SequenceGroup sg = new SequenceGroup();
1578 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1580 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1582 sg.setEndRes(viewport.alignment.getWidth() - 1);
1583 viewport.setSelectionGroup(sg);
1584 alignPanel.paintAlignment(true);
1585 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1588 public void deselectAllSequenceMenuItem_actionPerformed()
1590 if (viewport.cursorMode)
1592 alignPanel.seqPanel.keyboardNo1 = null;
1593 alignPanel.seqPanel.keyboardNo2 = null;
1595 viewport.setSelectionGroup(null);
1596 viewport.getColumnSelection().clear();
1597 viewport.setSelectionGroup(null);
1598 alignPanel.idPanel.idCanvas.searchResults = null;
1599 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1600 alignPanel.paintAlignment(true);
1601 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1604 public void invertSequenceMenuItem_actionPerformed()
1606 SequenceGroup sg = viewport.getSelectionGroup();
1607 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1609 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1612 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1615 void trimAlignment(boolean trimLeft)
1617 ColumnSelection colSel = viewport.getColumnSelection();
1620 if (colSel.size() > 0)
1624 column = colSel.getMin();
1628 column = colSel.getMax();
1632 if (viewport.getSelectionGroup() != null)
1634 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1635 hiddenRepSequences);
1639 seqs = viewport.alignment.getSequencesArray();
1642 TrimRegionCommand trimRegion;
1645 trimRegion = new TrimRegionCommand("Remove Left",
1646 TrimRegionCommand.TRIM_LEFT,
1651 viewport.selectionGroup);
1652 viewport.setStartRes(0);
1656 trimRegion = new TrimRegionCommand("Remove Right",
1657 TrimRegionCommand.TRIM_RIGHT,
1662 viewport.selectionGroup);
1665 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1667 addHistoryItem(trimRegion);
1669 Vector groups = viewport.alignment.getGroups();
1671 for (int i = 0; i < groups.size(); i++)
1673 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1675 if ( (trimLeft && !sg.adjustForRemoveLeft(column))
1676 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1678 viewport.alignment.deleteGroup(sg);
1682 viewport.firePropertyChange("alignment", null,
1683 viewport.getAlignment().getSequences());
1687 public void removeGappedColumnMenuItem_actionPerformed()
1689 int start = 0, end = viewport.alignment.getWidth() - 1;
1692 if (viewport.getSelectionGroup() != null)
1694 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1695 hiddenRepSequences);
1696 start = viewport.getSelectionGroup().getStartRes();
1697 end = viewport.getSelectionGroup().getEndRes();
1701 seqs = viewport.alignment.getSequencesArray();
1704 RemoveGapColCommand removeGapCols =
1705 new RemoveGapColCommand("Remove Gapped Columns",
1708 viewport.alignment);
1710 addHistoryItem(removeGapCols);
1712 statusBar.setText("Removed " + removeGapCols.getSize() + " empty columns.");
1714 //This is to maintain viewport position on first residue
1716 SequenceI seq = viewport.alignment.getSequenceAt(0);
1717 int startRes = seq.findPosition(viewport.startRes);
1718 // ShiftList shifts;
1719 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1720 // edit.alColumnChanges=shifts.getInverse();
1721 // if (viewport.hasHiddenColumns)
1722 // viewport.getColumnSelection().compensateForEdits(shifts);
1723 viewport.setStartRes(seq.findIndex(startRes) - 1);
1724 viewport.firePropertyChange("alignment", null,
1725 viewport.getAlignment().getSequences());
1729 public void removeAllGapsMenuItem_actionPerformed()
1731 int start = 0, end = viewport.alignment.getWidth() - 1;
1734 if (viewport.getSelectionGroup() != null)
1736 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1737 hiddenRepSequences);
1738 start = viewport.getSelectionGroup().getStartRes();
1739 end = viewport.getSelectionGroup().getEndRes();
1743 seqs = viewport.alignment.getSequencesArray();
1746 //This is to maintain viewport position on first residue
1748 SequenceI seq = viewport.alignment.getSequenceAt(0);
1749 int startRes = seq.findPosition(viewport.startRes);
1751 addHistoryItem(new RemoveGapsCommand("Remove Gaps",
1754 viewport.alignment));
1756 viewport.setStartRes(seq.findIndex(startRes) - 1);
1758 viewport.firePropertyChange("alignment", null,
1759 viewport.getAlignment().getSequences());
1763 public void findMenuItem_actionPerformed()
1765 new Finder(alignPanel);
1768 * create a new view derived from the current view
1770 * @return frame for the new view
1772 public AlignFrame newView(String viewtitle)
1775 if (viewport.hasHiddenRows)
1777 newal = new Alignment(viewport.getAlignment().
1778 getHiddenSequences()
1779 .getFullAlignment().
1780 getSequencesArray());
1784 newal = new Alignment(viewport.alignment.getSequencesArray());
1787 if (viewport.alignment.getAlignmentAnnotation() != null)
1789 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1791 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1793 newal.addAnnotation(viewport.alignment.getAlignmentAnnotation()[i]);
1798 AlignFrame newaf = new AlignFrame(newal,
1803 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
1804 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
1805 PaintRefresher.Register(newaf.alignPanel,
1806 newaf.alignPanel.av.getSequenceSetId());
1808 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
1809 newaf.alignPanel.av.getSequenceSetId());
1810 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
1811 newaf.alignPanel.av.getSequenceSetId());
1813 Vector comps = (Vector) PaintRefresher.components.get(viewport.
1814 getSequenceSetId());
1816 for (int i = 0; i < comps.size(); i++)
1818 if (comps.elementAt(i) instanceof AlignmentPanel)
1824 String title = new String(this.getTitle());
1825 if (viewtitle!=null)
1827 title = viewtitle+" ( "+title+")";
1829 if (title.indexOf("(View") > -1)
1831 title = title.substring(0, title.indexOf("(View"));
1833 title += "(View " + viewSize + ")";
1836 newaf.setTitle(title.toString());
1838 newaf.viewport.historyList = viewport.historyList;
1839 newaf.viewport.redoList = viewport.redoList;
1844 * @return list of feature groups on the view
1846 public String[] getFeatureGroups()
1848 FeatureRenderer fr = null;
1849 if (alignPanel!=null && (fr=alignPanel.getFeatureRenderer())!=null)
1851 return fr.getGroups();
1856 * get sequence feature groups that are hidden or shown
1857 * @param visible true is visible
1860 public String[] getFeatureGroupsOfState(boolean visible)
1862 FeatureRenderer fr = null;
1863 if (alignPanel!=null && (fr=alignPanel.getFeatureRenderer())!=null)
1865 return fr.getGroups(visible);
1870 * Change the display state for the given feature groups
1871 * @param groups list of group strings
1872 * @param state visible or invisible
1874 public void setFeatureGroupState(String[] groups, boolean state) {
1875 FeatureRenderer fr = null;
1876 this.sequenceFeatures.setState(true);
1877 viewport.showSequenceFeatures(true);
1878 if (alignPanel!=null && (fr=alignPanel.getFeatureRenderer())!=null)
1880 fr.setGroupState(groups, state);
1881 alignPanel.seqPanel.seqCanvas.repaint();
1882 if (alignPanel.overviewPanel != null)
1884 alignPanel.overviewPanel.updateOverviewImage();
1888 public void seqLimits_itemStateChanged()
1890 viewport.setShowJVSuffix(seqLimits.getState());
1891 alignPanel.fontChanged();
1892 alignPanel.paintAlignment(true);
1895 protected void colourTextMenuItem_actionPerformed()
1897 viewport.setColourText(colourTextMenuItem.getState());
1898 alignPanel.paintAlignment(true);
1901 protected void wrapMenuItem_actionPerformed()
1903 viewport.setWrapAlignment(wrapMenuItem.getState());
1904 alignPanel.setWrapAlignment(wrapMenuItem.getState());
1905 scaleAbove.setEnabled(wrapMenuItem.getState());
1906 scaleLeft.setEnabled(wrapMenuItem.getState());
1907 scaleRight.setEnabled(wrapMenuItem.getState());
1908 alignPanel.paintAlignment(true);
1911 public void overviewMenuItem_actionPerformed()
1913 if (alignPanel.overviewPanel != null)
1918 Frame frame = new Frame();
1919 OverviewPanel overview = new OverviewPanel(alignPanel);
1920 frame.add(overview);
1921 // +50 must allow for applet frame window
1922 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
1923 overview.getPreferredSize().width,
1924 overview.getPreferredSize().height + 50);
1927 frame.addWindowListener(new WindowAdapter()
1929 public void windowClosing(WindowEvent e)
1931 alignPanel.setOverviewPanel(null);
1935 alignPanel.setOverviewPanel(overview);
1939 void changeColour(ColourSchemeI cs)
1945 if (viewport.getAbovePIDThreshold())
1947 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
1949 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
1951 viewport.setGlobalColourScheme(cs);
1955 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
1958 if (viewport.getConservationSelected())
1961 Alignment al = (Alignment) viewport.alignment;
1962 Conservation c = new Conservation("All",
1963 ResidueProperties.propHash, 3,
1964 al.getSequences(), 0,
1968 c.verdict(false, viewport.ConsPercGaps);
1970 cs.setConservation(c);
1972 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
1978 cs.setConservation(null);
1981 cs.setConsensus(viewport.hconsensus);
1984 viewport.setGlobalColourScheme(cs);
1986 if (viewport.getColourAppliesToAllGroups())
1988 Vector groups = viewport.alignment.getGroups();
1989 for (int i = 0; i < groups.size(); i++)
1991 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1998 if (cs instanceof ClustalxColourScheme)
2000 sg.cs = new ClustalxColourScheme(
2001 sg.getSequences(viewport.hiddenRepSequences),
2008 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2010 catch (Exception ex)
2012 ex.printStackTrace();
2017 if (viewport.getAbovePIDThreshold()
2018 || cs instanceof PIDColourScheme
2019 || cs instanceof Blosum62ColourScheme)
2021 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2022 sg.cs.setConsensus(AAFrequency.calculate(
2023 sg.getSequences(viewport.hiddenRepSequences), 0, sg.getWidth()));
2027 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2030 if (viewport.getConservationSelected())
2032 Conservation c = new Conservation("Group",
2033 ResidueProperties.propHash, 3,
2034 sg.getSequences(viewport.
2035 hiddenRepSequences), 0,
2036 viewport.alignment.getWidth() - 1);
2038 c.verdict(false, viewport.ConsPercGaps);
2039 sg.cs.setConservation(c);
2043 sg.cs.setConservation(null);
2044 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2050 if (alignPanel.getOverviewPanel() != null)
2052 alignPanel.getOverviewPanel().updateOverviewImage();
2055 jalview.structure.StructureSelectionManager.getStructureSelectionManager()
2056 .sequenceColoursChanged(alignPanel);
2058 alignPanel.paintAlignment(true);
2061 protected void modifyPID_actionPerformed()
2063 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme != null)
2065 SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
2067 SliderPanel.showPIDSlider();
2071 protected void modifyConservation_actionPerformed()
2073 if (viewport.getConservationSelected() && viewport.globalColourScheme != null)
2075 SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
2077 SliderPanel.showConservationSlider();
2081 protected void conservationMenuItem_actionPerformed()
2083 viewport.setConservationSelected(conservationMenuItem.getState());
2085 viewport.setAbovePIDThreshold(false);
2086 abovePIDThreshold.setState(false);
2088 changeColour(viewport.getGlobalColourScheme());
2090 modifyConservation_actionPerformed();
2093 public void abovePIDThreshold_actionPerformed()
2095 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2097 conservationMenuItem.setState(false);
2098 viewport.setConservationSelected(false);
2100 changeColour(viewport.getGlobalColourScheme());
2102 modifyPID_actionPerformed();
2105 public void sortPairwiseMenuItem_actionPerformed()
2107 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2108 AlignmentSorter.sortByPID(viewport.getAlignment(),
2109 viewport.getAlignment().getSequenceAt(0));
2110 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2111 viewport.alignment));
2112 alignPanel.paintAlignment(true);
2115 public void sortIDMenuItem_actionPerformed()
2117 // addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
2118 // HistoryItem.SORT));
2119 AlignmentSorter.sortByID(viewport.getAlignment());
2120 alignPanel.paintAlignment(true);
2123 public void sortGroupMenuItem_actionPerformed()
2125 // addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
2126 // HistoryItem.SORT));
2127 AlignmentSorter.sortByGroup(viewport.getAlignment());
2128 alignPanel.paintAlignment(true);
2132 public void removeRedundancyMenuItem_actionPerformed()
2134 new RedundancyPanel(alignPanel);
2137 public void pairwiseAlignmentMenuItem_actionPerformed()
2139 if (viewport.getSelectionGroup() != null
2140 && viewport.getSelectionGroup().getSize() > 1)
2142 Frame frame = new Frame();
2143 frame.add(new PairwiseAlignPanel(alignPanel));
2144 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);
2148 public void PCAMenuItem_actionPerformed()
2150 //are the sequences aligned?
2151 if (!viewport.alignment.isAligned())
2154 int Width = viewport.getAlignment().getWidth();
2156 for (int i = 0; i < viewport.getAlignment().getSequences().size();
2159 current = viewport.getAlignment().getSequenceAt(i);
2161 if (current.getLength() < Width)
2163 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2166 alignPanel.paintAlignment(true);
2169 if ( (viewport.getSelectionGroup() != null &&
2170 viewport.getSelectionGroup().getSize() < 4 &&
2171 viewport.getSelectionGroup().getSize() > 0)
2172 || viewport.getAlignment().getHeight() < 4)
2179 new PCAPanel(viewport);
2181 catch (java.lang.OutOfMemoryError ex)
2187 public void averageDistanceTreeMenuItem_actionPerformed()
2189 NewTreePanel("AV", "PID", "Average distance tree using PID");
2192 public void neighbourTreeMenuItem_actionPerformed()
2194 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2197 protected void njTreeBlosumMenuItem_actionPerformed()
2199 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2202 protected void avTreeBlosumMenuItem_actionPerformed()
2204 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2207 void NewTreePanel(String type, String pwType, String title)
2209 //are the sequences aligned?
2210 if (!viewport.alignment.isAligned())
2213 int Width = viewport.getAlignment().getWidth();
2215 for (int i = 0; i < viewport.getAlignment().getSequences().size();
2218 current = viewport.getAlignment().getSequenceAt(i);
2220 if (current.getLength() < Width)
2222 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2225 alignPanel.paintAlignment(true);
2229 if ( (viewport.getSelectionGroup() != null &&
2230 viewport.getSelectionGroup().getSize() > 1)
2231 || (viewport.getSelectionGroup() == null
2232 && viewport.alignment.getHeight() > 1))
2234 final TreePanel tp = new TreePanel(viewport,
2238 addTreeMenuItem(tp, title);
2240 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2244 void loadTree_actionPerformed()
2246 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2247 cap.setText("Paste your Newick tree file here.");
2248 cap.setTreeImport();
2249 Frame frame = new Frame();
2251 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2254 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2256 TreePanel tp = new TreePanel(viewport,
2260 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2261 addTreeMenuItem(tp, treeFile);
2264 void addTreeMenuItem(final TreePanel treePanel, String title)
2266 final MenuItem item = new MenuItem(title);
2267 sortByTreeMenu.add(item);
2268 item.addActionListener(new java.awt.event.ActionListener()
2270 public void actionPerformed(ActionEvent evt)
2272 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2273 // HistoryItem.SORT));
2274 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
2275 alignPanel.paintAlignment(true);
2279 treePanel.addWindowListener(new WindowAdapter()
2281 public void windowClosing(WindowEvent e)
2283 sortByTreeMenu.remove(item);
2288 protected void documentation_actionPerformed()
2290 showURL("http://www.jalview.org/help.html", "HELP");
2293 protected void about_actionPerformed()
2300 public AboutPanel(String version)
2302 this.version = version;
2305 public void paint(Graphics g)
2307 g.setColor(Color.white);
2308 g.fillRect(0, 0, getSize().width, getSize().height);
2309 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2310 FontMetrics fm = g.getFontMetrics();
2311 int fh = fm.getHeight();
2313 g.setColor(Color.black);
2314 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2315 g.drawString("Jalview - Release " + version, 200, y += fh);
2316 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2317 g.drawString("Authors: Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",
2319 g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",
2322 "For any issues relating to Jalview, email help@jalview.org", x,
2324 g.drawString("If you use JalView, please cite:", x, y += fh + 8);
2325 g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",
2327 g.drawString("Bioinformatics, 2004 20;426-7.", x, y += fh);
2331 String version = "test";
2332 java.net.URL url = getClass().getResource("/.build_properties");
2337 BufferedReader reader = new BufferedReader(new InputStreamReader(
2340 while ( (line = reader.readLine()) != null)
2342 if (line.indexOf("VERSION") > -1)
2344 version = line.substring(line.indexOf("=") + 1);
2348 catch (Exception ex)
2350 ex.printStackTrace();
2354 Frame frame = new Frame();
2355 frame.add(new AboutPanel(version));
2356 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);
2360 public void showURL(String url, String target)
2362 if (viewport.applet == null)
2364 System.out.println("Not running as applet - no browser available.");
2370 System.out.println("Show url: " + url);
2371 viewport.applet.getAppletContext().showDocument(new java.net.URL(url),
2374 catch (Exception ex)
2376 ex.printStackTrace();
2381 //////////////////////////////////////////////////////////////////////////////////
2382 //JBuilder Graphics here
2384 MenuBar alignFrameMenuBar = new MenuBar();
2385 Menu fileMenu = new Menu("File");
2386 MenuItem loadApplication = new MenuItem("View in Full Application");
2387 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2388 MenuItem loadAnnotations = new MenuItem(
2389 "Load Features/Annotations ...");
2390 MenuItem outputFeatures = new MenuItem("Export Features ...");
2391 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2393 MenuItem closeMenuItem = new MenuItem("Close");
2394 Menu editMenu = new Menu("Edit");
2395 Menu viewMenu = new Menu("View");
2396 Menu colourMenu = new Menu("Colour");
2397 Menu calculateMenu = new Menu("Calculate");
2398 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2399 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2400 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2401 MenuItem remove2LeftMenuItem = new MenuItem();
2402 MenuItem remove2RightMenuItem = new MenuItem();
2403 MenuItem removeGappedColumnMenuItem = new MenuItem();
2404 MenuItem removeAllGapsMenuItem = new MenuItem();
2405 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2406 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2407 MenuItem sortPairwiseMenuItem = new MenuItem();
2408 MenuItem sortIDMenuItem = new MenuItem();
2409 MenuItem sortGroupMenuItem = new MenuItem();
2410 MenuItem removeRedundancyMenuItem = new MenuItem();
2411 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2412 MenuItem PCAMenuItem = new MenuItem();
2413 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2414 MenuItem neighbourTreeMenuItem = new MenuItem();
2415 BorderLayout borderLayout1 = new BorderLayout();
2416 public Label statusBar = new Label();
2417 Menu outputTextboxMenu = new Menu();
2418 MenuItem clustalColour = new MenuItem();
2419 MenuItem zappoColour = new MenuItem();
2420 MenuItem taylorColour = new MenuItem();
2421 MenuItem hydrophobicityColour = new MenuItem();
2422 MenuItem helixColour = new MenuItem();
2423 MenuItem strandColour = new MenuItem();
2424 MenuItem turnColour = new MenuItem();
2425 MenuItem buriedColour = new MenuItem();
2426 MenuItem userDefinedColour = new MenuItem();
2427 MenuItem PIDColour = new MenuItem();
2428 MenuItem BLOSUM62Colour = new MenuItem();
2429 MenuItem njTreeBlosumMenuItem = new MenuItem();
2430 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2431 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2432 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2433 MenuItem alProperties = new MenuItem("Alignment Properties...");
2434 MenuItem overviewMenuItem = new MenuItem();
2435 MenuItem undoMenuItem = new MenuItem();
2436 MenuItem redoMenuItem = new MenuItem();
2437 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2438 MenuItem noColourmenuItem = new MenuItem();
2439 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2440 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2441 MenuItem findMenuItem = new MenuItem();
2442 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2443 MenuItem nucleotideColour = new MenuItem();
2444 MenuItem deleteGroups = new MenuItem();
2445 MenuItem delete = new MenuItem();
2446 MenuItem copy = new MenuItem();
2447 MenuItem cut = new MenuItem();
2448 Menu pasteMenu = new Menu();
2449 MenuItem pasteNew = new MenuItem();
2450 MenuItem pasteThis = new MenuItem();
2451 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2452 MenuItem font = new MenuItem();
2453 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2454 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2455 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2456 MenuItem modifyPID = new MenuItem();
2457 MenuItem modifyConservation = new MenuItem();
2458 CheckboxMenuItem autoCalculate
2459 = new CheckboxMenuItem("Autocalculate Consensus", true);
2460 Menu sortByTreeMenu = new Menu();
2461 Menu sort = new Menu();
2462 Menu calculate = new Menu();
2463 MenuItem inputText = new MenuItem();
2464 Menu helpMenu = new Menu();
2465 MenuItem documentation = new MenuItem();
2466 MenuItem about = new MenuItem();
2467 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2470 Label embeddedSelect;
2472 Label embeddedFormat;
2473 Label embeddedColour;
2476 Label embeddedCalculate;
2477 FlowLayout flowLayout1;
2479 private void jbInit()
2483 setMenuBar(alignFrameMenuBar);
2487 // dynamically fill save as menu with available formats
2488 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length;
2492 item = new MenuItem(jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2494 item.addActionListener(new java.awt.event.ActionListener()
2496 public void actionPerformed(ActionEvent e)
2498 outputText_actionPerformed(e);
2502 outputTextboxMenu.add(item);
2504 closeMenuItem.addActionListener(this);
2505 loadApplication.addActionListener(this);
2507 loadTree.addActionListener(this);
2508 loadAnnotations.addActionListener(this);
2509 outputFeatures.addActionListener(this);
2510 outputAnnotations.addActionListener(this);
2511 selectAllSequenceMenuItem.addActionListener(this);
2512 deselectAllSequenceMenuItem.addActionListener(this);
2513 invertSequenceMenuItem.addActionListener(this);
2514 remove2LeftMenuItem.setLabel("Remove Left");
2515 remove2LeftMenuItem.addActionListener(this);
2516 remove2RightMenuItem.setLabel("Remove Right");
2517 remove2RightMenuItem.addActionListener(this);
2518 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2519 removeGappedColumnMenuItem.addActionListener(this);
2520 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2521 removeAllGapsMenuItem.addActionListener(this);
2522 viewBoxesMenuItem.setLabel("Boxes");
2523 viewBoxesMenuItem.setState(true);
2524 viewBoxesMenuItem.addItemListener(this);
2525 viewTextMenuItem.setLabel("Text");
2526 viewTextMenuItem.setState(true);
2527 viewTextMenuItem.addItemListener(this);
2528 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2529 sortPairwiseMenuItem.addActionListener(this);
2530 sortIDMenuItem.setLabel("by ID");
2531 sortIDMenuItem.addActionListener(this);
2532 sortGroupMenuItem.setLabel("by Group");
2533 sortGroupMenuItem.addActionListener(this);
2534 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2535 removeRedundancyMenuItem.addActionListener(this);
2536 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2537 pairwiseAlignmentMenuItem.addActionListener(this);
2538 PCAMenuItem.setLabel("Principal Component Analysis");
2539 PCAMenuItem.addActionListener(this);
2540 averageDistanceTreeMenuItem.setLabel(
2541 "Average Distance Using % Identity");
2542 averageDistanceTreeMenuItem.addActionListener(this);
2543 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2544 neighbourTreeMenuItem.addActionListener(this);
2545 statusBar.setBackground(Color.white);
2546 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2547 statusBar.setText("Status bar");
2548 outputTextboxMenu.setLabel("Output to Textbox");
2549 clustalColour.setLabel("Clustalx");
2551 clustalColour.addActionListener(this);
2552 zappoColour.setLabel("Zappo");
2553 zappoColour.addActionListener(this);
2554 taylorColour.setLabel("Taylor");
2555 taylorColour.addActionListener(this);
2556 hydrophobicityColour.setLabel("Hydrophobicity");
2557 hydrophobicityColour.addActionListener(this);
2558 helixColour.setLabel("Helix Propensity");
2559 helixColour.addActionListener(this);
2560 strandColour.setLabel("Strand Propensity");
2561 strandColour.addActionListener(this);
2562 turnColour.setLabel("Turn Propensity");
2563 turnColour.addActionListener(this);
2564 buriedColour.setLabel("Buried Index");
2565 buriedColour.addActionListener(this);
2566 userDefinedColour.setLabel("User Defined...");
2567 userDefinedColour.addActionListener(this);
2568 PIDColour.setLabel("Percentage Identity");
2569 PIDColour.addActionListener(this);
2570 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2571 BLOSUM62Colour.addActionListener(this);
2572 avDistanceTreeBlosumMenuItem.setLabel(
2573 "Average Distance Using BLOSUM62");
2574 avDistanceTreeBlosumMenuItem.addActionListener(this);
2575 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2576 njTreeBlosumMenuItem.addActionListener(this);
2577 annotationPanelMenuItem.setLabel("Show Annotations");
2578 annotationPanelMenuItem.addItemListener(this);
2579 colourTextMenuItem.setLabel("Colour Text");
2580 colourTextMenuItem.addItemListener(this);
2581 alProperties.addActionListener(this);
2582 overviewMenuItem.setLabel("Overview Window");
2583 overviewMenuItem.addActionListener(this);
2584 undoMenuItem.setEnabled(false);
2585 undoMenuItem.setLabel("Undo");
2586 undoMenuItem.addActionListener(this);
2587 redoMenuItem.setEnabled(false);
2588 redoMenuItem.setLabel("Redo");
2589 redoMenuItem.addActionListener(this);
2590 conservationMenuItem.setLabel("by Conservation");
2591 conservationMenuItem.addItemListener(this);
2592 noColourmenuItem.setLabel("None");
2593 noColourmenuItem.addActionListener(this);
2594 wrapMenuItem.setLabel("Wrap");
2595 wrapMenuItem.addItemListener(this);
2596 renderGapsMenuItem.setLabel("Show Gaps");
2597 renderGapsMenuItem.setState(true);
2598 renderGapsMenuItem.addItemListener(this);
2599 findMenuItem.setLabel("Find...");
2600 findMenuItem.addActionListener(this);
2601 abovePIDThreshold.setLabel("Above Identity Threshold");
2602 abovePIDThreshold.addItemListener(this);
2603 nucleotideColour.setLabel("Nucleotide");
2604 nucleotideColour.addActionListener(this);
2605 deleteGroups.setLabel("Undefine Groups");
2606 deleteGroups.addActionListener(this);
2607 copy.setLabel("Copy");
2608 copy.addActionListener(this);
2609 cut.setLabel("Cut");
2610 cut.addActionListener(this);
2611 delete.setLabel("Delete");
2612 delete.addActionListener(this);
2613 pasteMenu.setLabel("Paste");
2614 pasteNew.setLabel("To New Alignment");
2615 pasteNew.addActionListener(this);
2616 pasteThis.setLabel("Add To This Alignment");
2617 pasteThis.addActionListener(this);
2618 applyToAllGroups.setLabel("Apply Colour To All Groups");
2619 applyToAllGroups.setState(true);
2620 applyToAllGroups.addItemListener(this);
2621 font.setLabel("Font...");
2622 font.addActionListener(this);
2623 scaleAbove.setLabel("Scale Above");
2624 scaleAbove.setState(true);
2625 scaleAbove.setEnabled(false);
2626 scaleAbove.addItemListener(this);
2627 scaleLeft.setEnabled(false);
2628 scaleLeft.setState(true);
2629 scaleLeft.setLabel("Scale Left");
2630 scaleLeft.addItemListener(this);
2631 scaleRight.setEnabled(false);
2632 scaleRight.setState(true);
2633 scaleRight.setLabel("Scale Right");
2634 scaleRight.addItemListener(this);
2635 modifyPID.setLabel("Modify Identity Threshold...");
2636 modifyPID.addActionListener(this);
2637 modifyConservation.setLabel("Modify Conservation Threshold...");
2638 modifyConservation.addActionListener(this);
2639 sortByTreeMenu.setLabel("By Tree Order");
2640 sort.setLabel("Sort");
2641 calculate.setLabel("Calculate Tree");
2642 autoCalculate.addItemListener(this);
2643 inputText.setLabel("Input from textbox");
2644 inputText.addActionListener(this);
2646 helpMenu.setLabel("Help");
2647 documentation.setLabel("Documentation");
2648 documentation.addActionListener(this);
2650 about.setLabel("About...");
2651 about.addActionListener(this);
2652 seqLimits.setState(true);
2653 seqLimits.setLabel("Show Sequence Limits");
2654 seqLimits.addItemListener(this);
2655 featureSettings.setLabel("Feature Settings...");
2656 featureSettings.addActionListener(this);
2657 sequenceFeatures.setLabel("Sequence Features");
2658 sequenceFeatures.addItemListener(this);
2659 sequenceFeatures.setState(false);
2660 annotationColour.setLabel("by Annotation...");
2661 annotationColour.addActionListener(this);
2662 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
2663 invertColSel.setLabel("Invert Column Selection");
2664 menu1.setLabel("Show");
2665 showColumns.setLabel("All Columns ");
2666 showSeqs.setLabel("All Sequences");
2667 menu2.setLabel("Hide");
2668 hideColumns.setLabel("Selected Columns");
2669 hideSequences.setLabel("Selected Sequences");
2670 invertColSel.addActionListener(this);
2671 showColumns.addActionListener(this);
2672 showSeqs.addActionListener(this);
2673 hideColumns.addActionListener(this);
2674 hideSequences.addActionListener(this);
2675 formatMenu.setLabel("Format");
2676 selectMenu.setLabel("Select");
2677 newView.setLabel("New View");
2678 newView.addActionListener(this);
2679 alignFrameMenuBar.add(fileMenu);
2680 alignFrameMenuBar.add(editMenu);
2681 alignFrameMenuBar.add(selectMenu);
2682 alignFrameMenuBar.add(viewMenu);
2683 alignFrameMenuBar.add(formatMenu);
2684 alignFrameMenuBar.add(colourMenu);
2685 alignFrameMenuBar.add(calculateMenu);
2686 alignFrameMenuBar.add(helpMenu);
2688 fileMenu.add(inputText);
2689 fileMenu.add(loadTree);
2690 fileMenu.add(loadAnnotations);
2692 fileMenu.addSeparator();
2693 fileMenu.add(outputTextboxMenu);
2694 fileMenu.add(outputFeatures);
2695 fileMenu.add(outputAnnotations);
2697 if (jalviewServletURL != null)
2699 fileMenu.add(loadApplication);
2702 fileMenu.addSeparator();
2703 fileMenu.add(closeMenuItem);
2705 editMenu.add(undoMenuItem);
2706 editMenu.add(redoMenuItem);
2709 editMenu.add(pasteMenu);
2710 editMenu.add(delete);
2711 editMenu.addSeparator();
2712 editMenu.add(remove2LeftMenuItem);
2713 editMenu.add(remove2RightMenuItem);
2714 editMenu.add(removeGappedColumnMenuItem);
2715 editMenu.add(removeAllGapsMenuItem);
2716 editMenu.add(removeRedundancyMenuItem);
2717 viewMenu.add(newView);
2718 viewMenu.addSeparator();
2719 viewMenu.add(menu1);
2720 viewMenu.add(menu2);
2721 viewMenu.addSeparator();
2722 viewMenu.add(annotationPanelMenuItem);
2723 viewMenu.addSeparator();
2724 viewMenu.add(sequenceFeatures);
2725 viewMenu.add(featureSettings);
2726 viewMenu.addSeparator();
2727 viewMenu.add(alProperties);
2728 viewMenu.addSeparator();
2729 viewMenu.add(overviewMenuItem);
2730 colourMenu.add(applyToAllGroups);
2731 colourMenu.addSeparator();
2732 colourMenu.add(noColourmenuItem);
2733 colourMenu.add(clustalColour);
2734 colourMenu.add(BLOSUM62Colour);
2735 colourMenu.add(PIDColour);
2736 colourMenu.add(zappoColour);
2737 colourMenu.add(taylorColour);
2738 colourMenu.add(hydrophobicityColour);
2739 colourMenu.add(helixColour);
2740 colourMenu.add(strandColour);
2741 colourMenu.add(turnColour);
2742 colourMenu.add(buriedColour);
2743 colourMenu.add(nucleotideColour);
2744 colourMenu.add(userDefinedColour);
2745 colourMenu.addSeparator();
2746 colourMenu.add(conservationMenuItem);
2747 colourMenu.add(modifyConservation);
2748 colourMenu.add(abovePIDThreshold);
2749 colourMenu.add(modifyPID);
2750 colourMenu.add(annotationColour);
2751 calculateMenu.add(sort);
2752 calculateMenu.add(calculate);
2753 calculateMenu.addSeparator();
2754 calculateMenu.add(pairwiseAlignmentMenuItem);
2755 calculateMenu.add(PCAMenuItem);
2756 calculateMenu.add(autoCalculate);
2757 this.add(statusBar, BorderLayout.SOUTH);
2758 pasteMenu.add(pasteNew);
2759 pasteMenu.add(pasteThis);
2760 sort.add(sortIDMenuItem);
2761 sort.add(sortByTreeMenu);
2762 sort.add(sortGroupMenuItem);
2763 sort.add(sortPairwiseMenuItem);
2764 calculate.add(averageDistanceTreeMenuItem);
2765 calculate.add(neighbourTreeMenuItem);
2766 calculate.add(avDistanceTreeBlosumMenuItem);
2767 calculate.add(njTreeBlosumMenuItem);
2768 helpMenu.add(documentation);
2769 helpMenu.add(about);
2770 menu1.add(showColumns);
2771 menu1.add(showSeqs);
2772 menu2.add(hideColumns);
2773 menu2.add(hideSequences);
2774 formatMenu.add(font);
2775 formatMenu.add(seqLimits);
2776 formatMenu.add(wrapMenuItem);
2777 formatMenu.add(scaleAbove);
2778 formatMenu.add(scaleLeft);
2779 formatMenu.add(scaleRight);
2780 formatMenu.add(viewBoxesMenuItem);
2781 formatMenu.add(viewTextMenuItem);
2782 formatMenu.add(colourTextMenuItem);
2783 formatMenu.add(renderGapsMenuItem);
2784 selectMenu.add(findMenuItem);
2785 selectMenu.addSeparator();
2786 selectMenu.add(selectAllSequenceMenuItem);
2787 selectMenu.add(deselectAllSequenceMenuItem);
2788 selectMenu.add(invertSequenceMenuItem);
2789 selectMenu.add(invertColSel);
2790 selectMenu.add(deleteGroups);
2793 * This used to be called setEmbedded, but is now creates the
2794 * dropdown menus in a platform independent manner
2795 * to avoid OSX/Mac menu appendage daftness.
2797 * @param reallyEmbedded true to attach the view to the applet area on the page rather than in a new window
2799 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
2801 embeddedMenu = new Panel();
2802 embeddedEdit = new Label("Edit");
2803 embeddedSelect = new Label("Select");
2804 embeddedView = new Label("View");
2805 embeddedFormat = new Label("Format");
2806 embeddedColour = new Label("Colour");
2807 embeddedFile = new Label("File");
2808 embeddedHelp = new Label("Help");
2809 embeddedCalculate = new Label("Calculate");
2810 flowLayout1 = new FlowLayout();
2811 embeddedMenu.setBackground(Color.lightGray);
2812 embeddedMenu.setLayout(flowLayout1);
2813 embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2814 embeddedSelect.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2815 embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2816 embeddedFormat.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2817 embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2818 embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2819 embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2820 embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));
2821 embeddedMenu.add(embeddedFile);
2822 embeddedMenu.add(embeddedEdit);
2823 embeddedMenu.add(embeddedSelect);
2824 embeddedMenu.add(embeddedView);
2825 embeddedMenu.add(embeddedFormat);
2826 embeddedMenu.add(embeddedColour);
2827 embeddedMenu.add(embeddedCalculate);
2828 embeddedMenu.add(embeddedHelp);
2829 flowLayout1.setAlignment(FlowLayout.LEFT);
2830 flowLayout1.setHgap(2);
2831 flowLayout1.setVgap(0);
2832 embeddedFile.addMouseListener(this);
2833 embeddedEdit.addMouseListener(this);
2834 embeddedSelect.addMouseListener(this);
2835 embeddedView.addMouseListener(this);
2836 embeddedFormat.addMouseListener(this);
2837 embeddedColour.addMouseListener(this);
2838 embeddedCalculate.addMouseListener(this);
2839 embeddedHelp.addMouseListener(this);
2842 // view cannot be closed if its actually on the page
2843 fileMenu.remove(closeMenuItem);
2844 fileMenu.remove(3); // Remove Seperator
2845 // and actually add the components to the applet area
2846 viewport.applet.setLayout(new BorderLayout());
2847 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
2848 viewport.applet.add(statusBar, BorderLayout.SOUTH);
2849 alignPanel.setSize(viewport.applet.getSize().width,
2850 viewport.applet.getSize().height
2851 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
2852 viewport.applet.add(alignPanel, BorderLayout.CENTER);
2853 viewport.applet.validate();
2855 if (new jalview.util.Platform().isAMac())
2857 // TODO: try to modify the embeddedMenu display so it looks like a real toolbar menu
2858 // TODO: modify click/mouse handler for embeddedMenu so it behaves more like a real pulldown menu toolbar
2859 setMenuBar(null);// alignFramMenuBar);
2860 // add the components to the AlignFrame area.
2861 add(embeddedMenu, BorderLayout.NORTH);
2862 alignPanel.setSize(getSize().width,
2864 - embeddedMenu.HEIGHT - statusBar.HEIGHT);
2867 add(statusBar, BorderLayout.SOUTH);
2868 add(alignPanel, BorderLayout.CENTER);
2869 // and register with the applet so it can pass external API calls to us
2870 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
2875 PopupMenu filePopup, editPopup, searchPopup,
2876 viewPopup, formatPopup, colourPopup, calculatePopup, helpPopup;
2877 MenuItem featureSettings = new MenuItem();
2878 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
2879 MenuItem annotationColour = new MenuItem();
2880 MenuItem invertColSel = new MenuItem();
2881 Menu menu1 = new Menu();
2882 MenuItem showColumns = new MenuItem();
2883 MenuItem showSeqs = new MenuItem();
2884 Menu menu2 = new Menu();
2885 MenuItem hideColumns = new MenuItem();
2886 MenuItem hideSequences = new MenuItem();
2887 Menu formatMenu = new Menu();
2888 Menu selectMenu = new Menu();
2889 MenuItem newView = new MenuItem();
2891 public void mousePressed(MouseEvent evt)
2893 PopupMenu popup = null;
2894 Label source = (Label) evt.getSource();
2895 if (source == embeddedFile)
2897 popup = filePopup = genPopupMenu(filePopup, fileMenu);
2899 else if (source == embeddedEdit)
2901 popup = editPopup = genPopupMenu(editPopup, editMenu);
2903 else if (source == embeddedSelect)
2905 popup = searchPopup = genPopupMenu(searchPopup, selectMenu);
2907 else if (source == embeddedView)
2909 popup = viewPopup = genPopupMenu(viewPopup, viewMenu);
2911 else if (source == embeddedFormat)
2913 popup = formatPopup = genPopupMenu(formatPopup, formatMenu);
2915 else if (source == embeddedColour)
2917 popup = colourPopup = genPopupMenu(colourPopup, colourMenu);
2919 else if (source == embeddedCalculate)
2921 popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);
2923 else if (source == embeddedHelp)
2925 popup = helpPopup = genPopupMenu(helpPopup, helpMenu);
2928 embeddedMenu.add(popup);
2929 popup.show(embeddedMenu,
2930 source.getBounds().x,
2931 source.getBounds().y + source.getBounds().getSize().height);
2934 PopupMenu genPopupMenu(PopupMenu popup, Menu original)
2940 popup = new PopupMenu();
2941 int m, mSize = original.getItemCount();
2942 for (m = 0; m < mSize; m++)
2944 popup.add(original.getItem(m));
2952 public void mouseClicked(MouseEvent evt)
2955 public void mouseReleased(MouseEvent evt)
2958 public void mouseEntered(MouseEvent evt)
2961 public void mouseExited(MouseEvent evt)