Merge branch 'develop' into trialMerge
[jalview.git] / src / jalview / gui / FeatureTypeSettings.java
index 8ea966a..9ff51a8 100644 (file)
@@ -62,7 +62,6 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JSlider;
-import javax.swing.JTabbedPane;
 import javax.swing.JTextField;
 import javax.swing.border.LineBorder;
 import javax.swing.event.ChangeEvent;
@@ -113,7 +112,7 @@ public class FeatureTypeSettings extends JalviewDialog
    */
   final AlignmentViewPanel ap;
 
-  private final String featureType;
+  final String featureType;
 
   /*
    * the colour and filters to reset to on Cancel
@@ -154,10 +153,9 @@ public class FeatureTypeSettings extends JalviewDialog
 
   JRadioButton graduatedColour = new JRadioButton();
 
-  /**
-   * colours and filters are shown in tabbed view or single content pane
-   */
-  JPanel coloursPanel, filtersPanel;
+  JPanel coloursPanel;
+  
+  JPanel filtersPanel;
 
   JPanel singleColour = new JPanel();
 
@@ -213,28 +211,14 @@ public class FeatureTypeSettings extends JalviewDialog
    */
   public FeatureTypeSettings(FeatureRenderer frender, String theType)
   {
-    this(frender, false, theType);
-  }
-
-  /**
-   * Constructor, with option to make a blocking dialog (has to complete in the
-   * AWT event queue thread). Currently this option is always set to false.
-   * 
-   * @param frender
-   * @param blocking
-   * @param theType
-   */
-  FeatureTypeSettings(FeatureRenderer frender, boolean blocking,
-          String theType)
-  {
     this.fr = frender;
     this.featureType = theType;
     ap = fr.ap;
     originalFilter = fr.getFeatureFilter(theType);
     originalColour = fr.getFeatureColours().get(theType);
-
+    
     adjusting = true;
-
+    
     try
     {
       initialise();
@@ -243,28 +227,27 @@ public class FeatureTypeSettings extends JalviewDialog
       ex.printStackTrace();
       return;
     }
-
-    updateColoursTab();
-
-    updateFiltersTab();
-
+    
+    updateColoursPanel();
+    
+    updateFiltersPanel();
+    
     adjusting = false;
-
+    
     colourChanged(false);
-
+    
     String title = MessageManager
             .formatMessage("label.display_settings_for", new String[]
             { theType });
-    initDialogFrame(this, true, blocking, title, 500, 500);
-
+    initDialogFrame(this, true, false, title, 580, 500);
     waitForInput();
   }
 
   /**
-   * Configures the widgets on the Colours tab according to the current feature
+   * Configures the widgets on the Colours panel according to the current feature
    * colour scheme
    */
