JAL-2808 revised util.matcher package, 2 filter conditions per feature
[jalview.git] / src / jalview / gui / FeatureColourChooser.java
index 937b48e..fbe8437 100644 (file)
@@ -28,8 +28,8 @@ import jalview.util.MessageManager;
 import jalview.util.matcher.Condition;
 import jalview.util.matcher.KeyedMatcher;
 import jalview.util.matcher.KeyedMatcherI;
-import jalview.util.matcher.Matcher;
-import jalview.util.matcher.MatcherI;
+import jalview.util.matcher.KeyedMatcherSet;
+import jalview.util.matcher.KeyedMatcherSetI;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
@@ -40,6 +40,8 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.Iterator;
@@ -244,28 +246,34 @@ public class FeatureColourChooser extends JalviewDialog
   /**
    * Populates the attribute filter fields for the initial display
    * 
-   * @param attributeFilters
+   * @param filters
    */
-  void setInitialFilters(KeyedMatcherI attributeFilters)
+  void setInitialFilters(KeyedMatcherSetI filters)
   {
     // todo generalise to populate N conditions
-    
-    if (attributeFilters != null)
-    {
-      filterAttribute.setSelectedItem(attributeFilters.getKey());
-      filterCondition.setSelectedItem(attributeFilters.getMatcher()
-              .getCondition());
-      filterValue.setText(attributeFilters.getMatcher().getPattern());
-      
-      KeyedMatcherI second = attributeFilters.getSecondMatcher();
-      if (second != null)
-      {
-        // todo add OR/AND condition to gui
-        filterAttribute2.setSelectedItem(second.getKey());
-        filterCondition2
-                .setSelectedItem(second.getMatcher().getCondition());
-        filterValue2.setText(second.getMatcher().getPattern());
-      }
+
+    if (filters == null)
+    {
+      return;
+    }
+
+    Iterator<KeyedMatcherI> theFilters = filters.getMatchers();
+    if (theFilters.hasNext())
+    {
+      KeyedMatcherI filter = theFilters.next();
+      filterAttribute.setSelectedItem(filter.getKey());
+      filterCondition.setSelectedItem(filter.getMatcher().getCondition());
+      filterValue.setText(filter.getMatcher().getPattern());
+    }
+    if (theFilters.hasNext())
+    {
+      KeyedMatcherI filter = theFilters.next();
+      boolean anded = filters.isAnded();
+      // todo add OR/AND condition to gui
+      // - user choice for the second condition, fixed thereafter
+      filterAttribute2.setSelectedItem(filter.getKey());
+      filterCondition2.setSelectedItem(filter.getMatcher().getCondition());
+      filterValue2.setText(filter.getMatcher().getPattern());
     }
   }
 
@@ -684,24 +692,25 @@ public class FeatureColourChooser extends JalviewDialog
     String attribute = (String) filterAttribute.getSelectedItem();
     Condition cond = (Condition) filterCondition.getSelectedItem();
     String pattern = filterValue.getText().trim();
-    if (pattern.length() > 1)
+    if (pattern.length() > 0)
     {
-      MatcherI filter = new Matcher(cond, pattern);
-      KeyedMatcherI km = new KeyedMatcher(attribute, filter);
+      KeyedMatcherSetI filters = new KeyedMatcherSet();
+      KeyedMatcherI km = new KeyedMatcher(attribute, cond, pattern);
+      filters.and(km);
 
       /*
        * is there a second condition?
-       * todo: generalise to N conditions
+       * todo: allow N conditions with choice of AND or OR (but not both!)
        */
       pattern = filterValue2.getText().trim();
       if (pattern.length() > 1)
       {
         attribute = (String) filterAttribute2.getSelectedItem();
         cond = (Condition) filterCondition2.getSelectedItem();
-        filter = new Matcher(cond, pattern);
-        km = km.and(attribute, filter);
+        KeyedMatcherI km2 = new KeyedMatcher(attribute, cond, pattern);
+        filters.and(km2);
       }
-      acg.setAttributeFilters(km);
+      acg.setAttributeFilters(filters);
     }
   }
 
@@ -830,10 +839,10 @@ public class FeatureColourChooser extends JalviewDialog
       filterAttribute.addItem(attName);
       filterAttribute2.addItem(attName);
     }
-    filterAttribute.addActionListener(new ActionListener()
+    filterAttribute.addItemListener(new ItemListener()
     {
       @Override
-      public void actionPerformed(ActionEvent e)
+      public void itemStateChanged(ItemEvent e)
       {
         changeColour(true);
       }
@@ -847,10 +856,10 @@ public class FeatureColourChooser extends JalviewDialog
     {
       filterCondition.addItem(cond);
     }
-    filterCondition.addActionListener(new ActionListener()
+    filterCondition.addItemListener(new ItemListener()
     {
       @Override
-      public void actionPerformed(ActionEvent e)
+      public void itemStateChanged(ItemEvent e)
       {
         changeColour(true);
       }