JAL-3612 use _last_ drawn colour per feature type in Overview
[jalview.git] / src / jalview / renderer / seqfeatures / FeatureRenderer.java
index d580f2c..fe80e63 100644 (file)
  */
 package jalview.renderer.seqfeatures;
 
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.util.List;
+
 import jalview.api.AlignViewportI;
 import jalview.api.FeatureColourI;
+import jalview.datamodel.ContiguousI;
 import jalview.datamodel.MappedFeatures;
-import jalview.datamodel.Range;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
@@ -32,13 +39,6 @@ import jalview.util.Comparison;
 import jalview.util.ReverseListIterator;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.util.List;
-
 public class FeatureRenderer extends FeatureRendererModel
 {
   private static final AlphaComposite NO_TRANSPARENCY = AlphaComposite
@@ -112,6 +112,10 @@ public class FeatureRenderer extends FeatureRendererModel
         continue;
       }
 
+      /*
+       * JAL-3045 text is always drawn over features, even if
+       * 'Show Text' is unchecked in the format menu
+       */
       g.setColor(Color.white);
       int charOffset = (charWidth - fm.charWidth(s)) / 2;
       g.drawString(String.valueOf(s),
@@ -276,9 +280,9 @@ public class FeatureRenderer extends FeatureRendererModel
     /*
      * if columns are all gapped, or sequence has no features, nothing to do
      */
-    Range visiblePositions = seq.findPositions(start+1, end+1);
-    if (visiblePositions == null || (!seq.getFeatures().hasFeatures()
-            && !av.isShowComplementFeatures()))
+    ContiguousI visiblePositions = seq.findPositions(start + 1, end + 1);
+    if (visiblePositions == null || !seq.getFeatures().hasFeatures()
+            && !av.isShowComplementFeatures())
     {
       return null;
     }
@@ -319,7 +323,7 @@ public class FeatureRenderer extends FeatureRendererModel
       List<SequenceFeature> overlaps = seq.getFeatures().findFeatures(
               visiblePositions.getBegin(), visiblePositions.getEnd(), type);
 
-      if (fc.isSimpleColour())
+      if (overlaps.size() > 1 && fc.isSimpleColour())
       {
         filterFeaturesForDisplay(overlaps);
       }
@@ -447,12 +451,16 @@ public class FeatureRenderer extends FeatureRendererModel
    */
   Color drawComplementFeatures(final Graphics g, final SequenceI seq,
           int start, int end, int y1, boolean colourOnly,
-          Range visiblePositions, Color drawnColour)
+          ContiguousI visiblePositions, Color drawnColour)
   {
     AlignViewportI comp = av.getCodingComplement();
     FeatureRenderer fr2 = Desktop.getAlignFrameFor(comp)
             .getFeatureRenderer();
-    for (int pos = visiblePositions.start; pos <= visiblePositions.end; pos++)
+
+    final int visibleStart = visiblePositions.getBegin();
+    final int visibleEnd = visiblePositions.getEnd();
+
+    for (int pos = visibleStart; pos <= visibleEnd; pos++)
     {
       int column = seq.findIndex(pos);
       MappedFeatures mf = fr2
@@ -531,10 +539,15 @@ public class FeatureRenderer extends FeatureRendererModel
         continue;
       }
 
+      /*
+       * find features of this type, and the colour of the _last_ one
+       * (the one that would be drawn on top) that has a colour
+       */
       List<SequenceFeature> overlaps = seq.findFeatures(column, column,
               type);
-      for (SequenceFeature sequenceFeature : overlaps)
+      for (int i = overlaps.size() - 1 ; i >= 0 ; i--)
       {
+        SequenceFeature sequenceFeature = overlaps.get(i);
         if (!featureGroupNotShown(sequenceFeature))
         {
           Color col = getColour(sequenceFeature);