JAL-437 remove code duplicated by merge
[jalview.git] / src / jalview / gui / FeatureSettings.java
index 811b377..6957ea4 100644 (file)
@@ -22,29 +22,20 @@ package jalview.gui;
 
 import jalview.api.FeatureColourI;
 import jalview.api.FeatureSettingsControllerI;
-import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
-import jalview.datamodel.features.FeatureMatcher;
 import jalview.datamodel.features.FeatureMatcherI;
 import jalview.datamodel.features.FeatureMatcherSet;
 import jalview.datamodel.features.FeatureMatcherSetI;
 import jalview.gui.Help.HelpId;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
-import jalview.schemabinding.version2.CompoundMatcher;
 import jalview.schemabinding.version2.Filter;
 import jalview.schemabinding.version2.JalviewUserColours;
-import jalview.schemabinding.version2.MatchCondition;
 import jalview.schemabinding.version2.MatcherSet;
-import jalview.schemabinding.version2.types.ColourNoValueColourType;
-import jalview.schemabinding.version2.types.ColourThreshTypeType;
-import jalview.schemabinding.version2.types.FeatureMatcherByType;
 import jalview.schemes.FeatureColour;
-import jalview.util.Format;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
-import jalview.util.matcher.Condition;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel.FeatureSettingsBean;
 import jalview.ws.DasSequenceFeatureFetcher;
