JAL-2015 JAL-1956 rollout of FeatureColourI in place of
[jalview.git] / src / jalview / appletgui / FeatureSettings.java
index f1e9835..203605b 100755 (executable)
  */
 package jalview.appletgui;
 
+import jalview.api.FeatureColourI;
 import jalview.api.FeatureSettingsControllerI;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceFeature;
-import jalview.schemes.AnnotationColourGradient;
-import jalview.schemes.GraduatedColor;
 import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
@@ -58,8 +57,8 @@ import java.awt.event.MouseMotionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.util.Enumeration;
-import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
 public class FeatureSettings extends Panel implements ItemListener,
@@ -119,7 +118,8 @@ public class FeatureSettings extends Panel implements ItemListener,
     this.setLayout(new BorderLayout());
     scrollPane = new ScrollPane();
     scrollPane.add(featurePanel);
-    if (fr.getAllFeatureColours()!=null && fr.getAllFeatureColours().size()>0)
+    if (fr.getAllFeatureColours() != null
+            && fr.getAllFeatureColours().size() > 0)
     {
       add(scrollPane, BorderLayout.CENTER);
     }
@@ -150,10 +150,11 @@ public class FeatureSettings extends Panel implements ItemListener,
 
     if (groupPanel != null)
     {
-      groupPanel
-              .setLayout(new GridLayout(
-                      (fr.getFeatureGroupsSize()) / 4 + 1,
-                      4)); // JBPNote - this was scaled on number of visible groups. seems broken
+      groupPanel.setLayout(new GridLayout(
+              (fr.getFeatureGroupsSize()) / 4 + 1, 4)); // JBPNote - this was
+                                                        // scaled on number of
+                                                        // visible groups. seems
+                                                        // broken
       groupPanel.validate();
 
       add(groupPanel, BorderLayout.NORTH);
@@ -163,6 +164,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     final FeatureSettings me = this;
     frame.addWindowListener(new WindowAdapter()
     {
+      @Override
       public void windowClosing(WindowEvent e)
       {
         if (me.av.featureSettings == me)
@@ -180,10 +182,10 @@ public class FeatureSettings extends Panel implements ItemListener,
     int width = 300;
     jalview.bin.JalviewLite.addFrame(frame,
             MessageManager.getString("label.sequence_feature_settings"),
-            width,
-            height);
+            width, height);
   }
 
+  @Override
   public void paint(Graphics g)
   {
     g.setColor(Color.black);
@@ -197,25 +199,26 @@ public class FeatureSettings extends Panel implements ItemListener,
             60);
   }
 
-  protected void popupSort(final MyCheckbox check, final Hashtable minmax,
+  protected void popupSort(final MyCheckbox check,
+          final Map<String, float[][]> minmax,
           int x, int y)
   {
     final String type = check.type;
-    final Object typeCol = fr.getFeatureStyle(type);
-    java.awt.PopupMenu men = new PopupMenu(MessageManager.formatMessage(
-            "label.settings_for_type", new String[]
-            { type }));
-    java.awt.MenuItem scr = new MenuItem(
+    final FeatureColourI typeCol = fr.getFeatureStyle(type);
+    PopupMenu men = new PopupMenu(MessageManager.formatMessage(
+            "label.settings_for_type", new String[] { type }));
+    MenuItem scr = new MenuItem(
             MessageManager.getString("label.sort_by_score"));
     men.add(scr);
     final FeatureSettings me = this;
     scr.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.ap.alignFrame.avc.sortAlignmentByFeatureScore(new String[]
-        { type });
+        me.ap.alignFrame.avc
+                .sortAlignmentByFeatureScore(new String[] { type });
       }
 
     });
@@ -224,17 +227,18 @@ public class FeatureSettings extends Panel implements ItemListener,
     dens.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.ap.alignFrame.avc.sortAlignmentByFeatureDensity(new String[]
-        { type });
+        me.ap.alignFrame.avc
+                .sortAlignmentByFeatureDensity(new String[] { type });
       }
 
     });
     men.add(dens);
     if (minmax != null)
     {
-      final Object typeMinMax = minmax.get(type);
+      final float[][] typeMinMax = minmax.get(type);
       /*
        * final java.awt.CheckboxMenuItem chb = new
        * java.awt.CheckboxMenuItem("Vary Height"); // this is broken at the
@@ -247,20 +251,21 @@ public class FeatureSettings extends Panel implements ItemListener,
        * 
        * }); men.add(chb);
        */
-      if (typeMinMax != null && ((float[][]) typeMinMax)[0] != null)
+      if (typeMinMax != null && typeMinMax[0] != null)
       {
         // graduated colourschemes for those where minmax exists for the
         // positional features
         MenuItem mxcol = new MenuItem(
-                (typeCol instanceof Color) ? "Graduated Colour"
+                (typeCol.isSimpleColour()) ? "Graduated Colour"
                         : "Single Colour");
         men.add(mxcol);
         mxcol.addActionListener(new ActionListener()
         {
 
+          @Override
           public void actionPerformed(ActionEvent e)
           {
-            if (typeCol instanceof Color)
+            if (typeCol.isSimpleColour())
             {
               new FeatureColourChooser(me, type);
               // write back the current colour object to update the table
@@ -268,8 +273,7 @@ public class FeatureSettings extends Panel implements ItemListener,
             }
             else
             {
-              new UserDefinedColours(me, check.type,
-                      ((GraduatedColor) typeCol));
+              new UserDefinedColours(me, check.type, typeCol);
             }
           }
 
@@ -283,7 +287,8 @@ public class FeatureSettings extends Panel implements ItemListener,
   @Override
   public void discoverAllFeatureData()
   {
-    if (fr.getAllFeatureColours()!=null && fr.getAllFeatureColours().size()>0)
+    if (fr.getAllFeatureColours() != null
+            && fr.getAllFeatureColours().size() > 0)
     {
       rebuildGroups();
 
@@ -308,7 +313,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     }
     // TODO: JAL-964 - smoothly incorporate new group entries if panel already
     // displayed and new groups present
-    for (String group:fr.getFeatureGroups())
+    for (String group : fr.getFeatureGroups())
     {
       boolean vis = fr.checkGroupVisibility(group, false);
       Checkbox check = new MyCheckbox(group, vis,
@@ -326,13 +331,14 @@ public class FeatureSettings extends Panel implements ItemListener,
       groupPanel.validate();
     }
   }
+
   // This routine adds and removes checkboxes depending on
   // Group selection states
   void resetTable(boolean groupsChanged)
   {
     SequenceFeature[] tmpfeatures;
     String group = null, type;
-    Vector visibleChecks = new Vector();
+    Vector<String> visibleChecks = new Vector<String>();
     AlignmentI alignment = av.getAlignment();
     for (int i = 0; i < alignment.getHeight(); i++)
     {
@@ -398,7 +404,7 @@ public class FeatureSettings extends Panel implements ItemListener,
 
     // now add checkboxes which should be visible,
     // if they have not already been added
-    Enumeration en = visibleChecks.elements();
+    Enumeration<String> en = visibleChecks.elements();
 
     while (en.hasMoreElements())
     {
@@ -472,6 +478,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     }
   }
 
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     for (int i = 0; i < featurePanel.getComponentCount(); i++)
@@ -482,11 +489,13 @@ public class FeatureSettings extends Panel implements ItemListener,
     selectionChanged();
   }
 
-  private ItemListener groupItemListener = new ItemListener() {
-    public void itemStateChanged(ItemEvent evt) {
+  private ItemListener groupItemListener = new ItemListener()
+  {
+    @Override
+    public void itemStateChanged(ItemEvent evt)
+    {
       Checkbox source = (Checkbox) evt.getSource();
-      fr.setGroupVisibility(source.getLabel(),
-              source.getState());
+      fr.setGroupVisibility(source.getLabel(), source.getState());
       ap.seqPanel.seqCanvas.repaint();
       if (ap.overviewPanel != null)
       {
@@ -496,6 +505,8 @@ public class FeatureSettings extends Panel implements ItemListener,
       return;
     };
   };
+
+  @Override
   public void itemStateChanged(ItemEvent evt)
   {
     selectionChanged();
@@ -529,6 +540,7 @@ public class FeatureSettings extends Panel implements ItemListener,
 
   boolean dragging = false;
 
+  @Override
   public void mousePressed(MouseEvent evt)
   {
 
@@ -545,6 +557,7 @@ public class FeatureSettings extends Panel implements ItemListener,
 
   }
 
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     if (((Component) evt.getSource()).getParent() != featurePanel)
@@ -554,6 +567,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     dragging = true;
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     if (((Component) evt.getSource()).getParent() != featurePanel)
@@ -606,17 +620,9 @@ public class FeatureSettings extends Panel implements ItemListener,
     }
   }
 
-  public void setUserColour(String feature, Object originalColour)
+  public void setUserColour(String feature, FeatureColourI originalColour)
   {
-    if (originalColour instanceof Color
-            || originalColour instanceof GraduatedColor)
-    {
-      fr.setColour(feature, originalColour);
-    }
-    else
-    {
-      throw new Error(MessageManager.getString("error.implementation_error_unsupported_feature_colour_object"));
-    }
+    fr.setColour(feature, originalColour);
     refreshTable();
   }
 
@@ -627,14 +633,17 @@ public class FeatureSettings extends Panel implements ItemListener,
     ap.paintAlignment(true);
   }
 
+  @Override
   public void mouseEntered(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseExited(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
     MyCheckbox check = (MyCheckbox) evt.getSource();
@@ -660,10 +669,10 @@ public class FeatureSettings extends Panel implements ItemListener,
 
     if (evt.getClickCount() > 1)
     {
-      Object fcol = fr.getFeatureStyle(check.type);
-      if (fcol instanceof Color)
+      FeatureColourI fcol = fr.getFeatureStyle(check.type);
+      if (fcol.isSimpleColour())
       {
-        new UserDefinedColours(this, check.type, (Color) fcol);
+        new UserDefinedColours(this, check.type, fcol.getColour());
       }
       else
       {
@@ -674,10 +683,12 @@ public class FeatureSettings extends Panel implements ItemListener,
     }
   }
 
+  @Override
   public void mouseMoved(MouseEvent evt)
   {
   }
 
+  @Override
   public void adjustmentValueChanged(AdjustmentEvent evt)
   {
     fr.setTransparency((100 - transparency.getValue()) / 100f);
@@ -693,47 +704,34 @@ public class FeatureSettings extends Panel implements ItemListener,
 
     boolean hasLink;
 
-    GraduatedColor gcol;
-
-    Color col;
+    FeatureColourI col;
 
-    public void updateColor(Object newcol)
+    public void updateColor(FeatureColourI newcol)
     {
-      if (newcol instanceof Color)
-      {
-        col = (Color) newcol;
-        gcol = null;
-      }
-      else if (newcol instanceof GraduatedColor)
-      {
-        gcol = (GraduatedColor) newcol;
-        col = null;
-      }
-      else
-      {
-        throw new Error(MessageManager.getString("error.invalid_colour_for_mycheckbox"));
-      }
-      if (col != null)
+      col = newcol;
+      if (col.isSimpleColour())
       {
-        setBackground(col);
+        setBackground(col.getColour());
       }
       else
       {
         String vlabel = type;
-        if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD)
+        if (col.isAboveThreshold())
         {
-          vlabel += " "
-                  + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)"
-                          : "(<)");
+          vlabel += " (>)";
         }
-        if (gcol.isColourByLabel())
+        else if (col.isBelowThreshold())
+        {
+          vlabel += " (<)";
+        }
+        if (col.isColourByLabel())
         {
           setBackground(Color.white);
           vlabel += " (by Label)";
         }
         else
         {
-          setBackground(gcol.getMinColor());
+          setBackground(col.getMinColour());
         }
         this.setLabel(vlabel);
       }
@@ -750,40 +748,38 @@ public class FeatureSettings extends Panel implements ItemListener,
     }
 
     public MyCheckbox(String type, boolean selected, boolean b,
-            Object featureStyle)
+            FeatureColourI featureStyle)
     {
       this(type, selected, b);
       updateColor(featureStyle);
     }
 
+    @Override
     public void paint(Graphics g)
     {
       Dimension d = getSize();
-      if (gcol != null)
+      if (col.isColourByLabel())
       {
-        if (gcol.isColourByLabel())
-        {
-          g.setColor(Color.white);
-          g.fillRect(d.width / 2, 0, d.width / 2, d.height);
-          /*
-           * g.setColor(Color.black); Font f=g.getFont().deriveFont(9);
-           * g.setFont(f);
-           * 
-           * // g.setFont(g.getFont().deriveFont( //
-           * AffineTransform.getScaleInstance( //
-           * width/g.getFontMetrics().stringWidth("Label"), //
-           * height/g.getFontMetrics().getHeight()))); g.drawString("Label",
-           * width/2, 0);
-           */
+        g.setColor(Color.white);
+        g.fillRect(d.width / 2, 0, d.width / 2, d.height);
+        /*
+         * g.setColor(Color.black); Font f=g.getFont().deriveFont(9);
+         * g.setFont(f);
+         * 
+         * // g.setFont(g.getFont().deriveFont( //
+         * AffineTransform.getScaleInstance( //
+         * width/g.getFontMetrics().stringWidth("Label"), //
+         * height/g.getFontMetrics().getHeight()))); g.drawString("Label",
+         * width/2, 0);
+         */
 
-        }
-        else
-        {
-          Color maxCol = gcol.getMaxColor();
-          g.setColor(maxCol);
-          g.fillRect(d.width / 2, 0, d.width / 2, d.height);
+      }
+      else if (col.isGraduatedColour())
+      {
+        Color maxCol = col.getMaxColour();
+        g.setColor(maxCol);
+        g.fillRect(d.width / 2, 0, d.width / 2, d.height);
 
-        }
       }
 
       if (hasLink)