protected void hideInsertions_actionPerformed(ActionEvent actionEvent)
{
- HiddenColumns hidden = ap.av.getAlignment().getHiddenColumns();
- if (hidden == null)
+
+ HiddenColumns hidden = new HiddenColumns();
+ BitSet inserts = new BitSet(), mask = new BitSet();
+
+ // set mask to preserve existing hidden columns outside selected group
+ if (ap.av.hasHiddenColumns())
{
- hidden = new HiddenColumns();
+ ap.av.getAlignment().getHiddenColumns().markHiddenRegions(mask);
}
+
+ boolean markedPopup = false;
+ // mark inserts in current selection
if (ap.av.getSelectionGroup() != null)
{
- BitSet inserts = new BitSet();
- inserts.set(0, ap.av.getAlignment().getWidth());
- ;
+ // mark just the columns in the selection group to be hidden
+ inserts.set(ap.av.getSelectionGroup().getStartRes(), ap.av
+ .getSelectionGroup().getEndRes() + 1);
+
+ // and clear that part of the mask
+ mask.andNot(inserts);
+
+ // now clear columns without gaps
for (SequenceI sq : ap.av.getSelectionGroup().getSequences())
{
- inserts.and(sq.getInsertionsAsBits());
- }
- int firstSet = 0, lastSet = 0;
- do
- {
- if (inserts.get(firstSet))
+ if (sq == sequence)
{
- lastSet = inserts.nextClearBit(firstSet) - 1;
- hidden.hideColumns(firstSet, lastSet);
- firstSet = lastSet + 1;
+ markedPopup = true;
}
- else
- {
- firstSet = inserts.nextSetBit(firstSet);
- }
- } while (firstSet > -1);
-
+ inserts.and(sq.getInsertionsAsBits());
+ }
}
else
- if (sequence != null)
{
- hidden.hideInsertionsFor(sequence);
- ap.av.getAlignment().setHiddenColumns(hidden);
+ // initially, mark all columns to be hidden
+ inserts.set(0, ap.av.getAlignment().getWidth());
+
+ // and clear out old hidden regions completely
+ mask.clear();
+ }
+
+ // now mark for sequence under popup if we haven't already done it
+ if (!markedPopup && sequence != null)
+ {
+ inserts.and(sequence.getInsertionsAsBits());
}
+
+ // finally, preserve hidden regions outside selection
+ inserts.or(mask);
+
+ // and set hidden columns accordingly
+ hidden.hideMarkedBits(inserts);
+
+ ap.av.getAlignment().setHiddenColumns(hidden);
refresh();
}
if (start <= end)
{
seqs.add(sg.getSequenceAt(i).getDatasetSequence());
- features.add(new SequenceFeature(null, null, null, start, end, null));
+ features.add(new SequenceFeature(null, null, start, end, null));
}
}
- if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures(seqs,
- features, true, ap))
+ /*
+ * an entirely gapped region will generate empty lists of sequence / features
+ */
+ if (!seqs.isEmpty())
{
- ap.alignFrame.setShowSeqFeatures(true);
- ap.highlightSearchResults(null);
+ if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures(
+ seqs, features, true, ap))
+ {
+ ap.alignFrame.setShowSeqFeatures(true);
+ ap.av.setSearchResults(null); // clear highlighting
+ ap.repaint(); // draw new/amended features
+ }
}
}