X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=001529900d7b513409be46059a4490887af5903d;hb=bf2dd2a4708bdec06517605f9c6e69bfdc53d5ee;hp=2d9eb1676068da4b9f9157e3dd8d89a71b7e428d;hpb=3b5fd72d019a6cd71f611b4110651ff6b62ce5bf;p=jalview.git diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index 2d9eb16..0015299 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -20,6 +20,17 @@ */ package jalview.viewmodel; +import java.awt.Color; +import java.beans.PropertyChangeSupport; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.Deque; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.Conservation; import jalview.api.AlignCalcManagerI; @@ -36,19 +47,20 @@ import jalview.datamodel.Annotation; import jalview.datamodel.CigarArray; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenSequences; -import jalview.datamodel.SearchResults; +import jalview.datamodel.ProfilesI; +import jalview.datamodel.SearchResultsI; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceCollectionI; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; -import jalview.schemes.Blosum62ColourScheme; +import jalview.renderer.ResidueShader; +import jalview.renderer.ResidueShaderI; import jalview.schemes.ColourSchemeI; -import jalview.schemes.PIDColourScheme; -import jalview.schemes.ResidueProperties; import jalview.structure.CommandListener; import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasSource; import jalview.util.Comparison; +import jalview.util.MapList; import jalview.util.MappingUtils; import jalview.viewmodel.styles.ViewStyle; import jalview.workers.AlignCalcManager; @@ -56,17 +68,6 @@ import jalview.workers.ComplementConsensusThread; import jalview.workers.ConsensusThread; import jalview.workers.StrucConsensusThread; -import java.awt.Color; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Deque; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * base class holding visualization and analysis attributes and common logic for * an active alignment view displayed in the GUI @@ -77,6 +78,8 @@ import java.util.Set; public abstract class AlignmentViewport implements AlignViewportI, CommandListener, VamsasSource { + protected ViewportRanges ranges; + protected ViewStyleI viewStyle = new ViewStyle(); /** @@ -95,6 +98,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param name * @see jalview.api.ViewStyleI#setFontName(java.lang.String) */ + @Override public void setFontName(String name) { viewStyle.setFontName(name); @@ -104,6 +108,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param style * @see jalview.api.ViewStyleI#setFontStyle(int) */ + @Override public void setFontStyle(int style) { viewStyle.setFontStyle(style); @@ -113,6 +118,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param size * @see jalview.api.ViewStyleI#setFontSize(int) */ + @Override public void setFontSize(int size) { viewStyle.setFontSize(size); @@ -122,6 +128,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getFontStyle() */ + @Override public int getFontStyle() { return viewStyle.getFontStyle(); @@ -131,6 +138,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getFontName() */ + @Override public String getFontName() { return viewStyle.getFontName(); @@ -140,6 +148,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getFontSize() */ + @Override public int getFontSize() { return viewStyle.getFontSize(); @@ -149,6 +158,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param upperCasebold * @see jalview.api.ViewStyleI#setUpperCasebold(boolean) */ + @Override public void setUpperCasebold(boolean upperCasebold) { viewStyle.setUpperCasebold(upperCasebold); @@ -158,6 +168,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isUpperCasebold() */ + @Override public boolean isUpperCasebold() { return viewStyle.isUpperCasebold(); @@ -167,6 +178,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isSeqNameItalics() */ + @Override public boolean isSeqNameItalics() { return viewStyle.isSeqNameItalics(); @@ -176,6 +188,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param colourByReferenceSeq * @see jalview.api.ViewStyleI#setColourByReferenceSeq(boolean) */ + @Override public void setColourByReferenceSeq(boolean colourByReferenceSeq) { viewStyle.setColourByReferenceSeq(colourByReferenceSeq); @@ -185,6 +198,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setColourAppliesToAllGroups(boolean) */ + @Override public void setColourAppliesToAllGroups(boolean b) { viewStyle.setColourAppliesToAllGroups(b); @@ -194,6 +208,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getColourAppliesToAllGroups() */ + @Override public boolean getColourAppliesToAllGroups() { return viewStyle.getColourAppliesToAllGroups(); @@ -203,6 +218,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getAbovePIDThreshold() */ + @Override public boolean getAbovePIDThreshold() { return viewStyle.getAbovePIDThreshold(); @@ -212,6 +228,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param inc * @see jalview.api.ViewStyleI#setIncrement(int) */ + @Override public void setIncrement(int inc) { viewStyle.setIncrement(inc); @@ -221,6 +238,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getIncrement() */ + @Override public int getIncrement() { return viewStyle.getIncrement(); @@ -230,6 +248,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setConservationSelected(boolean) */ + @Override public void setConservationSelected(boolean b) { viewStyle.setConservationSelected(b); @@ -239,6 +258,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param show * @see jalview.api.ViewStyleI#setShowHiddenMarkers(boolean) */ + @Override public void setShowHiddenMarkers(boolean show) { viewStyle.setShowHiddenMarkers(show); @@ -248,6 +268,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getShowHiddenMarkers() */ + @Override public boolean getShowHiddenMarkers() { return viewStyle.getShowHiddenMarkers(); @@ -257,6 +278,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setScaleRightWrapped(boolean) */ + @Override public void setScaleRightWrapped(boolean b) { viewStyle.setScaleRightWrapped(b); @@ -266,6 +288,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setScaleLeftWrapped(boolean) */ + @Override public void setScaleLeftWrapped(boolean b) { viewStyle.setScaleLeftWrapped(b); @@ -275,6 +298,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setScaleAboveWrapped(boolean) */ + @Override public void setScaleAboveWrapped(boolean b) { viewStyle.setScaleAboveWrapped(b); @@ -284,6 +308,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getScaleLeftWrapped() */ + @Override public boolean getScaleLeftWrapped() { return viewStyle.getScaleLeftWrapped(); @@ -293,6 +318,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getScaleAboveWrapped() */ + @Override public boolean getScaleAboveWrapped() { return viewStyle.getScaleAboveWrapped(); @@ -302,6 +328,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getScaleRightWrapped() */ + @Override public boolean getScaleRightWrapped() { return viewStyle.getScaleRightWrapped(); @@ -311,6 +338,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setAbovePIDThreshold(boolean) */ + @Override public void setAbovePIDThreshold(boolean b) { viewStyle.setAbovePIDThreshold(b); @@ -320,6 +348,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param thresh * @see jalview.api.ViewStyleI#setThreshold(int) */ + @Override public void setThreshold(int thresh) { viewStyle.setThreshold(thresh); @@ -329,6 +358,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getThreshold() */ + @Override public int getThreshold() { return viewStyle.getThreshold(); @@ -338,6 +368,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getShowJVSuffix() */ + @Override public boolean getShowJVSuffix() { return viewStyle.getShowJVSuffix(); @@ -347,6 +378,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param b * @see jalview.api.ViewStyleI#setShowJVSuffix(boolean) */ + @Override public void setShowJVSuffix(boolean b) { viewStyle.setShowJVSuffix(b); @@ -356,6 +388,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param state * @see jalview.api.ViewStyleI#setWrapAlignment(boolean) */ + @Override public void setWrapAlignment(boolean state) { viewStyle.setWrapAlignment(state); @@ -365,6 +398,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param state * @see jalview.api.ViewStyleI#setShowText(boolean) */ + @Override public void setShowText(boolean state) { viewStyle.setShowText(state); @@ -374,6 +408,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param state * @see jalview.api.ViewStyleI#setRenderGaps(boolean) */ + @Override public void setRenderGaps(boolean state) { viewStyle.setRenderGaps(state); @@ -383,6 +418,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getColourText() */ + @Override public boolean getColourText() { return viewStyle.getColourText(); @@ -392,6 +428,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param state * @see jalview.api.ViewStyleI#setColourText(boolean) */ + @Override public void setColourText(boolean state) { viewStyle.setColourText(state); @@ -401,6 +438,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getWrapAlignment() */ + @Override public boolean getWrapAlignment() { return viewStyle.getWrapAlignment(); @@ -410,6 +448,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getShowText() */ + @Override public boolean getShowText() { return viewStyle.getShowText(); @@ -419,6 +458,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getWrappedWidth() */ + @Override public int getWrappedWidth() { return viewStyle.getWrappedWidth(); @@ -428,6 +468,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param w * @see jalview.api.ViewStyleI#setWrappedWidth(int) */ + @Override public void setWrappedWidth(int w) { viewStyle.setWrappedWidth(w); @@ -437,6 +478,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getCharHeight() */ + @Override public int getCharHeight() { return viewStyle.getCharHeight(); @@ -446,6 +488,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param h * @see jalview.api.ViewStyleI#setCharHeight(int) */ + @Override public void setCharHeight(int h) { viewStyle.setCharHeight(h); @@ -455,6 +498,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getCharWidth() */ + @Override public int getCharWidth() { return viewStyle.getCharWidth(); @@ -464,6 +508,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param w * @see jalview.api.ViewStyleI#setCharWidth(int) */ + @Override public void setCharWidth(int w) { viewStyle.setCharWidth(w); @@ -473,6 +518,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getShowBoxes() */ + @Override public boolean getShowBoxes() { return viewStyle.getShowBoxes(); @@ -482,6 +528,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getShowUnconserved() */ + @Override public boolean getShowUnconserved() { return viewStyle.getShowUnconserved(); @@ -491,6 +538,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param showunconserved * @see jalview.api.ViewStyleI#setShowUnconserved(boolean) */ + @Override public void setShowUnconserved(boolean showunconserved) { viewStyle.setShowUnconserved(showunconserved); @@ -500,6 +548,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param default1 * @see jalview.api.ViewStyleI#setSeqNameItalics(boolean) */ + @Override public void setSeqNameItalics(boolean default1) { viewStyle.setSeqNameItalics(default1); @@ -540,7 +589,6 @@ public abstract class AlignmentViewport implements AlignViewportI, return isDataset; } - private Map hiddenRepSequences; protected ColumnSelection colSel = new ColumnSelection(); @@ -551,98 +599,83 @@ public abstract class AlignmentViewport implements AlignViewportI, protected boolean ignoreGapsInConsensusCalculation = false; - protected ColourSchemeI globalColourScheme = null; - + protected ResidueShaderI residueShading; @Override public void setGlobalColourScheme(ColourSchemeI cs) { // TODO: logic refactored from AlignFrame changeColour - - // autorecalc stuff should be changed to rely on the worker system + // TODO: autorecalc stuff should be changed to rely on the worker system // check to see if we should implement a changeColour(cs) method rather than - // put th logic in here + // put the logic in here // - means that caller decides if they want to just modify state and defer // calculation till later or to do all calculations in thread. // via changecolour - globalColourScheme = cs; - boolean recalc = false; + + /* + * only instantiate alignment colouring once, thereafter update it; + * this means that any conservation or PID threshold settings + * persist when the alignment colour scheme is changed + */ + if (residueShading == null) + { + residueShading = new ResidueShader(viewStyle); + } + residueShading.setColourScheme(cs); + + // TODO: do threshold and increment belong in ViewStyle or ResidueShader? + // ...problem: groups need these, but do not currently have a ViewStyle + if (cs != null) { - cs.setConservationApplied(recalc = getConservationSelected()); - if (getAbovePIDThreshold() || cs instanceof PIDColourScheme - || cs instanceof Blosum62ColourScheme) - { - recalc = true; - cs.setThreshold(viewStyle.getThreshold(), - ignoreGapsInConsensusCalculation); - } - else - { - cs.setThreshold(0, ignoreGapsInConsensusCalculation); - } - if (recalc) + if (getConservationSelected()) { - cs.setConsensus(hconsensus); - cs.setConservation(hconservation); + residueShading.setConservation(hconservation); } - cs.alignmentChanged(alignment, hiddenRepSequences); + residueShading.alignmentChanged(alignment, hiddenRepSequences); } + + /* + * if 'apply colour to all groups' is selected... do so + * (but don't transfer any colour threshold settings to groups) + */ if (getColourAppliesToAllGroups()) { for (SequenceGroup sg : getAlignment().getGroups()) { - if (cs == null) - { - sg.cs = null; - continue; - } - sg.cs = cs.applyTo(sg, getHiddenRepSequences()); - sg.setConsPercGaps(ConsPercGaps); - if (getAbovePIDThreshold() || cs instanceof PIDColourScheme - || cs instanceof Blosum62ColourScheme) + /* + * retain any colour thresholds per group while + * changing choice of colour scheme (JAL-2386) + */ + sg.setColourScheme(cs); + if (cs != null) { - sg.cs.setThreshold(viewStyle.getThreshold(), - isIgnoreGapsConsensus()); - recalc = true; - } - else - { - sg.cs.setThreshold(0, isIgnoreGapsConsensus()); - } - - if (getConservationSelected()) - { - sg.cs.setConservationApplied(true); - recalc = true; - } - else - { - sg.cs.setConservation(null); - // sg.cs.setThreshold(0, getIgnoreGapsConsensus()); - } - if (recalc) - { - sg.recalcConservation(); - } - else - { - sg.cs.alignmentChanged(sg, hiddenRepSequences); + sg.getGroupColourScheme() + .alignmentChanged(sg, hiddenRepSequences); } } } - } @Override public ColourSchemeI getGlobalColourScheme() { - return globalColourScheme; + return residueShading == null ? null : residueShading + .getColourScheme(); + } + + @Override + public ResidueShaderI getResidueShading() + { + return residueShading; } protected AlignmentAnnotation consensus; protected AlignmentAnnotation complementConsensus; + protected AlignmentAnnotation gapcounts; + protected AlignmentAnnotation strucConsensus; protected AlignmentAnnotation conservation; @@ -656,7 +689,7 @@ public abstract class AlignmentViewport implements AlignViewportI, /** * results of alignment consensus analysis for visible portion of view */ - protected Hashtable[] hconsensus = null; + protected ProfilesI hconsensus = null; /** * results of cDNA complement consensus visible portion of view @@ -690,7 +723,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public void setSequenceConsensusHash(Hashtable[] hconsensus) + public void setSequenceConsensusHash(ProfilesI hconsensus) { this.hconsensus = hconsensus; } @@ -702,7 +735,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public Hashtable[] getSequenceConsensusHash() + public ProfilesI getSequenceConsensusHash() { return hconsensus; } @@ -745,6 +778,12 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override + public AlignmentAnnotation getAlignmentGapAnnotation() + { + return gapcounts; + } + + @Override public AlignmentAnnotation getComplementConsensusAnnotation() { return complementConsensus; @@ -764,7 +803,8 @@ public abstract class AlignmentViewport implements AlignViewportI, public void updateConservation(final AlignmentViewPanel ap) { // see note in mantis : issue number 8585 - if (alignment.isNucleotide() || conservation == null + if (alignment.isNucleotide() + || (conservation == null && quality == null) || !autoCalculateConsensus) { return; @@ -794,15 +834,36 @@ public abstract class AlignmentViewport implements AlignViewportI, /* * A separate thread to compute cDNA consensus for a protein alignment + * which has mapping to cDNA */ final AlignmentI al = this.getAlignment(); if (!al.isNucleotide() && al.getCodonFrames() != null && !al.getCodonFrames().isEmpty()) { - if (calculator - .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null) + /* + * fudge - check first for protein-to-nucleotide mappings + * (we don't want to do this for protein-to-protein) + */ + boolean doConsensus = false; + for (AlignedCodonFrame mapping : al.getCodonFrames()) { - calculator.registerWorker(new ComplementConsensusThread(this, ap)); + // TODO hold mapping type e.g. dna-to-protein in AlignedCodonFrame? + MapList[] mapLists = mapping.getdnaToProt(); + // mapLists can be empty if project load has not finished resolving seqs + if (mapLists.length > 0 && mapLists[0].getFromRatio() == 3) + { + doConsensus = true; + break; + } + } + if (doConsensus) + { + if (calculator + .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null) + { + calculator + .registerWorker(new ComplementConsensusThread(this, ap)); + } } } } @@ -849,6 +910,37 @@ public abstract class AlignmentViewport implements AlignViewportI, return false; } + public void setAlignment(AlignmentI align) + { + this.alignment = align; + } + + /** + * Clean up references when this viewport is closed + */ + @Override + public void dispose() + { + /* + * defensively null out references to large objects in case + * this object is not garbage collected (as if!) + */ + consensus = null; + complementConsensus = null; + strucConsensus = null; + conservation = null; + quality = null; + groupConsensus = null; + groupConservation = null; + hconsensus = null; + hcomplementConsensus = null; + // colour scheme may hold reference to consensus + residueShading = null; + // TODO remove listeners from changeSupport? + changeSupport = null; + setAlignment(null); + } + @Override public boolean isClosed() { @@ -979,7 +1071,6 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean sortByTree = false; - /** * * @@ -992,7 +1083,8 @@ public abstract class AlignmentViewport implements AlignViewportI, } /** - * Set the selection group for this window. + * Set the selection group for this window. Also sets the current alignment as + * the context for the group, if it does not already have one. * * @param sg * - group holding references to sequences in this alignment view @@ -1002,6 +1094,10 @@ public abstract class AlignmentViewport implements AlignViewportI, public void setSelectionGroup(SequenceGroup sg) { selectionGroup = sg; + if (sg != null && sg.getContext() == null) + { + sg.setContext(alignment); + } } public void setHiddenColumns(ColumnSelection colsel) @@ -1023,6 +1119,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { updateHiddenColumns(); } + isColSelChanged(true); } /** @@ -1043,6 +1140,13 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override + public boolean hasSelectedColumns() + { + ColumnSelection columnSelection = getColumnSelection(); + return columnSelection != null && columnSelection.hasSelectedColumns(); + } + + @Override public boolean hasHiddenColumns() { return colSel != null && colSel.hasHiddenColumns(); @@ -1055,17 +1159,10 @@ public abstract class AlignmentViewport implements AlignViewportI, // hasHiddenColumns = colSel.hasHiddenColumns(); } - protected boolean hasHiddenRows = false; - @Override public boolean hasHiddenRows() { - return hasHiddenRows; - } - - public void setHasHiddenRows(boolean hasHiddenRows) - { - this.hasHiddenRows = hasHiddenRows; + return alignment.getHiddenSequences().getSize() > 0; } protected SequenceGroup selectionGroup; @@ -1113,9 +1210,9 @@ public abstract class AlignmentViewport implements AlignViewportI, if (ap != null) { updateConsensus(ap); - if (globalColourScheme != null) + if (residueShading != null) { - globalColourScheme.setThreshold(globalColourScheme.getThreshold(), + residueShading.setThreshold(residueShading.getThreshold(), ignoreGapsInConsensusCalculation); } } @@ -1158,8 +1255,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean isColSelChanged(boolean b) { - int hc = (colSel == null || colSel.size() == 0) ? -1 : colSel - .hashCode(); + int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode(); if (hc != -1 && hc != colselhash) { if (b) @@ -1177,10 +1273,9 @@ public abstract class AlignmentViewport implements AlignViewportI, return ignoreGapsInConsensusCalculation; } - // / property change stuff - + // property change stuff // JBPNote Prolly only need this in the applet version. - private final java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport( + private PropertyChangeSupport changeSupport = new PropertyChangeSupport( this); protected boolean showConservation = true; @@ -1189,6 +1284,8 @@ public abstract class AlignmentViewport implements AlignViewportI, protected boolean showConsensus = true; + protected boolean showOccupancy = true; + private Map sequenceColours = new HashMap(); protected SequenceAnnotationOrder sortAnnotationsBy = null; @@ -1200,15 +1297,6 @@ public abstract class AlignmentViewport implements AlignViewportI, */ private boolean followHighlight = true; - // TODO private with getters and setters? - public int startRes; - - public int endRes; - - public int startSeq; - - public int endSeq; - /** * Property change listener for changes in alignment * @@ -1253,14 +1341,14 @@ public abstract class AlignmentViewport implements AlignViewportI, public void hideSelectedColumns() { - if (colSel.size() < 1) + if (colSel.isEmpty()) { return; } colSel.hideSelectedColumns(); setSelectionGroup(null); - + isColSelChanged(true); } public void hideColumns(int start, int end) @@ -1273,17 +1361,19 @@ public abstract class AlignmentViewport implements AlignViewportI, { colSel.hideColumns(start, end); } + isColSelChanged(true); } public void showColumn(int col) { colSel.revealHiddenColumns(col); - + isColSelChanged(true); } public void showAllHiddenColumns() { colSel.revealAllHiddenColumns(); + isColSelChanged(true); } // common hide/show seq stuff @@ -1304,7 +1394,6 @@ public abstract class AlignmentViewport implements AlignViewportI, setSequenceAnnotationsVisible(seq, true); } - hasHiddenRows = false; hiddenRepSequences = null; firePropertyChange("alignment", null, alignment.getSequences()); @@ -1317,8 +1406,7 @@ public abstract class AlignmentViewport implements AlignViewportI, public void showSequence(int index) { List tmp = alignment.getHiddenSequences().showSequence( - index, - hiddenRepSequences); + index, hiddenRepSequences); if (tmp.size() > 0) { if (selectionGroup == null) @@ -1332,12 +1420,6 @@ public abstract class AlignmentViewport implements AlignViewportI, selectionGroup.addSequence(seq, false); setSequenceAnnotationsVisible(seq, true); } - // JBPNote: refactor: only update flag if we modified visiblity (used to - // do this regardless) - if (alignment.getHiddenSequences().getSize() < 1) - { - hasHiddenRows = false; - } firePropertyChange("alignment", null, alignment.getSequences()); sendSelection(); } @@ -1366,12 +1448,44 @@ public abstract class AlignmentViewport implements AlignViewportI, alignment.getHiddenSequences().hideSequence(seq[i]); setSequenceAnnotationsVisible(seq[i], false); } - hasHiddenRows = true; firePropertyChange("alignment", null, alignment.getSequences()); } } /** + * Hides the specified sequence, or the sequences it represents + * + * @param sequence + * the sequence to hide, or keep as representative + * @param representGroup + * if true, hide the current selection group except for the + * representative sequence + */ + public void hideSequences(SequenceI sequence, boolean representGroup) + { + if (selectionGroup == null || selectionGroup.getSize() < 1) + { + hideSequence(new SequenceI[] { sequence }); + return; + } + + if (representGroup) + { + hideRepSequences(sequence, selectionGroup); + setSelectionGroup(null); + return; + } + + int gsize = selectionGroup.getSize(); + SequenceI[] hseqs = selectionGroup.getSequences().toArray( + new SequenceI[gsize]); + + hideSequence(hseqs); + setSelectionGroup(null); + sendSelection(); + } + + /** * Set visibility for any annotations for the given sequence. * * @param sequenceI @@ -1379,11 +1493,15 @@ public abstract class AlignmentViewport implements AlignViewportI, protected void setSequenceAnnotationsVisible(SequenceI sequenceI, boolean visible) { - for (AlignmentAnnotation ann : alignment.getAlignmentAnnotation()) + AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); + if (anns != null) { - if (ann.sequenceRef == sequenceI) + for (AlignmentAnnotation ann : anns) { - ann.visible = visible; + if (ann.sequenceRef == sequenceI) + { + ann.visible = visible; + } } } } @@ -1398,7 +1516,7 @@ public abstract class AlignmentViewport implements AlignViewportI, if (hiddenRepSequences == null) { - hiddenRepSequences = new Hashtable(); + hiddenRepSequences = new Hashtable(); } hiddenRepSequences.put(repSequence, sg); @@ -1424,12 +1542,42 @@ public abstract class AlignmentViewport implements AlignViewportI, } + /** + * + * @return null or the current reference sequence + */ + public SequenceI getReferenceSeq() + { + return alignment.getSeqrep(); + } + + /** + * @param seq + * @return true iff seq is the reference for the alignment + */ + public boolean isReferenceSeq(SequenceI seq) + { + return alignment.getSeqrep() == seq; + } + + /** + * + * @param seq + * @return true if there are sequences represented by this sequence that are + * currently hidden + */ public boolean isHiddenRepSequence(SequenceI seq) { - return alignment.getSeqrep()==seq || (hiddenRepSequences != null - && hiddenRepSequences.containsKey(seq)); + return (hiddenRepSequences != null && hiddenRepSequences + .containsKey(seq)); } + /** + * + * @param seq + * @return null or a sequence group containing the sequences that seq + * represents + */ public SequenceGroup getRepresentedSequences(SequenceI seq) { return (SequenceGroup) (hiddenRepSequences == null ? null @@ -1449,7 +1597,6 @@ public abstract class AlignmentViewport implements AlignViewportI, colSel.invertColumnSelection(0, alignment.getWidth()); } - @Override public SequenceI[] getSelectionAsNewSequence() { @@ -1477,7 +1624,6 @@ public abstract class AlignmentViewport implements AlignViewportI, return sequences; } - @Override public SequenceI[] getSequenceSelection() { @@ -1493,16 +1639,13 @@ public abstract class AlignmentViewport implements AlignViewportI, return sequences; } - @Override - public CigarArray getViewAsCigars( - boolean selectedRegionOnly) + public CigarArray getViewAsCigars(boolean selectedRegionOnly) { return new CigarArray(alignment, colSel, (selectedRegionOnly ? selectionGroup : null)); } - @Override public jalview.datamodel.AlignmentView getAlignmentView( boolean selectedOnly) @@ -1510,7 +1653,6 @@ public abstract class AlignmentViewport implements AlignViewportI, return getAlignmentView(selectedOnly, false); } - @Override public jalview.datamodel.AlignmentView getAlignmentView( boolean selectedOnly, boolean markGroups) @@ -1520,10 +1662,16 @@ public abstract class AlignmentViewport implements AlignViewportI, markGroups); } - @Override public String[] getViewAsString(boolean selectedRegionOnly) { + return getViewAsString(selectedRegionOnly, true); + } + + @Override + public String[] getViewAsString(boolean selectedRegionOnly, + boolean exportHiddenSeqs) + { String[] selection = null; SequenceI[] seqs = null; int i, iSize; @@ -1537,9 +1685,20 @@ public abstract class AlignmentViewport implements AlignViewportI, } else { - iSize = alignment.getHeight(); - seqs = alignment.getSequencesArray(); - end = alignment.getWidth(); + if (hasHiddenRows() && exportHiddenSeqs) + { + AlignmentI fullAlignment = alignment.getHiddenSequences() + .getFullAlignment(); + iSize = fullAlignment.getHeight(); + seqs = fullAlignment.getSequencesArray(); + end = fullAlignment.getWidth(); + } + else + { + iSize = alignment.getHeight(); + seqs = alignment.getSequencesArray(); + end = alignment.getWidth(); + } } selection = new String[iSize]; @@ -1558,7 +1717,6 @@ public abstract class AlignmentViewport implements AlignViewportI, return selection; } - @Override public List getVisibleRegionBoundaries(int min, int max) { @@ -1586,8 +1744,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } } - regions.add(new int[] - { start, end }); + regions.add(new int[] { start, end }); if (colSel != null && colSel.hasHiddenColumns()) { @@ -1602,19 +1759,23 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public List getVisibleAlignmentAnnotation(boolean selectedOnly) + public List getVisibleAlignmentAnnotation( + boolean selectedOnly) { ArrayList ala = new ArrayList(); AlignmentAnnotation[] aa; - if ((aa=alignment.getAlignmentAnnotation())!=null) + if ((aa = alignment.getAlignmentAnnotation()) != null) { - for (AlignmentAnnotation annot:aa) + for (AlignmentAnnotation annot : aa) { AlignmentAnnotation clone = new AlignmentAnnotation(annot); - if (selectedOnly && selectionGroup!=null) + if (selectedOnly && selectionGroup != null) + { + colSel.makeVisibleAnnotation(selectionGroup.getStartRes(), + selectionGroup.getEndRes(), clone); + } + else { - colSel.makeVisibleAnnotation(selectionGroup.getStartRes(), selectionGroup.getEndRes(),clone); - } else { colSel.makeVisibleAnnotation(clone); } ala.add(clone); @@ -1623,14 +1784,12 @@ public abstract class AlignmentViewport implements AlignViewportI, return ala; } - @Override public boolean isPadGaps() { return padGaps; } - @Override public void setPadGaps(boolean padGaps) { @@ -1682,7 +1841,7 @@ public abstract class AlignmentViewport implements AlignViewportI, selectionGroup.setEndRes(alWidth - 1); } - resetAllColourSchemes(); + updateAllColourSchemes(); calculator.restartWorkers(); // alignment.adjustSequenceAnnotations(); } @@ -1690,19 +1849,19 @@ public abstract class AlignmentViewport implements AlignViewportI, /** * reset scope and do calculations for all applied colourschemes on alignment */ - void resetAllColourSchemes() + void updateAllColourSchemes() { - ColourSchemeI cs = globalColourScheme; - if (cs != null) + ResidueShaderI rs = residueShading; + if (rs != null) { - cs.alignmentChanged(alignment, hiddenRepSequences); + rs.alignmentChanged(alignment, hiddenRepSequences); - cs.setConsensus(hconsensus); - if (cs.conservationApplied()) + rs.setConsensus(hconsensus); + if (rs.conservationApplied()) { - cs.setConservation(Conservation.calculateConservation("All", - ResidueProperties.propHash, 3, alignment.getSequences(), 0, - alignment.getWidth(), false, getConsPercGaps(), false)); + rs.setConservation(Conservation.calculateConservation("All", + alignment.getSequences(), 0, alignment.getWidth(), false, + getConsPercGaps(), false)); } } @@ -1736,29 +1895,48 @@ public abstract class AlignmentViewport implements AlignViewportI, consensus = new AlignmentAnnotation("Consensus", "PID", new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(consensus); + initGapCounts(); initComplementConsensus(); } } /** - * If this is a protein alignment and there are mappings to cDNA, add the cDNA - * consensus annotation. + * If this is a protein alignment and there are mappings to cDNA, adds the + * cDNA consensus annotation and returns true, else returns false. */ - public void initComplementConsensus() + public boolean initComplementConsensus() { if (!alignment.isNucleotide()) { - final Set codonMappings = alignment + final List codonMappings = alignment .getCodonFrames(); if (codonMappings != null && !codonMappings.isEmpty()) { - complementConsensus = new AlignmentAnnotation("cDNA Consensus", - "PID for cDNA", new Annotation[1], 0f, 100f, - AlignmentAnnotation.BAR_GRAPH); - initConsensus(complementConsensus); + boolean doConsensus = false; + for (AlignedCodonFrame mapping : codonMappings) + { + // TODO hold mapping type e.g. dna-to-protein in AlignedCodonFrame? + MapList[] mapLists = mapping.getdnaToProt(); + // mapLists can be empty if project load has not finished resolving + // seqs + if (mapLists.length > 0 && mapLists[0].getFromRatio() == 3) + { + doConsensus = true; + break; + } + } + if (doConsensus) + { + complementConsensus = new AlignmentAnnotation("cDNA Consensus", + "PID for cDNA", new Annotation[1], 0f, 100f, + AlignmentAnnotation.BAR_GRAPH); + initConsensus(complementConsensus); + return true; + } } } + return false; } private void initConsensus(AlignmentAnnotation aa) @@ -1772,6 +1950,24 @@ public abstract class AlignmentViewport implements AlignViewportI, } } + // these should be extracted from the view model - style and settings for + // derived annotation + private void initGapCounts() + { + if (showOccupancy) + { + gapcounts = new AlignmentAnnotation("Occupancy", + "Number of aligned positions", new Annotation[1], 0f, + alignment.getHeight(), AlignmentAnnotation.BAR_GRAPH); + gapcounts.hasText = true; + gapcounts.autoCalculated = true; + gapcounts.scaleColLabel = true; + gapcounts.graph = AlignmentAnnotation.BAR_GRAPH; + + alignment.addAnnotation(gapcounts); + } + } + private void initConservation() { if (showConservation) @@ -1958,6 +2154,7 @@ public abstract class AlignmentViewport implements AlignViewportI, } oldrfs.clear(); } + @Override public boolean isDisplayReferenceSeq() { @@ -2066,7 +2263,8 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public boolean areFeaturesDisplayed() { - return featuresDisplayed != null && featuresDisplayed.getRegisterdFeaturesCount()>0; + return featuresDisplayed != null + && featuresDisplayed.getRegisteredFeaturesCount() > 0; } /** @@ -2080,6 +2278,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { viewStyle.setShowSequenceFeatures(b); } + @Override public boolean isShowSequenceFeatures() { @@ -2098,8 +2297,6 @@ public abstract class AlignmentViewport implements AlignViewportI, return viewStyle.isShowSequenceFeaturesHeight(); } - - @Override public void setShowAnnotation(boolean b) { @@ -2140,6 +2337,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getTextColour() */ + @Override public Color getTextColour() { return viewStyle.getTextColour(); @@ -2149,6 +2347,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getTextColour2() */ + @Override public Color getTextColour2() { return viewStyle.getTextColour2(); @@ -2158,6 +2357,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getThresholdTextColour() */ + @Override public int getThresholdTextColour() { return viewStyle.getThresholdTextColour(); @@ -2167,6 +2367,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isConservationColourSelected() */ + @Override public boolean isConservationColourSelected() { return viewStyle.isConservationColourSelected(); @@ -2176,6 +2377,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isRenderGaps() */ + @Override public boolean isRenderGaps() { return viewStyle.isRenderGaps(); @@ -2185,6 +2387,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isShowColourText() */ + @Override public boolean isShowColourText() { return viewStyle.isShowColourText(); @@ -2194,6 +2397,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param conservationColourSelected * @see jalview.api.ViewStyleI#setConservationColourSelected(boolean) */ + @Override public void setConservationColourSelected( boolean conservationColourSelected) { @@ -2204,6 +2408,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param showColourText * @see jalview.api.ViewStyleI#setShowColourText(boolean) */ + @Override public void setShowColourText(boolean showColourText) { viewStyle.setShowColourText(showColourText); @@ -2213,6 +2418,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param textColour * @see jalview.api.ViewStyleI#setTextColour(java.awt.Color) */ + @Override public void setTextColour(Color textColour) { viewStyle.setTextColour(textColour); @@ -2222,6 +2428,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param thresholdTextColour * @see jalview.api.ViewStyleI#setThresholdTextColour(int) */ + @Override public void setThresholdTextColour(int thresholdTextColour) { viewStyle.setThresholdTextColour(thresholdTextColour); @@ -2231,6 +2438,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param textColour2 * @see jalview.api.ViewStyleI#setTextColour2(java.awt.Color) */ + @Override public void setTextColour2(Color textColour2) { viewStyle.setTextColour2(textColour2); @@ -2246,6 +2454,11 @@ public abstract class AlignmentViewport implements AlignViewportI, public void setViewStyle(ViewStyleI settingsForView) { viewStyle = new ViewStyle(settingsForView); + if (residueShading != null) + { + residueShading.setConservationApplied(settingsForView + .isConservationColourSelected()); + } } @Override @@ -2258,6 +2471,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#getIdWidth() */ + @Override public int getIdWidth() { return viewStyle.getIdWidth(); @@ -2267,6 +2481,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param i * @see jalview.api.ViewStyleI#setIdWidth(int) */ + @Override public void setIdWidth(int i) { viewStyle.setIdWidth(i); @@ -2276,6 +2491,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isCentreColumnLabels() */ + @Override public boolean isCentreColumnLabels() { return viewStyle.isCentreColumnLabels(); @@ -2285,6 +2501,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param centreColumnLabels * @see jalview.api.ViewStyleI#setCentreColumnLabels(boolean) */ + @Override public void setCentreColumnLabels(boolean centreColumnLabels) { viewStyle.setCentreColumnLabels(centreColumnLabels); @@ -2294,6 +2511,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param showdbrefs * @see jalview.api.ViewStyleI#setShowDBRefs(boolean) */ + @Override public void setShowDBRefs(boolean showdbrefs) { viewStyle.setShowDBRefs(showdbrefs); @@ -2303,6 +2521,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isShowDBRefs() */ + @Override public boolean isShowDBRefs() { return viewStyle.isShowDBRefs(); @@ -2312,6 +2531,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @return * @see jalview.api.ViewStyleI#isShowNPFeats() */ + @Override public boolean isShowNPFeats() { return viewStyle.isShowNPFeats(); @@ -2321,6 +2541,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * @param shownpfeats * @see jalview.api.ViewStyleI#setShowNPFeats(boolean) */ + @Override public void setShowNPFeats(boolean shownpfeats) { viewStyle.setShowNPFeats(shownpfeats); @@ -2344,7 +2565,8 @@ public abstract class AlignmentViewport implements AlignViewportI, protected void broadcastCommand(CommandI command, boolean undo) { - getStructureSelectionManager().commandPerformed(command, undo, getVamsasSource()); + getStructureSelectionManager().commandPerformed(command, undo, + getVamsasSource()); } /** @@ -2447,62 +2669,10 @@ public abstract class AlignmentViewport implements AlignViewportI, this.followHighlight = b; } - public int getStartRes() - { - return startRes; - } - - public int getEndRes() - { - return endRes; - } - - public int getStartSeq() - { - return startSeq; - } - - public void setStartRes(int res) - { - this.startRes = res; - } - - public void setStartSeq(int seq) - { - this.startSeq = seq; - } - - public void setEndRes(int res) - { - if (res > alignment.getWidth() - 1) - { - // log.System.out.println(" Corrected res from " + res + " to maximum " + - // (alignment.getWidth()-1)); - res = alignment.getWidth() - 1; - } - if (res < 0) - { - res = 0; - } - this.endRes = res; - } - - public void setEndSeq(int seq) - { - if (seq > alignment.getHeight()) - { - seq = alignment.getHeight(); - } - if (seq < 0) - { - seq = 0; - } - this.endSeq = seq; - } - - public int getEndSeq() + @Override + public ViewportRanges getRanges() { - return endSeq; + return ranges; } /** @@ -2513,23 +2683,23 @@ public abstract class AlignmentViewport implements AlignViewportI, * the SearchResults to add to * @return the offset (below top of visible region) of the matched sequence */ - protected int findComplementScrollTarget(SearchResults sr) + protected int findComplementScrollTarget(SearchResultsI sr) { - final AlignViewportI codingComplement = getCodingComplement(); - if (codingComplement == null || !codingComplement.isFollowHighlight()) + final AlignViewportI complement = getCodingComplement(); + if (complement == null || !complement.isFollowHighlight()) { return 0; } boolean iAmProtein = !getAlignment().isNucleotide(); - AlignmentI proteinAlignment = iAmProtein ? getAlignment() - : codingComplement.getAlignment(); + AlignmentI proteinAlignment = iAmProtein ? getAlignment() : complement + .getAlignment(); if (proteinAlignment == null) { return 0; } - final Set mappings = proteinAlignment + final List mappings = proteinAlignment .getCodonFrames(); - + /* * Heuristic: find the first mapped sequence (if any) with a non-gapped * residue in the middle column of the visible region. Scroll the @@ -2542,10 +2712,18 @@ public abstract class AlignmentViewport implements AlignViewportI, * locate 'middle' column (true middle if an odd number visible, left of * middle if an even number visible) */ - int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2; + int middleColumn = ranges.getStartRes() + + (ranges.getEndRes() - ranges.getStartRes()) / 2; final HiddenSequences hiddenSequences = getAlignment() .getHiddenSequences(); - for (int seqNo = getStartSeq(); seqNo < getEndSeq(); seqNo++, seqOffset++) + + /* + * searching to the bottom of the alignment gives smoother scrolling across + * all gapped visible regions + */ + int lastSeq = alignment.getHeight() - 1; + List seqMappings = null; + for (int seqNo = ranges.getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) @@ -2556,15 +2734,16 @@ public abstract class AlignmentViewport implements AlignViewportI, { continue; } - List seqMappings = MappingUtils - .findMappingsForSequence(sequence, mappings); + seqMappings = MappingUtils + .findMappingsForSequenceAndOthers(sequence, mappings, + getCodingComplement().getAlignment().getSequences()); if (!seqMappings.isEmpty()) { break; } } - - if (sequence == null) + + if (sequence == null || seqMappings == null || seqMappings.isEmpty()) { /* * No ungapped mapped sequence in middle column - do nothing @@ -2572,7 +2751,90 @@ public abstract class AlignmentViewport implements AlignViewportI, return 0; } MappingUtils.addSearchResults(sr, sequence, - sequence.findPosition(middleColumn), mappings); + sequence.findPosition(middleColumn), seqMappings); return seqOffset; } + + /** + * synthesize a column selection if none exists so it covers the given + * selection group. if wholewidth is false, no column selection is made if the + * selection group covers the whole alignment width. + * + * @param sg + * @param wholewidth + */ + public void expandColSelection(SequenceGroup sg, boolean wholewidth) + { + int sgs, sge; + if (sg != null && (sgs = sg.getStartRes()) >= 0 + && sg.getStartRes() <= (sge = sg.getEndRes()) + && !this.hasSelectedColumns()) + { + if (!wholewidth && alignment.getWidth() == (1 + sge - sgs)) + { + // do nothing + return; + } + if (colSel == null) + { + colSel = new ColumnSelection(); + } + for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++) + { + colSel.addElement(cspos); + } + } + } + + /** + * hold status of current selection group - defined on alignment or not. + */ + private boolean selectionIsDefinedGroup = false; + + @Override + public boolean isSelectionDefinedGroup() + { + if (selectionGroup == null) + { + return false; + } + if (isSelectionGroupChanged(true)) + { + selectionIsDefinedGroup = false; + List gps = alignment.getGroups(); + if (gps == null || gps.size() == 0) + { + selectionIsDefinedGroup = false; + } + else + { + selectionIsDefinedGroup = gps.contains(selectionGroup); + } + } + return selectionGroup.getContext() == alignment + || selectionIsDefinedGroup; + } + + /** + * null, or currently highlighted results on this view + */ + private SearchResultsI searchResults = null; + + @Override + public boolean hasSearchResults() + { + return searchResults != null; + } + + @Override + public void setSearchResults(SearchResultsI results) + { + searchResults = results; + } + + @Override + public SearchResultsI getSearchResults() + { + return searchResults; + } }