+
+ /**
+ *
+ * Add highlighted sequences to selected rows. Exclude highlighted sequences
+ * from selected rows. toggle inclusion or exclusion of highlighted sequences.
+ * or add/exclude/toggle for sequences not highlighted.
+ *
+ * @param invert
+ * - when true, sequences that are not highlighted are used to modify
+ * selection
+ * @param extendCurrent
+ * - normally true , the current selected group is modified.
+ * @param toggle
+ * - if a select
+ * @return
+ */
+ public boolean selectHighlightedSequences(boolean invert,
+ boolean extendCurrent, boolean toggle)
+ {
+ List<SequenceI> results = alignPanel.getAlignViewport()
+ .getHighlightedSeqs();
+
+ SequenceGroup sq = (extendCurrent
+ && viewport.getSelectionGroup() != null)
+ ? viewport.getSelectionGroup()
+ : new SequenceGroup();
+
+ SearchResultsI searchResults = viewport.getSearchResults();
+ if (invert)
+ {
+ List<SequenceI> nothighlighted = new ArrayList();
+ for (SequenceI seq : alignPanel.getAlignViewport().getAlignment()
+ .getSequences())
+ {
+ if (!results.contains(seq) && (searchResults == null
+ || !searchResults.involvesSequence(seq)))
+ {
+ nothighlighted.add(seq);
+ }
+ }
+ results = nothighlighted;
+ }
+ else
+ {
+ // copy list and add in search results
+ results = new ArrayList(results);
+ if (searchResults != null)
+ {
+ for (SequenceI seq : alignPanel.getAlignViewport().getAlignment()
+ .getSequences())
+ {
+ if (searchResults.involvesSequence(seq))
+ {
+ results.add(seq);
+ }
+ }
+ }
+ }
+
+ if (results == null || results.size() == 0)
+ {
+ // do nothing if no selection exists
+ // unless toggle ??
+ return false;
+ }
+
+ boolean changed = false;
+
+ for (SequenceI seq : results)
+ {
+ int size = sq.getSize();
+ if (toggle)
+ {
+ sq.addOrRemove(seq, false);
+ }
+ else
+ {
+ sq.addSequence(seq, false);
+ }
+ changed |= size != sq.getSize();
+ }
+
+ if (sq.getSize() == 0)
+ {
+ viewport.setSelectionGroup(null);
+ }
+ else
+ {
+ if (sq != viewport.getSelectionGroup())
+ {
+ sq.setStartRes(0);
+ sq.setEndRes(viewport.getRanges().getAbsoluteAlignmentWidth());
+ }
+ viewport.setSelectionGroup(sq);
+ }
+
+ alignPanel.paintAlignment(false, false);
+
+ return changed;
+ }
+
+ @Override
+ public boolean markHighlightedColumns(boolean invert,
+ boolean extendCurrent, boolean toggle)
+ {
+ if (!viewport.hasSearchResults())
+ {
+ // do nothing if no selection exists
+ return false;
+ }
+ // JBPNote this routine could also mark rows, not just columns.
+ BitSet bs = new BitSet();
+ SequenceCollectionI sqcol = (viewport.getSelectionGroup() == null
+ || extendCurrent) ? viewport.getAlignment()
+ : viewport.getSelectionGroup();
+
+ // this could be a lambda... - the remains of the method is boilerplate,
+ // except for the different messages for reporting selection.
+ int nseq = viewport.getSearchResults().markColumns(sqcol, bs);
+
+ ColumnSelection cs = viewport.getColumnSelection();
+ if (cs == null)
+ {
+ cs = new ColumnSelection();
+ }
+
+ if (bs.cardinality() > 0 || invert)
+ {
+ boolean changed = cs.markColumns(bs, sqcol.getStartRes(),
+ sqcol.getEndRes(), invert, extendCurrent, toggle);
+ if (changed)
+ {
+ viewport.setColumnSelection(cs);
+ alignPanel.paintAlignment(false, false);
+ int columnCount = invert
+ ? (sqcol.getEndRes() - sqcol.getStartRes() + 1)
+ - bs.cardinality()
+ : bs.cardinality();
+ avcg.setStatus(MessageManager.formatMessage(
+ "label.view_controller_toggled_marked", new String[]
+ { toggle ? MessageManager.getString("label.toggled")
+ : MessageManager.getString("label.marked"),
+ String.valueOf(columnCount),
+ invert ? MessageManager
+ .getString("label.not_containing")
+ : MessageManager.getString("label.containing"),
+ "Highlight", Integer.valueOf(nseq).toString() }));
+ return true;
+ }
+ }
+ else
+ {
+ avcg.setStatus(MessageManager
+ .formatMessage("No highlighted regions marked"));
+ if (!extendCurrent)
+ {
+ cs.clear();
+ alignPanel.paintAlignment(false, false);
+ }
+ }
+ return false;
+ }
+