Feature Groups added
[jalview.git] / src / jalview / appletgui / FeatureRenderer.java
index 048df28..fae19e8 100755 (executable)
@@ -36,14 +36,21 @@ public class FeatureRenderer
     SequenceGroup currentSequenceGroup = null;\r
     SequenceGroup[] allGroups = null;\r
     Graphics graphics;\r
-    float transparency = .4f;\r
 \r
     // The following vector holds the features which are\r
     // to be added, in the correct order or rendering\r
     Vector featuresDisplayed;\r
 \r
+    // A higher level for grouping features of a\r
+    // paritcular type\r
+    Hashtable featureGroups = null;\r
+\r
     Color currentColour = null;\r
 \r
+    boolean drawText = true;\r
+    FontMetrics fm;\r
+    int charOffset;\r
+\r
     /**\r
      * Creates a new FeatureRenderer object.\r
      *\r
@@ -53,13 +60,9 @@ public class FeatureRenderer
     {\r
         this.av = av;\r
         initColours();\r
-        String version = System.getProperty("java.version");\r
-        if (version.indexOf("1.1") == 0)\r
-          highlightTransparent = false;\r
-\r
     }\r
 \r
-    boolean highlightTransparent = true;\r
+    //boolean highlightTransparent = true;\r
     /**\r
      * DOCUMENT ME!\r
      *\r
@@ -76,6 +79,7 @@ public class FeatureRenderer
     public void drawSequence(Graphics g, SequenceI seq,\r
         int start, int end, int x1, int y1, int width, int height)\r
     {\r
+      fm = g.getFontMetrics();\r
 \r
         if(seq.getSequenceFeatures()==null)\r
           return;\r
@@ -87,11 +91,6 @@ public class FeatureRenderer
         else\r
          e = seq.getSequenceFeatures().elements();\r
 \r
-       if(highlightTransparent)\r
-        {\r
-        //  MyGraphics.SetTransparency(g, transparency);\r
-        }\r
-\r
 \r
         while (e.hasMoreElements())\r
         {\r
@@ -118,78 +117,84 @@ public class FeatureRenderer
             if(sf==null)\r
               continue;\r
 \r
+            if(featureGroups!=null\r
+               && sf.getFeatureGroup()!=null\r
+               && featureGroups.containsKey(sf.getFeatureGroup())\r
+               && !((Boolean)featureGroups.get(sf.getFeatureGroup())).booleanValue())\r
+            {\r
+              continue;\r
+            }\r
+\r
 \r
             if (sf.getBegin() > seq.getEnd())\r
             {\r
                 continue;\r
             }\r
 \r
-            int fstart = seq.findIndex(sf.getBegin()) - 1;\r
-            int fend = seq.findIndex(sf.getEnd()) - 1;\r
-\r
-            if (((fstart <= end) && (fend >= start)))\r
+            if (type.equals("disulfide bond"))\r
             {\r
-                if (fstart < start)\r
-                { // fix for if the feature we have starts before the sequence start,\r
-                    fstart = start; // but the feature end is still valid!!\r
-                }\r
-\r
-                if (fend >= end)\r
-                {\r
-                    fend = end;\r
-                }\r
-\r
-                if (fstart == fend)\r
-                {\r
-                    currentColour = getColour(type);\r
-                    g.setColor(currentColour);\r
-                    g.fillRoundRect((fstart - start) * width, y1, width,\r
-                        height, 4, 4);\r
-                    g.setColor(Color.white);\r
-\r
-                    char s = seq.getSequence().charAt(fstart);\r
-                    FontMetrics fm = g.getFontMetrics();\r
-                    int charOffset = (width - fm.charWidth(s)) / 2;\r
-                    int pady = height / 5;\r
-                    g.drawString(String.valueOf(s),\r
-                        charOffset + x1 + (width * (fstart - start)),\r
-                        (y1 + height) - pady);\r
-                }\r
-                else\r
-                {\r
-                    for (int i = fstart; i <= fend; i++)\r
-                    {\r
-                        char s = seq.getSequence().charAt(i);\r
-\r
-                        if (jalview.util.Comparison.isGap(s))\r
-                        {\r
-                            continue;\r
-                        }\r
-                        currentColour = getColour(type);\r
-                        g.setColor(currentColour);\r
-\r
-                        g.fillRect((i - start) * width, y1, width, height);\r
-\r
-                        g.setColor(Color.white);\r
-\r
-                        FontMetrics fm = g.getFontMetrics();\r
-                        int charOffset = (width - fm.charWidth(s)) / 2;\r
-                        int pady = height / 5;\r
-                        g.drawString(String.valueOf(s),\r
-                            charOffset + x1 + (width * (i - start)),\r
-                            (y1 + height) - pady);\r
-                    }\r
-                }\r
+\r
+              renderFeature(g, seq,\r
+                            seq.findIndex(sf.getBegin()) - 1,\r
+                            seq.findIndex(sf.getBegin()) - 1,\r
+                            type, start, end, x1, y1, width, height);\r
+              renderFeature(g, seq,\r
+                            seq.findIndex(sf.getEnd()) - 1,\r
+                            seq.findIndex(sf.getEnd()) - 1,\r
+                            type, start, end, x1, y1, width, height);\r
+\r
             }\r
+            else\r
+              renderFeature(g, seq,\r
+                            seq.findIndex(sf.getBegin()) - 1,\r
+                            seq.findIndex(sf.getEnd()) - 1,\r
+                          type, start, end, x1, y1, width, height);\r
+\r
+      }\r
+    }\r
+\r
+    void renderFeature(Graphics g, SequenceI seq,\r
+                       int fstart, int fend, String type, int start, int end,\r
+                       int x1, int y1, int width, int height)\r
+    {\r
+      if ( ( (fstart <= end) && (fend >= start)))\r
+      {\r
+        if (fstart < start)\r
+        { // fix for if the feature we have starts before the sequence start,\r
+          fstart = start; // but the feature end is still valid!!\r
+        }\r
+\r
+        if (fend >= end)\r
+        {\r
+          fend = end;\r
+        }\r
+        for (int i = fstart; i <= fend; i++)\r
+        {\r
+          char s = seq.getSequence().charAt(i);\r
+\r
+          if (jalview.util.Comparison.isGap(s))\r
+          {\r
+            continue;\r
           }\r
 \r
-          if (highlightTransparent)\r
+          currentColour = getColour(type);\r
+\r
+          g.setColor(currentColour);\r
+\r
+          g.fillRect( (i - start) * width, y1, width, height);\r
+\r
+          if (drawText)\r
           {\r
-        //    MyGraphics.SetTransparency(g, 1.0f);\r
+            g.setColor(Color.white);\r
+            charOffset = (width - fm.charWidth(s)) / 2;\r
+            g.drawString(String.valueOf(s),\r
+                         charOffset + x1 + (width * (i - start)),\r
+                         (y1 + height) - height / 5);\r
           }\r
+        }\r
+      }\r
     }\r
 \r
-\r
     Image offscreen;\r
     Frame nullframe;\r
     public Color findFeatureColour(Color initialCol, SequenceI seq, int i)\r
@@ -218,7 +223,16 @@ public class FeatureRenderer
       featureColours.put(featureType, col);\r
     }\r
 \r
-    public void setTransparency(float value)\r
+    public void addNewFeature(String name, Color col)\r
+    {\r
+      setColour(name, col);\r
+      if (featuresDisplayed == null)\r
+        featuresDisplayed = new Vector();\r
+      featuresDisplayed.insertElementAt(name, 0);\r
+    }\r
+\r
+\r
+ /*   public void setTransparency(float value)\r
     {\r
       transparency = value;\r
     }\r
@@ -226,14 +240,18 @@ public class FeatureRenderer
     public float getTransparency()\r
     {\r
       return transparency;\r
-    }\r
+    }*/\r
 \r
     public void setFeaturePriority(Object [][] data)\r
     {\r
       // The feature table will display high priority\r
       // features at the top, but theses are the ones\r
       // we need to render last, so invert the data\r
-      featuresDisplayed = new Vector();\r
+      if(featuresDisplayed!=null)\r
+        featuresDisplayed.removeAllElements();\r
+      else\r
+        featuresDisplayed = new Vector();\r
+\r
       for(int i=data.length-1; i>-1; i--)\r
       {\r
        String type = data[i][0].toString();\r