+ /**
+ * returns the visible column regions of the alignment
+ *
+ * @param selectedRegionOnly
+ * true to just return the contigs intersecting with the selected
+ * area
+ * @return
+ */
+ public int[] getViewAsVisibleContigs(boolean selectedRegionOnly)
+ {
+ int[] viscontigs = null;
+ int start = 0, end = 0;
+ if (selectedRegionOnly && selectionGroup != null)
+ {
+ start = selectionGroup.getStartRes();
+ end = selectionGroup.getEndRes() + 1;
+ }
+ else
+ {
+ end = alignment.getWidth();
+ }
+ viscontigs = colSel.getVisibleContigs(start, end);
+ return viscontigs;
+ }
+
+ /**
+ * get hash of undo and redo list for the alignment
+ *
+ * @return long[] { historyList.hashCode, redoList.hashCode };
+ */
+ public long[] getUndoRedoHash()
+ {
+ if (historyList == null || redoList == null)
+ return new long[]
+ { -1, -1 };
+ return new long[]
+ { historyList.hashCode(), this.redoList.hashCode() };
+ }
+
+ /**
+ * test if a particular set of hashcodes are different to the hashcodes for
+ * the undo and redo list.
+ *
+ * @param undoredo
+ * the stored set of hashcodes as returned by getUndoRedoHash
+ * @return true if the hashcodes differ (ie the alignment has been edited) or
+ * the stored hashcode array differs in size
+ */
+ public boolean isUndoRedoHashModified(long[] undoredo)
+ {
+ if (undoredo == null)
+ {
+ return true;
+ }
+ long[] cstate = getUndoRedoHash();
+ if (cstate.length != undoredo.length)
+ {
+ return true;
+ }
+
+ for (int i = 0; i < cstate.length; i++)
+ {
+ if (cstate[i] != undoredo[i])
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean getCentreColumnLabels()
+ {
+ return centreColumnLabels;
+ }
+
+ public void setCentreColumnLabels(boolean centrecolumnlabels)
+ {
+ centreColumnLabels = centrecolumnlabels;
+ }
+
+ public void updateSequenceIdColours()
+ {
+ Vector groups = alignment.getGroups();
+ if (sequenceColours == null)
+ {
+ sequenceColours = new Hashtable();
+ }
+ for (int ig = 0, igSize = groups.size(); ig < igSize; ig++)
+ {
+ SequenceGroup sg = (SequenceGroup) groups.elementAt(ig);
+ if (sg.idColour != null)
+ {
+ Vector sqs = sg.getSequences(hiddenRepSequences);
+ for (int s = 0, sSize = sqs.size(); s < sSize; s++)
+ {
+ sequenceColours.put(sqs.elementAt(s), sg.idColour);
+ }
+ }
+ }
+ }
+
+ /**
+ * enable or disable the display of Database Cross References in the sequence
+ * ID tooltip
+ */
+ public void setShowDbRefs(boolean show)
+ {
+ showdbrefs = show;
+ }
+
+ /**
+ *
+ * @return true if Database References are to be displayed on tooltips.
+ */
+ public boolean isShowDbRefs()
+ {
+ return showdbrefs;
+ }
+
+ /**
+ *
+ * @return true if Non-positional features are to be displayed on tooltips.
+ */
+ public boolean isShowNpFeats()
+ {
+ return shownpfeats;
+ }
+
+ /**
+ * enable or disable the display of Non-Positional sequence features in the
+ * sequence ID tooltip
+ *
+ * @param show
+ */
+ public void setShowNpFeats(boolean show)
+ {
+ shownpfeats = show;
+ }
+
+ /**
+ *
+ * @return true if view has hidden rows
+ */
+ public boolean hasHiddenRows()
+ {
+ return hasHiddenRows;
+ }
+
+ /**
+ *
+ * @return true if view has hidden columns
+ */
+ public boolean hasHiddenColumns()
+ {
+ return hasHiddenColumns;
+ }
+
+ /**
+ * when set, view will scroll to show the highlighted position
+ */
+ public boolean followHighlight = true;
+
+ /**
+ * @return true if view should scroll to show the highlighted region of a
+ * sequence
+ * @return
+ */
+ public boolean getFollowHighlight()
+ {
+ return followHighlight;
+ }
+
+ public boolean followSelection = true;
+
+ /**
+ * @return true if view selection should always follow the selections
+ * broadcast by other selection sources
+ */
+ public boolean getFollowSelection()
+ {
+ return followSelection;
+ }
+
+ private long sgrouphash = -1, colselhash = -1;
+
+ boolean showSeqFeaturesHeight;
+
+ /**
+ * checks current SelectionGroup against record of last hash value, and
+ * updates record.
+ *
+ * @return true if SelectionGroup changed since last call
+ */
+ boolean isSelectionGroupChanged()
+ {
+ int hc = (selectionGroup == null) ? -1 : selectionGroup.hashCode();
+ if (hc != sgrouphash)
+ {
+ sgrouphash = hc;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * checks current colsel against record of last hash value, and updates
+ * record.
+ *
+ * @return true if colsel changed since last call
+ */
+ boolean isColSelChanged()
+ {
+ int hc = (colSel == null) ? -1 : colSel.hashCode();
+ if (hc != colselhash)
+ {
+ colselhash = hc;
+ return true;
+ }
+ return false;
+ }
+
+ public void sendSelection()
+ {
+ jalview.structure.StructureSelectionManager
+ .getStructureSelectionManager().sendSelection(
+ new SequenceGroup(getSelectionGroup()),
+ new ColumnSelection(getColumnSelection()), this);
+ }
+
+ public void setShowSequenceFeaturesHeight(boolean selected)
+ {
+ showSeqFeaturesHeight = selected;
+ }
+
+ public boolean getShowSequenceFeaturesHeight()
+ {
+ return showSeqFeaturesHeight;
+ }
+
+ boolean showUnconserved = false;
+
+ public boolean getShowUnconserved()
+ {
+ return showUnconserved;
+ }
+
+ public void setShowUnconserved(boolean showunconserved)
+ {
+ showUnconserved = showunconserved;
+ }
+
+ /**
+ * return the alignPanel containing the given viewport. Use this to get the
+ * components currently handling the given viewport.
+ *
+ * @param av
+ * @return null or an alignPanel guaranteed to have non-null alignFrame
+ * reference
+ */
+ public AlignmentPanel getAlignPanel()
+ {
+ AlignmentPanel[] aps = PaintRefresher.getAssociatedPanels(this
+ .getSequenceSetId());
+ AlignmentPanel ap = null;
+ for (int p = 0; aps != null && p < aps.length; p++)
+ {
+ if (aps[p].av == this)
+ {
+ return aps[p];
+ }
+ }
+ return null;
+ }
+
+ public boolean getSortByTree()
+ {
+ return sortByTree;
+ }
+
+ public void setSortByTree(boolean sort)
+ {
+ sortByTree = sort;
+ }
+
+ /**
+ * should conservation rows be shown for groups
+ */
+ boolean showGroupConservation = false;
+
+ /**
+ * should consensus rows be shown for groups
+ */
+ boolean showGroupConsensus = false;
+
+ /**
+ * should consensus profile be rendered by default
+ */
+ public boolean showSequenceLogo = false;
+
+ /**
+ * should consensus histograms be rendered by default
+ */
+ public boolean showConsensusHistogram = true;
+
+ /**
+ * @return the showConsensusProfile
+ */
+ public boolean isShowSequenceLogo()
+ {
+ return showSequenceLogo;
+ }
+
+ /**
+ * @param showSequenceLogo
+ * the new value
+ */
+ public void setShowSequenceLogo(boolean showSequenceLogo)
+ {
+ if (showSequenceLogo != this.showSequenceLogo)
+ {
+ // TODO: decouple settings setting from calculation when refactoring
+ // annotation update method from alignframe to viewport
+ this.showSequenceLogo = showSequenceLogo;
+ if (consensusThread != null)
+ {
+ consensusThread.updateAnnotation();
+ }
+ }
+ this.showSequenceLogo = showSequenceLogo;
+ }
+
+ /**
+ * @param showConsensusHistogram
+ * the showConsensusHistogram to set
+ */
+ public void setShowConsensusHistogram(boolean showConsensusHistogram)
+ {
+ this.showConsensusHistogram = showConsensusHistogram;
+ }
+
+ /**
+ * @return the showGroupConservation
+ */
+ public boolean isShowGroupConservation()
+ {
+ return showGroupConservation;
+ }
+
+ /**
+ * @param showGroupConservation
+ * the showGroupConservation to set
+ */
+ public void setShowGroupConservation(boolean showGroupConservation)
+ {
+ this.showGroupConservation = showGroupConservation;
+ }
+
+ /**
+ * @return the showGroupConsensus
+ */
+ public boolean isShowGroupConsensus()
+ {
+ return showGroupConsensus;
+ }
+
+ /**
+ * @param showGroupConsensus
+ * the showGroupConsensus to set
+ */
+ public void setShowGroupConsensus(boolean showGroupConsensus)
+ {
+ this.showGroupConsensus = showGroupConsensus;
+ }
+
+ /**
+ *
+ * @return flag to indicate if the consensus histogram should be rendered by
+ * default
+ */
+ public boolean isShowConsensusHistogram()
+ {
+ return this.showConsensusHistogram;
+ }
+
+ /**
+ * 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())
+ && (colSel == null || colSel.getSelected() == null || colSel
+ .getSelected().size() == 0))
+ {
+ 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);
+ }
+ }
+ }