-  private void updateColoursTab()
+  private void updateColoursPanel()
   {
     FeatureColourI fc = fr.getFeatureColours().get(featureType);
 
@@ -279,9 +262,9 @@ public class FeatureTypeSettings extends JalviewDialog
        */
       if (fc.isSimpleColour())
       {
-        simpleColour.setSelected(true);
         singleColour.setBackground(fc.getColour());
         singleColour.setForeground(fc.getColour());
+        simpleColour.setSelected(true);
       }
 
       /*
@@ -379,7 +362,7 @@ public class FeatureTypeSettings extends JalviewDialog
                         : BELOW_THRESHOLD_OPTION);
         slider.setEnabled(true);
         slider.setValue((int) (fc.getThreshold() * scaleFactor));
-        thresholdValue.setText(String.valueOf(getRoundedSliderValue()));
+        thresholdValue.setText(String.valueOf(fc.getThreshold()));
         thresholdValue.setEnabled(true);
         thresholdIsMin.setEnabled(true);
       }
@@ -416,13 +399,13 @@ public class FeatureTypeSettings extends JalviewDialog
     };
 
     /*
-     * first panel/tab: colour options
+     * first panel: colour options
      */
     JPanel coloursPanel = initialiseColoursPanel();
     this.add(coloursPanel, BorderLayout.NORTH);
 
     /*
-     * second panel/tab: filter options
+     * second panel: filter options
      */
     JPanel filtersPanel = initialiseFiltersPanel();
     this.add(filtersPanel, BorderLayout.CENTER);
@@ -502,6 +485,7 @@ public class FeatureTypeSettings extends JalviewDialog
     graduatedColour = new JRadioButton(
             MessageManager.getString("label.by_range_of") + COLON);
     graduatedColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+    graduatedColour.setOpaque(false);
     graduatedColour.addItemListener(new ItemListener()
     {
       @Override
@@ -553,7 +537,8 @@ public class FeatureTypeSettings extends JalviewDialog
       {
         if (minColour.isEnabled())
         {
-          showColourChooser(minColour, "label.select_colour_minimum_value");
+          String ttl = MessageManager.getString("label.select_colour_minimum_value");
+          showColourChooser(minColour, ttl);
         }
       }
     });
@@ -569,21 +554,28 @@ public class FeatureTypeSettings extends JalviewDialog
       {
         if (maxColour.isEnabled())
         {
-          showColourChooser(maxColour, "label.select_colour_maximum_value");
+          String ttl = MessageManager.getString("label.select_colour_maximum_value");
+          showColourChooser(maxColour, ttl);
         }
       }
     });
     maxColour.setBorder(new LineBorder(Color.black));
 
     /*
-     * default max colour to current colour (if a plain colour),
-     * or to Black if colour by label;  make min colour a pale
-     * version of max colour
+     * if not set, default max colour to last plain colour,
+     * and make min colour a pale version of max colour
      */
-    FeatureColourI fc = fr.getFeatureColours().get(featureType);
-    Color bg = fc.isSimpleColour() ? fc.getColour() : Color.BLACK;
-    maxColour.setBackground(bg);
-    minColour.setBackground(ColorUtils.bleachColour(bg, 0.9f));
+    Color max = originalColour.getMaxColour();
+    if (max == null)
+    {
+      max = originalColour.getColour();
+      minColour.setBackground(ColorUtils.bleachColour(max, 0.9f));
+    }
+    else
+    {
+      maxColour.setBackground(max);
+      minColour.setBackground(originalColour.getMinColour());
+    }
 
     noValueCombo = new JComboBox<>();
     noValueCombo.addItem(MessageManager.getString("label.no_colour"));
@@ -666,6 +658,7 @@ public class FeatureTypeSettings extends JalviewDialog
         {
           thresholdValue
                   .setText(String.valueOf(slider.getValue() / scaleFactor));
+          thresholdValue.setBackground(Color.white); // to reset red for invalid
           sliderValueChanged();
         }
       }
@@ -741,13 +734,12 @@ public class FeatureTypeSettings extends JalviewDialog
      */
     JPanel simpleColourPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
     simpleColourPanel.setBackground(Color.white);
-//    JvSwingUtils.createTitledBorder(simpleColourPanel,
-//            MessageManager.getString("label.simple"), true);
     colourByPanel.add(simpleColourPanel);
 
     simpleColour = new JRadioButton(
             MessageManager.getString("label.simple_colour"));
     simpleColour.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+    simpleColour.setOpaque(false);
     simpleColour.addItemListener(new ItemListener()
     {
       @Override
@@ -755,7 +747,7 @@ public class FeatureTypeSettings extends JalviewDialog
       {
         if (simpleColour.isSelected() && !adjusting)
         {
-          showColourChooser(singleColour, "label.select_colour");
+          colourChanged(true);
         }
       }
     });
@@ -763,6 +755,16 @@ public class FeatureTypeSettings extends JalviewDialog
     singleColour.setFont(JvSwingUtils.getLabelFont());
     singleColour.setBorder(BorderFactory.createLineBorder(Color.black));
     singleColour.setPreferredSize(new Dimension(40, 20));
