+
+ @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
+ .getString("label.no_highlighted_regions_marked"));
+ if (!extendCurrent)
+ {
+ cs.clear();
+ alignPanel.paintAlignment(false, false);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean copyHighlightedRegionsToClipboard()
+ {
+ if (!viewport.hasSearchResults())
+ {
+ // do nothing if no selection exists
+ return false;
+ }
+
+ SearchResultsI searchResults = viewport.getSearchResults();
+ if (searchResults.isEmpty())
+ {
+ return false; // shouldn't happen
+ }
+ List<SequenceI> seqs = searchResults.getMatchingSubSequences();
+
+ // TODO: pass in hiddenColumns according to intersection of searchResults
+ // and visible columns. Currently this isn't done, since each contig becomes
+ // a single subsequence
+ Desktop.jalviewClipboard = new Object[] {
+ seqs.toArray(new SequenceI[0]),
+ alignPanel.getAlignment().getDataset(), null };
+ avcg.setStatus(MessageManager.formatMessage(
+ "label.copied_sequences_to_clipboard", seqs.size()));
+ // Technically we should return false, since view has not changed
+ return false;
+ }