@@ -75,7 +66,6 @@ import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -117,6 +107,9 @@ import javax.swing.table.TableColumn;
 public class FeatureSettings extends JPanel
         implements FeatureSettingsControllerI
 {
+  private static final String SEQUENCE_FEATURE_COLOURS = MessageManager
+          .getString("label.sequence_feature_colours");
+
   /*
    * column indices of fields in Feature Settings table
    */
@@ -189,290 +182,6 @@ public class FeatureSettings extends JPanel
   Map<String, float[]> typeWidth = null;
 
   /**
-   * Populates an XML model of the feature colour scheme for one feature type
-   * 
-   * @param featureType
-   * @param fcol
-   * @return
-   */
-  protected static jalview.schemabinding.version2.Colour marshalColour(
-          String featureType, FeatureColourI fcol)
-  {
-    jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();
-    if (fcol.isSimpleColour())
-    {
-      col.setRGB(Format.getHexString(fcol.getColour()));
-    }
-    else
-    {
-      col.setRGB(Format.getHexString(fcol.getMaxColour()));
-      col.setMin(fcol.getMin());
-      col.setMax(fcol.getMax());
-      col.setMinRGB(jalview.util.Format.getHexString(fcol.getMinColour()));
-      col.setAutoScale(fcol.isAutoScaled());
-      col.setThreshold(fcol.getThreshold());
-      col.setColourByLabel(fcol.isColourByLabel());
-      col.setThreshType(fcol.isAboveThreshold() ? ColourThreshTypeType.ABOVE
-              : (fcol.isBelowThreshold() ? ColourThreshTypeType.BELOW
-                      : ColourThreshTypeType.NONE));
-      if (fcol.isColourByAttribute())
-      {
-        col.setAttributeName(fcol.getAttributeName());
-      }
-      Color noColour = fcol.getNoColour();
-      if (noColour == null)
-      {
-        col.setNoValueColour(ColourNoValueColourType.NONE);
-      }
-      else if (noColour == fcol.getMaxColour())
-      {
-        col.setNoValueColour(ColourNoValueColourType.MAX);
-      }
-      else
-      {
-        col.setNoValueColour(ColourNoValueColourType.MIN);
-      }
-    }
-    col.setName(featureType);
-    return col;
-  }
-
-  /**
-   * Populates an XML model of the feature filter(s) for one feature type
-   * 
-   * @param firstMatcher
-   *          the first (or only) match condition)
-   * @param filter
-   *          remaining match conditions (if any)
-   * @param and
-   *          if true, conditions are and-ed, else or-ed
-   */
-  protected static MatcherSet marshalFilter(FeatureMatcherI firstMatcher,
-          Iterator<FeatureMatcherI> filters, boolean and)
-  {
-    MatcherSet result = new MatcherSet();
-
-    if (filters.hasNext())
-    {
-      /*
-       * compound matcher
-       */
-      CompoundMatcher compound = new CompoundMatcher();
-      compound.setAnd(and);
-      MatcherSet matcher1 = marshalFilter(firstMatcher,
-              Collections.emptyIterator(), and);
-      compound.addMatcherSet(matcher1);
-      FeatureMatcherI nextMatcher = filters.next();
-      MatcherSet matcher2 = marshalFilter(nextMatcher, filters, and);
-      compound.addMatcherSet(matcher2);
-      result.setCompoundMatcher(compound);
-    }
-    else
-    {
-      /*
-       * single condition matcher
-       */
-      MatchCondition matcherModel = new MatchCondition();
-      matcherModel.setCondition(
-              firstMatcher.getMatcher().getCondition().getStableName());
-      matcherModel.setValue(firstMatcher.getMatcher().getPattern());
-      if (firstMatcher.isByAttribute())
-      {
-        matcherModel.setBy(FeatureMatcherByType.BYATTRIBUTE);
-        matcherModel.setAttributeName(firstMatcher.getAttribute());
-      }
-      else if (firstMatcher.isByLabel())
-      {
-        matcherModel.setBy(FeatureMatcherByType.BYLABEL);
-      }
-      else if (firstMatcher.isByScore())
-      {
-        matcherModel.setBy(FeatureMatcherByType.BYSCORE);
-      }
-      result.setMatchCondition(matcherModel);
-    }
-
-    return result;
-  }
-
-  /**
-   * Loads one XML model of a feature filter to a Jalview object
-   * 
-   * @param colourModel
-   * @return
-   */
-  protected static FeatureMatcherSetI unmarshalFilter(Filter filterModel)
-  {
-    FeatureMatcherSetI result = new FeatureMatcherSet();
-    MatcherSet matcherSetModel = filterModel.getMatcherSet();
-    try
-    {
-      unmarshalFilterConditions(result, matcherSetModel, true);
-    } catch (IllegalStateException e)
-    {
-      // mixing AND and OR conditions perhaps
-      System.err.println(
-              String.format("Error reading filter conditions for '%s': %s",
-                      filterModel.getFeatureType(), e.getMessage()));
-      // return as much as was parsed up to the error
-    }
-
-    return result;
-  }
-
-  /**
-   * Adds feature match conditions to matcherSet as unmarshalled from XML
-   * (possibly recursively for compound conditions)
-   * 
-   * @param matcherSet
-   * @param matcherSetModel
-   * @param and
-   *          if true, multiple conditions are AND-ed, else they are OR-ed
-   * @throws IllegalStateException
-   *           if AND and OR conditions are mixed
-   */
-  protected static void unmarshalFilterConditions(
-          FeatureMatcherSetI matcherSet, MatcherSet matcherSetModel,
-          boolean and)
-  {
-    MatchCondition mc = matcherSetModel.getMatchCondition();
-    if (mc != null)
-    {
-      /*
-       * single condition
-       */
-      FeatureMatcherByType filterBy = mc.getBy();
-      Condition cond = Condition.fromString(mc.getCondition());
-      String pattern = mc.getValue();
-      FeatureMatcherI matchCondition = null;
-      if (filterBy == FeatureMatcherByType.BYLABEL)
-      {
-        matchCondition = FeatureMatcher.byLabel(cond, pattern);
-      }
-      else if (filterBy == FeatureMatcherByType.BYSCORE)
-      {
-        matchCondition = FeatureMatcher.byScore(cond, pattern);
-
-      }
-      else if (filterBy == FeatureMatcherByType.BYATTRIBUTE)
-      {
-        String[] attNames = mc.getAttributeName();
-        matchCondition = FeatureMatcher.byAttribute(cond, pattern,
-                attNames);
-      }
-
-      /*
-       * note this throws IllegalStateException if AND-ing to a 
-       * previously OR-ed compound condition, or vice versa
-       */
-      if (and)
-      {
-        matcherSet.and(matchCondition);
-      }
-      else
-      {
-        matcherSet.or(matchCondition);
-      }
-    }
-    else
-    {
-      /*
-       * compound condition
-       */
-      MatcherSet[] matchers = matcherSetModel.getCompoundMatcher()
-              .getMatcherSet();
-      boolean anded = matcherSetModel.getCompoundMatcher().getAnd();
-      if (matchers.length == 2)
-      {
-        unmarshalFilterConditions(matcherSet, matchers[0], anded);
-        unmarshalFilterConditions(matcherSet, matchers[1], anded);
-      }
-      else
-      {
-        System.err.println("Malformed compound filter condition");
-      }
-    }
-  }
-
-  /**
-   * Loads one XML model of a feature colour to a Jalview object
-   * 
-   * @param colourModel
-   * @return
-   */
-  protected static FeatureColourI unmarshalColour(
-          jalview.schemabinding.version2.Colour colourModel)
-  {
-    FeatureColourI colour = null;
-
-    if (colourModel.hasMax())
-    {
-      Color mincol = null;
-      Color maxcol = null;
-      Color noValueColour = null;
-
-      try
-      {
-        mincol = new Color(Integer.parseInt(colourModel.getMinRGB(), 16));
-        maxcol = new Color(Integer.parseInt(colourModel.getRGB(), 16));
-      } catch (Exception e)
-      {
-        Cache.log.warn("Couldn't parse out graduated feature color.", e);
-      }
-
-      ColourNoValueColourType noCol = colourModel.getNoValueColour();
-      if (noCol == ColourNoValueColourType.MIN)
-      {
-        noValueColour = mincol;
-      }
-      else if (noCol == ColourNoValueColourType.MAX)
-      {
-        noValueColour = maxcol;
-      }
-
-      colour = new FeatureColour(mincol, maxcol, noValueColour,
-              colourModel.getMin(),
-              colourModel.getMax());
-      String[] attributes = colourModel.getAttributeName();
-      if (attributes != null && attributes.length > 0)
-      {
-        colour.setAttributeName(attributes);
-      }
-      if (colourModel.hasAutoScale())
-      {
-        colour.setAutoScaled(colourModel.getAutoScale());
-      }
-      if (colourModel.hasColourByLabel())
-      {
-        colour.setColourByLabel(colourModel.getColourByLabel());
-      }
-      if (colourModel.hasThreshold())
-      {
-        colour.setThreshold(colourModel.getThreshold());
-      }
-      ColourThreshTypeType ttyp = colourModel.getThreshType();
-      if (ttyp != null)
-      {
-        if (ttyp == ColourThreshTypeType.ABOVE)
-        {
-          colour.setAboveThreshold(true);
-        }
-        else if (ttyp == ColourThreshTypeType.BELOW)
-        {
-          colour.setBelowThreshold(true);
-        }
-      }
-    }
-    else
-    {
-      Color color = new Color(Integer.parseInt(colourModel.getRGB(), 16));
-      colour = new FeatureColour(color);
-    }
-
-    return colour;
-  }
-
-  /**
    * Constructor
    * 
    * @param af
@@ -1153,7 +862,7 @@ public class FeatureSettings extends JPanel
   void load()
   {
     JalviewFileChooser chooser = new JalviewFileChooser("fc",
-            "Sequence Feature Colours");
+            SEQUENCE_FEATURE_COLOURS);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
             MessageManager.getString("label.load_feature_colours"));
@@ -1164,56 +873,67 @@ public class FeatureSettings extends JPanel
     if (value == JalviewFileChooser.APPROVE_OPTION)
     {
       File file = chooser.getSelectedFile();
+      load(file);
+    }
+  }
 
-      try
-      {
-        InputStreamReader in = new InputStreamReader(
-                new FileInputStream(file), "UTF-8");
+  /**
+   * Loads feature colours and filters from XML stored in the given file
+   * 
+   * @param file
+   */
+  void load(File file)
+  {
+    try
+    {
+      InputStreamReader in = new InputStreamReader(
+              new FileInputStream(file), "UTF-8");
 
-        JalviewUserColours jucs = JalviewUserColours.unmarshal(in);
+      JalviewUserColours jucs = JalviewUserColours.unmarshal(in);
 
-        /*
-         * load feature colours
-         */
-        for (int i = jucs.getColourCount() - 1; i >= 0; i--)
-        {
-          jalview.schemabinding.version2.Colour newcol = jucs.getColour(i);
-          FeatureColourI colour = unmarshalColour(newcol);
-          fr.setColour(newcol.getName(), colour);
-          fr.setOrder(newcol.getName(), i / (float) jucs.getColourCount());
-        }
+      /*
+       * load feature colours
+       */
+      for (int i = jucs.getColourCount() - 1; i >= 0; i--)
+      {
+        jalview.schemabinding.version2.Colour newcol = jucs.getColour(i);
+        FeatureColourI colour = Jalview2XML.unmarshalColour(newcol);
+        fr.setColour(newcol.getName(), colour);
+        fr.setOrder(newcol.getName(), i / (float) jucs.getColourCount());
+      }
 
-        /*
-         * load feature filters; loaded filters will replace any that are
-         * currently defined, other defined filters are left unchanged 
-         */
-        for (int i = 0; i < jucs.getFilterCount(); i++)
+      /*
+       * load feature filters; loaded filters will replace any that are
+       * currently defined, other defined filters are left unchanged 
+       */
+      for (int i = 0; i < jucs.getFilterCount(); i++)
+      {
+        jalview.schemabinding.version2.Filter filterModel = jucs
+                .getFilter(i);
+        String featureType = filterModel.getFeatureType();
+        FeatureMatcherSetI filter = Jalview2XML.unmarshalFilter(featureType,
+                filterModel.getMatcherSet());
+        if (!filter.isEmpty())
         {
-          jalview.schemabinding.version2.Filter filterModel = jucs
-                  .getFilter(i);
-          FeatureMatcherSetI filter = unmarshalFilter(filterModel);
-          if (!filter.isEmpty())
-          {
-            fr.setFeatureFilter(filterModel.getFeatureType(), filter);
-          }
+          fr.setFeatureFilter(featureType, filter);
         }
+      }
 
-        /*
-         * update feature settings table
-         */
-        if (table != null)
-        {
-          resetTable(null);
-          Object[][] data = ((FeatureTableModel) table.getModel())
-                  .getData();
-          ensureOrder(data);
-          updateFeatureRenderer(data, false);
-          table.repaint();
-        }
-      } catch (Exception ex)
+      /*
+       * update feature settings table
+       */
+      if (table != null)
       {
-        System.out.println("Error loading User Colour File\n" + ex);
+        resetTable(null);
+        Object[][] data = ((FeatureTableModel) table.getModel())
+                .getData();
+        ensureOrder(data);
+        updateFeatureRenderer(data, false);
+        table.repaint();
       }
+    } catch (Exception ex)
+    {
+      System.out.println("Error loading User Colour File\n" + ex);
     }
   }
 
