spike branch updated from latest features/JAL-2446
[jalview.git] / src / jalview / gui / PopupMenu.java
index 8f01162..c78021c 100644 (file)
@@ -1445,42 +1445,59 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
   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();
   }
 
@@ -1923,15 +1940,22 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
       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
+      }
     }
   }