X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignFrame.java;h=ab99e065edd79a2053a65ca1de46f243d9e88ccc;hb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;hp=0aefe9b01b51d544ce42103ceb58fea4f0c904a2;hpb=6b544d4a85673db44b7f75f40c22d9b7425d444e;p=jalview.git diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java old mode 100755 new mode 100644 index 0aefe9b..ab99e06 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -1,35 +1,94 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) + * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * + * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.appletgui; -import java.io.*; -import java.net.*; -import java.util.*; - -import java.awt.*; -import java.awt.event.*; - -import jalview.analysis.*; +import jalview.analysis.AlignmentSorter; +import jalview.analysis.Conservation; +import jalview.api.SequenceStructureBinding; import jalview.bin.JalviewLite; -import jalview.commands.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.schemes.*; +import jalview.commands.CommandI; +import jalview.commands.EditCommand; +import jalview.commands.OrderCommand; +import jalview.commands.RemoveGapColCommand; +import jalview.commands.RemoveGapsCommand; +import jalview.commands.SlideSequencesCommand; +import jalview.commands.TrimRegionCommand; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.AlignmentOrder; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.io.AnnotationFile; +import jalview.io.AppletFormatAdapter; +import jalview.io.FeaturesFile; +import jalview.io.TCoffeeScoreFile; +import jalview.schemes.Blosum62ColourScheme; +import jalview.schemes.BuriedColourScheme; +import jalview.schemes.ClustalxColourScheme; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.HelixColourScheme; +import jalview.schemes.HydrophobicColourScheme; +import jalview.schemes.NucleotideColourScheme; +import jalview.schemes.PIDColourScheme; +import jalview.schemes.PurinePyrimidineColourScheme; +import jalview.schemes.RNAHelicesColourChooser; +import jalview.schemes.ResidueProperties; +import jalview.schemes.StrandColourScheme; +import jalview.schemes.TCoffeeColourScheme; +import jalview.schemes.TaylorColourScheme; +import jalview.schemes.TurnColourScheme; +import jalview.schemes.ZappoColourScheme; +import jalview.structure.StructureSelectionManager; + +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.awt.CheckboxMenuItem; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Label; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.IOException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.List; +import java.util.StringTokenizer; +import java.util.Vector; public class AlignFrame extends EmbmenuFrame implements ActionListener, ItemListener, KeyListener @@ -47,7 +106,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded) { - if (applet != null) { jalviewServletURL = applet.getParameter("APPLICATION_URL"); @@ -68,7 +126,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.updateConsensus(alignPanel); annotationPanelMenuItem.setState(viewport.showAnnotation); - displayNonconservedMenuItem.setState(viewport.getShowunconserved()); + displayNonconservedMenuItem.setState(viewport.getShowUnconserved()); + followMouseOverFlag.setState(viewport.getFollowHighlight()); + showGroupConsensus.setState(viewport.isShowGroupConsensus()); + showGroupConservation.setState(viewport.isShowGroupConservation()); + showConsensusHistogram.setState(viewport.isShowConsensusHistogram()); + showSequenceLogo.setState(viewport.isShowSequenceLogo()); + normSequenceLogo.setState(viewport.isNormaliseSequenceLogo()); seqLimits.setState(viewport.showJVSuffix); @@ -125,7 +189,23 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } } - + if (viewport.getAlignment().isNucleotide()) + { + viewport.updateStrucConsensus(alignPanel); + if (viewport.getAlignment().hasRNAStructure()) + { + RNAHelixColour.setEnabled(true); + } + else + { + RNAHelixColour.setEnabled(false); + } + } + else + { + RNAHelixColour.setEnabled(false); + purinePyrimidineColour.setEnabled(false); + } // Some JVMS send keyevents to Top frame or lowest panel, // Havent worked out why yet. So add to both this frame and seqCanvas for // now @@ -134,8 +214,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, alignPanel.idPanel.idCanvas.addKeyListener(this); alignPanel.scalePanel.addKeyListener(this); alignPanel.annotationPanel.addKeyListener(this); + alignPanel.annotationPanelHolder.addKeyListener(this); + alignPanel.annotationSpaceFillerHolder.addKeyListener(this); + alignPanel.alabels.addKeyListener(this); createAlignFrameWindow(embedded, title); - alignPanel.validate(); + + validate(); + alignPanel.adjustAnnotationHeight(); alignPanel.paintAlignment(true); } @@ -150,22 +235,46 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } /** - * DOCUMENT ME! + * Load a features file onto the alignment * - * @param String - * DOCUMENT ME! + * @param file + * file URL, content, or other resolvable path + * @param type + * is protocol for accessing data referred to by file */ - public void parseFeaturesFile(String file, String type) + public boolean parseFeaturesFile(String file, String type) + { + return parseFeaturesFile(file, type, true); + } + + /** + * Load a features file onto the alignment + * + * @param file + * file URL, content, or other resolvable path + * @param type + * is protocol for accessing data referred to by file + * @param autoenabledisplay + * when true, display features flag will be automatically enabled if + * features are loaded + * @return true if data parsed as a features file + */ + public boolean parseFeaturesFile(String file, String type, + boolean autoenabledisplay) { + // TODO: test if importing a features file onto an alignment which already + // has features with links overwrites the original links. + Hashtable featureLinks = new Hashtable(); boolean featuresFile = false; try { - featuresFile = new jalview.io.FeaturesFile(file, type).parse( - viewport.alignment, alignPanel.seqPanel.seqCanvas + featuresFile = new jalview.io.FeaturesFile(file, type) + .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas .getFeatureRenderer().featureColours, featureLinks, - true); + true, viewport.applet.getDefaultParameter( + "relaxedidmatch", false)); } catch (Exception ex) { ex.printStackTrace(); @@ -177,17 +286,22 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks; } - viewport.showSequenceFeatures = true; - sequenceFeatures.setState(true); + if (autoenabledisplay) + { + viewport.showSequenceFeatures = true; + sequenceFeatures.setState(true); + } if (viewport.featureSettings != null) { viewport.featureSettings.refreshTable(); } alignPanel.paintAlignment(true); + statusBar.setText("Successfully added features to alignment."); } - + return featuresFile; } + @Override public void keyPressed(KeyEvent evt) { if (viewport.cursorMode @@ -201,6 +315,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { case 27: // escape key deselectAllSequenceMenuItem_actionPerformed(); + + alignPanel.alabels.cancelDrag(); break; case KeyEvent.VK_X: if (evt.isControlDown() || evt.isMetaDown()) @@ -460,8 +576,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, // Hide everything by the current selection - this is a hack - we do the // invert and then hide // first check that there will be visible columns after the invert. - if ((viewport.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel - .getSelected().size() > 0) + if ((viewport.getColumnSelection() != null + && viewport.getColumnSelection().getSelected() != null && viewport + .getColumnSelection().getSelected().size() > 0) || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg .getEndRes())) { @@ -484,12 +601,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (toggleSeqs) { - if (sg != null && sg.getSize() != viewport.alignment.getHeight()) + if (sg != null && sg.getSize() != viewport.getAlignment().getHeight()) { hide = true; viewport.hideAllSelectedSeqs(); } - else if (!(toggleCols && viewport.colSel.getSelected().size() > 0)) + else if (!(toggleCols && viewport.getColumnSelection().getSelected() + .size() > 0)) { viewport.showAllHiddenSeqs(); } @@ -497,12 +615,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (toggleCols) { - if (viewport.colSel.getSelected().size() > 0) + if (viewport.getColumnSelection().getSelected().size() > 0) { viewport.hideSelectedColumns(); if (!toggleSeqs) { - viewport.selectionGroup = sg; + viewport.setSelectionGroup(sg); } } else if (!hide) @@ -512,14 +630,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } } + @Override public void keyReleased(KeyEvent evt) { } + @Override public void keyTyped(KeyEvent evt) { } + @Override public void itemStateChanged(ItemEvent evt) { if (evt.getSource() == displayNonconservedMenuItem) @@ -586,7 +707,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } else if (evt.getSource() == autoCalculate) { - viewport.autocalculateConsensus = autoCalculate.getState(); + viewport.autoCalculateConsensus = autoCalculate.getState(); + } + else if (evt.getSource() == sortByTree) + { + viewport.sortByTree = sortByTree.getState(); } else if (evt.getSource() == this.centreColumnLabelFlag) { @@ -596,7 +721,30 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { mouseOverFlag_stateChanged(); } - + else if (evt.getSource() == showGroupConsensus) + { + showGroupConsensus_actionPerformed(); + } + else if (evt.getSource() == showGroupConservation) + { + showGroupConservation_actionPerformed(); + } + else if (evt.getSource() == showSequenceLogo) + { + showSequenceLogo_actionPerformed(); + } + else if (evt.getSource() == normSequenceLogo) + { + normSequenceLogo_actionPerformed(); + } + else if (evt.getSource() == showConsensusHistogram) + { + showConsensusHistogram_actionPerformed(); + } + else if (evt.getSource() == applyAutoAnnotationSettings) + { + applyAutoAnnotationSettings_actionPerformed(); + } alignPanel.paintAlignment(true); } @@ -613,6 +761,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, this.alignPanel.annotationPanel.repaint(); } + @Override public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); @@ -786,44 +935,38 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.showAllHiddenSeqs(); alignPanel.paintAlignment(true); } + else if (source == showGroupConsensus) + { + showGroupConsensus_actionPerformed(); + } + else if (source == showGroupConservation) + { + showGroupConservation_actionPerformed(); + } + else if (source == showSequenceLogo) + { + showSequenceLogo_actionPerformed(); + } + else if (source == normSequenceLogo) + { + normSequenceLogo_actionPerformed(); + } + else if (source == showConsensusHistogram) + { + showConsensusHistogram_actionPerformed(); + } + else if (source == applyAutoAnnotationSettings) + { + applyAutoAnnotationSettings_actionPerformed(); + } else if (source == featureSettings) { new FeatureSettings(alignPanel); } else if (source == alProperties) { - StringBuffer contents = new StringBuffer(); - - float avg = 0; - int min = Integer.MAX_VALUE, max = 0; - for (int i = 0; i < viewport.alignment.getHeight(); i++) - { - int size = viewport.alignment.getSequenceAt(i).getEnd() - - viewport.alignment.getSequenceAt(i).getStart(); - avg += size; - if (size > max) - max = size; - if (size < min) - min = size; - } - avg = avg / (float) viewport.alignment.getHeight(); - - contents.append("\nSequences: " + viewport.alignment.getHeight()); - contents.append("\nMinimum Sequence Length: " + min); - contents.append("\nMaximum Sequence Length: " + max); - contents.append("\nAverage Length: " + (int) avg); - - if (((Alignment) viewport.alignment).alignmentProperties != null) - { - Hashtable props = ((Alignment) viewport.alignment).alignmentProperties; - Enumeration en = props.keys(); - while (en.hasMoreElements()) - { - String key = en.nextElement().toString(); - contents.append("\n" + key + "\t" + props.get(key)); - } - } - + StringBuffer contents = new jalview.io.AlignmentProperties( + viewport.getAlignment()).formatAsString(); CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); cap.setText(contents.toString()); Frame frame = new Frame(); @@ -842,8 +985,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, else if (source == clustalColour) { abovePIDThreshold.setState(false); - changeColour(new ClustalxColourScheme(viewport.alignment - .getSequences(), viewport.alignment.getWidth())); + changeColour(new ClustalxColourScheme(viewport.getAlignment(), null)); } else if (source == zappoColour) { @@ -877,6 +1019,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { changeColour(new NucleotideColourScheme()); } + else if (source == purinePyrimidineColour) + { + changeColour(new PurinePyrimidineColourScheme()); + } + else if (source == RNAHelixColour) + { + new RNAHelicesColourChooser(viewport, alignPanel); + } else if (source == modifyPID) { modifyPID_actionPerformed(); @@ -897,6 +1047,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { changeColour(new Blosum62ColourScheme()); } + else if (source == tcoffeeColour) + { + changeColour(new TCoffeeColourScheme(alignPanel.getAlignment())); + } else if (source == annotationColour) { new AnnotationColourChooser(viewport, alignPanel); @@ -969,17 +1123,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); Frame frame = new Frame(); frame.add(cap); - jalview.bin.JalviewLite.addFrame(frame, "Alignment output - " - + e.getActionCommand(), 600, 500); - cap.setText(new AppletFormatAdapter().formatSequences(e - .getActionCommand(), viewport.getAlignment(), + jalview.bin.JalviewLite.addFrame(frame, + "Alignment output - " + e.getActionCommand(), 600, 500); + cap.setText(new AppletFormatAdapter().formatSequences( + e.getActionCommand(), viewport.getAlignment(), viewport.showJVSuffix)); } public void loadAnnotations() { CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this); - cap.setText("Paste your features / annotations file here."); + cap.setText("Paste your features / annotations / T-coffee score file here."); cap.setAnnotationImport(); Frame frame = new Frame(); frame.add(cap); @@ -990,10 +1144,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public String outputAnnotations(boolean displayTextbox) { String annotation = new AnnotationFile().printAnnotations( - viewport.showAnnotation ? viewport.alignment - .getAlignmentAnnotation() : null, viewport.alignment - .getGroups(), - ((Alignment) viewport.alignment).alignmentProperties); + viewport.showAnnotation ? viewport.getAlignment() + .getAlignmentAnnotation() : null, viewport + .getAlignment().getGroups(), ((Alignment) viewport + .getAlignment()).alignmentProperties); if (displayTextbox) { @@ -1009,7 +1163,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, private Hashtable getDisplayedFeatureCols() { - if (alignPanel.getFeatureRenderer() != null) + if (alignPanel.getFeatureRenderer() != null + && viewport.featuresDisplayed != null) { FeatureRenderer fr = alignPanel.getFeatureRenderer(); Hashtable fcols = new Hashtable(); @@ -1029,24 +1184,40 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, String features; if (format.equalsIgnoreCase("Jalview")) { - features = new FeaturesFile().printJalviewFormat(viewport.alignment - .getSequencesArray(), getDisplayedFeatureCols()); + features = new FeaturesFile().printJalviewFormat(viewport + .getAlignment().getSequencesArray(), + getDisplayedFeatureCols()); } else { - features = new FeaturesFile().printGFFFormat(viewport.alignment + features = new FeaturesFile().printGFFFormat(viewport.getAlignment() .getSequencesArray(), getDisplayedFeatureCols()); } if (displayTextbox) { - CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); + boolean frimport = false; + if (features == null || features.equals("No Features Visible")) + { + features = "# No features visible - paste some and import them here."; + frimport = true; + } + + CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this); + if (frimport) + { + cap.setAnnotationImport(); + } Frame frame = new Frame(); frame.add(cap); jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500); - cap.setText(features); } + else + { + if (features == null) + features = ""; + } return features; } @@ -1067,9 +1238,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.applet.getParameter("annotations") != null) { url.append("&annotations="); - url - .append(appendProtocol(viewport.applet - .getParameter("annotations"))); + url.append(appendProtocol(viewport.applet.getParameter("annotations"))); } if (viewport.applet.getParameter("jnetfile") != null) @@ -1147,19 +1316,30 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void closeMenuItem_actionPerformed() { PaintRefresher.RemoveComponent(alignPanel); - PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas); - PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas); + if (alignPanel.seqPanel != null + && alignPanel.seqPanel.seqCanvas != null) + { + PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas); + } + if (alignPanel.idPanel != null && alignPanel.idPanel.idCanvas != null) + { + PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas); + } if (PaintRefresher.components.size() == 0 && viewport.applet == null) { System.exit(0); } - + else + { + } + viewport = null; + alignPanel = null; this.dispose(); } /** - * DOCUMENT ME! + * TODO: JAL-1104 */ void updateEditMenuBar() { @@ -1190,6 +1370,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } } + /** + * TODO: JAL-1104 + */ public void addHistoryItem(CommandI command) { if (command.getSize() > 0) @@ -1197,12 +1380,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.historyList.push(command); viewport.redoList.removeAllElements(); updateEditMenuBar(); - viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + viewport.updateHiddenColumns(); } } /** - * DOCUMENT ME! + * TODO: JAL-1104 DOCUMENT ME! * * @param e * DOCUMENT ME! @@ -1219,15 +1402,22 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, command.undoCommand(null); AlignViewport originalSource = getOriginatingSource(command); - - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + // JBPNote Test + if (originalSource != viewport) + { + System.err + .println("Warning: Viewport object mismatch whilst undoing"); + } + originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns = + // viewport.getColumnSelection().getHiddenColumns() + // != null; updateEditMenuBar(); - originalSource.firePropertyChange("alignment", null, - originalSource.alignment.getSequences()); + originalSource.firePropertyChange("alignment", null, originalSource + .getAlignment().getSequences()); } /** - * DOCUMENT ME! + * TODO: JAL-1104 DOCUMENT ME! * * @param e * DOCUMENT ME! @@ -1244,11 +1434,19 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, command.doCommand(null); AlignViewport originalSource = getOriginatingSource(command); - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + // JBPNote Test + if (originalSource != viewport) + { + System.err + .println("Warning: Viewport object mismatch whilst re-doing"); + } + originalSource.updateHiddenColumns(); // sethasHiddenColumns(); = + // viewport.getColumnSelection().getHiddenColumns() + // != null; updateEditMenuBar(); - originalSource.firePropertyChange("alignment", null, - originalSource.alignment.getSequences()); + originalSource.firePropertyChange("alignment", null, originalSource + .getAlignment().getSequences()); } AlignViewport getOriginatingSource(CommandI command) @@ -1268,7 +1466,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { if (comps.elementAt(i) instanceof AlignmentPanel) { - if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment) + if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment()) { originalSource = ((AlignmentPanel) comps.elementAt(i)).av; break; @@ -1283,7 +1481,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, // the current view against the closed view first if (al != null) { - PaintRefresher.validateSequences(al, viewport.alignment); + PaintRefresher.validateSequences(al, viewport.getAlignment()); } originalSource = viewport; @@ -1299,65 +1497,25 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { return; } - - if (up) - { - for (int i = 1; i < viewport.alignment.getHeight(); i++) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.getSequences(null).contains(seq)) - { - continue; - } - - SequenceI temp = viewport.alignment.getSequenceAt(i - 1); - if (sg.getSequences(null).contains(temp)) - { - continue; - } - - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i - 1); - } - } - else - { - for (int i = viewport.alignment.getHeight() - 2; i > -1; i--) - { - SequenceI seq = viewport.alignment.getSequenceAt(i); - if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq)) - { - continue; - } - - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); - if (sg.getSequences(viewport.hiddenRepSequences).contains(temp)) - { - continue; - } - - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); - } - } - + viewport.getAlignment().moveSelectedSequencesByOne(sg, + up ? null : viewport.getHiddenRepSequences(), up); alignPanel.paintAlignment(true); } synchronized void slideSequences(boolean right, int size) { - Vector sg = new Vector(); + List sg = new Vector(); if (viewport.cursorMode) { - sg.addElement(viewport.alignment - .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY)); + sg.add(viewport.getAlignment().getSequenceAt( + alignPanel.seqPanel.seqCanvas.cursorY)); } else if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().getSize() != viewport.alignment - .getHeight()) + && viewport.getSelectionGroup().getSize() != viewport + .getAlignment().getHeight()) { sg = viewport.getSelectionGroup().getSequences( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); } if (sg.size() < 1) @@ -1365,21 +1523,20 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, return; } - Vector invertGroup = new Vector(); + Vector invertGroup = new Vector(); - for (int i = 0; i < viewport.alignment.getHeight(); i++) + for (int i = 0; i < viewport.getAlignment().getHeight(); i++) { - if (!sg.contains(viewport.alignment.getSequenceAt(i))) - invertGroup.addElement(viewport.alignment.getSequenceAt(i)); + if (!sg.contains(viewport.getAlignment().getSequenceAt(i))) + invertGroup.addElement(viewport.getAlignment().getSequenceAt(i)); } - SequenceI[] seqs1 = new SequenceI[sg.size()]; - for (int i = 0; i < sg.size(); i++) - seqs1[i] = (SequenceI) sg.elementAt(i); + SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]); - SequenceI[] seqs2 = new SequenceI[invertGroup.size()]; + SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup + .size()]); for (int i = 0; i < invertGroup.size(); i++) - seqs2[i] = (SequenceI) invertGroup.elementAt(i); + seqs2[i] = invertGroup.elementAt(i); SlideSequencesCommand ssc; if (right) @@ -1445,14 +1602,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, for (int i = 0; i < sg.getSize(); i++) { SequenceI seq = sg.getSequenceAt(i); - int index = viewport.alignment.findIndex(seq); + int index = viewport.getAlignment().findIndex(seq); orderedSeqs.put(index + "", seq); } int index = 0, startRes, endRes; char ch; - if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null) + if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null) { copiedHiddenColumns = new Vector(); int hiddenOffset = viewport.getSelectionGroup().getStartRes(); @@ -1599,16 +1756,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { for (int i = 0; i < seqs.length; i++) { - viewport.alignment.addSequence(seqs[i]); + viewport.getAlignment().addSequence(seqs[i]); } // !newAlignment addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE, - seqs, 0, viewport.alignment.getWidth(), viewport.alignment)); + seqs, 0, viewport.getAlignment().getWidth(), + viewport.getAlignment())); - viewport.setEndSeq(viewport.alignment.getHeight()); - viewport.alignment.getWidth(); - viewport.firePropertyChange("alignment", null, viewport.alignment + viewport.setEndSeq(viewport.getAlignment().getHeight()); + viewport.getAlignment().getWidth(); + viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); } @@ -1637,7 +1795,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } // If the cut affects all sequences, remove highlighted columns - if (sg.getSize() == viewport.alignment.getHeight()) + if (sg.getSize() == viewport.getAlignment().getHeight()) { viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes() + 1); @@ -1654,10 +1812,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, */ addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, - viewport.alignment)); + viewport.getAlignment())); viewport.setSelectionGroup(null); - viewport.alignment.deleteGroup(sg); + viewport.getAlignment().deleteGroup(sg); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); @@ -1666,6 +1824,66 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { this.setVisible(false); } + viewport.sendSelection(); + } + + /** + * group consensus toggled + * + */ + protected void showGroupConsensus_actionPerformed() + { + viewport.setShowGroupConsensus(showGroupConsensus.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + + } + + /** + * group conservation toggled. + */ + protected void showGroupConservation_actionPerformed() + { + viewport.setShowGroupConservation(showGroupConservation.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void showConsensusHistogram_actionPerformed() + { + viewport.setShowConsensusHistogram(showConsensusHistogram.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void showSequenceLogo_actionPerformed() + { + viewport.setShowSequenceLogo(showSequenceLogo.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + protected void normSequenceLogo_actionPerformed() + { + showSequenceLogo.setState(true); + viewport.setShowSequenceLogo(true); + viewport.setNormaliseSequenceLogo(normSequenceLogo.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + protected void applyAutoAnnotationSettings_actionPerformed() + { + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } protected void makeGrpsFromSelection_actionPerformed() @@ -1673,10 +1891,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.getSelectionGroup() != null) { SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom( - viewport.getSequenceSelection(), viewport.getAlignmentView( - true).getSequenceStrings(viewport.getGapCharacter()), - viewport.alignment.getGroups()); - viewport.alignment.deleteAllGroups(); + viewport.getSequenceSelection(), + viewport.getAlignmentView(true).getSequenceStrings( + viewport.getGapCharacter()), viewport.getAlignment() + .getGroups()); + viewport.getAlignment().deleteAllGroups(); viewport.sequenceColours = null; viewport.setSelectionGroup(null); // set view properties for each group @@ -1684,24 +1903,22 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { // gps[g].setShowunconserved(viewport.getShowUnconserved()); gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo()); - viewport.alignment.addGroup(gps[g]); - Color col = new Color((int) (Math.random() * 255), (int) (Math - .random() * 255), (int) (Math.random() * 255)); + viewport.getAlignment().addGroup(gps[g]); + Color col = new Color((int) (Math.random() * 255), + (int) (Math.random() * 255), (int) (Math.random() * 255)); col = col.brighter(); - for (Enumeration sq = gps[g].getSequences(null).elements(); sq - .hasMoreElements(); viewport.setSequenceColour( - (SequenceI) sq.nextElement(), col)) - ; + for (SequenceI sq : gps[g].getSequences(null)) + viewport.setSequenceColour(sq, col); } PaintRefresher.Refresh(this, viewport.getSequenceSetId()); - // alignPanel.updateAnnotation(); + alignPanel.updateAnnotation(); alignPanel.paintAlignment(true); } } protected void deleteGroups_actionPerformed() { - viewport.alignment.deleteAllGroups(); + viewport.getAlignment().deleteAllGroups(); viewport.sequenceColours = null; viewport.setSelectionGroup(null); @@ -1715,10 +1932,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { sg.addSequence(viewport.getAlignment().getSequenceAt(i), false); } - sg.setEndRes(viewport.alignment.getWidth() - 1); + sg.setEndRes(viewport.getAlignment().getWidth() - 1); viewport.setSelectionGroup(sg); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void deselectAllSequenceMenuItem_actionPerformed() @@ -1735,6 +1953,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, alignPanel.seqPanel.seqCanvas.highlightSearchResults(null); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void invertSequenceMenuItem_actionPerformed() @@ -1746,6 +1965,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void invertColSel_actionPerformed() @@ -1753,6 +1973,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.invertColumnSelection(); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } void trimAlignment(boolean trimLeft) @@ -1775,11 +1996,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } TrimRegionCommand trimRegion; @@ -1787,32 +2008,28 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { trimRegion = new TrimRegionCommand("Remove Left", TrimRegionCommand.TRIM_LEFT, seqs, column, - viewport.alignment, viewport.colSel, - viewport.selectionGroup); + viewport.getAlignment(), viewport.getColumnSelection(), + viewport.getSelectionGroup()); viewport.setStartRes(0); } else { trimRegion = new TrimRegionCommand("Remove Right", TrimRegionCommand.TRIM_RIGHT, seqs, column, - viewport.alignment, viewport.colSel, - viewport.selectionGroup); + viewport.getAlignment(), viewport.getColumnSelection(), + viewport.getSelectionGroup()); } statusBar.setText("Removed " + trimRegion.getSize() + " columns."); addHistoryItem(trimRegion); - Vector groups = viewport.alignment.getGroups(); - - for (int i = 0; i < groups.size(); i++) + for (SequenceGroup sg : viewport.getAlignment().getGroups()) { - SequenceGroup sg = (SequenceGroup) groups.elementAt(i); - if ((trimLeft && !sg.adjustForRemoveLeft(column)) || (!trimLeft && !sg.adjustForRemoveRight(column))) { - viewport.alignment.deleteGroup(sg); + viewport.getAlignment().deleteGroup(sg); } } @@ -1823,23 +2040,24 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void removeGappedColumnMenuItem_actionPerformed() { - int start = 0, end = viewport.alignment.getWidth() - 1; + int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } RemoveGapColCommand removeGapCols = new RemoveGapColCommand( - "Remove Gapped Columns", seqs, start, end, viewport.alignment); + "Remove Gapped Columns", seqs, start, end, + viewport.getAlignment()); addHistoryItem(removeGapCols); @@ -1848,7 +2066,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, // This is to maintain viewport position on first residue // of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); + SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); // ShiftList shifts; // viewport.getAlignment().removeGaps(shifts=new ShiftList()); @@ -1863,28 +2081,28 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void removeAllGapsMenuItem_actionPerformed() { - int start = 0, end = viewport.alignment.getWidth() - 1; + int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } // This is to maintain viewport position on first residue // of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); + SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end, - viewport.alignment)); + viewport.getAlignment())); viewport.setStartRes(seq.findIndex(startRes) - 1); @@ -1907,35 +2125,34 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public AlignFrame newView(String viewtitle) { AlignmentI newal; - if (viewport.hasHiddenRows) + if (viewport.hasHiddenRows()) { newal = new Alignment(viewport.getAlignment().getHiddenSequences() .getFullAlignment().getSequencesArray()); } else { - newal = new Alignment(viewport.alignment.getSequencesArray()); + newal = new Alignment(viewport.getAlignment().getSequencesArray()); } - if (viewport.alignment.getAlignmentAnnotation() != null) + if (viewport.getAlignment().getAlignmentAnnotation() != null) { - for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++) + for (int i = 0; i < viewport.getAlignment().getAlignmentAnnotation().length; i++) { - if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated) + if (!viewport.getAlignment().getAlignmentAnnotation()[i].autoCalculated) { - newal - .addAnnotation(viewport.alignment - .getAlignmentAnnotation()[i]); + newal.addAnnotation(viewport.getAlignment() + .getAlignmentAnnotation()[i]); } } } AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false); - newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId(); + newaf.viewport.setSequenceSetId(alignPanel.av.getSequenceSetId()); PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId()); - PaintRefresher.Register(newaf.alignPanel, newaf.alignPanel.av - .getSequenceSetId()); + PaintRefresher.Register(newaf.alignPanel, + newaf.alignPanel.av.getSequenceSetId()); PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas, newaf.alignPanel.av.getSequenceSetId()); @@ -2077,11 +2294,16 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, overview.getPreferredSize().height + 50); frame.pack(); + final AlignmentPanel ap = alignPanel; frame.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { - alignPanel.setOverviewPanel(null); + if (ap != null) + { + ap.setOverviewPanel(null); + } }; }); @@ -2112,13 +2334,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.getConservationSelected()) { - Alignment al = (Alignment) viewport.alignment; + Alignment al = (Alignment) viewport.getAlignment(); Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, al.getSequences(), 0, al - .getWidth() - 1); + ResidueProperties.propHash, 3, al.getSequences(), 0, + al.getWidth() - 1); c.calculate(); - c.verdict(false, viewport.ConsPercGaps); + c.verdict(false, viewport.getConsPercGaps()); cs.setConservation(c); @@ -2131,81 +2353,19 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, cs.setConservation(null); } - cs.setConsensus(viewport.hconsensus); + cs.setConsensus(viewport.getSequenceConsensusHash()); } viewport.setGlobalColourScheme(cs); - if (viewport.getColourAppliesToAllGroups()) - { - Vector groups = viewport.alignment.getGroups(); - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.elementAt(i); - - if (cs == null) - { - sg.cs = null; - continue; - } - if (cs instanceof ClustalxColourScheme) - { - sg.cs = new ClustalxColourScheme(sg - .getSequences(viewport.hiddenRepSequences), sg.getWidth()); - } - else - { - try - { - sg.cs = (ColourSchemeI) cs.getClass().newInstance(); - } catch (Exception ex) - { - ex.printStackTrace(); - sg.cs = cs; - } - } - - if (viewport.getAbovePIDThreshold() - || cs instanceof PIDColourScheme - || cs instanceof Blosum62ColourScheme) - { - sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - sg.cs.setConsensus(AAFrequency.calculate(sg - .getSequences(viewport.hiddenRepSequences), 0, sg - .getWidth())); - } - else - { - sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus()); - } - - if (viewport.getConservationSelected()) - { - Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg - .getSequences(viewport.hiddenRepSequences), 0, - viewport.alignment.getWidth() - 1); - c.calculate(); - c.verdict(false, viewport.ConsPercGaps); - sg.cs.setConservation(c); - } - else - { - sg.cs.setConservation(null); - sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus()); - } - - } - } - if (alignPanel.getOverviewPanel() != null) { alignPanel.getOverviewPanel().updateOverviewImage(); } jalview.structure.StructureSelectionManager - .getStructureSelectionManager().sequenceColoursChanged( - alignPanel); + .getStructureSelectionManager(viewport.applet) + .sequenceColoursChanged(alignPanel); alignPanel.paintAlignment(true); } @@ -2213,10 +2373,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, protected void modifyPID_actionPerformed() { if (viewport.getAbovePIDThreshold() - && viewport.globalColourScheme != null) + && viewport.getGlobalColourScheme() != null) { - SliderPanel.setPIDSliderSource(alignPanel, viewport - .getGlobalColourScheme(), "Background"); + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showPIDSlider(); } } @@ -2224,10 +2384,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, protected void modifyConservation_actionPerformed() { if (viewport.getConservationSelected() - && viewport.globalColourScheme != null) + && viewport.getGlobalColourScheme() != null) { SliderPanel.setConservationSlider(alignPanel, - viewport.globalColourScheme, "Background"); + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showConservationSlider(); } } @@ -2263,7 +2423,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, .getAlignment().getSequenceAt(0), null); addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -2271,7 +2431,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByID(viewport.getAlignment()); - addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment)); + addHistoryItem(new OrderCommand("ID Sort", oldOrder, + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -2279,7 +2440,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByLength(viewport.getAlignment()); - addHistoryItem(new OrderCommand("Length Sort", oldOrder, viewport.alignment)); + addHistoryItem(new OrderCommand("Length Sort", oldOrder, + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -2288,7 +2450,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByGroup(viewport.getAlignment()); addHistoryItem(new OrderCommand("Group Sort", oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -2313,7 +2475,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void PCAMenuItem_actionPerformed() { // are the sequences aligned? - if (!viewport.alignment.isAligned(false)) + if (!viewport.getAlignment().isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); @@ -2370,7 +2532,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, void NewTreePanel(String type, String pwType, String title) { // are the sequences aligned? - if (!viewport.alignment.isAligned(false)) + if (!viewport.getAlignment().isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); @@ -2390,10 +2552,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if ((viewport.getSelectionGroup() != null && viewport .getSelectionGroup().getSize() > 1) - || (viewport.getSelectionGroup() == null && viewport.alignment - .getHeight() > 1)) + || (viewport.getAlignment().getHeight() > 1)) { - final TreePanel tp = new TreePanel(viewport, type, pwType); + final TreePanel tp = new TreePanel(alignPanel, type, pwType); addTreeMenuItem(tp, title); @@ -2413,7 +2574,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void loadTree(jalview.io.NewickFile tree, String treeFile) { - TreePanel tp = new TreePanel(viewport, treeFile, "From File - ", tree); + TreePanel tp = new TreePanel(alignPanel, treeFile, "From File - ", tree); jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500); addTreeMenuItem(tp, treeFile); } @@ -2434,7 +2595,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, // addHistoryItem(new HistoryItem("Sort", viewport.alignment, // HistoryItem.SORT)); addHistoryItem(new OrderCommand("Order by " + title, oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -2452,6 +2613,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, sortByTreeMenu.add(item); item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { sortByTree(treePanel, title); // treePanel.getTitle()); @@ -2460,6 +2622,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, treePanel.addWindowListener(new WindowAdapter() { + @Override public void windowOpened(WindowEvent e) { if (viewport.sortByTree) @@ -2469,6 +2632,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, super.windowOpened(e); } + @Override public void windowClosing(WindowEvent e) { sortByTreeMenu.remove(item); @@ -2476,9 +2640,27 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, }); } + public boolean sortBy(AlignmentOrder alorder, String undoname) + { + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); + if (viewport.applet.debug) + { + System.err.println("Sorting " + alorder.getOrder().size() + + " in alignment '" + getTitle() + "'"); + } + AlignmentSorter.sortBy(viewport.getAlignment(), alorder); + if (undoname != null) + { + addHistoryItem(new OrderCommand(undoname, oldOrder, + viewport.getAlignment())); + } + alignPanel.paintAlignment(true); + return true; + } + protected void documentation_actionPerformed() { - showURL("http://www.jalview.org/help.html", "HELP"); + alignPanel.av.applet.openJalviewHelpUrl(); } protected void about_actionPerformed() @@ -2496,6 +2678,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, this.builddate = builddate; } + @Override public void paint(Graphics g) { g.setColor(Color.white); @@ -2512,28 +2695,23 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, g.setFont(new Font("Helvetica", Font.BOLD, 12)); g.drawString("Build date: " + builddate, x, y += fh); g.setFont(new Font("Helvetica", Font.PLAIN, 12)); - g - .drawString( - "Authors: Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,", - x, y += fh * 1.5); - g.drawString("David Martin & Geoff Barton.", x + 50, y += fh); - g - .drawString( - "Development managed by The Barton Group, University of Dundee, Scotland, UK.", - x, y += fh); - g - .drawString( - "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list", - x, y += fh); + g.drawString( + "Authors: Jim Procter, Andrew Waterhouse, Jan Engelhardt, Lauren Lui,", + x, y += fh * 1.5); + g.drawString("Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton.", x + 50, y += fh+8); + g.drawString( + "Development managed by The Barton Group, University of Dundee, Scotland, UK.", + x, y += fh); + g.drawString( + "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list", + x, y += fh); g.drawString("If you use Jalview, please cite:", x, y += fh + 8); - g - .drawString( - "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)", - x, y += fh); - g - .drawString( - "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench", - x, y += fh); + g.drawString( + "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)", + x, y += fh); + g.drawString( + "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench", + x, y += fh); g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033", x, y += fh); } @@ -2554,35 +2732,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } else { - try - { - if (url.indexOf(":") == -1) - { - // TODO: verify (Bas Vroling bug) prepend codebase or server URL to - // form valid URL - if (url.indexOf("/") == 0) - { - String codebase = viewport.applet.getCodeBase().toString(); - url = codebase.substring(0, codebase.length() - - viewport.applet.getCodeBase().getFile().length()) - + url; - } - else - { - url = viewport.applet.getCodeBase() + url; - } - System.out.println("Show url (prepended codebase): " + url); - } - else - { - System.out.println("Show url: " + url); - } - viewport.applet.getAppletContext().showDocument( - new java.net.URL(url), target); - } catch (Exception ex) - { - ex.printStackTrace(); - } + viewport.applet.showURL(url, target); } } @@ -2671,12 +2821,18 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, MenuItem buriedColour = new MenuItem(); + MenuItem purinePyrimidineColour = new MenuItem(); + + MenuItem RNAHelixColour = new MenuItem(); + MenuItem userDefinedColour = new MenuItem(); MenuItem PIDColour = new MenuItem(); MenuItem BLOSUM62Colour = new MenuItem(); + MenuItem tcoffeeColour = new MenuItem(); + MenuItem njTreeBlosumMenuItem = new MenuItem(); MenuItem avDistanceTreeBlosumMenuItem = new MenuItem(); @@ -2742,6 +2898,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, CheckboxMenuItem autoCalculate = new CheckboxMenuItem( "Autocalculate Consensus", true); + CheckboxMenuItem sortByTree = new CheckboxMenuItem( + "Sort Alignment With New Tree", true); + Menu sortByTreeMenu = new Menu(); Menu sort = new Menu(); @@ -2762,6 +2921,20 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem(); + Menu autoAnnMenu = new Menu(); + + CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem(); + + CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem(); + + CheckboxMenuItem showConsensusHistogram = new CheckboxMenuItem(); + + CheckboxMenuItem showGroupConsensus = new CheckboxMenuItem(); + + CheckboxMenuItem showGroupConservation = new CheckboxMenuItem(); + + CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem(); + private void jbInit() throws Exception { @@ -2778,6 +2951,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { outputText_actionPerformed(e); @@ -2850,12 +3024,20 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, turnColour.addActionListener(this); buriedColour.setLabel("Buried Index"); buriedColour.addActionListener(this); + purinePyrimidineColour.setLabel("Purine/Pyrimidine"); + purinePyrimidineColour.addActionListener(this); + RNAHelixColour.setLabel("by RNA Helices"); + RNAHelixColour.addActionListener(this); userDefinedColour.setLabel("User Defined..."); userDefinedColour.addActionListener(this); PIDColour.setLabel("Percentage Identity"); PIDColour.addActionListener(this); BLOSUM62Colour.setLabel("BLOSUM62 Score"); BLOSUM62Colour.addActionListener(this); + tcoffeeColour.setLabel("T-Coffee Scores"); + tcoffeeColour.setEnabled(false); // it will enabled only if a score file is + // provided + tcoffeeColour.addActionListener(this); avDistanceTreeBlosumMenuItem .setLabel("Average Distance Using BLOSUM62"); avDistanceTreeBlosumMenuItem.addActionListener(this); @@ -2931,6 +3113,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, sort.setLabel("Sort"); calculate.setLabel("Calculate Tree"); autoCalculate.addItemListener(this); + sortByTree.addItemListener(this); inputText.setLabel("Input from textbox"); inputText.addActionListener(this); centreColumnLabelFlag.setLabel("Centre column labels"); @@ -2964,6 +3147,15 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)"); hideAllSelection.setLabel("Selected Region"); showAllHidden.setLabel("All Sequences and Columns"); + showGroupConsensus.setLabel("Group Consensus"); + showGroupConservation.setLabel("Group Conservation"); + showConsensusHistogram.setLabel("Show Consensus Histogram"); + showSequenceLogo.setLabel("Show Consensus Logo"); + normSequenceLogo.setLabel("Normalise Consensus Logo"); + applyAutoAnnotationSettings.setLabel("Apply to all groups"); + applyAutoAnnotationSettings.setState(true); + autoAnnMenu.setLabel("Autocalculated Annotation"); + invertColSel.addActionListener(this); showColumns.addActionListener(this); showSeqs.addActionListener(this); @@ -2972,6 +3164,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, hideAllButSelection.addActionListener(this); hideAllSelection.addActionListener(this); showAllHidden.addActionListener(this); + showGroupConsensus.addItemListener(this); + showGroupConservation.addItemListener(this); + showConsensusHistogram.addItemListener(this); + showSequenceLogo.addItemListener(this); + normSequenceLogo.addItemListener(this); + + applyAutoAnnotationSettings.addItemListener(this); formatMenu.setLabel("Format"); selectMenu.setLabel("Select"); newView.setLabel("New View"); @@ -3021,6 +3220,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewMenu.addSeparator(); viewMenu.add(followMouseOverFlag); viewMenu.add(annotationPanelMenuItem); + autoAnnMenu.add(applyAutoAnnotationSettings); + autoAnnMenu.add(showConsensusHistogram); + autoAnnMenu.add(showSequenceLogo); + autoAnnMenu.add(normSequenceLogo); + autoAnnMenu.addSeparator(); + autoAnnMenu.add(showGroupConservation); + autoAnnMenu.add(showGroupConsensus); + viewMenu.add(autoAnnMenu); viewMenu.addSeparator(); viewMenu.add(sequenceFeatures); viewMenu.add(featureSettings); @@ -3042,6 +3249,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, colourMenu.add(turnColour); colourMenu.add(buriedColour); colourMenu.add(nucleotideColour); + colourMenu.add(purinePyrimidineColour); + colourMenu.add(tcoffeeColour); colourMenu.add(userDefinedColour); colourMenu.addSeparator(); colourMenu.add(conservationMenuItem); @@ -3049,12 +3258,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, colourMenu.add(abovePIDThreshold); colourMenu.add(modifyPID); colourMenu.add(annotationColour); + colourMenu.add(RNAHelixColour); calculateMenu.add(sort); calculateMenu.add(calculate); calculateMenu.addSeparator(); calculateMenu.add(pairwiseAlignmentMenuItem); calculateMenu.add(PCAMenuItem); calculateMenu.add(autoCalculate); + calculateMenu.add(sortByTree); this.add(statusBar, BorderLayout.SOUTH); pasteMenu.add(pasteNew); pasteMenu.add(pasteThis); @@ -3156,10 +3367,29 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.applet.setLayout(new BorderLayout()); viewport.applet.add(embeddedMenu, BorderLayout.NORTH); viewport.applet.add(statusBar, BorderLayout.SOUTH); - alignPanel.setSize(viewport.applet.getSize().width, viewport.applet - .getSize().height - - embeddedMenu.HEIGHT - statusBar.HEIGHT); + alignPanel.setSize(viewport.applet.getSize().width, + viewport.applet.getSize().height - embeddedMenu.HEIGHT + - statusBar.HEIGHT); viewport.applet.add(alignPanel, BorderLayout.CENTER); + final AlignFrame me = this; + viewport.applet.addFocusListener(new FocusListener() + { + + @Override + public void focusLost(FocusEvent e) + { + if (me.viewport.applet.currentAlignFrame == me) + { + me.viewport.applet.currentAlignFrame = null; + } + } + + @Override + public void focusGained(FocusEvent e) + { + me.viewport.applet.currentAlignFrame = me; + } + }); viewport.applet.validate(); } else @@ -3180,4 +3410,345 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, DEFAULT_HEIGHT); } } + + /** + * create a new binding between structures in an existing jmol viewer instance + * and an alignpanel with sequences that have existing PDBFile entries. Note, + * this does not open a new Jmol window, or modify the display of the + * structures in the original jmol window. Note This method doesn't work + * without an additional javascript library to exchange messages between the + * distinct applets. See http://issues.jalview.org/browse/JAL-621 + * + * @param viewer + * JmolViewer instance + * @param sequenceIds + * - sequence Ids to search for associations + */ + public SequenceStructureBinding addStructureViewInstance( + Object jmolviewer, String[] sequenceIds) + { + org.jmol.api.JmolViewer viewer = null; + try + { + viewer = (org.jmol.api.JmolViewer) jmolviewer; + } catch (ClassCastException ex) + { + System.err.println("Unsupported viewer object :" + + jmolviewer.getClass()); + } + if (viewer == null) + { + System.err.println("Can't use this object as a structure viewer:" + + jmolviewer.getClass()); + return null; + } + SequenceI[] seqs = null; + if (sequenceIds == null || sequenceIds.length == 0) + { + seqs = viewport.getAlignment().getSequencesArray(); + } + else + { + Vector sqi = new Vector(); + AlignmentI al = viewport.getAlignment(); + for (int sid = 0; sid < sequenceIds.length; sid++) + { + SequenceI sq = al.findName(sequenceIds[sid]); + if (sq != null) + { + sqi.addElement(sq); + } + } + if (sqi.size() > 0) + { + seqs = new SequenceI[sqi.size()]; + for (int sid = 0, sSize = sqi.size(); sid < sSize; sid++) + { + seqs[sid] = (SequenceI) sqi.elementAt(sid); + } + } + else + { + return null; + } + } + ExtJmol jmv = null; + // TODO: search for a jmv that involves viewer + if (jmv == null) + { // create a new viewer/jalview binding. + jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][] + { seqs }); + } + return jmv; + + } + + /** + * bind a pdb file to a sequence in the current view + * + * @param sequenceId + * - sequenceId within the dataset. + * @param pdbEntryString + * - the short name for the PDB file + * @param pdbFile + * - pdb file - either a URL or a valid PDB file. + * @return true if binding was as success TODO: consider making an exception + * structure for indicating when PDB parsing or sequenceId location + * fails. + */ + public boolean addPdbFile(String sequenceId, String pdbEntryString, + String pdbFile) + { + SequenceI toaddpdb = viewport.getAlignment().findName(sequenceId); + boolean needtoadd = false; + if (toaddpdb != null) + { + Vector pdbe = toaddpdb.getPDBId(); + PDBEntry pdbentry = null; + if (pdbe != null && pdbe.size() > 0) + { + for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++) + { + pdbentry = (PDBEntry) pdbe.elementAt(pe); + if (!pdbentry.getId().equals(pdbEntryString) + && !pdbentry.getFile().equals(pdbFile)) + { + pdbentry = null; + } + else + { + continue; + } + } + } + if (pdbentry == null) + { + pdbentry = new PDBEntry(); + pdbentry.setId(pdbEntryString); + pdbentry.setFile(pdbFile); + needtoadd = true; // add this new entry to sequence. + } + // resolve data source + // TODO: this code should be a refactored to an io package + String protocol = AppletFormatAdapter.resolveProtocol(pdbFile, "PDB"); + if (protocol == null) + { + return false; + } + if (needtoadd) + { + // make a note of the access mode and add + if (pdbentry.getProperty() == null) + { + pdbentry.setProperty(new Hashtable()); + } + pdbentry.getProperty().put("protocol", protocol); + toaddpdb.addPDBId(pdbentry); + } + } + return true; + } + + private Object[] cleanSeqChainArrays(SequenceI[] seqs, String[] chains) + { + if (seqs != null) + { + Vector sequences = new Vector(); + for (int i = 0; i < seqs.length; i++) + { + if (seqs[i] != null) + { + sequences.addElement(new Object[] + { seqs[i], (chains != null) ? chains[i] : null }); + } + } + seqs = new SequenceI[sequences.size()]; + chains = new String[sequences.size()]; + for (int i = 0, isize = sequences.size(); i < isize; i++) + { + Object[] oj = (Object[]) sequences.elementAt(i); + + seqs[i] = (SequenceI) oj[0]; + chains[i] = (String) oj[1]; + } + } + return new Object[] + { seqs, chains }; + + } + + public void newStructureView(JalviewLite applet, PDBEntry pdb, + SequenceI[] seqs, String[] chains, String protocol) + { + // Scrub any null sequences from the array + Object[] sqch = cleanSeqChainArrays(seqs, chains); + seqs = (SequenceI[]) sqch[0]; + chains = (String[]) sqch[1]; + if (seqs == null || seqs.length == 0) + { + System.err + .println("JalviewLite.AlignFrame:newStructureView: No sequence to bind structure to."); + } + if (protocol == null || protocol.trim().length() == 0 + || protocol.equals("null")) + { + protocol = (String) pdb.getProperty().get("protocol"); + if (protocol == null) + { + System.err.println("Couldn't work out protocol to open structure: " + + pdb.getId()); + return; + } + } + if (applet.useXtrnalSviewer) + { + // register the association(s) and quit, don't create any windows. + if (StructureSelectionManager.getStructureSelectionManager(applet) + .setMapping(seqs, chains, pdb.getFile(), protocol) == null) + { + System.err.println("Failed to map " + pdb.getFile() + " (" + + protocol + ") to any sequences"); + } + return; + } + if (applet.isAlignPdbStructures() && applet.jmolAvailable) + { + // can only do alignments with Jmol + // find the last jmol window assigned to this alignment + jalview.appletgui.AppletJmol ajm = null, tajm; + Vector jmols = applet + .getAppletWindow(jalview.appletgui.AppletJmol.class); + for (int i = 0, iSize = jmols.size(); i < iSize; i++) + { + tajm = (jalview.appletgui.AppletJmol) jmols.elementAt(i); + if (tajm.ap.alignFrame == this) + { + ajm = tajm; + break; + } + } + if (ajm != null) + { + System.err + .println("Incremental adding and aligning structure to existing Jmol view not yet implemented."); + // try and add the pdb structure + // ajm.addS + ajm = null; + } + } + // otherwise, create a new window + if (applet.jmolAvailable) + { + new jalview.appletgui.AppletJmol(pdb, seqs, chains, alignPanel, + protocol); + applet.lastFrameX += 40; + applet.lastFrameY += 40; + } + else + { + new MCview.AppletPDBViewer(pdb, seqs, chains, alignPanel, protocol); + } + + } + + public void alignedStructureView(JalviewLite applet, PDBEntry[] pdb, + SequenceI[][] seqs, String[][] chains, String[] protocols) + { + // TODO Auto-generated method stub + System.err.println("Aligned Structure View: Not yet implemented."); + } + + /** + * modify the current selection, providing the user has not made a selection + * already. + * + * @param sel + * - sequences from this alignment + * @param csel + * - columns to be selected on the alignment + */ + public void select(SequenceGroup sel, ColumnSelection csel) + { + alignPanel.seqPanel.selection(sel, csel, null); + } + + public void scrollTo(int row, int column) + { + alignPanel.seqPanel.scrollTo(row, column); + } + + public void scrollToRow(int row) + { + alignPanel.seqPanel.scrollToRow(row); + } + + public void scrollToColumn(int column) + { + alignPanel.seqPanel.scrollToColumn(column); + } + + /** + * @return the alignments unique ID. + */ + public String getSequenceSetId() + { + return viewport.getSequenceSetId(); + } + + /** + * Load the (T-Coffee) score file from the specified url + * + * @param source + * File/URL/T-COFFEE score file contents + * @throws IOException + * @return true if alignment was annotated with data from source + */ + public boolean loadScoreFile(String source) throws IOException + { + + TCoffeeScoreFile file = new TCoffeeScoreFile(source, + AppletFormatAdapter.checkProtocol(source)); + if (!file.isValid()) + { + // TODO: raise dialog for gui + System.err.println("Problems parsing T-Coffee scores: " + + file.getWarningMessage()); + System.err.println("Origin was:\n" + source); + return false; + } + + /* + * check that the score matrix matches the alignment dimensions + */ + AlignmentI aln; + if ((aln = viewport.getAlignment()) != null + && (aln.getHeight() != file.getHeight() || aln.getWidth() != file + .getWidth())) + { + // TODO: raise a dialog box here rather than bomb out. + System.err + .println("The scores matrix does not match the alignment dimensions"); + + } + + // TODO add parameter to indicate if matching should be done + if (file.annotateAlignment(alignPanel.getAlignment(), false)) + { + alignPanel.fontChanged(); + tcoffeeColour.setEnabled(true); + // switch to this color + changeColour(new TCoffeeColourScheme(alignPanel.getAlignment())); + return true; + } + else + { + System.err.println("Problems resolving T-Coffee scores:"); + if (file.getWarningMessage() != null) + { + System.err.println(file.getWarningMessage()); + } + } + return false; + } + }