@@ -1224,7 +944,7 @@ public class FeatureSettings extends JPanel
   void save()
   {
     JalviewFileChooser chooser = new JalviewFileChooser("fc",
-            "Sequence Feature Colours");
+            SEQUENCE_FEATURE_COLOURS);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
             MessageManager.getString("label.save_feature_colours"));
@@ -1234,77 +954,87 @@ public class FeatureSettings extends JPanel
 
     if (value == JalviewFileChooser.APPROVE_OPTION)
     {
-      String choice = chooser.getSelectedFile().getPath();
-      JalviewUserColours ucs = new JalviewUserColours();
-      ucs.setSchemeName("Sequence Features");
-      try
-      {
-        PrintWriter out = new PrintWriter(new OutputStreamWriter(
-                new FileOutputStream(choice), "UTF-8"));
+      save(chooser.getSelectedFile());
+    }
+  }
 
-        /*
-         * sort feature types by colour order, from 0 (highest)
-         * to 1 (lowest)
-         */
-        Set<String> fr_colours = fr.getAllFeatureColours();
-        String[] sortedTypes = fr_colours
-                .toArray(new String[fr_colours.size()]);
-        Arrays.sort(sortedTypes, new Comparator<String>()
-        {
-          @Override
-          public int compare(String type1, String type2)
-          {
-            return Float.compare(fr.getOrder(type1), fr.getOrder(type2));
-          }
-        });
+  /**
+   * Saves feature colours and filters to the given file
+   * 
+   * @param file
+   */
+  void save(File file)
+  {
+    JalviewUserColours ucs = new JalviewUserColours();
+    ucs.setSchemeName("Sequence Features");
+    try
+    {
+      PrintWriter out = new PrintWriter(new OutputStreamWriter(
+              new FileOutputStream(file), "UTF-8"));
 
-        /*
-         * save feature colours
-         */
-        for (String featureType : sortedTypes)
+      /*
+       * sort feature types by colour order, from 0 (highest)
+       * to 1 (lowest)
+       */
+      Set<String> fr_colours = fr.getAllFeatureColours();
+      String[] sortedTypes = fr_colours
+              .toArray(new String[fr_colours.size()]);
+      Arrays.sort(sortedTypes, new Comparator<String>()
+      {
+        @Override
+        public int compare(String type1, String type2)
         {
-          FeatureColourI fcol = fr.getFeatureStyle(featureType);
-          jalview.schemabinding.version2.Colour col = marshalColour(
-                  featureType, fcol);
-          ucs.addColour(col);
+          return Float.compare(fr.getOrder(type1), fr.getOrder(type2));
         }
+      });
 
-        /*
-         * save any feature filters
-         */
-        for (String featureType : sortedTypes)
-        {
-          FeatureMatcherSetI filter = fr.getFeatureFilter(featureType);
-          if (filter != null && !filter.isEmpty())
-          {
-            Iterator<FeatureMatcherI> iterator = filter.getMatchers().iterator();
-            FeatureMatcherI firstMatcher = iterator.next();
-            MatcherSet ms = marshalFilter(firstMatcher, iterator,
-                    filter.isAnded());
-            Filter filterModel = new Filter();
-            filterModel.setFeatureType(featureType);
-            filterModel.setMatcherSet(ms);
-            ucs.addFilter(filterModel);
-          }
-        }
+      /*
+       * save feature colours
+       */
+      for (String featureType : sortedTypes)
+      {
+        FeatureColourI fcol = fr.getFeatureStyle(featureType);
+        jalview.schemabinding.version2.Colour col = Jalview2XML.marshalColour(
+                featureType, fcol);
+        ucs.addColour(col);
+      }
 
-        ucs.marshal(out);
-        out.close();
-      } catch (Exception ex)
+      /*
+       * save any feature filters
+       */
+      for (String featureType : sortedTypes)
       {
-        ex.printStackTrace();
+        FeatureMatcherSetI filter = fr.getFeatureFilter(featureType);
+        if (filter != null && !filter.isEmpty())
+        {
+          Iterator<FeatureMatcherI> iterator = filter.getMatchers().iterator();
+          FeatureMatcherI firstMatcher = iterator.next();
+          MatcherSet ms = Jalview2XML.marshalFilter(firstMatcher, iterator,
+                  filter.isAnded());
+          Filter filterModel = new Filter();
+          filterModel.setFeatureType(featureType);
+          filterModel.setMatcherSet(ms);
+          ucs.addFilter(filterModel);
+        }
       }
+
+      ucs.marshal(out);
+      out.close();
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
     }
   }
 
   public void invertSelection()
   {
-    for (int i = 0; i < table.getRowCount(); i++)
+    Object[][] data = ((FeatureTableModel) table.getModel()).getData();
+    for (int i = 0; i < data.length; i++)
     {
-      Boolean value = (Boolean) table.getValueAt(i, SHOW_COLUMN);
-
-      table.setValueAt(new Boolean(!value.booleanValue()), i, SHOW_COLUMN);
+      data[i][SHOW_COLUMN] = !(Boolean) data[i][SHOW_COLUMN];
     }
+    updateFeatureRenderer(data, true);
+    table.repaint();
   }
 
   public void orderByAvWidth()
