bugfix + create/amend whilst feature panel open (still fixing)
authorjprocter <Jim Procter>
Mon, 2 Apr 2007 14:52:11 +0000 (14:52 +0000)
committerjprocter <Jim Procter>
Mon, 2 Apr 2007 14:52:11 +0000 (14:52 +0000)
src/jalview/gui/FeatureRenderer.java
src/jalview/gui/FeatureSettings.java

index 65d5f55..10f91b0 100755 (executable)
@@ -398,7 +398,7 @@ public class FeatureRenderer
   synchronized void findAllFeatures()
   {
     findAllFeatures(true); // add all new features as visible
-    if (!newFeatureAdded && !firing) {
+    if (!firing) {
       firing=true;
       changeSupport.firePropertyChange("changeSupport",null,null);
       firing=false;
@@ -478,7 +478,7 @@ public class FeatureRenderer
     updateRenderOrder(allfeatures);
     findingFeatures = false;
   }
-  boolean firing=false;
+  protected boolean firing=false;
   /**
    * replaces the current renderOrder with the unordered features in allfeatures.
    * The ordering of any types in both renderOrder and allfeatures is preserved,
@@ -489,21 +489,21 @@ public class FeatureRenderer
    * 
    * @param allFeatures
    */
-  public void updateRenderOrder(Vector allFeatures) {
+  private void updateRenderOrder(Vector allFeatures) {
     Vector allfeatures = new Vector(allFeatures);
     String[] oldRender = renderOrder;
     renderOrder = new String[allfeatures.size()];
     boolean initOrders=(featureOrder==null);
     int opos=0;
-    if (oldRender!=null)
+    if (oldRender!=null && oldRender.length>0)
     {
-      for (int j=0; i<oldRender.length; j++)
+      for (int j=0; j<oldRender.length; j++)
       {
         if (oldRender[j]!=null)
           {
             if (initOrders)
             {
-              setOrder(oldRender[j], (1-((float)j)/(float) oldRender.length));
+              setOrder(oldRender[j], (1-(1+(float)j)/(float) oldRender.length));
             } 
             if (allfeatures.contains(oldRender[j])) {
               renderOrder[opos++]  = oldRender[j]; // existing features always
@@ -530,9 +530,9 @@ public class FeatureRenderer
       if (initOrders || !featureOrder.containsKey(newf[i])) 
       {
         int denom = initOrders ? allfeatures.size() : featureOrder.size();
-          // new unordered feature - compute persistent ordering at tail of
+          // new unordered feature - compute persistent ordering at head of
           // existing features.
-        setOrder(newf[i], ((float)2*denom)/(float)(1+2*denom));
+        setOrder(newf[i], i/(float) denom);
       }
       // set order from newly found feature from persisted ordering.
       sortOrder[i] = 2-((Float) featureOrder.get(newf[i])).floatValue();
@@ -543,7 +543,7 @@ public class FeatureRenderer
       }
       i--;
     }
-    if (sort)
+    if (iSize>1 && sort)
       jalview.util.QuickSort.sort(sortOrder, newf);
     sortOrder=null;
     System.arraycopy(newf, 0, renderOrder, opos, newf.length);
index 895c235..6c5990a 100755 (executable)
@@ -128,13 +128,12 @@ public class FeatureSettings
     final PropertyChangeListener change;
     final FeatureSettings fs=this;
     fr.addPropertyChangeListener(change=new PropertyChangeListener() {
-      private boolean firing=false;
       public void propertyChange(PropertyChangeEvent evt)
       {
-        if (!fs.resettingTable && !firing) {
-          firing=true;
-          resetTable(null);
-          firing=false;
+        if (!fs.resettingTable && !fs.handlingUpdate) {
+          fs.handlingUpdate=true;
+          fs.resetTable(new String[] {}); // groups may be added
+          fs.handlingUpdate=false;
         }
       }
       
@@ -155,6 +154,11 @@ public class FeatureSettings
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
   }
   /**
+   * true when Feature Settings are updating from feature renderer
+   */
+  private boolean handlingUpdate=false;
+  
+  /**
    * contains a float[3] for each feature type string. created by setTableData
    */
   Hashtable typeWidth=null;
@@ -300,9 +304,6 @@ public class FeatureSettings
             ( (Boolean) fr.featureGroups.get(group)).booleanValue())
         {
           type = tmpfeatures[index].getType();
-          if (groupchanged==null || groupchanged.contains(group)) {
-            //af.getViewport().featuresDisplayed.put(type, fr.getColour(type));
-          }
           if (!visibleChecks.contains(type))
           {
             visibleChecks.addElement(type);
@@ -330,7 +331,8 @@ public class FeatureSettings
 
     if (fr.renderOrder != null)
     {
-      fr.findAllFeatures(groupChanged!=null); // prod to update colourschemes. but don't affect display
+      if (!handlingUpdate)
+        fr.findAllFeatures(groupChanged!=null); // prod to update colourschemes. but don't affect display
       //First add the checks in the previous render order,
       //in case the window has been closed and reopened
       for (int ro = fr.renderOrder.length - 1; ro > -1; ro--)
@@ -438,17 +440,21 @@ public class FeatureSettings
             JalviewUserColours();
         jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
 
-        for (int i = 0; i < jucs.getColourCount(); i++)
+        for (int i = jucs.getColourCount()-1; i >=0; i--)
         {
           String name;
           fr.setColour(name=jucs.getColour(i).getName(),
                        new Color(Integer.parseInt(jucs.getColour(i).getRGB(),
                                                   16)));
-          fr.setOrder(name,i/jucs.getColourCount());
+          fr.setOrder(name,(i==0) ? 0 : i/jucs.getColourCount());
+        }
+        if (table!=null) {
+          resetTable(null);
+          Object[][] data=((FeatureTableModel) table.getModel()).getData();
+          ensureOrder(data);
+          updateFeatureRenderer(data,false);
+          table.repaint();
         }
-
-        setTableData();
-        af.alignPanel.paintAlignment(true);
       }
       catch (Exception ex)
       {
@@ -483,15 +489,24 @@ public class FeatureSettings
             new FileOutputStream(choice), "UTF-8"));
 
         Enumeration e = fr.featureColours.keys();
+        float[] sortOrder = new float[fr.featureColours.size()];
+        String[] sortTypes = new String[fr.featureColours.size()];
+        int i=0;
         while (e.hasMoreElements())
         {
+          sortTypes[i] = e.nextElement().toString();
+          sortOrder[i]  = fr.getOrder(sortTypes[i]);
+          i++;
+        }
+        jalview.util.QuickSort.sort(sortOrder, sortTypes);
+        sortOrder=null;
+        for (i=0; i<sortTypes.length; i++) {
           jalview.binding.Colour col = new jalview.binding.Colour();
-          col.setName(e.nextElement().toString());
+          col.setName(sortTypes[i]);
           col.setRGB(jalview.util.Format.getHexString(
               fr.getColour(col.getName())));
           ucs.addColour(col);
         }
-
         ucs.marshal(out);
         out.close();
       }