Merge branch 'features/JAL-2068groovyAnnotationWorker' into develop
authorJim Procter <jprocter@issues.jalview.org>
Mon, 18 Jul 2016 13:01:49 +0000 (14:01 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Mon, 18 Jul 2016 13:01:49 +0000 (14:01 +0100)
minor conflicts in constructor/imports for unification of Graduated/FeatureColour

1  2 
src/jalview/appletgui/FeatureRenderer.java
src/jalview/gui/FeatureRenderer.java
src/jalview/renderer/seqfeatures/FeatureRenderer.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java
src/jalview/workers/StrucConsensusThread.java

   */
  package jalview.appletgui;
  
 +import jalview.api.FeatureColourI;
  import jalview.datamodel.SearchResults;
  import jalview.datamodel.SequenceFeature;
  import jalview.datamodel.SequenceI;
 -import jalview.schemes.AnnotationColourGradient;
 -import jalview.schemes.GraduatedColor;
 +import jalview.io.FeaturesFile;
 +import jalview.schemes.FeatureColour;
 +import jalview.schemes.UserColourScheme;
  import jalview.util.MessageManager;
  import jalview.viewmodel.AlignmentViewport;
  
@@@ -45,9 -43,6 +45,9 @@@ import java.awt.TextArea
  import java.awt.TextField;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
 +import java.awt.event.MouseAdapter;
 +import java.awt.event.MouseEvent;
 +import java.util.Hashtable;
  
  /**
   * DOCUMENT ME!
  public class FeatureRenderer extends
          jalview.renderer.seqfeatures.FeatureRenderer
  {
 +
 +  // Holds web links for feature groups and feature types
 +  // in the form label|link
 +  Hashtable featureLinks = null;
 +
    /**
     * Creates a new FeatureRenderer object.
     * 
     * @param av
     */
    public FeatureRenderer(AlignmentViewport av)
    {
-     super();
-     this.av = av;
+     super(av);
    }
  
    static String lastFeatureAdded;
      /**
       * render a feature style in the amend feature dialog box
       */
 -    public void updateColor(Object newcol)
 +    public void updateColor(FeatureColourI newcol)
      {
 -
 -      Color bg, col = null;
 -      GraduatedColor gcol = null;
 +      Color bg = null;
        String vlabel = "";
 -      if (newcol instanceof Color)
 +      if (newcol.isSimpleColour())
        {
 -        isGcol = false;
 -        col = (Color) newcol;
 -        gcol = null;
 -      }
 -      else if (newcol instanceof GraduatedColor)
 -      {
 -        isGcol = true;
 -        gcol = (GraduatedColor) newcol;
 -        col = null;
 +        bg = newcol.getColour();
 +        setBackground(bg);
        }
        else
        {
 -        throw new Error(
 -                MessageManager
 -                        .getString("error.invalid_colour_for_mycheckbox"));
 -      }
 -      if (col != null)
 -      {
 -        setBackground(bg = col);
 -      }
 -      else
 -      {
 -        if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD)
 +        if (newcol.isAboveThreshold())
          {
 -          vlabel += " "
 -                  + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)"
 -                          : "(<)");
 +          vlabel += " (>)";
          }
 -        if (isColourByLabel = gcol.isColourByLabel())
 +        else if (newcol.isBelowThreshold())
 +        {
 +          vlabel += " (<)";
 +        }
 +
 +        if (isColourByLabel = newcol.isColourByLabel())
          {
            setBackground(bg = Color.white);
            vlabel += " (by Label)";
          }
          else
          {
 -          setBackground(bg = gcol.getMinColor());
 -          maxCol = gcol.getMaxColor();
 +          setBackground(bg = newcol.getMinColour());
 +          maxCol = newcol.getMaxColour();
          }
        }
        label = vlabel;
              ap.seqPanel.seqCanvas.highlightSearchResults(highlight);
  
            }
 -          Object col = getFeatureStyle(name.getText());
 +          FeatureColourI col = getFeatureStyle(name.getText());
            if (col == null)
            {
 -            col = new jalview.schemes.UserColourScheme()
 +            Color generatedColour = UserColourScheme
                      .createColourFromName(name.getText());
 +            col = new FeatureColour(generatedColour);
            }
  
            colourPanel.updateColor(col);
      start.setText(features[0].getBegin() + "");
      end.setText(features[0].getEnd() + "");
      description.setText(features[0].getDescription());
 -    Object fcol = getFeatureStyle(name.getText());
 +    // lookup (or generate) the feature colour
 +    FeatureColourI fcol = getFeatureStyle(name.getText());
      // simply display the feature color in a box
      colourPanel.updateColor(fcol);
      dialog.setResizable(true);
      // TODO: render the graduated color in the box.
 -    colourPanel.addMouseListener(new java.awt.event.MouseAdapter()
 +    colourPanel.addMouseListener(new MouseAdapter()
      {
        @Override
 -      public void mousePressed(java.awt.event.MouseEvent evt)
 +      public void mousePressed(MouseEvent evt)
        {
          if (!colourPanel.isGcol)
          {
          }
          else
          {
 -          FeatureColourChooser fcc = new FeatureColourChooser(
 -                  ap.alignFrame, name.getText());
 +          new FeatureColourChooser(ap.alignFrame, name.getText());
            dialog.transferFocus();
          }
        }
      });
      dialog.setVisible(true);
  
 -    jalview.io.FeaturesFile ffile = new jalview.io.FeaturesFile();
 +    FeaturesFile ffile = new FeaturesFile();
  
      if (dialog.accept)
      {
          if (!colourPanel.isGcol)
          {
            // update colour - otherwise its already done.
 -          setColour(sf.type, colourPanel.getBackground());
 +          setColour(sf.type, new FeatureColour(colourPanel.getBackground()));
          }
          try
          {
          {
            setGroupVisibility(lastFeatureGroupAdded, true);
          }
 -        setColour(lastFeatureAdded, newColour); // was fcol
 +        setColour(lastFeatureAdded, new FeatureColour(newColour)); // was fcol
          setVisible(lastFeatureAdded);
          findAllFeatures(false); // different to original applet behaviour ?
          // findAllFeatures();
   */
  package jalview.gui;
  
 +import jalview.api.FeatureColourI;
  import jalview.datamodel.SearchResults;
  import jalview.datamodel.SequenceFeature;
  import jalview.datamodel.SequenceI;
 -import jalview.schemes.GraduatedColor;
 +import jalview.schemes.FeatureColour;
 +import jalview.schemes.UserColourScheme;
  import jalview.util.MessageManager;
  
  import java.awt.BorderLayout;
@@@ -75,9 -73,8 +75,8 @@@ public class FeatureRenderer extend
     */
    public FeatureRenderer(AlignmentPanel ap)
    {
-     super();
+     super(ap.av);
      this.ap = ap;
-     this.av = ap.av;
      if (ap != null && ap.getSeqPanel() != null
              && ap.getSeqPanel().seqCanvas != null
              && ap.getSeqPanel().seqCanvas.fr != null)
@@@ -96,7 -93,7 +95,7 @@@
  
    static String lastDescriptionAdded;
  
 -  Object oldcol, fcol;
 +  FeatureColourI oldcol, fcol;
  
    int featureIndex = 0;
  
        @Override
        public void mousePressed(MouseEvent evt)
        {
 -        if (fcol instanceof Color)
 +        if (fcol.isSimpleColour())
          {
            Color col = JColorChooser.showDialog(Desktop.desktop,
                    MessageManager.getString("label.select_feature_colour"),
 -                  ((Color) fcol));
 +                  fcol.getColour());
            if (col != null)
            {
 -            fcol = col;
 -            updateColourButton(bigPanel, colour, col);
 +            fcol = new FeatureColour(col);
 +            updateColourButton(bigPanel, colour, new FeatureColour(col));
            }
          }
          else
          {
 -
            if (fcc == null)
            {
              final String type = features[featureIndex].getType();
              ap.getSeqPanel().seqCanvas.highlightSearchResults(highlight);
  
            }
 -          Object col = getFeatureStyle(name.getText());
 +          FeatureColourI col = getFeatureStyle(name.getText());
            if (col == null)
            {
 -            col = new jalview.schemes.UserColourScheme()
 -                    .createColourFromName(name.getText());
 +            col = new FeatureColour(UserColourScheme
 +                    .createColourFromName(name.getText()));
            }
            oldcol = fcol = col;
            updateColourButton(bigPanel, colour, col);
     * 
     * @param bigPanel
     * @param col
 -   * @param col2
 +   * @param col
     */
    protected void updateColourButton(JPanel bigPanel, JLabel colour,
 -          Object col2)
 +          FeatureColourI col)
    {
      colour.removeAll();
      colour.setIcon(null);
      colour.setToolTipText(null);
      colour.setText("");
  
 -    if (col2 instanceof Color)
 +    if (col.isSimpleColour())
      {
 -      colour.setBackground((Color) col2);
 +      colour.setBackground(col.getColour());
      }
      else
      {
        colour.setBackground(bigPanel.getBackground());
        colour.setForeground(Color.black);
 -      FeatureSettings.renderGraduatedColor(colour, (GraduatedColor) col2);
 -      // colour.setForeground(colour.getBackground());
 +      FeatureSettings.renderGraduatedColor(colour, col);
      }
    }
  
@@@ -20,6 -20,7 +20,7 @@@
   */
  package jalview.renderer.seqfeatures;
  
+ import jalview.api.AlignViewportI;
  import jalview.datamodel.SequenceFeature;
  import jalview.datamodel.SequenceI;
  import jalview.viewmodel.seqfeatures.FeatureRendererModel;
@@@ -50,8 -51,16 +51,18 @@@ public class FeatureRenderer extends Fe
  
    boolean av_validCharWidth, av_isShowSeqFeatureHeight;
  
 +  private Integer currentColour;
 +
+   /**
+    * Constructor given a viewport
+    * 
+    * @param viewport
+    */
+   public FeatureRenderer(AlignViewportI viewport)
+   {
+     this.av = viewport;
+   }
    protected void updateAvConfig()
    {
      av_charHeight = av.getCharHeight();
    }
  
    /**
 -   * This is used by the Molecule Viewer and Overview to get the accurate
 -   * colourof the rendered sequence
 +   * This is used by the Molecule Viewer and Overview to get the accurate colour
 +   * of the rendered sequence
     */
    public synchronized int findFeatureColour(int initialCol,
            final SequenceI seq, int column)
        }
        else
        {
 -        return ((Integer) currentColour).intValue();
 +        return currentColour.intValue();
        }
      }
  
@@@ -27,9 -27,7 +27,8 @@@ import jalview.datamodel.AlignmentI
  import jalview.datamodel.SequenceFeature;
  import jalview.datamodel.SequenceI;
  import jalview.renderer.seqfeatures.FeatureRenderer;
 -import jalview.schemes.GraduatedColor;
 +import jalview.schemes.FeatureColour;
 +import jalview.schemes.UserColourScheme;
- import jalview.viewmodel.AlignmentViewport;
  
  import java.awt.Color;
  import java.beans.PropertyChangeListener;
@@@ -53,19 -51,28 +52,19 @@@ public abstract class FeatureRendererMo
     */
    protected float transparency = 1.0f;
  
 -  protected Map<String, Object> featureColours = new ConcurrentHashMap<String, Object>();
 +  protected Map<String, FeatureColourI> featureColours = new ConcurrentHashMap<String, FeatureColourI>();
  
    protected Map<String, Boolean> featureGroups = new ConcurrentHashMap<String, Boolean>();
  
 -  protected Object currentColour;
 -
 -  /*
 -   * feature types in ordering of rendering, where last means on top
 -   */
    protected String[] renderOrder;
  
 +  Map<String, Float> featureOrder = null;
 +
    protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
            this);
  
-   protected AlignmentViewport av;
+   protected AlignViewportI av;
  
 -  /*
 -   * map holds per feature type, {{min, max}, {min, max}} feature score
 -   * values for positional and non-positional features respectively
 -   */
 -  private Map<String, float[][]> minmax = new Hashtable<String, float[][]>();
 -
    @Override
    public AlignViewportI getViewport()
    {
      renderOrder = neworder;
    }
  
 +  protected Map<String, float[][]> minmax = new Hashtable<String, float[][]>();
 +
    public Map<String, float[][]> getMinMax()
    {
      return minmax;
      List<String> allfeatures = new ArrayList<String>(allFeatures);
      String[] oldRender = renderOrder;
      renderOrder = new String[allfeatures.size()];
 -    Object mmrange, fc = null;
      boolean initOrders = (featureOrder == null);
      int opos = 0;
      if (oldRender != null && oldRender.length > 0)
              allfeatures.remove(oldRender[j]);
              if (minmax != null)
              {
 -              mmrange = minmax.get(oldRender[j]);
 +              float[][] mmrange = minmax.get(oldRender[j]);
                if (mmrange != null)
                {
 -                fc = featureColours.get(oldRender[j]);
 -                if (fc != null && fc instanceof GraduatedColor
 -                        && ((GraduatedColor) fc).isAutoScale())
 +                FeatureColourI fc = featureColours.get(oldRender[j]);
 +                if (fc != null && !fc.isSimpleColour() && fc.isAutoScaled())
                  {
 -                  ((GraduatedColor) fc).updateBounds(
 -                          ((float[][]) mmrange)[0][0],
 -                          ((float[][]) mmrange)[0][1]);
 +                  fc.updateBounds(mmrange[0][0], mmrange[0][1]);
                  }
                }
              }
        if (minmax != null)
        {
          // update from new features minmax if necessary
 -        mmrange = minmax.get(newf[i]);
 +        float[][] mmrange = minmax.get(newf[i]);
          if (mmrange != null)
          {
 -          fc = featureColours.get(newf[i]);
 -          if (fc != null && fc instanceof GraduatedColor
 -                  && ((GraduatedColor) fc).isAutoScale())
 +          FeatureColourI fc = featureColours.get(newf[i]);
 +          if (fc != null && !fc.isSimpleColour() && fc.isAutoScaled())
            {
 -            ((GraduatedColor) fc).updateBounds(((float[][]) mmrange)[0][0],
 -                    ((float[][]) mmrange)[0][1]);
 +            fc.updateBounds(mmrange[0][0], mmrange[0][1]);
            }
          }
        }
          setOrder(newf[i], i / (float) denom);
        }
        // set order from newly found feature from persisted ordering.
 -      sortOrder[i] = 2 - ((Float) featureOrder.get(newf[i])).floatValue();
 +      sortOrder[i] = 2 - featureOrder.get(newf[i]).floatValue();
        if (i < iSize)
        {
          // only sort if we need to
  
    /**
     * get a feature style object for the given type string. Creates a
 -   * java.awt.Color for a featureType with no existing colourscheme. TODO:
 -   * replace return type with object implementing standard abstract colour/style
 -   * interface
 +   * java.awt.Color for a featureType with no existing colourscheme.
     * 
     * @param featureType
 -   * @return java.awt.Color or GraduatedColor
 +   * @return
     */
    @Override
 -  public Object getFeatureStyle(String featureType)
 +  public FeatureColourI getFeatureStyle(String featureType)
    {
 -    Object fc = featureColours.get(featureType);
 +    FeatureColourI fc = featureColours.get(featureType);
      if (fc == null)
      {
 -      jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
 -      Color col = ucs.createColourFromName(featureType);
 -      featureColours.put(featureType, fc = col);
 +      Color col = UserColourScheme.createColourFromName(featureType);
 +      fc = new FeatureColour(col);
 +      featureColours.put(featureType, fc);
      }
      return fc;
    }
     */
    public Color getColour(SequenceFeature feature)
    {
 -    Object fc = getFeatureStyle(feature.getType());
 -    if (fc instanceof Color)
 -    {
 -      return (Color) fc;
 -    }
 -    else
 -    {
 -      if (fc instanceof GraduatedColor)
 -      {
 -        return ((GraduatedColor) fc).findColor(feature);
 -      }
 -    }
 -    throw new Error("Implementation Error: Unrecognised render object "
 -            + fc.getClass() + " for features of type " + feature.getType());
 +    FeatureColourI fc = getFeatureStyle(feature.getType());
 +    return fc.getColor(feature);
    }
  
    protected boolean showFeature(SequenceFeature sequenceFeature)
    {
 -    Object fc = getFeatureStyle(sequenceFeature.type);
 -    if (fc instanceof GraduatedColor)
 -    {
 -      return ((GraduatedColor) fc).isColored(sequenceFeature);
 -    }
 -    else
 -    {
 -      return true;
 -    }
 +    FeatureColourI fc = getFeatureStyle(sequenceFeature.type);
 +    return fc.isColored(sequenceFeature);
    }
  
    protected boolean showFeatureOfType(String type)
    }
  
    @Override
 -  public void setColour(String featureType, Object col)
 +  public void setColour(String featureType, FeatureColourI col)
    {
 -    // overwrite
 -    // Color _col = (col instanceof Color) ? ((Color) col) : (col instanceof
 -    // GraduatedColor) ? ((GraduatedColor) col).getMaxColor() : null;
 -    // Object c = featureColours.get(featureType);
 -    // if (c == null || c instanceof Color || (c instanceof GraduatedColor &&
 -    // !((GraduatedColor)c).getMaxColor().equals(_col)))
 -    if (col instanceof FeatureColourI)
 -    {
 -      if (((FeatureColourI) col).isGraduatedColour())
 -      {
 -        col = new GraduatedColor((FeatureColourI) col);
 -      }
 -      else
 -      {
 -        col = ((FeatureColourI) col).getColour();
 -      }
 -    }
 -      featureColours.put(featureType, col);
 +     featureColours.put(featureType, col);
    }
  
    public void setTransparency(float value)
      return transparency;
    }
  
 -  Map featureOrder = null;
 -
    /**
     * analogous to colour - store a normalized ordering for all feature types in
     * this rendering context.
    {
      if (featureOrder == null)
      {
 -      featureOrder = new Hashtable();
 +      featureOrder = new Hashtable<String, Float>();
      }
      featureOrder.put(type, new Float(position));
      return position;
      {
        if (featureOrder.containsKey(type))
        {
 -        return ((Float) featureOrder.get(type)).floatValue();
 +        return featureOrder.get(type).floatValue();
        }
      }
      return -1;
    }
  
    @Override
 -  public Map<String, Object> getFeatureColours()
 +  public Map<String, FeatureColourI> getFeatureColours()
    {
      return featureColours;
    }
       * note visible feature ordering and colours before update
       */
      List<String> visibleFeatures = getDisplayedFeatureTypes();
 -    Map<String, Object> visibleColours = new HashMap<String, Object>(
 +    Map<String, FeatureColourI> visibleColours = new HashMap<String, FeatureColourI>(
              getFeatureColours());
  
      FeaturesDisplayedI av_featuresdisplayed = null;
        for (int i = 0; i < data.length; i++)
        {
          String type = data[i][0].toString();
 -        setColour(type, data[i][1]); // todo : typesafety - feature color
 -        // interface object
 +        setColour(type, (FeatureColourI) data[i][1]);
          if (((Boolean) data[i][2]).booleanValue())
          {
            av_featuresdisplayed.setVisible(type);
    {
      if (featureGroups != null)
      {
 -      ArrayList gp = new ArrayList();
 +      List<String> gp = new ArrayList<String>();
  
 -      for (Object grp : featureGroups.keySet())
 +      for (String grp : featureGroups.keySet())
        {
          Boolean state = featureGroups.get(grp);
          if (state.booleanValue() == visible)
    }
  
    @Override
 -  public Hashtable getDisplayedFeatureCols()
 +  public Map<String, FeatureColourI> getDisplayedFeatureCols()
    {
 -    Hashtable fcols = new Hashtable();
 +    Map<String, FeatureColourI> fcols = new Hashtable<String, FeatureColourI>();
      if (getViewport().getFeaturesDisplayed() == null)
      {
        return fcols;
      }
 -    Iterator<String> en = getViewport().getFeaturesDisplayed()
 +    Iterator<String> features = getViewport().getFeaturesDisplayed()
              .getVisibleFeatures();
 -    while (en.hasNext())
 +    while (features.hasNext())
      {
 -      String col = en.next();
 -      fcols.put(col, featureColours.get(col));
 +      String feature = features.next();
 +      fcols.put(feature, getFeatureStyle(feature));
      }
      return fcols;
    }
@@@ -94,15 -94,12 +94,15 @@@ public class StrucConsensusThread exten
                .getAlignmentAnnotation();
        AlignmentAnnotation rnaStruc = null;
        // select rna struct to use for calculation
 -      for (int i = 0; i < aa.length; i++)
 +      if (aa != null)
        {
 -        if (aa[i].visible && aa[i].isRNA() && aa[i].isValidStruc())
 +        for (int i = 0; i < aa.length; i++)
          {
 -          rnaStruc = aa[i];
 -          break;
 +          if (aa[i].visible && aa[i].isRNA() && aa[i].isValidStruc())
 +          {
 +            rnaStruc = aa[i];
 +            break;
 +          }
          }
        }
        // check to see if its valid
        updateResultAnnotation(true);
      } catch (OutOfMemoryError error)
      {
-       calcMan.workerCannotRun(this);
+       calcMan.disableWorker(this);
  
        // consensus = null;
        // hconsensus = null;