@@ -1499,22 +1229,6 @@ public class FeatureSettings extends JPanel
         }
       }
     });
-    help.setFont(JvSwingUtils.getLabelFont());
-    help.setText(MessageManager.getString("action.help"));
-    help.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        try
-        {
-          Help.showHelpWindow(HelpId.SequenceFeatureSettings);
-        } catch (HelpSetException e1)
-        {
-          e1.printStackTrace();
-        }
-      }
-    });
 
     JButton cancel = new JButton(MessageManager.getString("action.cancel"));
     cancel.setFont(JvSwingUtils.getLabelFont());
@@ -1544,6 +1258,8 @@ public class FeatureSettings extends JPanel
     JButton loadColours = new JButton(
             MessageManager.getString("label.load_colours"));
     loadColours.setFont(JvSwingUtils.getLabelFont());
+    loadColours.setToolTipText(
+            MessageManager.getString("label.load_colours_tooltip"));
     loadColours.addActionListener(new ActionListener()
     {
       @Override
@@ -1556,6 +1272,8 @@ public class FeatureSettings extends JPanel
     JButton saveColours = new JButton(
             MessageManager.getString("label.save_colours"));
     saveColours.setFont(JvSwingUtils.getLabelFont());
+    saveColours.setToolTipText(
+            MessageManager.getString("label.save_colours_tooltip"));
     saveColours.addActionListener(new ActionListener()
     {
       @Override