JAL-2016 FeatureSettingsI now FeatureSettingsModelI
[jalview.git] / src / jalview / gui / AlignViewport.java
index 5944b80..7d8d4fe 100644 (file)
@@ -43,6 +43,9 @@ import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureColourI;
+import jalview.api.FeatureSettingsModelI;
+import jalview.api.FeaturesDisplayedI;
 import jalview.api.ViewStyleI;
 import jalview.bin.Cache;
 import jalview.commands.CommandI;
@@ -72,7 +75,6 @@ import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.JInternalFrame;
@@ -461,7 +463,7 @@ public class AlignViewport extends AlignmentViewport implements
     AlignmentI al = getAlignment();
     if (al != null)
     {
-      Set<AlignedCodonFrame> mappings = al.getCodonFrames();
+      List<AlignedCodonFrame> mappings = al.getCodonFrames();
       if (mappings != null)
       {
         StructureSelectionManager ssm = StructureSelectionManager
@@ -855,7 +857,7 @@ public class AlignViewport extends AlignmentViewport implements
      * Check if any added sequence could be the object of a mapping or
      * cross-reference; if so, make the mapping explicit 
      */
-    realiseMappings(getAlignment(), toAdd);
+    getAlignment().realiseMappings(toAdd.getSequences());
 
     /*
      * If any cDNA/protein mappings exist or can be made between the alignments, 
@@ -863,17 +865,6 @@ public class AlignViewport extends AlignmentViewport implements
      */
     if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true))
     {
-      // if (toAdd.getDataset() == null)
-      // {
-      // // need to create ds seqs
-      // for (SequenceI sq : toAdd.getSequences())
-      // {
-      // if (sq.getDatasetSequence() == null)
-      // {
-      // sq.createDatasetSequence();
-      // }
-      // }
-      // }
       if (AlignmentUtils.isMappable(toAdd, getAlignment()))
       {
         if (openLinkedAlignment(toAdd, title))
@@ -889,61 +880,26 @@ public class AlignViewport extends AlignmentViewport implements
     // TODO: JAL-407 regardless of above - identical sequences (based on ID and
     // provenance) should share the same dataset sequence
 
+    AlignmentI al = getAlignment();
+    String gap = String.valueOf(al.getGapCharacter());
     for (int i = 0; i < toAdd.getHeight(); i++)
     {
-      getAlignment().addSequence(toAdd.getSequenceAt(i));
-    }
-
-    setEndSeq(getAlignment().getHeight());
-    firePropertyChange("alignment", null, getAlignment().getSequences());
-  }
-
-  /**
-   * Check if any added sequence could be the object of a mapping or
-   * cross-reference; if so, make the mapping explicit. Returns the count of
-   * mappings updated.
-   * 
-   * @param al
-   * @param toAdd
-   */
-  protected int realiseMappings(AlignmentI al, AlignmentI toAdd)
-  {
-    // TODO this is proof of concept
-    // we might want to give the user some choice here
-    int count = 0;
-    for (SequenceI seq : toAdd.getSequences())
-    {
-      count += realiseMappingsTo(al, seq);
-    }
-    return count;
-  }
-
-  /**
-   * If the alignment holds any mappings to a dummy (placeholder) sequence that
-   * matches the given sequence, then update the mapping to point to the
-   * sequence. Returns the number of mappings updated.
-   * 
-   * @param al
-   * @param seq
-   * @return
-   */
-  protected int realiseMappingsTo(AlignmentI al, SequenceI seq)
-  {
-    int count = 0;
-    Set<AlignedCodonFrame> mappings = al.getDataset().getCodonFrames();
-    // TODO are mappings on alignment or alignment dataset?!?
-    for (AlignedCodonFrame mapping : mappings)
-    {
+      SequenceI seq = toAdd.getSequenceAt(i);
       /*
-       * TODO could just go straight to realiseWith() here unless we want
-       * to give the user some choice before going ahead
+       * experimental!
+       * - 'align' any mapped sequences as per existing 
+       *    e.g. cdna to genome, domain hit to protein sequence
+       * very experimental! (need a separate menu option for this)
+       * - only add mapped sequences ('select targets from a dataset')
        */
-      if (mapping.isRealisableWith(seq))
+      if (true /*AlignmentUtils.alignSequenceAs(seq, al, gap, true, true)*/)
       {
-        count += mapping.realiseWith(seq);
+        al.addSequence(seq);
       }
     }
-    return count;
+
+    setEndSeq(getAlignment().getHeight());
+    firePropertyChange("alignment", null, getAlignment().getSequences());
   }
 
   /**
@@ -1172,4 +1128,67 @@ public class AlignViewport extends AlignmentViewport implements
     return true;
   }
 
+  /**
+   * Applies the supplied feature settings descriptor to currently known
+   * features. This supports an 'initial configuration' of feature colouring
+   * based on a preset or user favourite. This may then be modified in the usual
+   * way using the Feature Settings dialogue.
+   * 
+   * @param featureSettings
+   */
+  public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
+  {
+    if (featureSettings == null)
+    {
+      return;
+    }
+
+    FeatureRenderer fr = getAlignPanel().getSeqPanel().seqCanvas
+            .getFeatureRenderer();
+    fr.findAllFeatures(true);
+    List<String> renderOrder = fr.getRenderOrder();
+    FeaturesDisplayedI displayed = fr.getFeaturesDisplayed();
+    displayed.clear();
+    // TODO this clears displayed.featuresRegistered - do we care?
+
+    /*
+     * set feature colour if specified by feature settings
+     * set visibility of all features
+     */
+    for (String type : renderOrder)
+    {
+      FeatureColourI preferredColour = featureSettings
+              .getFeatureColour(type);
+      if (preferredColour != null)
+      {
+        fr.setColour(type, preferredColour);
+      }
+      if (featureSettings.isFeatureDisplayed(type))
+      {
+        displayed.setVisible(type);
+      }
+    }
+
+    /*
+     * set visibility of feature groups
+     */
+    for (String group : fr.getFeatureGroups())
+    {
+      fr.setGroupVisibility(group, featureSettings.isGroupDisplayed(group));
+    }
+
+    /*
+     * order the features
+     */
+    if (featureSettings.optimiseOrder())
+    {
+      // TODO not supported (yet?)
+    }
+    else
+    {
+      fr.orderFeatures(featureSettings);
+    }
+    fr.setTransparency(featureSettings.getTransparency());
+  }
+
 }