X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FAlignFrame.java;h=bad78485fa0fe257bbc247c459f99981c4e5f3b2;hb=4fcca76a6c1460d492469ace09a728925b733bfe;hp=3e214b8e6bbfc899849f1d2b305a2c3865bbfdde;hpb=506d60f0e188723ddc91c26824b41ac7034df3fe;p=jalview.git diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index 3e214b8..bad7848 100755 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -1,24 +1,22 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) + * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * - * This program 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 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program 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. + * 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. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * 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 . */ package jalview.appletgui; -import java.io.*; import java.net.*; import java.util.*; @@ -26,6 +24,8 @@ import java.awt.*; import java.awt.event.*; import jalview.analysis.*; +import jalview.api.SequenceStructureBinding; +import jalview.bin.JalviewLite; import jalview.commands.*; import jalview.datamodel.*; import jalview.io.*; @@ -68,6 +68,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.updateConsensus(alignPanel); annotationPanelMenuItem.setState(viewport.showAnnotation); + displayNonconservedMenuItem.setState(viewport.getShowunconserved()); + followMouseOverFlag.setState(viewport.getFollowHighlight()); seqLimits.setState(viewport.showJVSuffix); @@ -84,6 +86,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { sortPairwiseMenuItem_actionPerformed(); } + else if (param.equalsIgnoreCase("Length")) + { + sortLengthMenuItem_actionPerformed(); + } } param = applet.getParameter("wrap"); @@ -101,7 +107,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, centreColumnLabelFlag.setState(true); centreColumnLabelFlag_stateChanged(); } - try { param = applet.getParameter("windowWidth"); @@ -149,7 +154,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * DOCUMENT ME! * * @param String - * DOCUMENT ME! + * DOCUMENT ME! */ public void parseFeaturesFile(String file, String type) @@ -158,10 +163,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, boolean featuresFile = false; try { - featuresFile = new jalview.io.FeaturesFile(file, type).parse( - viewport.alignment, alignPanel.seqPanel.seqCanvas - .getFeatureRenderer().featureColours, featureLinks, - true); + featuresFile = new jalview.io.FeaturesFile(file, type) + .parse(viewport.alignment, + alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours, + featureLinks, true, viewport.applet.getDefaultParameter("relaxedidmatch", false)); } catch (Exception ex) { ex.printStackTrace(); @@ -175,6 +180,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } viewport.showSequenceFeatures = true; sequenceFeatures.setState(true); + if (viewport.featureSettings != null) + { + viewport.featureSettings.refreshTable(); + } alignPanel.paintAlignment(true); } @@ -336,37 +345,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { boolean toggleSeqs = !evt.isControlDown(); boolean toggleCols = !evt.isShiftDown(); - boolean hide = false; - SequenceGroup sg = viewport.getSelectionGroup(); - - if (toggleSeqs) - { - if (sg != null && sg.getSize() != viewport.alignment.getHeight()) - { - hide = true; - viewport.hideAllSelectedSeqs(); - } - else if (!(toggleCols && viewport.colSel.getSelected().size() > 0)) - { - viewport.showAllHiddenSeqs(); - } - } - - if (toggleCols) - { - if (viewport.colSel.getSelected().size() > 0) - { - viewport.hideSelectedColumns(); - if (!toggleSeqs) - { - viewport.selectionGroup = sg; - } - } - else if (!hide) - { - viewport.showAllHiddenColumns(); - } - } + toggleHiddenRegions(toggleSeqs, toggleCols); break; } @@ -440,11 +419,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { if (evt.isAltDown()) { - viewport.invertColumnSelection(); + invertColSel_actionPerformed(); } else { - this.invertSequenceMenuItem_actionPerformed(); + invertSequenceMenuItem_actionPerformed(); } } break; @@ -467,6 +446,73 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, alignPanel.paintAlignment(true); } + /** + * called by key handler and the hide all/show all menu items + * + * @param toggleSeqs + * @param toggleCols + */ + private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols) + { + boolean hide = false; + SequenceGroup sg = viewport.getSelectionGroup(); + if (!toggleSeqs && !toggleCols) + { + // 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) + || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg + .getEndRes())) + { + // now invert the sequence set, if required - empty selection implies + // that no hiding is required. + if (sg != null) + { + invertSequenceMenuItem_actionPerformed(); + sg = viewport.getSelectionGroup(); + toggleSeqs = true; + + } + viewport.expandColSelection(sg, true); + // finally invert the column selection and get the new sequence + // selection and indicate it should be hidden. + invertColSel_actionPerformed(); + toggleCols = true; + } + } + + if (toggleSeqs) + { + if (sg != null && sg.getSize() != viewport.alignment.getHeight()) + { + hide = true; + viewport.hideAllSelectedSeqs(); + } + else if (!(toggleCols && viewport.colSel.getSelected().size() > 0)) + { + viewport.showAllHiddenSeqs(); + } + } + + if (toggleCols) + { + if (viewport.colSel.getSelected().size() > 0) + { + viewport.hideSelectedColumns(); + if (!toggleSeqs) + { + viewport.selectionGroup = sg; + } + } + else if (!hide) + { + viewport.showAllHiddenColumns(); + } + } + } + public void keyReleased(KeyEvent evt) { } @@ -477,7 +523,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void itemStateChanged(ItemEvent evt) { - if (evt.getSource() == colourTextMenuItem) + if (evt.getSource() == displayNonconservedMenuItem) + { + displayNonconservedMenuItem_actionPerformed(); + } + else if (evt.getSource() == colourTextMenuItem) { colourTextMenuItem_actionPerformed(); } @@ -543,10 +593,21 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { centreColumnLabelFlag_stateChanged(); } + else if (evt.getSource() == this.followMouseOverFlag) + { + mouseOverFlag_stateChanged(); + } alignPanel.paintAlignment(true); } + private void mouseOverFlag_stateChanged() + { + viewport.followHighlight = followMouseOverFlag.getState(); + // TODO: could kick the scrollTo mechanism to reset view for current + // searchresults. + } + private void centreColumnLabelFlag_stateChanged() { viewport.centreColumnLabels = centreColumnLabelFlag.getState(); @@ -633,6 +694,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { delete_actionPerformed(); } + else if (source == grpsFromSelection) + { + makeGrpsFromSelection_actionPerformed(); + } else if (source == deleteGroups) { deleteGroups_actionPerformed(); @@ -690,6 +755,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, else if (source == showSeqs) { viewport.showAllHiddenSeqs(); + alignPanel.paintAlignment(true); } else if (source == hideColumns) { @@ -700,6 +766,26 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, && viewport.getSelectionGroup() != null) { viewport.hideAllSelectedSeqs(); + alignPanel.paintAlignment(true); + } + else if (source == hideAllButSelection) + { + toggleHiddenRegions(false, false); + alignPanel.paintAlignment(true); + } + else if (source == hideAllSelection) + { + SequenceGroup sg = viewport.getSelectionGroup(); + viewport.expandColSelection(sg, false); + viewport.hideAllSelectedSeqs(); + viewport.hideSelectedColumns(); + alignPanel.paintAlignment(true); + } + else if (source == showAllHidden) + { + viewport.showAllHiddenColumns(); + viewport.showAllHiddenSeqs(); + alignPanel.paintAlignment(true); } else if (source == featureSettings) { @@ -707,38 +793,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } 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.alignment).formatAsString(); CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this); cap.setText(contents.toString()); Frame frame = new Frame(); @@ -757,8 +813,9 @@ 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.alignment.getSequences(), + viewport.alignment.getWidth())); } else if (source == zappoColour) { @@ -824,6 +881,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { sortIDMenuItem_actionPerformed(); } + else if (source == sortLengthMenuItem) + { + sortLengthMenuItem_actionPerformed(); + } else if (source == sortGroupMenuItem) { sortGroupMenuItem_actionPerformed(); @@ -880,10 +941,10 @@ 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)); } @@ -918,18 +979,37 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, return annotation; } + private Hashtable getDisplayedFeatureCols() + { + if (alignPanel.getFeatureRenderer() != null) + { + FeatureRenderer fr = alignPanel.getFeatureRenderer(); + Hashtable fcols = new Hashtable(); + Enumeration en = viewport.featuresDisplayed.keys(); + while (en.hasMoreElements()) + { + Object col = en.nextElement(); + fcols.put(col, fr.featureColours.get(col)); + } + return fcols; + } + return null; + } + public String outputFeatures(boolean displayTextbox, String format) { String features; if (format.equalsIgnoreCase("Jalview")) { - features = new FeaturesFile().printJalviewFormat(viewport.alignment - .getSequencesArray(), viewport.featuresDisplayed); + features = new FeaturesFile().printJalviewFormat( + viewport.alignment.getSequencesArray(), + getDisplayedFeatureCols()); } else { - features = new FeaturesFile().printGFFFormat(viewport.alignment - .getSequencesArray(), viewport.featuresDisplayed); + features = new FeaturesFile().printGFFFormat( + viewport.alignment.getSequencesArray(), + getDisplayedFeatureCols()); } if (displayTextbox) @@ -961,9 +1041,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) @@ -1099,7 +1177,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void undoMenuItem_actionPerformed() { @@ -1124,7 +1202,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void redoMenuItem_actionPerformed() { @@ -1502,8 +1580,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.setEndSeq(viewport.alignment.getHeight()); viewport.alignment.getWidth(); - viewport.firePropertyChange("alignment", null, viewport.alignment - .getSequences()); + viewport.firePropertyChange("alignment", null, + viewport.alignment.getSequences()); } @@ -1560,6 +1638,39 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { this.setVisible(false); } + viewport.sendSelection(); + } + + protected void makeGrpsFromSelection_actionPerformed() + { + 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.sequenceColours = null; + viewport.setSelectionGroup(null); + // set view properties for each group + for (int g = 0; g < gps.length; g++) + { + // 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)); + col = col.brighter(); + for (Enumeration sq = gps[g].getSequences(null).elements(); sq + .hasMoreElements(); viewport.setSequenceColour( + (SequenceI) sq.nextElement(), col)) + ; + } + PaintRefresher.Refresh(this, viewport.getSequenceSetId()); + // alignPanel.updateAnnotation(); + alignPanel.paintAlignment(true); + } } protected void deleteGroups_actionPerformed() @@ -1582,6 +1693,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewport.setSelectionGroup(sg); alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void deselectAllSequenceMenuItem_actionPerformed() @@ -1598,6 +1710,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() @@ -1609,6 +1722,15 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); + } + + public void invertColSel_actionPerformed() + { + viewport.invertColumnSelection(); + alignPanel.paintAlignment(true); + PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } void trimAlignment(boolean trimLeft) @@ -1779,9 +1901,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated) { - newal - .addAnnotation(viewport.alignment - .getAlignmentAnnotation()[i]); + newal.addAnnotation(viewport.alignment.getAlignmentAnnotation()[i]); } } } @@ -1790,8 +1910,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, newaf.viewport.sequenceSetID = 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()); @@ -1849,7 +1969,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * get sequence feature groups that are hidden or shown * * @param visible - * true is visible + * true is visible * @return list */ public String[] getFeatureGroupsOfState(boolean visible) @@ -1867,9 +1987,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * Change the display state for the given feature groups * * @param groups - * list of group strings + * list of group strings * @param state - * visible or invisible + * visible or invisible */ public void setFeatureGroupState(String[] groups, boolean state) { @@ -1901,6 +2021,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, alignPanel.paintAlignment(true); } + protected void displayNonconservedMenuItem_actionPerformed() + { + viewport.setShowunconserved(displayNonconservedMenuItem.getState()); + alignPanel.paintAlignment(true); + } + protected void wrapMenuItem_actionPerformed() { viewport.setWrapAlignment(wrapMenuItem.getState()); @@ -1964,8 +2090,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, Alignment al = (Alignment) viewport.alignment; 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); @@ -2000,8 +2126,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, } if (cs instanceof ClustalxColourScheme) { - sg.cs = new ClustalxColourScheme(sg - .getSequences(viewport.hiddenRepSequences), sg.getWidth()); + sg.cs = new ClustalxColourScheme( + sg.getSequences(viewport.hiddenRepSequences), + sg.getWidth()); } else { @@ -2020,9 +2147,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, || cs instanceof Blosum62ColourScheme) { sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - sg.cs.setConsensus(AAFrequency.calculate(sg - .getSequences(viewport.hiddenRepSequences), 0, sg - .getWidth())); + sg.cs.setConsensus(AAFrequency.calculate( + sg.getSequences(viewport.hiddenRepSequences), 0, + sg.getWidth())); } else { @@ -2032,8 +2159,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.getConservationSelected()) { Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg - .getSequences(viewport.hiddenRepSequences), 0, + ResidueProperties.propHash, 3, + sg.getSequences(viewport.hiddenRepSequences), 0, viewport.alignment.getWidth() - 1); c.calculate(); c.verdict(false, viewport.ConsPercGaps); @@ -2065,8 +2192,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme != null) { - SliderPanel.setPIDSliderSource(alignPanel, viewport - .getGlobalColourScheme(), "Background"); + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showPIDSlider(); } } @@ -2111,6 +2238,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByPID(viewport.getAlignment(), viewport .getAlignment().getSequenceAt(0), null); + addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, viewport.alignment)); alignPanel.paintAlignment(true); @@ -2118,17 +2246,27 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void sortIDMenuItem_actionPerformed() { - // addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, - // HistoryItem.SORT)); + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByID(viewport.getAlignment()); + addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment)); + alignPanel.paintAlignment(true); + } + + public void sortLengthMenuItem_actionPerformed() + { + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); + AlignmentSorter.sortByLength(viewport.getAlignment()); + addHistoryItem(new OrderCommand("Length Sort", oldOrder, + viewport.alignment)); alignPanel.paintAlignment(true); } public void sortGroupMenuItem_actionPerformed() { - // addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, - // HistoryItem.SORT)); + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByGroup(viewport.getAlignment()); + addHistoryItem(new OrderCommand("Group Sort", oldOrder, + viewport.alignment)); alignPanel.paintAlignment(true); } @@ -2153,7 +2291,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, public void PCAMenuItem_actionPerformed() { // are the sequences aligned? - if (!viewport.alignment.isAligned()) + if (!viewport.alignment.isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); @@ -2210,7 +2348,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, void NewTreePanel(String type, String pwType, String title) { // are the sequences aligned? - if (!viewport.alignment.isAligned()) + if (!viewport.alignment.isAligned(false)) { SequenceI current; int Width = viewport.getAlignment().getWidth(); @@ -2258,7 +2396,35 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, addTreeMenuItem(tp, treeFile); } - void addTreeMenuItem(final TreePanel treePanel, String title) + /** + * sort the alignment using the given treePanel + * + * @param treePanel + * tree used to sort view + * @param title + * string used for undo event name + */ + public void sortByTree(TreePanel treePanel, String title) + { + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); + AlignmentSorter + .sortByTree(viewport.getAlignment(), treePanel.getTree()); + // addHistoryItem(new HistoryItem("Sort", viewport.alignment, + // HistoryItem.SORT)); + addHistoryItem(new OrderCommand("Order by " + title, oldOrder, + viewport.alignment)); + alignPanel.paintAlignment(true); + } + + /** + * Do any automatic reordering of the alignment and add the necessary bits to + * the menu structure for the new tree + * + * @param treePanel + * @param title + */ + protected void addTreeMenuItem(final TreePanel treePanel, + final String title) { final MenuItem item = new MenuItem(title); sortByTreeMenu.add(item); @@ -2266,23 +2432,43 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { public void actionPerformed(ActionEvent evt) { - // addHistoryItem(new HistoryItem("Sort", viewport.alignment, - // HistoryItem.SORT)); - AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel - .getTree()); - alignPanel.paintAlignment(true); + sortByTree(treePanel, title); // treePanel.getTitle()); } }); treePanel.addWindowListener(new WindowAdapter() { + public void windowOpened(WindowEvent e) + { + if (viewport.sortByTree) + { + sortByTree(treePanel, title); + } + super.windowOpened(e); + } + public void windowClosing(WindowEvent e) { sortByTreeMenu.remove(item); }; }); } - + 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.alignment)); + } + alignPanel.paintAlignment(true); + return true; + } protected void documentation_actionPerformed() { showURL("http://www.jalview.org/help.html", "HELP"); @@ -2295,9 +2481,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { String version; - public AboutPanel(String version) + String builddate; + + public AboutPanel(String version, String builddate) { this.version = version; + this.builddate = builddate; } public void paint(Graphics g) @@ -2313,53 +2502,34 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, // lite and application g.setFont(new Font("Helvetica", Font.BOLD, 14)); g.drawString("JalviewLite - Release " + version, x, y += fh); + 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( + "Authors: Jim Procter, Andrew Waterhouse, 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( + "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( - "\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"", - x, y += fh); - g.drawString("Bioinformatics, 2004 20;426-7.", x, y += fh); - } - } - - String version = "test"; - java.net.URL url = getClass().getResource("/.build_properties"); - if (url != null) - { - try - { - BufferedReader reader = new BufferedReader(new InputStreamReader( - url.openStream())); - String line; - while ((line = reader.readLine()) != null) - { - if (line.indexOf("VERSION") > -1) - { - version = line.substring(line.indexOf("=") + 1); - } - } - } catch (Exception ex) - { - ex.printStackTrace(); + 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); } } Frame frame = new Frame(); - frame.add(new AboutPanel(version)); + frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite + .getBuildDate())); jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220); } @@ -2374,22 +2544,38 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, { try { - if (url.indexOf(":")==-1) + if (url.indexOf(":") == -1) { - // TODO: verify (Bas Vroling bug) prepend codebase or server URL to form valid URL - if (url.indexOf("/")==0) + // 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; + 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 { + } + else + { System.out.println("Show url: " + url); } - viewport.applet.getAppletContext().showDocument( - new java.net.URL(url), target); + if (url.indexOf("javascript:") == 0) + { + // no target for the javascript context + viewport.applet.getAppletContext().showDocument( + new java.net.URL(url)); + } + else + { + viewport.applet.getAppletContext().showDocument( + new java.net.URL(url), target); + } } catch (Exception ex) { ex.printStackTrace(); @@ -2446,6 +2632,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, MenuItem sortIDMenuItem = new MenuItem(); + MenuItem sortLengthMenuItem = new MenuItem(); + MenuItem sortGroupMenuItem = new MenuItem(); MenuItem removeRedundancyMenuItem = new MenuItem(); @@ -2494,6 +2682,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem(); + CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem(); + MenuItem alProperties = new MenuItem("Alignment Properties..."); MenuItem overviewMenuItem = new MenuItem(); @@ -2518,6 +2708,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, MenuItem deleteGroups = new MenuItem(); + MenuItem grpsFromSelection = new MenuItem(); + MenuItem delete = new MenuItem(); MenuItem copy = new MenuItem(); @@ -2565,6 +2757,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, CheckboxMenuItem centreColumnLabelFlag = new CheckboxMenuItem(); + CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem(); + private void jbInit() throws Exception { @@ -2617,6 +2811,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, sortPairwiseMenuItem.addActionListener(this); sortIDMenuItem.setLabel("by ID"); sortIDMenuItem.addActionListener(this); + sortLengthMenuItem.setLabel("by Length"); + sortLengthMenuItem.addActionListener(this); sortGroupMenuItem.setLabel("by Group"); sortGroupMenuItem.addActionListener(this); removeRedundancyMenuItem.setLabel("Remove Redundancy..."); @@ -2666,6 +2862,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, annotationPanelMenuItem.addItemListener(this); colourTextMenuItem.setLabel("Colour Text"); colourTextMenuItem.addItemListener(this); + displayNonconservedMenuItem.setLabel("Show nonconserved"); + displayNonconservedMenuItem.addItemListener(this); alProperties.addActionListener(this); overviewMenuItem.setLabel("Overview Window"); overviewMenuItem.addActionListener(this); @@ -2692,6 +2890,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, nucleotideColour.addActionListener(this); deleteGroups.setLabel("Undefine Groups"); deleteGroups.addActionListener(this); + grpsFromSelection.setLabel("Make Groups for selection"); + grpsFromSelection.addActionListener(this); copy.setLabel("Copy"); copy.addActionListener(this); cut.setLabel("Cut"); @@ -2732,7 +2932,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, inputText.addActionListener(this); centreColumnLabelFlag.setLabel("Centre column labels"); centreColumnLabelFlag.addItemListener(this); - + followMouseOverFlag.setLabel("Automatic Scrolling"); + followMouseOverFlag.addItemListener(this); helpMenu.setLabel("Help"); documentation.setLabel("Documentation"); documentation.addActionListener(this); @@ -2757,11 +2958,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, menu2.setLabel("Hide"); hideColumns.setLabel("Selected Columns"); hideSequences.setLabel("Selected Sequences"); + hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)"); + hideAllSelection.setLabel("Selected Region"); + showAllHidden.setLabel("All Sequences and Columns"); invertColSel.addActionListener(this); showColumns.addActionListener(this); showSeqs.addActionListener(this); hideColumns.addActionListener(this); hideSequences.addActionListener(this); + hideAllButSelection.addActionListener(this); + hideAllSelection.addActionListener(this); + showAllHidden.addActionListener(this); formatMenu.setLabel("Format"); selectMenu.setLabel("Select"); newView.setLabel("New View"); @@ -2809,6 +3016,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, viewMenu.add(menu1); viewMenu.add(menu2); viewMenu.addSeparator(); + viewMenu.add(followMouseOverFlag); viewMenu.add(annotationPanelMenuItem); viewMenu.addSeparator(); viewMenu.add(sequenceFeatures); @@ -2848,6 +3056,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, pasteMenu.add(pasteNew); pasteMenu.add(pasteThis); sort.add(sortIDMenuItem); + sort.add(sortLengthMenuItem); sort.add(sortByTreeMenu); sort.add(sortGroupMenuItem); sort.add(sortPairwiseMenuItem); @@ -2859,8 +3068,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, helpMenu.add(about); menu1.add(showColumns); menu1.add(showSeqs); + menu1.add(showAllHidden); menu2.add(hideColumns); menu2.add(hideSequences); + menu2.add(hideAllSelection); + menu2.add(hideAllButSelection); formatMenu.add(font); formatMenu.add(seqLimits); formatMenu.add(wrapMenuItem); @@ -2870,6 +3082,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, formatMenu.add(viewBoxesMenuItem); formatMenu.add(viewTextMenuItem); formatMenu.add(colourTextMenuItem); + formatMenu.add(displayNonconservedMenuItem); formatMenu.add(renderGapsMenuItem); formatMenu.add(centreColumnLabelFlag); selectMenu.add(findMenuItem); @@ -2878,7 +3091,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, selectMenu.add(deselectAllSequenceMenuItem); selectMenu.add(invertSequenceMenuItem); selectMenu.add(invertColSel); + selectMenu.add(grpsFromSelection); selectMenu.add(deleteGroups); + } MenuItem featureSettings = new MenuItem(); @@ -2901,6 +3116,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, MenuItem hideSequences = new MenuItem(); + MenuItem hideAllButSelection = new MenuItem(); + + MenuItem hideAllSelection = new MenuItem(); + + MenuItem showAllHidden = new MenuItem(); + Menu formatMenu = new Menu(); Menu selectMenu = new Menu(); @@ -2913,8 +3134,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, * platform independent manner to avoid OSX/Mac menu appendage daftness. * * @param reallyEmbedded - * true to attach the view to the applet area on the page - * rather than in a new window + * true to attach the view to the applet area on the page rather than + * in a new window */ public void createAlignFrameWindow(boolean reallyEmbedded, String title) { @@ -2932,10 +3153,27 @@ 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 @@ -2956,4 +3194,236 @@ 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; + + } + + 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.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); + } }