Feature rendering in groups
[jalview.git] / src / jalview / appletgui / FeatureRenderer.java
index 21c401a..0b504be 100755 (executable)
@@ -45,7 +45,6 @@ public class FeatureRenderer
 \r
     String [] renderOrder;\r
 \r
-    boolean drawText = true;\r
     FontMetrics fm;\r
     int charOffset;\r
 \r
@@ -85,11 +84,11 @@ public class FeatureRenderer
 \r
       return new Color( ((Integer)currentColour).intValue() );\r
     }\r
+\r
     /**\r
      * This is used by the Molecule Viewer to get the accurate colour\r
      * of the rendered sequence\r
      */\r
-\r
     boolean overview = false;\r
 \r
     int white = Color.white.getRGB();\r
@@ -152,12 +151,12 @@ public class FeatureRenderer
         return;\r
 \r
 \r
-      if(g!=null)\r
-        fm = g.getFontMetrics();\r
-\r
       if (av.featuresDisplayed == null || renderOrder==null)\r
        {\r
          findAllFeatures();\r
+         if(av.featuresDisplayed.size()<1)\r
+           return;\r
+\r
          sequenceFeatures = seq.getSequenceFeatures();\r
          sfSize = sequenceFeatures.length;\r
        }\r
@@ -171,11 +170,15 @@ public class FeatureRenderer
       {\r
         spos = lastSequence.findPosition(start);\r
         epos = lastSequence.findPosition(end);\r
+        if(g!=null)\r
+          fm = g.getFontMetrics();\r
       }\r
       String type;\r
       for(int renderIndex=0; renderIndex<renderOrder.length; renderIndex++)\r
        {\r
         type =  renderOrder[renderIndex];\r
+        if(!av.featuresDisplayed.containsKey(type))\r
+          continue;\r
 \r
         // loop through all features in sequence to find\r
         // current feature to render\r
@@ -184,7 +187,10 @@ public class FeatureRenderer
           if (!sequenceFeatures[sfindex].type.equals(type))\r
             continue;\r
 \r
-          if (featureGroups != null\r
+          if(sequenceFeatures[sfindex]==null)\r
+          {\r
+          }\r
+          else  if (featureGroups != null\r
               && sequenceFeatures[sfindex].featureGroup != null\r
               &&\r
               featureGroups.containsKey(sequenceFeatures[sfindex].featureGroup)\r
@@ -285,6 +291,7 @@ public class FeatureRenderer
     void findAllFeatures()\r
     {\r
       av.featuresDisplayed = new Hashtable();\r
+      Vector allfeatures = new Vector();\r
       for (int i = 0; i < av.alignment.getHeight(); i++)\r
       {\r
         SequenceFeature [] features = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
@@ -299,18 +306,19 @@ public class FeatureRenderer
           {\r
             av.featuresDisplayed.put(features[index].getType(),\r
                                   new Integer( getColour(features[index].getType()).getRGB()) );\r
+            allfeatures.addElement(features[index].getType());\r
           }\r
           index++;\r
         }\r
       }\r
 \r
-      renderOrder = new String[av.featuresDisplayed.size()];\r
-      Enumeration en = av.featuresDisplayed.keys();\r
-      int i = 0;\r
+      renderOrder = new String[allfeatures.size()];\r
+      Enumeration en = allfeatures.elements();\r
+      int i = allfeatures.size()-1;\r
       while(en.hasMoreElements())\r
       {\r
         renderOrder[i] = en.nextElement().toString();\r
-        i++;\r
+        i--;\r
       }\r
     }\r
 \r
@@ -337,26 +345,26 @@ public class FeatureRenderer
 \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
-      av.featuresDisplayed.clear();\r
-\r
-      renderOrder = new String[data.length];\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
+        if(av.featuresDisplayed!=null)\r
+          av.featuresDisplayed.clear();\r
 \r
-      if(data.length>0)\r
-      for(int i=0; i<data.length; i++)\r
-      {\r
-       String type = data[i][0].toString();\r
-       setColour(type, (Color)data[i][1]);\r
-       if( ((Boolean)data[i][2]).booleanValue() )\r
-       {\r
-         av.featuresDisplayed.put(type, new Integer(getColour(type).getRGB()));\r
-       }\r
+        renderOrder = new String[data.length];\r
 \r
-       renderOrder[i] = type;\r
-      }\r
+        if (data.length > 0)\r
+          for (int i = 0; i < data.length; i++)\r
+          {\r
+            String type = data[i][0].toString();\r
+            setColour(type, (Color) data[i][1]);\r
+            if ( ( (Boolean) data[i][2]).booleanValue())\r
+            {\r
+              av.featuresDisplayed.put(type, new Integer(getColour(type).getRGB()));\r
+            }\r
 \r
+            renderOrder[data.length - i - 1] = type;\r
+          }\r
     }\r
 \r
     Hashtable featureColours = new Hashtable();\r