Merge branch 'develop' into features/JAL-250_hideredundantseqs
[jalview.git] / src / jalview / controller / AlignViewController.java
index 806e9a5..e71ccfb 100644 (file)
@@ -33,10 +33,12 @@ import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.io.DataSourceType;
 import jalview.io.FeaturesFile;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
+import java.util.Arrays;
 import java.util.BitSet;
 import java.util.List;
 
@@ -101,29 +103,36 @@ public class AlignViewController implements AlignViewControllerI
     }
     if (gps != null)
     {
-      viewport.getAlignment().deleteAllGroups();
-      viewport.clearSequenceColours();
-      viewport.setSelectionGroup(null);
-      // set view properties for each group
-      for (int g = 0; g < gps.length; g++)
-      {
-        // gps[g].setShowunconserved(viewport.getShowUnconserved());
-        gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
-        viewport.getAlignment().addGroup(gps[g]);
-        Color col = new Color((int) (Math.random() * 255),
-                (int) (Math.random() * 255), (int) (Math.random() * 255));
-        col = col.brighter();
-        for (SequenceI sq : gps[g].getSequences(null))
-        {
-          viewport.setSequenceColour(sq, col);
-        }
-      }
+      showRandomColoursForGroups(Arrays.asList(gps));
+
       return true;
     }
     return false;
   }
 
   @Override
+  public void showRandomColoursForGroups(List<SequenceGroup> gps)
+  {
+    viewport.getAlignment().deleteAllGroups();
+    viewport.clearSequenceColours();
+    viewport.setSelectionGroup(null);
+    // set view properties for each group
+    for (SequenceGroup sg : gps)
+    {
+      // gps[g].setShowunconserved(viewport.getShowUnconserved());
+      sg.setshowSequenceLogo(viewport.isShowSequenceLogo());
+      viewport.getAlignment().addGroup(sg);
+      Color col = new Color((int) (Math.random() * 255),
+              (int) (Math.random() * 255), (int) (Math.random() * 255));
+      col = col.brighter();
+      for (SequenceI sq : sg.getSequences(null))
+      {
+        viewport.setSequenceColour(sq, col);
+      }
+    }
+  }
+
+  @Override
   public boolean createGroup()
   {
 
@@ -370,7 +379,7 @@ public class AlignViewController implements AlignViewControllerI
   }
 
   @Override
-  public boolean parseFeaturesFile(String file, String protocol,
+  public boolean parseFeaturesFile(String file, DataSourceType protocol,
           boolean relaxedIdMatching)
   {
     boolean featuresFile = false;
@@ -402,4 +411,66 @@ public class AlignViewController implements AlignViewControllerI
     return featuresFile;
 
   }
+
+  @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(true);
+        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(true);
+      }
+    }
+    return false;
+  }
+
 }