X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FAlignmentViewport.java;h=7849c2d1ea69cf2d66429f688f1c3f5f16f89de7;hb=fbfbbe26bee37143d5279fe4d254a5a89c96b021;hp=39621c53215034ee3dae89d936ea99b5cf777cf2;hpb=4d890895e6aabfc36d45d3b53781ee2cf5cfafdc;p=jalview.git diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index 39621c5..7849c2d 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -22,7 +22,9 @@ package jalview.viewmodel; import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.Conservation; +import jalview.analysis.TreeModel; import jalview.api.AlignCalcManagerI; +import jalview.api.AlignExportSettingsI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.FeaturesDisplayedI; @@ -30,11 +32,12 @@ import jalview.api.ViewStyleI; import jalview.commands.CommandI; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentExportData; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.Annotation; -import jalview.datamodel.CigarArray; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.ContactListI; import jalview.datamodel.HiddenColumns; import jalview.datamodel.HiddenSequences; import jalview.datamodel.ProfilesI; @@ -67,6 +70,7 @@ import java.util.BitSet; import java.util.Deque; import java.util.HashMap; import java.util.Hashtable; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -77,10 +81,10 @@ import java.util.Map; * @author jimp * */ -public abstract class AlignmentViewport implements AlignViewportI, - CommandListener, VamsasSource +public abstract class AlignmentViewport + implements AlignViewportI, CommandListener, VamsasSource { - final protected ViewportRanges ranges; + protected ViewportRanges ranges; protected ViewStyleI viewStyle = new ViewStyle(); @@ -92,9 +96,9 @@ public abstract class AlignmentViewport implements AlignViewportI, FeaturesDisplayedI featuresDisplayed = null; - protected Deque historyList = new ArrayDeque(); + protected Deque historyList = new ArrayDeque<>(); - protected Deque redoList = new ArrayDeque(); + protected Deque redoList = new ArrayDeque<>(); /** * alignment displayed in the viewport. Please use get/setter @@ -405,6 +409,7 @@ public abstract class AlignmentViewport implements AlignViewportI, public void setWrapAlignment(boolean state) { viewStyle.setWrapAlignment(state); + ranges.setWrappedMode(state); } /** @@ -567,8 +572,6 @@ public abstract class AlignmentViewport implements AlignViewportI, viewStyle.setSeqNameItalics(default1); } - - @Override public AlignmentI getAlignment() { @@ -609,7 +612,7 @@ public abstract class AlignmentViewport implements AlignViewportI, protected boolean ignoreGapsInConsensusCalculation = false; - protected ResidueShaderI residueShading; + protected ResidueShaderI residueShading = new ResidueShader(); @Override public void setGlobalColourScheme(ColourSchemeI cs) @@ -642,6 +645,11 @@ public abstract class AlignmentViewport implements AlignViewportI, { residueShading.setConservation(hconservation); } + /* + * reset conservation flag in case just set to false if + * Conservation was null (calculation still in progress) + */ + residueShading.setConservationApplied(getConservationSelected()); residueShading.alignmentChanged(alignment, hiddenRepSequences); } @@ -657,11 +665,11 @@ public abstract class AlignmentViewport implements AlignViewportI, * retain any colour thresholds per group while * changing choice of colour scheme (JAL-2386) */ - sg.setColourScheme(cs); + sg.setColourScheme(cs == null ? null : cs.getInstance(this, sg)); if (cs != null) { - sg.getGroupColourScheme() - .alignmentChanged(sg, hiddenRepSequences); + sg.getGroupColourScheme().alignmentChanged(sg, + hiddenRepSequences); } } } @@ -670,8 +678,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public ColourSchemeI getGlobalColourScheme() { - return residueShading == null ? null : residueShading - .getColourScheme(); + return residueShading == null ? null : residueShading.getColourScheme(); } @Override @@ -704,13 +711,13 @@ public abstract class AlignmentViewport implements AlignViewportI, /** * results of cDNA complement consensus visible portion of view */ - protected Hashtable[] hcomplementConsensus = null; + protected Hashtable[] hcomplementConsensus = null; /** * results of secondary structure base pair consensus for visible portion of * view */ - protected Hashtable[] hStrucConsensus = null; + protected Hashtable[] hStrucConsensus = null; protected Conservation hconservation = null; @@ -739,7 +746,8 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public void setComplementConsensusHash(Hashtable[] hconsensus) + public void setComplementConsensusHash( + Hashtable[] hconsensus) { this.hcomplementConsensus = hconsensus; } @@ -751,19 +759,20 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public Hashtable[] getComplementConsensusHash() + public Hashtable[] getComplementConsensusHash() { return hcomplementConsensus; } @Override - public Hashtable[] getRnaStructureConsensusHash() + public Hashtable[] getRnaStructureConsensusHash() { return hStrucConsensus; } @Override - public void setRnaStructureConsensusHash(Hashtable[] hStrucConsensus) + public void setRnaStructureConsensusHash( + Hashtable[] hStrucConsensus) { this.hStrucConsensus = hStrucConsensus; @@ -819,11 +828,11 @@ public abstract class AlignmentViewport implements AlignViewportI, { return; } - if (calculator - .getRegisteredWorkersOfClass(jalview.workers.ConservationThread.class) == null) + if (calculator.getRegisteredWorkersOfClass( + jalview.workers.ConservationThread.class) == null) { - calculator.registerWorker(new jalview.workers.ConservationThread( - this, ap)); + calculator.registerWorker( + new jalview.workers.ConservationThread(this, ap)); } } @@ -837,7 +846,8 @@ public abstract class AlignmentViewport implements AlignViewportI, { return; } - if (calculator.getRegisteredWorkersOfClass(ConsensusThread.class) == null) + if (calculator + .getRegisteredWorkersOfClass(ConsensusThread.class) == null) { calculator.registerWorker(new ConsensusThread(this, ap)); } @@ -868,8 +878,8 @@ public abstract class AlignmentViewport implements AlignViewportI, } if (doConsensus) { - if (calculator - .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null) + if (calculator.getRegisteredWorkersOfClass( + ComplementConsensusThread.class) == null) { calculator .registerWorker(new ComplementConsensusThread(this, ap)); @@ -893,7 +903,8 @@ public abstract class AlignmentViewport implements AlignViewportI, { return; } - if (calculator.getRegisteredWorkersOfClass(StrucConsensusThread.class) == null) + if (calculator.getRegisteredWorkersOfClass( + StrucConsensusThread.class) == null) { calculator.registerWorker(new StrucConsensusThread(this, ap)); } @@ -943,11 +954,16 @@ public abstract class AlignmentViewport implements AlignViewportI, groupConsensus = null; groupConservation = null; hconsensus = null; + hconservation = null; hcomplementConsensus = null; - // colour scheme may hold reference to consensus - residueShading = null; - // TODO remove listeners from changeSupport? + gapcounts = null; + calculator = null; + residueShading = null; // may hold a reference to Consensus changeSupport = null; + ranges = null; + currentTree = null; + selectionGroup = null; + colSel = null; setAlignment(null); } @@ -1113,7 +1129,6 @@ public abstract class AlignmentViewport implements AlignViewportI, public void setHiddenColumns(HiddenColumns hidden) { this.alignment.setHiddenColumns(hidden); - // this.colSel = colsel; } @Override @@ -1160,7 +1175,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public boolean hasHiddenColumns() { - return colSel != null + return alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns(); } @@ -1183,8 +1198,8 @@ public abstract class AlignmentViewport implements AlignViewportI, { if (sequenceSetID != null) { - System.err - .println("Warning - overwriting a sequenceSetId for a viewport!"); + System.err.println( + "Warning - overwriting a sequenceSetId for a viewport!"); } sequenceSetID = new String(newid); } @@ -1298,7 +1313,7 @@ public abstract class AlignmentViewport implements AlignViewportI, protected boolean showOccupancy = true; - private Map sequenceColours = new HashMap(); + private Map sequenceColours = new HashMap<>(); protected SequenceAnnotationOrder sortAnnotationsBy = null; @@ -1330,7 +1345,10 @@ public abstract class AlignmentViewport implements AlignViewportI, public void removePropertyChangeListener( java.beans.PropertyChangeListener listener) { - changeSupport.removePropertyChangeListener(listener); + if (changeSupport != null) + { + changeSupport.removePropertyChangeListener(listener); + } } /** @@ -1391,6 +1409,9 @@ public abstract class AlignmentViewport implements AlignViewportI, // common hide/show seq stuff public void showAllHiddenSeqs() { + int startSeq = ranges.getStartSeq(); + int endSeq = ranges.getEndSeq(); + if (alignment.getHiddenSequences().getSize() > 0) { if (selectionGroup == null) @@ -1398,8 +1419,8 @@ public abstract class AlignmentViewport implements AlignViewportI, selectionGroup = new SequenceGroup(); selectionGroup.setEndRes(alignment.getWidth() - 1); } - List tmp = alignment.getHiddenSequences().showAll( - hiddenRepSequences); + List tmp = alignment.getHiddenSequences() + .showAll(hiddenRepSequences); for (SequenceI seq : tmp) { selectionGroup.addSequence(seq, false); @@ -1408,6 +1429,8 @@ public abstract class AlignmentViewport implements AlignViewportI, hiddenRepSequences = null; + ranges.setStartEndSeq(startSeq, endSeq + tmp.size()); + firePropertyChange("alignment", null, alignment.getSequences()); // used to set hasHiddenRows/hiddenRepSequences here, after the property // changed event @@ -1417,8 +1440,11 @@ public abstract class AlignmentViewport implements AlignViewportI, public void showSequence(int index) { - List tmp = alignment.getHiddenSequences().showSequence( - index, hiddenRepSequences); + int startSeq = ranges.getStartSeq(); + int endSeq = ranges.getEndSeq(); + + List tmp = alignment.getHiddenSequences().showSequence(index, + hiddenRepSequences); if (tmp.size() > 0) { if (selectionGroup == null) @@ -1432,6 +1458,9 @@ public abstract class AlignmentViewport implements AlignViewportI, selectionGroup.addSequence(seq, false); setSequenceAnnotationsVisible(seq, true); } + + ranges.setStartEndSeq(startSeq, endSeq + tmp.size()); + firePropertyChange("alignment", null, alignment.getSequences()); sendSelection(); } @@ -1453,6 +1482,11 @@ public abstract class AlignmentViewport implements AlignViewportI, public void hideSequence(SequenceI[] seq) { + /* + * cache offset to first visible sequence + */ + int startSeq = ranges.getStartSeq(); + if (seq != null) { for (int i = 0; i < seq.length; i++) @@ -1460,6 +1494,7 @@ public abstract class AlignmentViewport implements AlignViewportI, alignment.getHiddenSequences().hideSequence(seq[i]); setSequenceAnnotationsVisible(seq[i], false); } + ranges.setStartSeq(startSeq); firePropertyChange("alignment", null, alignment.getSequences()); } } @@ -1489,8 +1524,8 @@ public abstract class AlignmentViewport implements AlignViewportI, } int gsize = selectionGroup.getSize(); - SequenceI[] hseqs = selectionGroup.getSequences().toArray( - new SequenceI[gsize]); + SequenceI[] hseqs = selectionGroup.getSequences() + .toArray(new SequenceI[gsize]); hideSequence(hseqs); setSelectionGroup(null); @@ -1528,7 +1563,7 @@ public abstract class AlignmentViewport implements AlignViewportI, if (hiddenRepSequences == null) { - hiddenRepSequences = new Hashtable(); + hiddenRepSequences = new Hashtable<>(); } hiddenRepSequences.put(repSequence, sg); @@ -1580,8 +1615,8 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean isHiddenRepSequence(SequenceI seq) { - return (hiddenRepSequences != null && hiddenRepSequences - .containsKey(seq)); + return (hiddenRepSequences != null + && hiddenRepSequences.containsKey(seq)); } /** @@ -1599,14 +1634,15 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public int adjustForHiddenSeqs(int alignmentIndex) { - return alignment.getHiddenSequences().adjustForHiddenSeqs( - alignmentIndex); + return alignment.getHiddenSequences() + .adjustForHiddenSeqs(alignmentIndex); } @Override public void invertColumnSelection() { colSel.invertColumnSelection(0, alignment.getWidth(), alignment); + isColSelChanged(true); } @Override @@ -1652,13 +1688,6 @@ public abstract class AlignmentViewport implements AlignViewportI, } @Override - public CigarArray getViewAsCigars(boolean selectedRegionOnly) - { - return new CigarArray(alignment, alignment.getHiddenColumns(), - (selectedRegionOnly ? selectionGroup : null)); - } - - @Override public jalview.datamodel.AlignmentView getAlignmentView( boolean selectedOnly) { @@ -1670,10 +1699,10 @@ public abstract class AlignmentViewport implements AlignViewportI, boolean selectedOnly, boolean markGroups) { return new AlignmentView(alignment, alignment.getHiddenColumns(), - selectionGroup, alignment.getHiddenColumns() != null + selectionGroup, + alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns(), - selectedOnly, - markGroups); + selectedOnly, markGroups); } @Override @@ -1719,8 +1748,12 @@ public abstract class AlignmentViewport implements AlignViewportI, if (alignment.getHiddenColumns() != null && alignment.getHiddenColumns().hasHiddenColumns()) { - selection = alignment.getHiddenColumns().getVisibleSequenceStrings( - start, end, seqs); + for (i = 0; i < iSize; i++) + { + Iterator blocks = alignment.getHiddenColumns() + .getVisContigsIterator(start, end + 1, false); + selection[i] = seqs[i].getSequenceStringFromIterator(blocks); + } } else { @@ -1736,7 +1769,7 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public List getVisibleRegionBoundaries(int min, int max) { - ArrayList regions = new ArrayList(); + ArrayList regions = new ArrayList<>(); int start = min; int end = max; @@ -1747,10 +1780,10 @@ public abstract class AlignmentViewport implements AlignViewportI, { if (start == 0) { - start = hidden.adjustForHiddenColumns(start); + start = hidden.visibleToAbsoluteColumn(start); } - end = hidden.getHiddenBoundaryRight(start); + end = hidden.getNextHiddenBoundary(false, start); if (start == end) { end = max; @@ -1765,12 +1798,12 @@ public abstract class AlignmentViewport implements AlignViewportI, if (hidden != null && hidden.hasHiddenColumns()) { - start = hidden.adjustForHiddenColumns(end); - start = hidden.getHiddenBoundaryLeft(start) + 1; + start = hidden.visibleToAbsoluteColumn(end); + start = hidden.getNextHiddenBoundary(true, start) + 1; } } while (end < max); - int[][] startEnd = new int[regions.size()][2]; + // int[][] startEnd = new int[regions.size()][2]; return regions; } @@ -1779,7 +1812,7 @@ public abstract class AlignmentViewport implements AlignViewportI, public List getVisibleAlignmentAnnotation( boolean selectedOnly) { - ArrayList ala = new ArrayList(); + ArrayList ala = new ArrayList<>(); AlignmentAnnotation[] aa; if ((aa = alignment.getAlignmentAnnotation()) != null) { @@ -1788,13 +1821,12 @@ public abstract class AlignmentViewport implements AlignViewportI, AlignmentAnnotation clone = new AlignmentAnnotation(annot); if (selectedOnly && selectionGroup != null) { - alignment.getHiddenColumns().makeVisibleAnnotation( - selectionGroup.getStartRes(), - selectionGroup.getEndRes(), clone); + clone.makeVisibleAnnotation(selectionGroup.getStartRes(), + selectionGroup.getEndRes(), alignment.getHiddenColumns()); } else { - alignment.getHiddenColumns().makeVisibleAnnotation(clone); + clone.makeVisibleAnnotation(alignment.getHiddenColumns()); } ala.add(clone); } @@ -1979,8 +2011,8 @@ public abstract class AlignmentViewport implements AlignViewportI, { gapcounts = new AlignmentAnnotation("Occupancy", MessageManager.getString("label.occupancy_descr"), - new Annotation[1], 0f, - alignment.getHeight(), AlignmentAnnotation.BAR_GRAPH); + new Annotation[1], 0f, alignment.getHeight(), + AlignmentAnnotation.BAR_GRAPH); gapcounts.hasText = true; gapcounts.autoCalculated = true; gapcounts.scaleColLabel = true; @@ -1998,8 +2030,8 @@ public abstract class AlignmentViewport implements AlignViewportI, { conservation = new AlignmentAnnotation("Conservation", MessageManager.formatMessage("label.conservation_descr", - getConsPercGaps()), new Annotation[1], - 0f, 11f, AlignmentAnnotation.BAR_GRAPH); + getConsPercGaps()), + new Annotation[1], 0f, 11f, AlignmentAnnotation.BAR_GRAPH); conservation.hasText = true; conservation.autoCalculated = true; alignment.addAnnotation(conservation); @@ -2125,7 +2157,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * TODO reorder the annotation rows according to group/sequence ordering on * alignment */ - boolean sortg = true; + // boolean sortg = true; // remove old automatic annotation // add any new annotation @@ -2133,7 +2165,7 @@ public abstract class AlignmentViewport implements AlignViewportI, // intersect alignment annotation with alignment groups AlignmentAnnotation[] aan = alignment.getAlignmentAnnotation(); - List oldrfs = new ArrayList(); + List oldrfs = new ArrayList<>(); if (aan != null) { for (int an = 0; an < aan.length; an++) @@ -2235,7 +2267,7 @@ public abstract class AlignmentViewport implements AlignViewportI, public void clearSequenceColours() { sequenceColours.clear(); - }; + } @Override public AlignViewportI getCodingComplement() @@ -2479,8 +2511,8 @@ public abstract class AlignmentViewport implements AlignViewportI, viewStyle = new ViewStyle(settingsForView); if (residueShading != null) { - residueShading.setConservationApplied(settingsForView - .isConservationColourSelected()); + residueShading.setConservationApplied( + settingsForView.isConservationColourSelected()); } } @@ -2648,7 +2680,8 @@ public abstract class AlignmentViewport implements AlignViewportI, return sortAnnotationsBy; } - public void setSortAnnotationsBy(SequenceAnnotationOrder sortAnnotationsBy) + public void setSortAnnotationsBy( + SequenceAnnotationOrder sortAnnotationsBy) { this.sortAnnotationsBy = sortAnnotationsBy; } @@ -2675,6 +2708,42 @@ public abstract class AlignmentViewport implements AlignViewportI, viewStyle.setScaleProteinAsCdna(b); } + @Override + public boolean isProteinFontAsCdna() + { + return viewStyle.isProteinFontAsCdna(); + } + + @Override + public void setProteinFontAsCdna(boolean b) + { + viewStyle.setProteinFontAsCdna(b); + } + + @Override + public void setShowComplementFeatures(boolean b) + { + viewStyle.setShowComplementFeatures(b); + } + + @Override + public boolean isShowComplementFeatures() + { + return viewStyle.isShowComplementFeatures(); + } + + @Override + public void setShowComplementFeaturesOnTop(boolean b) + { + viewStyle.setShowComplementFeaturesOnTop(b); + } + + @Override + public boolean isShowComplementFeaturesOnTop() + { + return viewStyle.isShowComplementFeaturesOnTop(); + } + /** * @return true if view should scroll to show the highlighted region of a * sequence @@ -2714,8 +2783,8 @@ public abstract class AlignmentViewport implements AlignViewportI, return 0; } boolean iAmProtein = !getAlignment().isNucleotide(); - AlignmentI proteinAlignment = iAmProtein ? getAlignment() : complement - .getAlignment(); + AlignmentI proteinAlignment = iAmProtein ? getAlignment() + : complement.getAlignment(); if (proteinAlignment == null) { return 0; @@ -2746,7 +2815,8 @@ public abstract class AlignmentViewport implements AlignViewportI, */ int lastSeq = alignment.getHeight() - 1; List seqMappings = null; - for (int seqNo = ranges.getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) + for (int seqNo = ranges + .getStartSeq(); seqNo <= lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) @@ -2757,9 +2827,9 @@ public abstract class AlignmentViewport implements AlignViewportI, { continue; } - seqMappings = MappingUtils - .findMappingsForSequenceAndOthers(sequence, mappings, - getCodingComplement().getAlignment().getSequences()); + seqMappings = MappingUtils.findMappingsForSequenceAndOthers(sequence, + mappings, + getCodingComplement().getAlignment().getSequences()); if (!seqMappings.isEmpty()) { break; @@ -2834,8 +2904,7 @@ public abstract class AlignmentViewport implements AlignViewportI, selectionIsDefinedGroup = gps.contains(selectionGroup); } } - return selectionGroup.getContext() == alignment - || selectionIsDefinedGroup; + return selectionGroup.isDefined() || selectionIsDefinedGroup; } /** @@ -2843,6 +2912,8 @@ public abstract class AlignmentViewport implements AlignViewportI, */ private SearchResultsI searchResults = null; + protected TreeModel currentTree = null; + @Override public boolean hasSearchResults() { @@ -2860,4 +2931,176 @@ public abstract class AlignmentViewport implements AlignViewportI, { return searchResults; } + + @Override + public ContactListI getContactList(AlignmentAnnotation _aa, int column) + { + return alignment.getContactListFor(_aa, column); + } + + /** + * get the consensus sequence as displayed under the PID consensus annotation + * row. + * + * @return consensus sequence as a new sequence object + */ + public SequenceI getConsensusSeq() + { + if (consensus == null) + { + updateConsensus(null); + } + if (consensus == null) + { + return null; + } + StringBuffer seqs = new StringBuffer(); + for (int i = 0; i < consensus.annotations.length; i++) + { + Annotation annotation = consensus.annotations[i]; + if (annotation != null) + { + String description = annotation.description; + if (description != null && description.startsWith("[")) + { + // consensus is a tie - just pick the first one + seqs.append(description.charAt(1)); + } + else + { + seqs.append(annotation.displayCharacter); + } + } + } + + SequenceI sq = new Sequence("Consensus", seqs.toString()); + sq.setDescription("Percentage Identity Consensus " + + ((ignoreGapsInConsensusCalculation) ? " without gaps" : "")); + return sq; + } + + @Override + public void setCurrentTree(TreeModel tree) + { + currentTree = tree; + } + + @Override + public TreeModel getCurrentTree() + { + return currentTree; + } + + @Override + public AlignmentExportData getAlignExportData( + AlignExportSettingsI options) + { + AlignmentI alignmentToExport = null; + String[] omitHidden = null; + alignmentToExport = null; + + if (hasHiddenColumns() && !options.isExportHiddenColumns()) + { + omitHidden = getViewAsString(false, + options.isExportHiddenSequences()); + } + + int[] alignmentStartEnd = new int[2]; + if (hasHiddenRows() && options.isExportHiddenSequences()) + { + alignmentToExport = getAlignment().getHiddenSequences() + .getFullAlignment(); + } + else + { + alignmentToExport = getAlignment(); + } + alignmentStartEnd = getAlignment().getHiddenColumns() + .getVisibleStartAndEndIndex(alignmentToExport.getWidth()); + AlignmentExportData ed = new AlignmentExportData(alignmentToExport, + omitHidden, alignmentStartEnd); + return ed; + } + + /** + * flag set to indicate if structure views might be out of sync with sequences + * in the alignment + */ + + private boolean needToUpdateStructureViews = false; + + @Override + public boolean isUpdateStructures() + { + return needToUpdateStructureViews; + } + + @Override + public void setUpdateStructures(boolean update) + { + needToUpdateStructureViews = update; + } + + @Override + public boolean needToUpdateStructureViews() + { + boolean update = needToUpdateStructureViews; + needToUpdateStructureViews = false; + return update; + } + + @Override + public void addSequenceGroup(SequenceGroup sequenceGroup) + { + alignment.addGroup(sequenceGroup); + + Color col = sequenceGroup.idColour; + if (col != null) + { + col = col.brighter(); + + for (SequenceI sq : sequenceGroup.getSequences()) + { + setSequenceColour(sq, col); + } + } + + if (codingComplement != null) + { + SequenceGroup mappedGroup = MappingUtils + .mapSequenceGroup(sequenceGroup, this, codingComplement); + if (mappedGroup.getSequences().size() > 0) + { + codingComplement.getAlignment().addGroup(mappedGroup); + + if (col != null) + { + for (SequenceI seq : mappedGroup.getSequences()) + { + codingComplement.setSequenceColour(seq, col); + } + } + } + // propagate the structure view update flag according to our own setting + codingComplement.setUpdateStructures(needToUpdateStructureViews); + } + } + + @Override + public Iterator getViewAsVisibleContigs(boolean selectedRegionOnly) + { + int start = 0; + int end = 0; + if (selectedRegionOnly && selectionGroup != null) + { + start = selectionGroup.getStartRes(); + end = selectionGroup.getEndRes() + 1; + } + else + { + end = alignment.getWidth(); + } + return (alignment.getHiddenColumns().getVisContigsIterator(start, end, + false)); + } }