+    // if (originalColour.isGraduatedColour())
+    // {
+    // singleColour.setBackground(originalColour.getMaxColour());
+    // singleColour.setForeground(originalColour.getMaxColour());
+    // }
+    // else
+    // {
+      singleColour.setBackground(originalColour.getColour());
+      singleColour.setForeground(originalColour.getColour());
+    // }
     singleColour.addMouseListener(new MouseAdapter()
     {
       @Override
@@ -770,7 +772,8 @@ public class FeatureTypeSettings extends JalviewDialog
       {
         if (simpleColour.isSelected())
         {
-          showColourChooser(singleColour, "label.select_colour");
+          String ttl = MessageManager.formatMessage("label.select_colour_for",  featureType);
+          showColourChooser(singleColour, ttl);
         }
       }
     });
@@ -788,6 +791,7 @@ public class FeatureTypeSettings extends JalviewDialog
     byCategory = new JRadioButton(
             MessageManager.getString("label.by_text_of") + COLON);
     byCategory.setPreferredSize(new Dimension(RADIO_WIDTH, 20));
+    byCategory.setOpaque(false);
     byCategory.addItemListener(new ItemListener()
     {
       @Override
@@ -838,10 +842,9 @@ public class FeatureTypeSettings extends JalviewDialog
    * 
    * @param colourPanel
    *          the panel whose background colour is being picked
-   * @param key
-   *          message bundle key for the dialog title
+   * @param title
    */
-  void showColourChooser(JPanel colourPanel, String key)
+  void showColourChooser(JPanel colourPanel, String title)
   {
     ColourChooserListener listener = new ColourChooserListener()
     {
@@ -854,9 +857,8 @@ public class FeatureTypeSettings extends JalviewDialog
         colourChanged(true);
       }
     };
-    JalviewColourChooser.showColourChooser(this,
-            MessageManager.getString(key), colourPanel.getBackground(),
-            listener);
+       JalviewColourChooser.showColourChooser(this, title, 
+         colourPanel.getBackground(), listener);
   }
 
   /**
@@ -890,7 +892,7 @@ public class FeatureTypeSettings extends JalviewDialog
     fr.setColour(featureType, acg);
     ap.paintAlignment(updateStructsAndOverview, updateStructsAndOverview);
 
-    updateColoursTab();
+    updateColoursPanel();
   }
 
   /**
@@ -901,42 +903,9 @@ public class FeatureTypeSettings extends JalviewDialog
   private FeatureColourI makeColourFromInputs()
   {
     /*
-     * easiest case - a single colour
-     */
-    if (simpleColour.isSelected())
-    {
-      return new FeatureColour(singleColour.getBackground());
-    }
-
-    /*
-     * next easiest case - colour by Label, or attribute text
+     * min-max range is to (or from) threshold value if 
+     * 'threshold is min/max' is selected 
      */
-    if (byCategory.isSelected())
-    {
-      Color c = this.getBackground();
-      FeatureColourI fc = new FeatureColour(c, c, null, 0f, 0f);
-      fc.setColourByLabel(true);
-      String byWhat = (String) colourByTextCombo.getSelectedItem();
-      if (!LABEL_18N.equals(byWhat))
-      {
-        fc.setAttributeName(
-                FeatureMatcher.fromAttributeDisplayName(byWhat));
-      }
-      return fc;
-    }
-
-    /*
-     * remaining case - graduated colour by score, or attribute value
-     */
-    Color noColour = null;
-    if (noValueCombo.getSelectedIndex() == MIN_COLOUR_OPTION)
-    {
-      noColour = minColour.getBackground();
-    }
-    else if (noValueCombo.getSelectedIndex() == MAX_COLOUR_OPTION)
-    {
-      noColour = maxColour.getBackground();
-    }
 
     float thresh = 0f;
     try
@@ -946,11 +915,6 @@ public class FeatureTypeSettings extends JalviewDialog
     {
       // invalid inputs are already handled on entry
     }
-
-    /*
-     * min-max range is to (or from) threshold value if 
-     * 'threshold is min/max' is selected 
-     */
     float minValue = min;
     float maxValue = max;
     int thresholdOption = threshold.getSelectedIndex();
@@ -964,14 +928,50 @@ public class FeatureTypeSettings extends JalviewDialog
     {
       maxValue = thresh;
     }
+    Color noColour = null;
+    if (noValueCombo.getSelectedIndex() == MIN_COLOUR_OPTION)
+    {
+      noColour = minColour.getBackground();
+    }
+    else if (noValueCombo.getSelectedIndex() == MAX_COLOUR_OPTION)
+    {
+      noColour = maxColour.getBackground();
+    }
+
+    /*
+     * construct a colour that 'remembers' all the options, including
+     * those not currently selected
+     */
+    FeatureColourI fc = new FeatureColour(singleColour.getBackground(),
+            minColour.getBackground(), maxColour.getBackground(), noColour,
+            minValue, maxValue);
+
+    /*
+     * easiest case - a single colour
+     */
+    if (simpleColour.isSelected())
+    {
+      ((FeatureColour) fc).setGraduatedColour(false);
+      return fc;
+    }
 
     /*
-     * make the graduated colour
+     * next easiest case - colour by Label, or attribute text
      */
-    FeatureColourI fc = new FeatureColour(minColour.getBackground(),
-            maxColour.getBackground(), noColour, minValue, maxValue);
+    if (byCategory.isSelected())
+    {
+      fc.setColourByLabel(true);
+      String byWhat = (String) colourByTextCombo.getSelectedItem();
+      if (!LABEL_18N.equals(byWhat))
+      {
+        fc.setAttributeName(
+                FeatureMatcher.fromAttributeDisplayName(byWhat));
+      }
+      return fc;
+    }
 
     /*
+     * remaining case - graduated colour by score, or attribute value;
      * set attribute to colour by if selected
      */
     String byWhat = (String) colourByRangeCombo.getSelectedItem();
@@ -1039,21 +1039,23 @@ public class FeatureTypeSettings extends JalviewDialog
   {
     try
     {
+      /*
+       * set 'adjusting' flag while moving the slider, so it 
+       * doesn't then in turn change the value (with rounding)
+       */
       adjusting = true;
       float f = Float.parseFloat(thresholdValue.getText());
+      f = Float.max(f,  this.min);
+      f = Float.min(f, this.max);
+      thresholdValue.setText(String.valueOf(f));
       slider.setValue((int) (f * scaleFactor));
       threshline.value = f;
       thresholdValue.setBackground(Color.white); // ok
-
-      /*
-       * force repaint of any Overview window or structure
-       */
-      ap.paintAlignment(true, true);
+      adjusting = false;
+      colourChanged(true);
     } catch (NumberFormatException ex)
     {
       thresholdValue.setBackground(Color.red); // not ok
-    } finally
-    {
       adjusting = false;
     }
   }
@@ -1201,6 +1203,8 @@ public class FeatureTypeSettings extends JalviewDialog
     andOrPanel.setBackground(Color.white);
     andFilters = new JRadioButton(MessageManager.getString("label.and"));
     orFilters = new JRadioButton(MessageManager.getString("label.or"));
+    andFilters.setOpaque(false);
+    orFilters.setOpaque(false);
     ActionListener actionListener = new ActionListener()
     {
       @Override
@@ -1228,7 +1232,7 @@ public class FeatureTypeSettings extends JalviewDialog
    * for adding a condition. This should be called after a filter has been
    * removed, added or amended.
    */
-  private void updateFiltersTab()
+  private void updateFiltersPanel()
   {
     /*
      * clear the panel and list of filter conditions
@@ -1763,6 +1767,6 @@ public class FeatureTypeSettings extends JalviewDialog
     fr.setFeatureFilter(featureType, combined.isEmpty() ? null : combined);
     ap.paintAlignment(true, true);
 
-    updateFiltersTab();
+    updateFiltersPanel();
   }
 }