2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3 * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
18 package jalview.appletgui;
24 import java.awt.event.*;
26 import jalview.analysis.*;
27 import jalview.api.SequenceStructureBinding;
28 import jalview.bin.JalviewLite;
29 import jalview.commands.*;
30 import jalview.datamodel.*;
32 import jalview.schemes.*;
34 public class AlignFrame extends EmbmenuFrame implements ActionListener,
35 ItemListener, KeyListener
37 public AlignmentPanel alignPanel;
39 public AlignViewport viewport;
41 int DEFAULT_WIDTH = 700;
43 int DEFAULT_HEIGHT = 500;
45 String jalviewServletURL;
47 public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
48 String title, boolean embedded)
53 jalviewServletURL = applet.getParameter("APPLICATION_URL");
59 } catch (Exception ex)
64 viewport = new AlignViewport(al, applet);
65 alignPanel = new AlignmentPanel(this, viewport);
67 viewport.updateConservation(alignPanel);
68 viewport.updateConsensus(alignPanel);
70 annotationPanelMenuItem.setState(viewport.showAnnotation);
71 displayNonconservedMenuItem.setState(viewport.getShowunconserved());
72 followMouseOverFlag.setState(viewport.getFollowHighlight());
73 showGroupConsensus.setState(viewport.showGroupConsensus);
74 showGroupConservation.setState(viewport.showGroupConservation);
75 showConsensusHistogram.setState(viewport.showConsensusHistogram);
76 showSequenceLogo.setState(viewport.showSequenceLogo);
78 seqLimits.setState(viewport.showJVSuffix);
82 String param = applet.getParameter("sortBy");
85 if (param.equalsIgnoreCase("Id"))
87 sortIDMenuItem_actionPerformed();
89 else if (param.equalsIgnoreCase("Pairwise Identity"))
91 sortPairwiseMenuItem_actionPerformed();
93 else if (param.equalsIgnoreCase("Length"))
95 sortLengthMenuItem_actionPerformed();
99 param = applet.getParameter("wrap");
102 if (param.equalsIgnoreCase("true"))
104 wrapMenuItem.setState(true);
105 wrapMenuItem_actionPerformed();
108 param = applet.getParameter("centrecolumnlabels");
111 centreColumnLabelFlag.setState(true);
112 centreColumnLabelFlag_stateChanged();
116 param = applet.getParameter("windowWidth");
119 int width = Integer.parseInt(param);
120 DEFAULT_WIDTH = width;
122 param = applet.getParameter("windowHeight");
125 int height = Integer.parseInt(param);
126 DEFAULT_HEIGHT = height;
128 } catch (Exception ex)
134 // Some JVMS send keyevents to Top frame or lowest panel,
135 // Havent worked out why yet. So add to both this frame and seqCanvas for
137 this.addKeyListener(this);
138 alignPanel.seqPanel.seqCanvas.addKeyListener(this);
139 alignPanel.idPanel.idCanvas.addKeyListener(this);
140 alignPanel.scalePanel.addKeyListener(this);
141 alignPanel.annotationPanel.addKeyListener(this);
142 createAlignFrameWindow(embedded, title);
143 alignPanel.validate();
144 alignPanel.paintAlignment(true);
147 public AlignViewport getAlignViewport()
152 public SeqCanvas getSeqcanvas()
154 return alignPanel.seqPanel.seqCanvas;
164 public void parseFeaturesFile(String file, String type)
166 Hashtable featureLinks = new Hashtable();
167 boolean featuresFile = false;
170 featuresFile = new jalview.io.FeaturesFile(file, type)
171 .parse(viewport.alignment,
172 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours,
173 featureLinks, true, viewport.applet.getDefaultParameter("relaxedidmatch", false));
174 } catch (Exception ex)
176 ex.printStackTrace();
181 if (featureLinks.size() > 0)
183 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
185 viewport.showSequenceFeatures = true;
186 sequenceFeatures.setState(true);
187 if (viewport.featureSettings != null)
189 viewport.featureSettings.refreshTable();
191 alignPanel.paintAlignment(true);
196 public void keyPressed(KeyEvent evt)
198 if (viewport.cursorMode
199 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
200 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
201 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
202 && Character.isDigit(evt.getKeyChar()))
203 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
205 switch (evt.getKeyCode())
207 case 27: // escape key
208 deselectAllSequenceMenuItem_actionPerformed();
211 if (evt.isControlDown() || evt.isMetaDown())
213 cut_actionPerformed();
217 if (viewport.cursorMode && !evt.isControlDown())
219 alignPanel.seqPanel.setCursorColumn();
221 if (evt.isControlDown() || evt.isMetaDown())
223 copy_actionPerformed();
227 if (evt.isControlDown())
229 paste(evt.isShiftDown());
233 if (evt.isControlDown() || evt.isMetaDown())
235 selectAllSequenceMenuItem_actionPerformed();
238 case KeyEvent.VK_DOWN:
239 if (viewport.cursorMode)
241 alignPanel.seqPanel.moveCursor(0, 1);
245 moveSelectedSequences(false);
250 if (viewport.cursorMode)
252 alignPanel.seqPanel.moveCursor(0, -1);
256 moveSelectedSequences(true);
260 case KeyEvent.VK_LEFT:
261 if (evt.isAltDown() || !viewport.cursorMode)
262 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
264 alignPanel.seqPanel.moveCursor(-1, 0);
267 case KeyEvent.VK_RIGHT:
268 if (evt.isAltDown() || !viewport.cursorMode)
269 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
271 alignPanel.seqPanel.moveCursor(1, 0);
274 case KeyEvent.VK_SPACE:
275 if (viewport.cursorMode)
277 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
278 || evt.isShiftDown() || evt.isAltDown());
282 case KeyEvent.VK_DELETE:
283 case KeyEvent.VK_BACK_SPACE:
284 if (viewport.cursorMode)
286 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
287 || evt.isShiftDown() || evt.isAltDown());
291 cut_actionPerformed();
292 alignPanel.seqPanel.seqCanvas.repaint();
297 if (viewport.cursorMode)
299 alignPanel.seqPanel.setCursorRow();
303 if (viewport.cursorMode)
305 alignPanel.seqPanel.setCursorPosition();
309 case KeyEvent.VK_ENTER:
310 case KeyEvent.VK_COMMA:
311 if (viewport.cursorMode)
313 alignPanel.seqPanel.setCursorRowAndColumn();
318 if (viewport.cursorMode)
320 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
324 if (viewport.cursorMode)
326 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
331 viewport.cursorMode = !viewport.cursorMode;
332 statusBar.setText("Keyboard editing mode is "
333 + (viewport.cursorMode ? "on" : "off"));
334 if (viewport.cursorMode)
336 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
337 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
342 if (evt.isControlDown())
344 findMenuItem_actionPerformed();
350 boolean toggleSeqs = !evt.isControlDown();
351 boolean toggleCols = !evt.isShiftDown();
352 toggleHiddenRegions(toggleSeqs, toggleCols);
356 case KeyEvent.VK_PAGE_UP:
357 if (viewport.wrapAlignment)
359 alignPanel.scrollUp(true);
363 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
364 - viewport.endSeq + viewport.startSeq);
368 case KeyEvent.VK_PAGE_DOWN:
369 if (viewport.wrapAlignment)
371 alignPanel.scrollUp(false);
375 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
376 + viewport.endSeq - viewport.startSeq);
381 if (evt.isControlDown())
383 undoMenuItem_actionPerformed();
388 if (evt.isControlDown())
390 redoMenuItem_actionPerformed();
395 if (evt.isControlDown())
402 if (evt.isControlDown())
404 trimAlignment(false);
409 if (evt.isControlDown())
411 if (evt.isShiftDown())
413 this.removeAllGapsMenuItem_actionPerformed();
417 removeGappedColumnMenuItem_actionPerformed();
422 if (evt.isControlDown())
426 invertColSel_actionPerformed();
430 invertSequenceMenuItem_actionPerformed();
436 if (evt.isControlDown())
438 this.deleteGroups_actionPerformed();
443 if (evt.isControlDown())
450 alignPanel.paintAlignment(true);
454 * called by key handler and the hide all/show all menu items
459 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
461 boolean hide = false;
462 SequenceGroup sg = viewport.getSelectionGroup();
463 if (!toggleSeqs && !toggleCols)
465 // Hide everything by the current selection - this is a hack - we do the
466 // invert and then hide
467 // first check that there will be visible columns after the invert.
468 if ((viewport.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel
469 .getSelected().size() > 0)
470 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
473 // now invert the sequence set, if required - empty selection implies
474 // that no hiding is required.
477 invertSequenceMenuItem_actionPerformed();
478 sg = viewport.getSelectionGroup();
482 viewport.expandColSelection(sg, true);
483 // finally invert the column selection and get the new sequence
484 // selection and indicate it should be hidden.
485 invertColSel_actionPerformed();
492 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
495 viewport.hideAllSelectedSeqs();
497 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
499 viewport.showAllHiddenSeqs();
505 if (viewport.colSel.getSelected().size() > 0)
507 viewport.hideSelectedColumns();
510 viewport.selectionGroup = sg;
515 viewport.showAllHiddenColumns();
520 public void keyReleased(KeyEvent evt)
524 public void keyTyped(KeyEvent evt)
528 public void itemStateChanged(ItemEvent evt)
530 if (evt.getSource() == displayNonconservedMenuItem)
532 displayNonconservedMenuItem_actionPerformed();
534 else if (evt.getSource() == colourTextMenuItem)
536 colourTextMenuItem_actionPerformed();
538 else if (evt.getSource() == wrapMenuItem)
540 wrapMenuItem_actionPerformed();
542 else if (evt.getSource() == scaleAbove)
544 viewport.setScaleAboveWrapped(scaleAbove.getState());
546 else if (evt.getSource() == scaleLeft)
548 viewport.setScaleLeftWrapped(scaleLeft.getState());
550 else if (evt.getSource() == scaleRight)
552 viewport.setScaleRightWrapped(scaleRight.getState());
554 else if (evt.getSource() == seqLimits)
556 seqLimits_itemStateChanged();
558 else if (evt.getSource() == viewBoxesMenuItem)
560 viewport.setShowBoxes(viewBoxesMenuItem.getState());
562 else if (evt.getSource() == viewTextMenuItem)
564 viewport.setShowText(viewTextMenuItem.getState());
566 else if (evt.getSource() == renderGapsMenuItem)
568 viewport.setRenderGaps(renderGapsMenuItem.getState());
570 else if (evt.getSource() == annotationPanelMenuItem)
572 viewport.setShowAnnotation(annotationPanelMenuItem.getState());
573 alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
575 else if (evt.getSource() == sequenceFeatures)
577 viewport.showSequenceFeatures(sequenceFeatures.getState());
578 alignPanel.seqPanel.seqCanvas.repaint();
580 else if (evt.getSource() == conservationMenuItem)
582 conservationMenuItem_actionPerformed();
584 else if (evt.getSource() == abovePIDThreshold)
586 abovePIDThreshold_actionPerformed();
588 else if (evt.getSource() == applyToAllGroups)
590 viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
592 else if (evt.getSource() == autoCalculate)
594 viewport.autocalculateConsensus = autoCalculate.getState();
596 else if (evt.getSource() == this.centreColumnLabelFlag)
598 centreColumnLabelFlag_stateChanged();
600 else if (evt.getSource() == this.followMouseOverFlag)
602 mouseOverFlag_stateChanged();
604 else if (evt.getSource() == showGroupConsensus)
606 showGroupConsensus_actionPerformed();
608 else if (evt.getSource() == showGroupConservation)
610 showGroupConservation_actionPerformed();
612 else if (evt.getSource() == showSequenceLogo)
614 showSequenceLogo_actionPerformed();
616 else if (evt.getSource() == showConsensusHistogram)
618 showConsensusHistogram_actionPerformed();
620 else if (evt.getSource() == applyAutoAnnotationSettings)
622 applyAutoAnnotationSettings_actionPerformed();
624 alignPanel.paintAlignment(true);
627 private void mouseOverFlag_stateChanged()
629 viewport.followHighlight = followMouseOverFlag.getState();
630 // TODO: could kick the scrollTo mechanism to reset view for current
634 private void centreColumnLabelFlag_stateChanged()
636 viewport.centreColumnLabels = centreColumnLabelFlag.getState();
637 this.alignPanel.annotationPanel.repaint();
640 public void actionPerformed(ActionEvent evt)
642 Object source = evt.getSource();
644 if (source == inputText)
646 inputText_actionPerformed();
648 else if (source == loadTree)
650 loadTree_actionPerformed();
652 else if (source == loadApplication)
654 launchFullApplication();
656 else if (source == loadAnnotations)
660 else if (source == outputAnnotations)
662 outputAnnotations(true);
664 else if (source == outputFeatures)
666 outputFeatures(true, "Jalview");
668 else if (source == closeMenuItem)
670 closeMenuItem_actionPerformed();
672 else if (source == copy)
674 copy_actionPerformed();
676 else if (source == undoMenuItem)
678 undoMenuItem_actionPerformed();
680 else if (source == redoMenuItem)
682 redoMenuItem_actionPerformed();
684 else if (source == inputText)
686 inputText_actionPerformed();
688 else if (source == closeMenuItem)
690 closeMenuItem_actionPerformed();
692 else if (source == undoMenuItem)
694 undoMenuItem_actionPerformed();
696 else if (source == redoMenuItem)
698 redoMenuItem_actionPerformed();
700 else if (source == copy)
702 copy_actionPerformed();
704 else if (source == pasteNew)
706 pasteNew_actionPerformed();
708 else if (source == pasteThis)
710 pasteThis_actionPerformed();
712 else if (source == cut)
714 cut_actionPerformed();
716 else if (source == delete)
718 delete_actionPerformed();
720 else if (source == grpsFromSelection)
722 makeGrpsFromSelection_actionPerformed();
724 else if (source == deleteGroups)
726 deleteGroups_actionPerformed();
728 else if (source == selectAllSequenceMenuItem)
730 selectAllSequenceMenuItem_actionPerformed();
732 else if (source == deselectAllSequenceMenuItem)
734 deselectAllSequenceMenuItem_actionPerformed();
736 else if (source == invertSequenceMenuItem)
738 invertSequenceMenuItem_actionPerformed();
740 else if (source == invertColSel)
742 viewport.invertColumnSelection();
743 alignPanel.paintAlignment(true);
745 else if (source == remove2LeftMenuItem)
749 else if (source == remove2RightMenuItem)
751 trimAlignment(false);
753 else if (source == removeGappedColumnMenuItem)
755 removeGappedColumnMenuItem_actionPerformed();
757 else if (source == removeAllGapsMenuItem)
759 removeAllGapsMenuItem_actionPerformed();
761 else if (source == findMenuItem)
763 findMenuItem_actionPerformed();
765 else if (source == font)
767 new FontChooser(alignPanel);
769 else if (source == newView)
773 else if (source == showColumns)
775 viewport.showAllHiddenColumns();
776 alignPanel.paintAlignment(true);
778 else if (source == showSeqs)
780 viewport.showAllHiddenSeqs();
781 alignPanel.paintAlignment(true);
783 else if (source == hideColumns)
785 viewport.hideSelectedColumns();
786 alignPanel.paintAlignment(true);
788 else if (source == hideSequences
789 && viewport.getSelectionGroup() != null)
791 viewport.hideAllSelectedSeqs();
792 alignPanel.paintAlignment(true);
794 else if (source == hideAllButSelection)
796 toggleHiddenRegions(false, false);
797 alignPanel.paintAlignment(true);
799 else if (source == hideAllSelection)
801 SequenceGroup sg = viewport.getSelectionGroup();
802 viewport.expandColSelection(sg, false);
803 viewport.hideAllSelectedSeqs();
804 viewport.hideSelectedColumns();
805 alignPanel.paintAlignment(true);
807 else if (source == showAllHidden)
809 viewport.showAllHiddenColumns();
810 viewport.showAllHiddenSeqs();
811 alignPanel.paintAlignment(true);
813 else if (source == showGroupConsensus)
815 showGroupConsensus_actionPerformed();
817 else if (source == showGroupConservation)
819 showGroupConservation_actionPerformed();
821 else if (source == showSequenceLogo)
823 showSequenceLogo_actionPerformed();
825 else if (source == showConsensusHistogram)
827 showConsensusHistogram_actionPerformed();
829 else if (source == applyAutoAnnotationSettings)
831 applyAutoAnnotationSettings_actionPerformed();
833 else if (source == featureSettings)
835 new FeatureSettings(alignPanel);
837 else if (source == alProperties)
839 StringBuffer contents = new jalview.io.AlignmentProperties(
840 viewport.alignment).formatAsString();
841 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
842 cap.setText(contents.toString());
843 Frame frame = new Frame();
845 jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "
846 + getTitle(), 400, 250);
848 else if (source == overviewMenuItem)
850 overviewMenuItem_actionPerformed();
852 else if (source == noColourmenuItem)
856 else if (source == clustalColour)
858 abovePIDThreshold.setState(false);
859 changeColour(new ClustalxColourScheme(
860 viewport.alignment.getSequences(),
861 viewport.alignment.getWidth()));
863 else if (source == zappoColour)
865 changeColour(new ZappoColourScheme());
867 else if (source == taylorColour)
869 changeColour(new TaylorColourScheme());
871 else if (source == hydrophobicityColour)
873 changeColour(new HydrophobicColourScheme());
875 else if (source == helixColour)
877 changeColour(new HelixColourScheme());
879 else if (source == strandColour)
881 changeColour(new StrandColourScheme());
883 else if (source == turnColour)
885 changeColour(new TurnColourScheme());
887 else if (source == buriedColour)
889 changeColour(new BuriedColourScheme());
891 else if (source == nucleotideColour)
893 changeColour(new NucleotideColourScheme());
895 else if (source == modifyPID)
897 modifyPID_actionPerformed();
899 else if (source == modifyConservation)
901 modifyConservation_actionPerformed();
903 else if (source == userDefinedColour)
905 new UserDefinedColours(alignPanel, null);
907 else if (source == PIDColour)
909 changeColour(new PIDColourScheme());
911 else if (source == BLOSUM62Colour)
913 changeColour(new Blosum62ColourScheme());
915 else if (source == annotationColour)
917 new AnnotationColourChooser(viewport, alignPanel);
919 else if (source == sortPairwiseMenuItem)
921 sortPairwiseMenuItem_actionPerformed();
923 else if (source == sortIDMenuItem)
925 sortIDMenuItem_actionPerformed();
927 else if (source == sortLengthMenuItem)
929 sortLengthMenuItem_actionPerformed();
931 else if (source == sortGroupMenuItem)
933 sortGroupMenuItem_actionPerformed();
935 else if (source == removeRedundancyMenuItem)
937 removeRedundancyMenuItem_actionPerformed();
939 else if (source == pairwiseAlignmentMenuItem)
941 pairwiseAlignmentMenuItem_actionPerformed();
943 else if (source == PCAMenuItem)
945 PCAMenuItem_actionPerformed();
947 else if (source == averageDistanceTreeMenuItem)
949 averageDistanceTreeMenuItem_actionPerformed();
951 else if (source == neighbourTreeMenuItem)
953 neighbourTreeMenuItem_actionPerformed();
955 else if (source == njTreeBlosumMenuItem)
957 njTreeBlosumMenuItem_actionPerformed();
959 else if (source == avDistanceTreeBlosumMenuItem)
961 avTreeBlosumMenuItem_actionPerformed();
963 else if (source == documentation)
965 documentation_actionPerformed();
967 else if (source == about)
969 about_actionPerformed();
974 public void inputText_actionPerformed()
976 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
977 Frame frame = new Frame();
979 jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);
982 protected void outputText_actionPerformed(ActionEvent e)
984 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
985 Frame frame = new Frame();
987 jalview.bin.JalviewLite.addFrame(frame,
988 "Alignment output - " + e.getActionCommand(), 600, 500);
989 cap.setText(new AppletFormatAdapter().formatSequences(
990 e.getActionCommand(), viewport.getAlignment(),
991 viewport.showJVSuffix));
994 public void loadAnnotations()
996 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
997 cap.setText("Paste your features / annotations file here.");
998 cap.setAnnotationImport();
999 Frame frame = new Frame();
1001 jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);
1005 public String outputAnnotations(boolean displayTextbox)
1007 String annotation = new AnnotationFile().printAnnotations(
1008 viewport.showAnnotation ? viewport.alignment
1009 .getAlignmentAnnotation() : null, viewport.alignment
1011 ((Alignment) viewport.alignment).alignmentProperties);
1015 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1016 Frame frame = new Frame();
1018 jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);
1019 cap.setText(annotation);
1025 private Hashtable getDisplayedFeatureCols()
1027 if (alignPanel.getFeatureRenderer() != null)
1029 FeatureRenderer fr = alignPanel.getFeatureRenderer();
1030 Hashtable fcols = new Hashtable();
1031 Enumeration en = viewport.featuresDisplayed.keys();
1032 while (en.hasMoreElements())
1034 Object col = en.nextElement();
1035 fcols.put(col, fr.featureColours.get(col));
1042 public String outputFeatures(boolean displayTextbox, String format)
1045 if (format.equalsIgnoreCase("Jalview"))
1047 features = new FeaturesFile().printJalviewFormat(
1048 viewport.alignment.getSequencesArray(),
1049 getDisplayedFeatureCols());
1053 features = new FeaturesFile().printGFFFormat(
1054 viewport.alignment.getSequencesArray(),
1055 getDisplayedFeatureCols());
1060 CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);
1061 Frame frame = new Frame();
1063 jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);
1065 cap.setText(features);
1071 void launchFullApplication()
1073 StringBuffer url = new StringBuffer(jalviewServletURL);
1076 + appendProtocol(viewport.applet.getParameter("file")));
1078 if (viewport.applet.getParameter("features") != null)
1080 url.append("&features=");
1081 url.append(appendProtocol(viewport.applet.getParameter("features")));
1084 if (viewport.applet.getParameter("annotations") != null)
1086 url.append("&annotations=");
1087 url.append(appendProtocol(viewport.applet.getParameter("annotations")));
1090 if (viewport.applet.getParameter("jnetfile") != null)
1092 url.append("&annotations=");
1093 url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
1096 if (viewport.applet.getParameter("defaultColour") != null)
1098 url.append("&colour="
1099 + removeWhiteSpace(viewport.applet
1100 .getParameter("defaultColour")));
1103 if (viewport.applet.getParameter("userDefinedColour") != null)
1105 url.append("&colour="
1106 + removeWhiteSpace(viewport.applet
1107 .getParameter("userDefinedColour")));
1109 if (viewport.applet.getParameter("tree") != null)
1112 + appendProtocol(viewport.applet.getParameter("tree")));
1114 if (viewport.applet.getParameter("treeFile") != null)
1117 + appendProtocol(viewport.applet.getParameter("treeFile")));
1120 showURL(url.toString(), "FULL_APP");
1123 String removeWhiteSpace(String colour)
1125 StringBuffer sb = new StringBuffer();
1126 for (int i = 0; i < colour.length(); i++)
1128 if (Character.isWhitespace(colour.charAt(i)))
1134 sb.append(colour.charAt(i));
1138 return sb.toString();
1141 String appendProtocol(String url)
1146 url = URLEncoder.encode(url);
1149 * When we finally deprecate 1.1 compatibility, we can start to use
1150 * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch
1151 * (UnsupportedEncodingException ex) { System.err.println("WARNING -
1152 * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);
1153 * ex.printStackTrace(); }
1155 catch (java.net.MalformedURLException ex)
1157 url = viewport.applet.getCodeBase() + url;
1162 public void closeMenuItem_actionPerformed()
1164 PaintRefresher.RemoveComponent(alignPanel);
1165 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
1166 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
1168 if (PaintRefresher.components.size() == 0 && viewport.applet == null)
1179 void updateEditMenuBar()
1182 if (viewport.historyList.size() > 0)
1184 undoMenuItem.setEnabled(true);
1185 CommandI command = (CommandI) viewport.historyList.peek();
1186 undoMenuItem.setLabel("Undo " + command.getDescription());
1190 undoMenuItem.setEnabled(false);
1191 undoMenuItem.setLabel("Undo");
1194 if (viewport.redoList.size() > 0)
1196 redoMenuItem.setEnabled(true);
1198 CommandI command = (CommandI) viewport.redoList.peek();
1199 redoMenuItem.setLabel("Redo " + command.getDescription());
1203 redoMenuItem.setEnabled(false);
1204 redoMenuItem.setLabel("Redo");
1208 public void addHistoryItem(CommandI command)
1210 if (command.getSize() > 0)
1212 viewport.historyList.push(command);
1213 viewport.redoList.removeAllElements();
1214 updateEditMenuBar();
1215 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1225 protected void undoMenuItem_actionPerformed()
1227 if (viewport.historyList.size() < 1)
1232 CommandI command = (CommandI) viewport.historyList.pop();
1233 viewport.redoList.push(command);
1234 command.undoCommand(null);
1236 AlignViewport originalSource = getOriginatingSource(command);
1238 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1239 updateEditMenuBar();
1240 originalSource.firePropertyChange("alignment", null,
1241 originalSource.alignment.getSequences());
1250 protected void redoMenuItem_actionPerformed()
1252 if (viewport.redoList.size() < 1)
1257 CommandI command = (CommandI) viewport.redoList.pop();
1258 viewport.historyList.push(command);
1259 command.doCommand(null);
1261 AlignViewport originalSource = getOriginatingSource(command);
1262 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1264 updateEditMenuBar();
1265 originalSource.firePropertyChange("alignment", null,
1266 originalSource.alignment.getSequences());
1269 AlignViewport getOriginatingSource(CommandI command)
1271 AlignViewport originalSource = null;
1272 // For sequence removal and addition, we need to fire
1273 // the property change event FROM the viewport where the
1274 // original alignment was altered
1275 AlignmentI al = null;
1276 if (command instanceof EditCommand)
1278 EditCommand editCommand = (EditCommand) command;
1279 al = editCommand.getAlignment();
1280 Vector comps = (Vector) PaintRefresher.components.get(viewport
1281 .getSequenceSetId());
1282 for (int i = 0; i < comps.size(); i++)
1284 if (comps.elementAt(i) instanceof AlignmentPanel)
1286 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1288 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1295 if (originalSource == null)
1297 // The original view is closed, we must validate
1298 // the current view against the closed view first
1301 PaintRefresher.validateSequences(al, viewport.alignment);
1304 originalSource = viewport;
1307 return originalSource;
1310 public void moveSelectedSequences(boolean up)
1312 SequenceGroup sg = viewport.getSelectionGroup();
1320 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1322 SequenceI seq = viewport.alignment.getSequenceAt(i);
1323 if (!sg.getSequences(null).contains(seq))
1328 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1329 if (sg.getSequences(null).contains(temp))
1334 viewport.alignment.getSequences().setElementAt(temp, i);
1335 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1340 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1342 SequenceI seq = viewport.alignment.getSequenceAt(i);
1343 if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))
1348 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1349 if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))
1354 viewport.alignment.getSequences().setElementAt(temp, i);
1355 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1359 alignPanel.paintAlignment(true);
1362 synchronized void slideSequences(boolean right, int size)
1364 Vector sg = new Vector();
1365 if (viewport.cursorMode)
1367 sg.addElement(viewport.alignment
1368 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1370 else if (viewport.getSelectionGroup() != null
1371 && viewport.getSelectionGroup().getSize() != viewport.alignment
1374 sg = viewport.getSelectionGroup().getSequences(
1375 viewport.hiddenRepSequences);
1383 Vector invertGroup = new Vector();
1385 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1387 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1388 invertGroup.addElement(viewport.alignment.getSequenceAt(i));
1391 SequenceI[] seqs1 = new SequenceI[sg.size()];
1392 for (int i = 0; i < sg.size(); i++)
1393 seqs1[i] = (SequenceI) sg.elementAt(i);
1395 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1396 for (int i = 0; i < invertGroup.size(); i++)
1397 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1399 SlideSequencesCommand ssc;
1401 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1402 size, viewport.getGapCharacter());
1404 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1405 size, viewport.getGapCharacter());
1407 int groupAdjustment = 0;
1408 if (ssc.getGapsInsertedBegin() && right)
1410 if (viewport.cursorMode)
1411 alignPanel.seqPanel.moveCursor(size, 0);
1413 groupAdjustment = size;
1415 else if (!ssc.getGapsInsertedBegin() && !right)
1417 if (viewport.cursorMode)
1418 alignPanel.seqPanel.moveCursor(-size, 0);
1420 groupAdjustment = -size;
1423 if (groupAdjustment != 0)
1425 viewport.getSelectionGroup().setStartRes(
1426 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1427 viewport.getSelectionGroup().setEndRes(
1428 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1431 boolean appendHistoryItem = false;
1432 if (viewport.historyList != null && viewport.historyList.size() > 0
1433 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1435 appendHistoryItem = ssc
1436 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1440 if (!appendHistoryItem)
1441 addHistoryItem(ssc);
1446 static StringBuffer copiedSequences;
1448 static Vector copiedHiddenColumns;
1450 protected void copy_actionPerformed()
1452 if (viewport.getSelectionGroup() == null)
1457 SequenceGroup sg = viewport.getSelectionGroup();
1458 copiedSequences = new StringBuffer();
1459 Hashtable orderedSeqs = new Hashtable();
1460 for (int i = 0; i < sg.getSize(); i++)
1462 SequenceI seq = sg.getSequenceAt(i);
1463 int index = viewport.alignment.findIndex(seq);
1464 orderedSeqs.put(index + "", seq);
1467 int index = 0, startRes, endRes;
1470 if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)
1472 copiedHiddenColumns = new Vector();
1473 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1474 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1477 int[] region = (int[]) viewport.getColumnSelection()
1478 .getHiddenColumns().elementAt(i);
1480 copiedHiddenColumns.addElement(new int[]
1481 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1486 copiedHiddenColumns = null;
1489 for (int i = 0; i < sg.getSize(); i++)
1491 SequenceI seq = null;
1495 if (orderedSeqs.containsKey(index + ""))
1497 seq = (SequenceI) orderedSeqs.get(index + "");
1509 // Returns residue following index if gap
1510 startRes = seq.findPosition(sg.getStartRes());
1513 // Need to find the residue preceeding index if gap
1516 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
1518 ch = seq.getCharAt(j);
1519 if (!jalview.util.Comparison.isGap((ch)))
1527 endRes += seq.getStart() - 1;
1530 copiedSequences.append(seq.getName()
1536 + seq.getSequenceAsString(sg.getStartRes(),
1537 sg.getEndRes() + 1) + "\n");
1542 protected void pasteNew_actionPerformed()
1547 protected void pasteThis_actionPerformed()
1552 void paste(boolean newAlignment)
1557 if (copiedSequences == null)
1562 StringTokenizer st = new StringTokenizer(copiedSequences.toString());
1563 Vector seqs = new Vector();
1564 while (st.hasMoreElements())
1566 String name = st.nextToken();
1567 int start = Integer.parseInt(st.nextToken());
1568 int end = Integer.parseInt(st.nextToken());
1569 seqs.addElement(new Sequence(name, st.nextToken(), start, end));
1571 SequenceI[] newSeqs = new SequenceI[seqs.size()];
1572 for (int i = 0; i < seqs.size(); i++)
1574 newSeqs[i] = (SequenceI) seqs.elementAt(i);
1579 String newtitle = new String("Copied sequences");
1580 if (getTitle().startsWith("Copied sequences"))
1582 newtitle = getTitle();
1586 newtitle = newtitle.concat("- from " + getTitle());
1588 AlignFrame af = new AlignFrame(new Alignment(newSeqs),
1589 viewport.applet, newtitle, false);
1590 if (copiedHiddenColumns != null)
1592 for (int i = 0; i < copiedHiddenColumns.size(); i++)
1594 int[] region = (int[]) copiedHiddenColumns.elementAt(i);
1595 af.viewport.hideColumns(region[0], region[1]);
1599 jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
1604 addSequences(newSeqs);
1607 } catch (Exception ex)
1609 } // could be anything being pasted in here
1613 void addSequences(SequenceI[] seqs)
1615 for (int i = 0; i < seqs.length; i++)
1617 viewport.alignment.addSequence(seqs[i]);
1621 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1622 seqs, 0, viewport.alignment.getWidth(), viewport.alignment));
1624 viewport.setEndSeq(viewport.alignment.getHeight());
1625 viewport.alignment.getWidth();
1626 viewport.firePropertyChange("alignment", null,
1627 viewport.alignment.getSequences());
1631 protected void cut_actionPerformed()
1633 copy_actionPerformed();
1634 delete_actionPerformed();
1637 protected void delete_actionPerformed()
1640 SequenceGroup sg = viewport.getSelectionGroup();
1646 Vector seqs = new Vector();
1648 for (int i = 0; i < sg.getSize(); i++)
1650 seq = sg.getSequenceAt(i);
1651 seqs.addElement(seq);
1654 // If the cut affects all sequences, remove highlighted columns
1655 if (sg.getSize() == viewport.alignment.getHeight())
1657 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1658 sg.getEndRes() + 1);
1661 SequenceI[] cut = new SequenceI[seqs.size()];
1662 for (int i = 0; i < seqs.size(); i++)
1664 cut[i] = (SequenceI) seqs.elementAt(i);
1668 * //ADD HISTORY ITEM
1670 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1671 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1672 viewport.alignment));
1674 viewport.setSelectionGroup(null);
1675 viewport.alignment.deleteGroup(sg);
1677 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1680 if (viewport.getAlignment().getHeight() < 1)
1682 this.setVisible(false);
1684 viewport.sendSelection();
1688 * group consensus toggled
1691 protected void showGroupConsensus_actionPerformed()
1693 viewport.setShowGroupConsensus(showGroupConsensus.getState());
1694 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1699 * group conservation toggled.
1701 protected void showGroupConservation_actionPerformed()
1703 viewport.setShowGroupConservation(showGroupConservation.getState());
1704 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1711 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
1712 * .event.ActionEvent)
1714 protected void showConsensusHistogram_actionPerformed()
1716 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
1717 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1723 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
1724 * .event.ActionEvent)
1726 protected void showSequenceLogo_actionPerformed()
1728 viewport.setShowSequenceLogo(showSequenceLogo.getState());
1729 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1732 protected void applyAutoAnnotationSettings_actionPerformed()
1734 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
1737 protected void makeGrpsFromSelection_actionPerformed()
1739 if (viewport.getSelectionGroup() != null)
1741 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
1742 viewport.getSequenceSelection(),
1743 viewport.getAlignmentView(true).getSequenceStrings(
1744 viewport.getGapCharacter()),
1745 viewport.alignment.getGroups());
1746 viewport.alignment.deleteAllGroups();
1747 viewport.sequenceColours = null;
1748 viewport.setSelectionGroup(null);
1749 // set view properties for each group
1750 for (int g = 0; g < gps.length; g++)
1752 // gps[g].setShowunconserved(viewport.getShowUnconserved());
1753 gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
1754 viewport.alignment.addGroup(gps[g]);
1755 Color col = new Color((int) (Math.random() * 255),
1756 (int) (Math.random() * 255), (int) (Math.random() * 255));
1757 col = col.brighter();
1758 for (Enumeration sq = gps[g].getSequences(null).elements(); sq
1759 .hasMoreElements(); viewport.setSequenceColour(
1760 (SequenceI) sq.nextElement(), col))
1763 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1764 alignPanel.updateAnnotation();
1765 alignPanel.paintAlignment(true);
1769 protected void deleteGroups_actionPerformed()
1771 viewport.alignment.deleteAllGroups();
1772 viewport.sequenceColours = null;
1773 viewport.setSelectionGroup(null);
1775 alignPanel.paintAlignment(true);
1778 public void selectAllSequenceMenuItem_actionPerformed()
1780 SequenceGroup sg = new SequenceGroup();
1781 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1783 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1785 sg.setEndRes(viewport.alignment.getWidth() - 1);
1786 viewport.setSelectionGroup(sg);
1787 alignPanel.paintAlignment(true);
1788 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1789 viewport.sendSelection();
1792 public void deselectAllSequenceMenuItem_actionPerformed()
1794 if (viewport.cursorMode)
1796 alignPanel.seqPanel.keyboardNo1 = null;
1797 alignPanel.seqPanel.keyboardNo2 = null;
1799 viewport.setSelectionGroup(null);
1800 viewport.getColumnSelection().clear();
1801 viewport.setSelectionGroup(null);
1802 alignPanel.idPanel.idCanvas.searchResults = null;
1803 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1804 alignPanel.paintAlignment(true);
1805 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1806 viewport.sendSelection();
1809 public void invertSequenceMenuItem_actionPerformed()
1811 SequenceGroup sg = viewport.getSelectionGroup();
1812 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1814 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1817 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1818 viewport.sendSelection();
1821 public void invertColSel_actionPerformed()
1823 viewport.invertColumnSelection();
1824 alignPanel.paintAlignment(true);
1825 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1826 viewport.sendSelection();
1829 void trimAlignment(boolean trimLeft)
1831 ColumnSelection colSel = viewport.getColumnSelection();
1834 if (colSel.size() > 0)
1838 column = colSel.getMin();
1842 column = colSel.getMax();
1846 if (viewport.getSelectionGroup() != null)
1848 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1849 viewport.hiddenRepSequences);
1853 seqs = viewport.alignment.getSequencesArray();
1856 TrimRegionCommand trimRegion;
1859 trimRegion = new TrimRegionCommand("Remove Left",
1860 TrimRegionCommand.TRIM_LEFT, seqs, column,
1861 viewport.alignment, viewport.colSel,
1862 viewport.selectionGroup);
1863 viewport.setStartRes(0);
1867 trimRegion = new TrimRegionCommand("Remove Right",
1868 TrimRegionCommand.TRIM_RIGHT, seqs, column,
1869 viewport.alignment, viewport.colSel,
1870 viewport.selectionGroup);
1873 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1875 addHistoryItem(trimRegion);
1877 Vector groups = viewport.alignment.getGroups();
1879 for (int i = 0; i < groups.size(); i++)
1881 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
1883 if ((trimLeft && !sg.adjustForRemoveLeft(column))
1884 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1886 viewport.alignment.deleteGroup(sg);
1890 viewport.firePropertyChange("alignment", null, viewport
1891 .getAlignment().getSequences());
1895 public void removeGappedColumnMenuItem_actionPerformed()
1897 int start = 0, end = viewport.alignment.getWidth() - 1;
1900 if (viewport.getSelectionGroup() != null)
1902 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1903 viewport.hiddenRepSequences);
1904 start = viewport.getSelectionGroup().getStartRes();
1905 end = viewport.getSelectionGroup().getEndRes();
1909 seqs = viewport.alignment.getSequencesArray();
1912 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
1913 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
1915 addHistoryItem(removeGapCols);
1917 statusBar.setText("Removed " + removeGapCols.getSize()
1918 + " empty columns.");
1920 // This is to maintain viewport position on first residue
1921 // of first sequence
1922 SequenceI seq = viewport.alignment.getSequenceAt(0);
1923 int startRes = seq.findPosition(viewport.startRes);
1924 // ShiftList shifts;
1925 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1926 // edit.alColumnChanges=shifts.getInverse();
1927 // if (viewport.hasHiddenColumns)
1928 // viewport.getColumnSelection().compensateForEdits(shifts);
1929 viewport.setStartRes(seq.findIndex(startRes) - 1);
1930 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1935 public void removeAllGapsMenuItem_actionPerformed()
1937 int start = 0, end = viewport.alignment.getWidth() - 1;
1940 if (viewport.getSelectionGroup() != null)
1942 seqs = viewport.getSelectionGroup().getSequencesAsArray(
1943 viewport.hiddenRepSequences);
1944 start = viewport.getSelectionGroup().getStartRes();
1945 end = viewport.getSelectionGroup().getEndRes();
1949 seqs = viewport.alignment.getSequencesArray();
1952 // This is to maintain viewport position on first residue
1953 // of first sequence
1954 SequenceI seq = viewport.alignment.getSequenceAt(0);
1955 int startRes = seq.findPosition(viewport.startRes);
1957 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
1958 viewport.alignment));
1960 viewport.setStartRes(seq.findIndex(startRes) - 1);
1962 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1967 public void findMenuItem_actionPerformed()
1969 new Finder(alignPanel);
1973 * create a new view derived from the current view
1976 * @return frame for the new view
1978 public AlignFrame newView(String viewtitle)
1981 if (viewport.hasHiddenRows)
1983 newal = new Alignment(viewport.getAlignment().getHiddenSequences()
1984 .getFullAlignment().getSequencesArray());
1988 newal = new Alignment(viewport.alignment.getSequencesArray());
1991 if (viewport.alignment.getAlignmentAnnotation() != null)
1993 for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)
1995 if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)
1997 newal.addAnnotation(viewport.alignment.getAlignmentAnnotation()[i]);
2002 AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);
2004 newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();
2005 PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());
2006 PaintRefresher.Register(newaf.alignPanel,
2007 newaf.alignPanel.av.getSequenceSetId());
2009 PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,
2010 newaf.alignPanel.av.getSequenceSetId());
2011 PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,
2012 newaf.alignPanel.av.getSequenceSetId());
2014 Vector comps = (Vector) PaintRefresher.components.get(viewport
2015 .getSequenceSetId());
2017 for (int i = 0; i < comps.size(); i++)
2019 if (comps.elementAt(i) instanceof AlignmentPanel)
2025 String title = new String(this.getTitle());
2026 if (viewtitle != null)
2028 title = viewtitle + " ( " + title + ")";
2032 if (title.indexOf("(View") > -1)
2034 title = title.substring(0, title.indexOf("(View"));
2036 title += "(View " + viewSize + ")";
2039 newaf.setTitle(title.toString());
2041 newaf.viewport.historyList = viewport.historyList;
2042 newaf.viewport.redoList = viewport.redoList;
2048 * @return list of feature groups on the view
2050 public String[] getFeatureGroups()
2052 FeatureRenderer fr = null;
2053 if (alignPanel != null
2054 && (fr = alignPanel.getFeatureRenderer()) != null)
2056 return fr.getGroups();
2062 * get sequence feature groups that are hidden or shown
2068 public String[] getFeatureGroupsOfState(boolean visible)
2070 FeatureRenderer fr = null;
2071 if (alignPanel != null
2072 && (fr = alignPanel.getFeatureRenderer()) != null)
2074 return fr.getGroups(visible);
2080 * Change the display state for the given feature groups
2083 * list of group strings
2085 * visible or invisible
2087 public void setFeatureGroupState(String[] groups, boolean state)
2089 FeatureRenderer fr = null;
2090 this.sequenceFeatures.setState(true);
2091 viewport.showSequenceFeatures(true);
2092 if (alignPanel != null
2093 && (fr = alignPanel.getFeatureRenderer()) != null)
2095 fr.setGroupState(groups, state);
2096 alignPanel.seqPanel.seqCanvas.repaint();
2097 if (alignPanel.overviewPanel != null)
2099 alignPanel.overviewPanel.updateOverviewImage();
2104 public void seqLimits_itemStateChanged()
2106 viewport.setShowJVSuffix(seqLimits.getState());
2107 alignPanel.fontChanged();
2108 alignPanel.paintAlignment(true);
2111 protected void colourTextMenuItem_actionPerformed()
2113 viewport.setColourText(colourTextMenuItem.getState());
2114 alignPanel.paintAlignment(true);
2117 protected void displayNonconservedMenuItem_actionPerformed()
2119 viewport.setShowunconserved(displayNonconservedMenuItem.getState());
2120 alignPanel.paintAlignment(true);
2123 protected void wrapMenuItem_actionPerformed()
2125 viewport.setWrapAlignment(wrapMenuItem.getState());
2126 alignPanel.setWrapAlignment(wrapMenuItem.getState());
2127 scaleAbove.setEnabled(wrapMenuItem.getState());
2128 scaleLeft.setEnabled(wrapMenuItem.getState());
2129 scaleRight.setEnabled(wrapMenuItem.getState());
2130 alignPanel.paintAlignment(true);
2133 public void overviewMenuItem_actionPerformed()
2135 if (alignPanel.overviewPanel != null)
2140 Frame frame = new Frame();
2141 OverviewPanel overview = new OverviewPanel(alignPanel);
2142 frame.add(overview);
2143 // +50 must allow for applet frame window
2144 jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),
2145 overview.getPreferredSize().width,
2146 overview.getPreferredSize().height + 50);
2149 frame.addWindowListener(new WindowAdapter()
2151 public void windowClosing(WindowEvent e)
2153 alignPanel.setOverviewPanel(null);
2157 alignPanel.setOverviewPanel(overview);
2161 void changeColour(ColourSchemeI cs)
2167 if (viewport.getAbovePIDThreshold())
2169 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2172 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2174 viewport.setGlobalColourScheme(cs);
2178 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2181 if (viewport.getConservationSelected())
2184 Alignment al = (Alignment) viewport.alignment;
2185 Conservation c = new Conservation("All",
2186 ResidueProperties.propHash, 3, al.getSequences(), 0,
2190 c.verdict(false, viewport.ConsPercGaps);
2192 cs.setConservation(c);
2194 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2200 cs.setConservation(null);
2203 cs.setConsensus(viewport.hconsensus);
2206 viewport.setGlobalColourScheme(cs);
2208 if (viewport.getColourAppliesToAllGroups())
2210 Vector groups = viewport.alignment.getGroups();
2211 for (int i = 0; i < groups.size(); i++)
2213 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2220 if (cs instanceof ClustalxColourScheme)
2222 sg.cs = new ClustalxColourScheme(
2223 sg.getSequences(viewport.hiddenRepSequences),
2230 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2231 } catch (Exception ex)
2233 ex.printStackTrace();
2238 if (viewport.getAbovePIDThreshold()
2239 || cs instanceof PIDColourScheme
2240 || cs instanceof Blosum62ColourScheme)
2242 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2243 sg.cs.setConsensus(AAFrequency.calculate(
2244 sg.getSequences(viewport.hiddenRepSequences), 0,
2249 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2252 if (viewport.getConservationSelected())
2254 Conservation c = new Conservation("Group",
2255 ResidueProperties.propHash, 3,
2256 sg.getSequences(viewport.hiddenRepSequences), 0,
2257 viewport.alignment.getWidth() - 1);
2259 c.verdict(false, viewport.ConsPercGaps);
2260 sg.cs.setConservation(c);
2264 sg.cs.setConservation(null);
2265 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2271 if (alignPanel.getOverviewPanel() != null)
2273 alignPanel.getOverviewPanel().updateOverviewImage();
2276 jalview.structure.StructureSelectionManager
2277 .getStructureSelectionManager().sequenceColoursChanged(
2280 alignPanel.paintAlignment(true);
2283 protected void modifyPID_actionPerformed()
2285 if (viewport.getAbovePIDThreshold()
2286 && viewport.globalColourScheme != null)
2288 SliderPanel.setPIDSliderSource(alignPanel,
2289 viewport.getGlobalColourScheme(), "Background");
2290 SliderPanel.showPIDSlider();
2294 protected void modifyConservation_actionPerformed()
2296 if (viewport.getConservationSelected()
2297 && viewport.globalColourScheme != null)
2299 SliderPanel.setConservationSlider(alignPanel,
2300 viewport.globalColourScheme, "Background");
2301 SliderPanel.showConservationSlider();
2305 protected void conservationMenuItem_actionPerformed()
2307 viewport.setConservationSelected(conservationMenuItem.getState());
2309 viewport.setAbovePIDThreshold(false);
2310 abovePIDThreshold.setState(false);
2312 changeColour(viewport.getGlobalColourScheme());
2314 modifyConservation_actionPerformed();
2317 public void abovePIDThreshold_actionPerformed()
2319 viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
2321 conservationMenuItem.setState(false);
2322 viewport.setConservationSelected(false);
2324 changeColour(viewport.getGlobalColourScheme());
2326 modifyPID_actionPerformed();
2329 public void sortPairwiseMenuItem_actionPerformed()
2331 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2332 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
2333 .getAlignment().getSequenceAt(0), null);
2335 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2336 viewport.alignment));
2337 alignPanel.paintAlignment(true);
2340 public void sortIDMenuItem_actionPerformed()
2342 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2343 AlignmentSorter.sortByID(viewport.getAlignment());
2344 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2345 alignPanel.paintAlignment(true);
2348 public void sortLengthMenuItem_actionPerformed()
2350 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2351 AlignmentSorter.sortByLength(viewport.getAlignment());
2352 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
2353 viewport.alignment));
2354 alignPanel.paintAlignment(true);
2357 public void sortGroupMenuItem_actionPerformed()
2359 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2360 AlignmentSorter.sortByGroup(viewport.getAlignment());
2361 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
2362 viewport.alignment));
2363 alignPanel.paintAlignment(true);
2367 public void removeRedundancyMenuItem_actionPerformed()
2369 new RedundancyPanel(alignPanel);
2372 public void pairwiseAlignmentMenuItem_actionPerformed()
2374 if (viewport.getSelectionGroup() != null
2375 && viewport.getSelectionGroup().getSize() > 1)
2377 Frame frame = new Frame();
2378 frame.add(new PairwiseAlignPanel(alignPanel));
2379 jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600,
2384 public void PCAMenuItem_actionPerformed()
2386 // are the sequences aligned?
2387 if (!viewport.alignment.isAligned(false))
2390 int Width = viewport.getAlignment().getWidth();
2392 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2394 current = viewport.getAlignment().getSequenceAt(i);
2396 if (current.getLength() < Width)
2398 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2401 alignPanel.paintAlignment(true);
2404 if ((viewport.getSelectionGroup() != null
2405 && viewport.getSelectionGroup().getSize() < 4 && viewport
2406 .getSelectionGroup().getSize() > 0)
2407 || viewport.getAlignment().getHeight() < 4)
2414 new PCAPanel(viewport);
2415 } catch (java.lang.OutOfMemoryError ex)
2421 public void averageDistanceTreeMenuItem_actionPerformed()
2423 NewTreePanel("AV", "PID", "Average distance tree using PID");
2426 public void neighbourTreeMenuItem_actionPerformed()
2428 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2431 protected void njTreeBlosumMenuItem_actionPerformed()
2433 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2436 protected void avTreeBlosumMenuItem_actionPerformed()
2438 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2441 void NewTreePanel(String type, String pwType, String title)
2443 // are the sequences aligned?
2444 if (!viewport.alignment.isAligned(false))
2447 int Width = viewport.getAlignment().getWidth();
2449 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2451 current = viewport.getAlignment().getSequenceAt(i);
2453 if (current.getLength() < Width)
2455 current.insertCharAt(Width - 1, viewport.getGapCharacter());
2458 alignPanel.paintAlignment(true);
2462 if ((viewport.getSelectionGroup() != null && viewport
2463 .getSelectionGroup().getSize() > 1)
2464 || (viewport.getSelectionGroup() == null && viewport.alignment
2467 final TreePanel tp = new TreePanel(alignPanel, type, pwType);
2469 addTreeMenuItem(tp, title);
2471 jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);
2475 void loadTree_actionPerformed()
2477 CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);
2478 cap.setText("Paste your Newick tree file here.");
2479 cap.setTreeImport();
2480 Frame frame = new Frame();
2482 jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);
2485 public void loadTree(jalview.io.NewickFile tree, String treeFile)
2487 TreePanel tp = new TreePanel(alignPanel, treeFile, "From File - ", tree);
2488 jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
2489 addTreeMenuItem(tp, treeFile);
2493 * sort the alignment using the given treePanel
2496 * tree used to sort view
2498 * string used for undo event name
2500 public void sortByTree(TreePanel treePanel, String title)
2502 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2504 .sortByTree(viewport.getAlignment(), treePanel.getTree());
2505 // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2506 // HistoryItem.SORT));
2507 addHistoryItem(new OrderCommand("Order by " + title, oldOrder,
2508 viewport.alignment));
2509 alignPanel.paintAlignment(true);
2513 * Do any automatic reordering of the alignment and add the necessary bits to
2514 * the menu structure for the new tree
2519 protected void addTreeMenuItem(final TreePanel treePanel,
2522 final MenuItem item = new MenuItem(title);
2523 sortByTreeMenu.add(item);
2524 item.addActionListener(new java.awt.event.ActionListener()
2526 public void actionPerformed(ActionEvent evt)
2528 sortByTree(treePanel, title); // treePanel.getTitle());
2532 treePanel.addWindowListener(new WindowAdapter()
2534 public void windowOpened(WindowEvent e)
2536 if (viewport.sortByTree)
2538 sortByTree(treePanel, title);
2540 super.windowOpened(e);
2543 public void windowClosing(WindowEvent e)
2545 sortByTreeMenu.remove(item);
2549 public boolean sortBy(AlignmentOrder alorder, String undoname)
2551 SequenceI[] oldOrder = viewport.getAlignment()
2552 .getSequencesArray();
2553 if (viewport.applet.debug)
2555 System.err.println("Sorting "+alorder.getOrder().size()+" in alignment '"+getTitle()+"'");
2557 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
2560 addHistoryItem(new OrderCommand(undoname, oldOrder, viewport.alignment));
2562 alignPanel.paintAlignment(true);
2565 protected void documentation_actionPerformed()
2567 showURL("http://www.jalview.org/help.html", "HELP");
2570 protected void about_actionPerformed()
2573 class AboutPanel extends Canvas
2579 public AboutPanel(String version, String builddate)
2581 this.version = version;
2582 this.builddate = builddate;
2585 public void paint(Graphics g)
2587 g.setColor(Color.white);
2588 g.fillRect(0, 0, getSize().width, getSize().height);
2589 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2590 FontMetrics fm = g.getFontMetrics();
2591 int fh = fm.getHeight();
2593 g.setColor(Color.black);
2594 // TODO: update this text for each release or centrally store it for
2595 // lite and application
2596 g.setFont(new Font("Helvetica", Font.BOLD, 14));
2597 g.drawString("JalviewLite - Release " + version, x, y += fh);
2598 g.setFont(new Font("Helvetica", Font.BOLD, 12));
2599 g.drawString("Build date: " + builddate, x, y += fh);
2600 g.setFont(new Font("Helvetica", Font.PLAIN, 12));
2602 "Authors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,",
2604 g.drawString("David Martin & Geoff Barton.", x + 50, y += fh);
2606 "Development managed by The Barton Group, University of Dundee, Scotland, UK.",
2609 "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
2611 g.drawString("If you use Jalview, please cite:", x, y += fh + 8);
2613 "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",
2616 "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",
2618 g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",
2623 Frame frame = new Frame();
2624 frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite
2626 jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
2630 public void showURL(String url, String target)
2632 if (viewport.applet == null)
2634 System.out.println("Not running as applet - no browser available.");
2640 if (url.indexOf(":") == -1)
2642 // TODO: verify (Bas Vroling bug) prepend codebase or server URL to
2644 if (url.indexOf("/") == 0)
2646 String codebase = viewport.applet.getCodeBase().toString();
2647 url = codebase.substring(0, codebase.length()
2648 - viewport.applet.getCodeBase().getFile().length())
2653 url = viewport.applet.getCodeBase() + url;
2655 System.out.println("Show url (prepended codebase): " + url);
2659 System.out.println("Show url: " + url);
2661 if (url.indexOf("javascript:") == 0)
2663 // no target for the javascript context
2664 viewport.applet.getAppletContext().showDocument(
2665 new java.net.URL(url));
2669 viewport.applet.getAppletContext().showDocument(
2670 new java.net.URL(url), target);
2672 } catch (Exception ex)
2674 ex.printStackTrace();
2679 // ////////////////////////////////////////////////////////////////////////////////
2680 // JBuilder Graphics here
2682 MenuBar alignFrameMenuBar = new MenuBar();
2684 Menu fileMenu = new Menu("File");
2686 MenuItem loadApplication = new MenuItem("View in Full Application");
2688 MenuItem loadTree = new MenuItem("Load Associated Tree ...");
2690 MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");
2692 MenuItem outputFeatures = new MenuItem("Export Features ...");
2694 MenuItem outputAnnotations = new MenuItem("Export Annotations ...");
2696 MenuItem closeMenuItem = new MenuItem("Close");
2698 Menu editMenu = new Menu("Edit");
2700 Menu viewMenu = new Menu("View");
2702 Menu colourMenu = new Menu("Colour");
2704 Menu calculateMenu = new Menu("Calculate");
2706 MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");
2708 MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");
2710 MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");
2712 MenuItem remove2LeftMenuItem = new MenuItem();
2714 MenuItem remove2RightMenuItem = new MenuItem();
2716 MenuItem removeGappedColumnMenuItem = new MenuItem();
2718 MenuItem removeAllGapsMenuItem = new MenuItem();
2720 CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();
2722 CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();
2724 MenuItem sortPairwiseMenuItem = new MenuItem();
2726 MenuItem sortIDMenuItem = new MenuItem();
2728 MenuItem sortLengthMenuItem = new MenuItem();
2730 MenuItem sortGroupMenuItem = new MenuItem();
2732 MenuItem removeRedundancyMenuItem = new MenuItem();
2734 MenuItem pairwiseAlignmentMenuItem = new MenuItem();
2736 MenuItem PCAMenuItem = new MenuItem();
2738 MenuItem averageDistanceTreeMenuItem = new MenuItem();
2740 MenuItem neighbourTreeMenuItem = new MenuItem();
2742 BorderLayout borderLayout1 = new BorderLayout();
2744 public Label statusBar = new Label();
2746 Menu outputTextboxMenu = new Menu();
2748 MenuItem clustalColour = new MenuItem();
2750 MenuItem zappoColour = new MenuItem();
2752 MenuItem taylorColour = new MenuItem();
2754 MenuItem hydrophobicityColour = new MenuItem();
2756 MenuItem helixColour = new MenuItem();
2758 MenuItem strandColour = new MenuItem();
2760 MenuItem turnColour = new MenuItem();
2762 MenuItem buriedColour = new MenuItem();
2764 MenuItem userDefinedColour = new MenuItem();
2766 MenuItem PIDColour = new MenuItem();
2768 MenuItem BLOSUM62Colour = new MenuItem();
2770 MenuItem njTreeBlosumMenuItem = new MenuItem();
2772 MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();
2774 CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();
2776 CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
2778 CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
2780 MenuItem alProperties = new MenuItem("Alignment Properties...");
2782 MenuItem overviewMenuItem = new MenuItem();
2784 MenuItem undoMenuItem = new MenuItem();
2786 MenuItem redoMenuItem = new MenuItem();
2788 CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
2790 MenuItem noColourmenuItem = new MenuItem();
2792 CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();
2794 CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();
2796 MenuItem findMenuItem = new MenuItem();
2798 CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();
2800 MenuItem nucleotideColour = new MenuItem();
2802 MenuItem deleteGroups = new MenuItem();
2804 MenuItem grpsFromSelection = new MenuItem();
2806 MenuItem delete = new MenuItem();
2808 MenuItem copy = new MenuItem();
2810 MenuItem cut = new MenuItem();
2812 Menu pasteMenu = new Menu();
2814 MenuItem pasteNew = new MenuItem();
2816 MenuItem pasteThis = new MenuItem();
2818 CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();
2820 MenuItem font = new MenuItem();
2822 CheckboxMenuItem scaleAbove = new CheckboxMenuItem();
2824 CheckboxMenuItem scaleLeft = new CheckboxMenuItem();
2826 CheckboxMenuItem scaleRight = new CheckboxMenuItem();
2828 MenuItem modifyPID = new MenuItem();
2830 MenuItem modifyConservation = new MenuItem();
2832 CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
2833 "Autocalculate Consensus", true);
2835 Menu sortByTreeMenu = new Menu();
2837 Menu sort = new Menu();
2839 Menu calculate = new Menu();
2841 MenuItem inputText = new MenuItem();
2843 Menu helpMenu = new Menu();
2845 MenuItem documentation = new MenuItem();
2847 MenuItem about = new MenuItem();
2849 CheckboxMenuItem seqLimits = new CheckboxMenuItem();
2851 CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem();
2853 CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
2854 Menu autoAnnMenu=new Menu();
2855 CheckboxMenuItem showSequenceLogo= new CheckboxMenuItem();
2856 CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
2857 CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem();
2858 CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem();
2859 CheckboxMenuItem showGroupConservation = new CheckboxMenuItem();
2861 private void jbInit() throws Exception
2864 setMenuBar(alignFrameMenuBar);
2868 // dynamically fill save as menu with available formats
2869 for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
2872 item = new MenuItem(
2873 jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
2875 item.addActionListener(new java.awt.event.ActionListener()
2877 public void actionPerformed(ActionEvent e)
2879 outputText_actionPerformed(e);
2883 outputTextboxMenu.add(item);
2885 closeMenuItem.addActionListener(this);
2886 loadApplication.addActionListener(this);
2888 loadTree.addActionListener(this);
2889 loadAnnotations.addActionListener(this);
2890 outputFeatures.addActionListener(this);
2891 outputAnnotations.addActionListener(this);
2892 selectAllSequenceMenuItem.addActionListener(this);
2893 deselectAllSequenceMenuItem.addActionListener(this);
2894 invertSequenceMenuItem.addActionListener(this);
2895 remove2LeftMenuItem.setLabel("Remove Left");
2896 remove2LeftMenuItem.addActionListener(this);
2897 remove2RightMenuItem.setLabel("Remove Right");
2898 remove2RightMenuItem.addActionListener(this);
2899 removeGappedColumnMenuItem.setLabel("Remove Empty Columns");
2900 removeGappedColumnMenuItem.addActionListener(this);
2901 removeAllGapsMenuItem.setLabel("Remove All Gaps");
2902 removeAllGapsMenuItem.addActionListener(this);
2903 viewBoxesMenuItem.setLabel("Boxes");
2904 viewBoxesMenuItem.setState(true);
2905 viewBoxesMenuItem.addItemListener(this);
2906 viewTextMenuItem.setLabel("Text");
2907 viewTextMenuItem.setState(true);
2908 viewTextMenuItem.addItemListener(this);
2909 sortPairwiseMenuItem.setLabel("by Pairwise Identity");
2910 sortPairwiseMenuItem.addActionListener(this);
2911 sortIDMenuItem.setLabel("by ID");
2912 sortIDMenuItem.addActionListener(this);
2913 sortLengthMenuItem.setLabel("by Length");
2914 sortLengthMenuItem.addActionListener(this);
2915 sortGroupMenuItem.setLabel("by Group");
2916 sortGroupMenuItem.addActionListener(this);
2917 removeRedundancyMenuItem.setLabel("Remove Redundancy...");
2918 removeRedundancyMenuItem.addActionListener(this);
2919 pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");
2920 pairwiseAlignmentMenuItem.addActionListener(this);
2921 PCAMenuItem.setLabel("Principal Component Analysis");
2922 PCAMenuItem.addActionListener(this);
2923 averageDistanceTreeMenuItem
2924 .setLabel("Average Distance Using % Identity");
2925 averageDistanceTreeMenuItem.addActionListener(this);
2926 neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");
2927 neighbourTreeMenuItem.addActionListener(this);
2928 statusBar.setBackground(Color.white);
2929 statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
2930 statusBar.setText("Status bar");
2931 outputTextboxMenu.setLabel("Output to Textbox");
2932 clustalColour.setLabel("Clustalx");
2934 clustalColour.addActionListener(this);
2935 zappoColour.setLabel("Zappo");
2936 zappoColour.addActionListener(this);
2937 taylorColour.setLabel("Taylor");
2938 taylorColour.addActionListener(this);
2939 hydrophobicityColour.setLabel("Hydrophobicity");
2940 hydrophobicityColour.addActionListener(this);
2941 helixColour.setLabel("Helix Propensity");
2942 helixColour.addActionListener(this);
2943 strandColour.setLabel("Strand Propensity");
2944 strandColour.addActionListener(this);
2945 turnColour.setLabel("Turn Propensity");
2946 turnColour.addActionListener(this);
2947 buriedColour.setLabel("Buried Index");
2948 buriedColour.addActionListener(this);
2949 userDefinedColour.setLabel("User Defined...");
2950 userDefinedColour.addActionListener(this);
2951 PIDColour.setLabel("Percentage Identity");
2952 PIDColour.addActionListener(this);
2953 BLOSUM62Colour.setLabel("BLOSUM62 Score");
2954 BLOSUM62Colour.addActionListener(this);
2955 avDistanceTreeBlosumMenuItem
2956 .setLabel("Average Distance Using BLOSUM62");
2957 avDistanceTreeBlosumMenuItem.addActionListener(this);
2958 njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");
2959 njTreeBlosumMenuItem.addActionListener(this);
2960 annotationPanelMenuItem.setLabel("Show Annotations");
2961 annotationPanelMenuItem.addItemListener(this);
2962 colourTextMenuItem.setLabel("Colour Text");
2963 colourTextMenuItem.addItemListener(this);
2964 displayNonconservedMenuItem.setLabel("Show nonconserved");
2965 displayNonconservedMenuItem.addItemListener(this);
2966 alProperties.addActionListener(this);
2967 overviewMenuItem.setLabel("Overview Window");
2968 overviewMenuItem.addActionListener(this);
2969 undoMenuItem.setEnabled(false);
2970 undoMenuItem.setLabel("Undo");
2971 undoMenuItem.addActionListener(this);
2972 redoMenuItem.setEnabled(false);
2973 redoMenuItem.setLabel("Redo");
2974 redoMenuItem.addActionListener(this);
2975 conservationMenuItem.setLabel("by Conservation");
2976 conservationMenuItem.addItemListener(this);
2977 noColourmenuItem.setLabel("None");
2978 noColourmenuItem.addActionListener(this);
2979 wrapMenuItem.setLabel("Wrap");
2980 wrapMenuItem.addItemListener(this);
2981 renderGapsMenuItem.setLabel("Show Gaps");
2982 renderGapsMenuItem.setState(true);
2983 renderGapsMenuItem.addItemListener(this);
2984 findMenuItem.setLabel("Find...");
2985 findMenuItem.addActionListener(this);
2986 abovePIDThreshold.setLabel("Above Identity Threshold");
2987 abovePIDThreshold.addItemListener(this);
2988 nucleotideColour.setLabel("Nucleotide");
2989 nucleotideColour.addActionListener(this);
2990 deleteGroups.setLabel("Undefine Groups");
2991 deleteGroups.addActionListener(this);
2992 grpsFromSelection.setLabel("Make Groups for selection");
2993 grpsFromSelection.addActionListener(this);
2994 copy.setLabel("Copy");
2995 copy.addActionListener(this);
2996 cut.setLabel("Cut");
2997 cut.addActionListener(this);
2998 delete.setLabel("Delete");
2999 delete.addActionListener(this);
3000 pasteMenu.setLabel("Paste");
3001 pasteNew.setLabel("To New Alignment");
3002 pasteNew.addActionListener(this);
3003 pasteThis.setLabel("Add To This Alignment");
3004 pasteThis.addActionListener(this);
3005 applyToAllGroups.setLabel("Apply Colour To All Groups");
3006 applyToAllGroups.setState(true);
3007 applyToAllGroups.addItemListener(this);
3008 font.setLabel("Font...");
3009 font.addActionListener(this);
3010 scaleAbove.setLabel("Scale Above");
3011 scaleAbove.setState(true);
3012 scaleAbove.setEnabled(false);
3013 scaleAbove.addItemListener(this);
3014 scaleLeft.setEnabled(false);
3015 scaleLeft.setState(true);
3016 scaleLeft.setLabel("Scale Left");
3017 scaleLeft.addItemListener(this);
3018 scaleRight.setEnabled(false);
3019 scaleRight.setState(true);
3020 scaleRight.setLabel("Scale Right");
3021 scaleRight.addItemListener(this);
3022 modifyPID.setLabel("Modify Identity Threshold...");
3023 modifyPID.addActionListener(this);
3024 modifyConservation.setLabel("Modify Conservation Threshold...");
3025 modifyConservation.addActionListener(this);
3026 sortByTreeMenu.setLabel("By Tree Order");
3027 sort.setLabel("Sort");
3028 calculate.setLabel("Calculate Tree");
3029 autoCalculate.addItemListener(this);
3030 inputText.setLabel("Input from textbox");
3031 inputText.addActionListener(this);
3032 centreColumnLabelFlag.setLabel("Centre column labels");
3033 centreColumnLabelFlag.addItemListener(this);
3034 followMouseOverFlag.setLabel("Automatic Scrolling");
3035 followMouseOverFlag.addItemListener(this);
3036 helpMenu.setLabel("Help");
3037 documentation.setLabel("Documentation");
3038 documentation.addActionListener(this);
3040 about.setLabel("About...");
3041 about.addActionListener(this);
3042 seqLimits.setState(true);
3043 seqLimits.setLabel("Show Sequence Limits");
3044 seqLimits.addItemListener(this);
3045 featureSettings.setLabel("Feature Settings...");
3046 featureSettings.addActionListener(this);
3047 sequenceFeatures.setLabel("Sequence Features");
3048 sequenceFeatures.addItemListener(this);
3049 sequenceFeatures.setState(false);
3050 annotationColour.setLabel("by Annotation...");
3051 annotationColour.addActionListener(this);
3052 invertSequenceMenuItem.setLabel("Invert Sequence Selection");
3053 invertColSel.setLabel("Invert Column Selection");
3054 menu1.setLabel("Show");
3055 showColumns.setLabel("All Columns ");
3056 showSeqs.setLabel("All Sequences");
3057 menu2.setLabel("Hide");
3058 hideColumns.setLabel("Selected Columns");
3059 hideSequences.setLabel("Selected Sequences");
3060 hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)");
3061 hideAllSelection.setLabel("Selected Region");
3062 showAllHidden.setLabel("All Sequences and Columns");
3063 showGroupConsensus.setLabel("Group Consensus");
3064 showGroupConservation.setLabel("Group Conservation");
3065 showConsensusHistogram.setLabel("Show Consensus Histogram");
3066 showSequenceLogo.setLabel("Show Consensus Logo");
3067 applyAutoAnnotationSettings.setLabel("Apply to all groups");
3068 applyAutoAnnotationSettings.setState(true);
3069 autoAnnMenu.setLabel("Autocalculated Annotation");
3071 invertColSel.addActionListener(this);
3072 showColumns.addActionListener(this);
3073 showSeqs.addActionListener(this);
3074 hideColumns.addActionListener(this);
3075 hideSequences.addActionListener(this);
3076 hideAllButSelection.addActionListener(this);
3077 hideAllSelection.addActionListener(this);
3078 showAllHidden.addActionListener(this);
3079 showGroupConsensus.addItemListener(this);
3080 showGroupConservation.addItemListener(this);
3081 showConsensusHistogram.addItemListener(this);
3082 showSequenceLogo.addItemListener(this);
3083 applyAutoAnnotationSettings.addItemListener(this);
3084 formatMenu.setLabel("Format");
3085 selectMenu.setLabel("Select");
3086 newView.setLabel("New View");
3087 newView.addActionListener(this);
3088 alignFrameMenuBar.add(fileMenu);
3089 alignFrameMenuBar.add(editMenu);
3090 alignFrameMenuBar.add(selectMenu);
3091 alignFrameMenuBar.add(viewMenu);
3092 alignFrameMenuBar.add(formatMenu);
3093 alignFrameMenuBar.add(colourMenu);
3094 alignFrameMenuBar.add(calculateMenu);
3095 alignFrameMenuBar.add(helpMenu);
3097 fileMenu.add(inputText);
3098 fileMenu.add(loadTree);
3099 fileMenu.add(loadAnnotations);
3101 fileMenu.addSeparator();
3102 fileMenu.add(outputTextboxMenu);
3103 fileMenu.add(outputFeatures);
3104 fileMenu.add(outputAnnotations);
3106 if (jalviewServletURL != null)
3108 fileMenu.add(loadApplication);
3111 fileMenu.addSeparator();
3112 fileMenu.add(closeMenuItem);
3114 editMenu.add(undoMenuItem);
3115 editMenu.add(redoMenuItem);
3118 editMenu.add(pasteMenu);
3119 editMenu.add(delete);
3120 editMenu.addSeparator();
3121 editMenu.add(remove2LeftMenuItem);
3122 editMenu.add(remove2RightMenuItem);
3123 editMenu.add(removeGappedColumnMenuItem);
3124 editMenu.add(removeAllGapsMenuItem);
3125 editMenu.add(removeRedundancyMenuItem);
3126 viewMenu.add(newView);
3127 viewMenu.addSeparator();
3128 viewMenu.add(menu1);
3129 viewMenu.add(menu2);
3130 viewMenu.addSeparator();
3131 viewMenu.add(followMouseOverFlag);
3132 viewMenu.add(annotationPanelMenuItem);
3133 autoAnnMenu.add(applyAutoAnnotationSettings);
3134 autoAnnMenu.add(showConsensusHistogram);
3135 autoAnnMenu.add(showSequenceLogo);
3136 autoAnnMenu.addSeparator();
3137 autoAnnMenu.add(showGroupConservation);
3138 autoAnnMenu.add(showGroupConsensus);
3139 viewMenu.add(autoAnnMenu);
3140 viewMenu.addSeparator();
3141 viewMenu.add(sequenceFeatures);
3142 viewMenu.add(featureSettings);
3143 viewMenu.addSeparator();
3144 viewMenu.add(alProperties);
3145 viewMenu.addSeparator();
3146 viewMenu.add(overviewMenuItem);
3147 colourMenu.add(applyToAllGroups);
3148 colourMenu.addSeparator();
3149 colourMenu.add(noColourmenuItem);
3150 colourMenu.add(clustalColour);
3151 colourMenu.add(BLOSUM62Colour);
3152 colourMenu.add(PIDColour);
3153 colourMenu.add(zappoColour);
3154 colourMenu.add(taylorColour);
3155 colourMenu.add(hydrophobicityColour);
3156 colourMenu.add(helixColour);
3157 colourMenu.add(strandColour);
3158 colourMenu.add(turnColour);
3159 colourMenu.add(buriedColour);
3160 colourMenu.add(nucleotideColour);
3161 colourMenu.add(userDefinedColour);
3162 colourMenu.addSeparator();
3163 colourMenu.add(conservationMenuItem);
3164 colourMenu.add(modifyConservation);
3165 colourMenu.add(abovePIDThreshold);
3166 colourMenu.add(modifyPID);
3167 colourMenu.add(annotationColour);
3168 calculateMenu.add(sort);
3169 calculateMenu.add(calculate);
3170 calculateMenu.addSeparator();
3171 calculateMenu.add(pairwiseAlignmentMenuItem);
3172 calculateMenu.add(PCAMenuItem);
3173 calculateMenu.add(autoCalculate);
3174 this.add(statusBar, BorderLayout.SOUTH);
3175 pasteMenu.add(pasteNew);
3176 pasteMenu.add(pasteThis);
3177 sort.add(sortIDMenuItem);
3178 sort.add(sortLengthMenuItem);
3179 sort.add(sortByTreeMenu);
3180 sort.add(sortGroupMenuItem);
3181 sort.add(sortPairwiseMenuItem);
3182 calculate.add(averageDistanceTreeMenuItem);
3183 calculate.add(neighbourTreeMenuItem);
3184 calculate.add(avDistanceTreeBlosumMenuItem);
3185 calculate.add(njTreeBlosumMenuItem);
3186 helpMenu.add(documentation);
3187 helpMenu.add(about);
3188 menu1.add(showColumns);
3189 menu1.add(showSeqs);
3190 menu1.add(showAllHidden);
3191 menu2.add(hideColumns);
3192 menu2.add(hideSequences);
3193 menu2.add(hideAllSelection);
3194 menu2.add(hideAllButSelection);
3195 formatMenu.add(font);
3196 formatMenu.add(seqLimits);
3197 formatMenu.add(wrapMenuItem);
3198 formatMenu.add(scaleAbove);
3199 formatMenu.add(scaleLeft);
3200 formatMenu.add(scaleRight);
3201 formatMenu.add(viewBoxesMenuItem);
3202 formatMenu.add(viewTextMenuItem);
3203 formatMenu.add(colourTextMenuItem);
3204 formatMenu.add(displayNonconservedMenuItem);
3205 formatMenu.add(renderGapsMenuItem);
3206 formatMenu.add(centreColumnLabelFlag);
3207 selectMenu.add(findMenuItem);
3208 selectMenu.addSeparator();
3209 selectMenu.add(selectAllSequenceMenuItem);
3210 selectMenu.add(deselectAllSequenceMenuItem);
3211 selectMenu.add(invertSequenceMenuItem);
3212 selectMenu.add(invertColSel);
3213 selectMenu.add(grpsFromSelection);
3214 selectMenu.add(deleteGroups);
3218 MenuItem featureSettings = new MenuItem();
3220 CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();
3222 MenuItem annotationColour = new MenuItem();
3224 MenuItem invertColSel = new MenuItem();
3226 Menu menu1 = new Menu();
3228 MenuItem showColumns = new MenuItem();
3230 MenuItem showSeqs = new MenuItem();
3232 Menu menu2 = new Menu();
3234 MenuItem hideColumns = new MenuItem();
3236 MenuItem hideSequences = new MenuItem();
3238 MenuItem hideAllButSelection = new MenuItem();
3240 MenuItem hideAllSelection = new MenuItem();
3242 MenuItem showAllHidden = new MenuItem();
3244 Menu formatMenu = new Menu();
3246 Menu selectMenu = new Menu();
3248 MenuItem newView = new MenuItem();
3251 * Attach the alignFrame panels after embedding menus, if necessary. This used
3252 * to be called setEmbedded, but is now creates the dropdown menus in a
3253 * platform independent manner to avoid OSX/Mac menu appendage daftness.
3255 * @param reallyEmbedded
3256 * true to attach the view to the applet area on the page rather than
3259 public void createAlignFrameWindow(boolean reallyEmbedded, String title)
3264 // Explicly build the embedded menu panel for the on-page applet
3266 // view cannot be closed if its actually on the page
3267 fileMenu.remove(closeMenuItem);
3268 fileMenu.remove(3); // Remove Seperator
3269 embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
3270 Font.PLAIN, 10, false); // use our own fonts.
3271 // and actually add the components to the applet area
3272 viewport.applet.setLayout(new BorderLayout());
3273 viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
3274 viewport.applet.add(statusBar, BorderLayout.SOUTH);
3275 alignPanel.setSize(viewport.applet.getSize().width,
3276 viewport.applet.getSize().height - embeddedMenu.HEIGHT
3277 - statusBar.HEIGHT);
3278 viewport.applet.add(alignPanel, BorderLayout.CENTER);
3279 final AlignFrame me = this;
3280 viewport.applet.addFocusListener(new FocusListener()
3284 public void focusLost(FocusEvent e)
3286 if (me.viewport.applet.currentAlignFrame==me) {
3287 me.viewport.applet.currentAlignFrame = null;
3291 public void focusGained(FocusEvent e)
3293 me.viewport.applet.currentAlignFrame = me;
3296 viewport.applet.validate();
3301 // test and embed menu bar if necessary.
3303 if (embedMenuIfNeeded(alignPanel))
3305 // adjust for status bar height too
3306 alignPanel.setSize(getSize().width, getSize().height
3307 - statusBar.HEIGHT);
3309 add(statusBar, BorderLayout.SOUTH);
3310 add(alignPanel, BorderLayout.CENTER);
3311 // and register with the applet so it can pass external API calls to us
3312 jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
3318 * create a new binding between structures in an existing jmol viewer instance
3319 * and an alignpanel with sequences that have existing PDBFile entries. Note,
3320 * this does not open a new Jmol window, or modify the display of the
3321 * structures in the original jmol window. Note This method doesn't work
3322 * without an additional javascript library to exchange messages between the
3323 * distinct applets. See http://issues.jalview.org/browse/JAL-621
3326 * JmolViewer instance
3327 * @param sequenceIds
3328 * - sequence Ids to search for associations
3330 public SequenceStructureBinding addStructureViewInstance(
3331 Object jmolviewer, String[] sequenceIds)
3333 org.jmol.api.JmolViewer viewer = null;
3336 viewer = (org.jmol.api.JmolViewer) jmolviewer;
3337 } catch (ClassCastException ex)
3339 System.err.println("Unsupported viewer object :"
3340 + jmolviewer.getClass());
3344 System.err.println("Can't use this object as a structure viewer:"
3345 + jmolviewer.getClass());
3348 SequenceI[] seqs = null;
3349 if (sequenceIds == null || sequenceIds.length == 0)
3351 seqs = viewport.getAlignment().getSequencesArray();
3355 Vector sqi = new Vector();
3356 AlignmentI al = viewport.getAlignment();
3357 for (int sid = 0; sid < sequenceIds.length; sid++)
3359 SequenceI sq = al.findName(sequenceIds[sid]);
3367 seqs = new SequenceI[sqi.size()];
3368 for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++)
3370 seqs[sid] = (SequenceI) sqi.elementAt(sid);
3379 // TODO: search for a jmv that involves viewer
3381 { // create a new viewer/jalview binding.
3382 jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][] {seqs});
3388 public boolean addPdbFile(String sequenceId, String pdbEntryString,
3391 SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId);
3392 boolean needtoadd = false;
3393 if (toaddpdb != null)
3395 Vector pdbe = toaddpdb.getPDBId();
3396 PDBEntry pdbentry = null;
3397 if (pdbe != null && pdbe.size() > 0)
3399 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
3401 pdbentry = (PDBEntry) pdbe.elementAt(pe);
3402 if (!pdbentry.getId().equals(pdbEntryString)
3403 && !pdbentry.getFile().equals(pdbFile))
3413 if (pdbentry == null)
3415 pdbentry = new PDBEntry();
3416 pdbentry.setId(pdbEntryString);
3417 pdbentry.setFile(pdbFile);
3418 needtoadd = true; // add this new entry to sequence.
3420 // resolve data source
3421 // TODO: this code should be a refactored to an io package
3422 String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB");
3423 if (protocol == null)
3429 // make a note of the access mode and add
3430 if (pdbentry.getProperty() == null)
3432 pdbentry.setProperty(new Hashtable());
3434 pdbentry.getProperty().put("protocol", protocol);
3435 toaddpdb.addPDBId(pdbentry);
3441 private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains)
3445 Vector sequences = new Vector();
3446 for (int i = 0; i < seqs.length; i++)
3448 if (seqs[i] != null)
3450 sequences.addElement(new Object[]
3451 { seqs[i], (chains != null) ? chains[i] : null });
3454 seqs = new SequenceI[sequences.size()];
3455 chains = new String[sequences.size()];
3456 for (int i = 0, isize = sequences.size(); i < isize; i++)
3458 Object[] oj = (Object[]) sequences.elementAt(i);
3460 seqs[i] = (SequenceI) oj[0];
3461 chains[i] = (String) oj[1];
3469 public void newStructureView(JalviewLite applet, PDBEntry pdb,
3470 SequenceI[] seqs, String[] chains, String protocol)
3472 // Scrub any null sequences from the array
3473 Object[] sqch = cleanSeqChainArrays(seqs, chains);
3474 seqs = (SequenceI[]) sqch[0];
3475 chains = (String[]) sqch[1];
3476 if (seqs == null || seqs.length == 0)
3479 .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to.");
3481 if (protocol == null || protocol.trim().length() == 0
3482 || protocol.equals("null"))
3484 protocol = (String) pdb.getProperty().get("protocol");
3485 if (protocol == null)
3487 System.err.println("Couldn't work out protocol to open structure: "
3492 if (applet.isAlignPdbStructures() && applet.jmolAvailable)
3494 // can only do alignments with Jmol
3495 // find the last jmol window assigned to this alignment
3496 jalview.appletgui.AppletJmol ajm = null, tajm;
3497 Vector jmols = applet
3498 .getAppletWindow(jalview.appletgui.AppletJmol.class);
3499 for (int i = 0, iSize = jmols.size(); i < iSize; i++)
3501 tajm = (jalview.appletgui.AppletJmol) jmols.elementAt(i);
3502 if (tajm.ap.alignFrame == this)
3511 .println("Incremental adding and aligning structure to existing Jmol view not yet implemented.");
3512 // try and add the pdb structure
3517 // otherwise, create a new window
3518 if (applet.jmolAvailable)
3520 new jalview.appletgui.AppletJmol(pdb, seqs, chains, alignPanel,
3522 applet.lastFrameX += 40;
3523 applet.lastFrameY += 40;
3527 new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol);
3532 public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb,
3533 SequenceI[][] seqs, String[][] chains, String[] protocols)
3535 // TODO Auto-generated method stub
3536 System.err.println("Aligned Structure View: Not yet implemented.");
3540 * modify the current selection, providing the user has not made a selection already.
3541 * @param sel - sequences from this alignment
3542 * @param csel - columns to be selected on the alignment
3544 public void select(SequenceGroup sel, ColumnSelection csel)
3546 alignPanel.seqPanel.selection(sel, csel, null);