Refactored FilterControls, moving some logic in the superclass.
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java
index 7f9b32f..7c66509 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java
@@ -10,6 +10,7 @@
  ******************************************************************************/
 package org.eclipse.rmf.reqif10.search.filter.ui;
 
+import java.util.List;
 import java.util.ResourceBundle;
 
 import org.eclipse.rmf.reqif10.AttributeDefinition;
@@ -23,41 +24,155 @@
 import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
 import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
 import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter.InternalAttribute;
 import org.eclipse.rmf.reqif10.search.filter.EnumFilter;
 import org.eclipse.rmf.reqif10.search.filter.IFilter;
 import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 
 /**
- * Represents the actual {@link Control} that holds the settings for the contained filter.
+ * Represents the actual {@link Control} that holds the settings for the
+ * contained filter. The infrastructure manages the operator.
+ * 
  * Also provides factory methods for building {@link FilterControl} instances.
  * 
  * @author jastram
  */
 public abstract class FilterControl extends Composite {
 
-	public FilterControl(Composite parent, int style) {
-		super(parent, style);
+	protected IFilter templateFilter;
+	protected Object attribute;
+
+	private Combo operatorControl;
+
+	/**
+	 * New {@link FilterControl} for the given {@link #attribute}, which can be
+	 * an internal attribute or an {@link AttributeDefinition}.
+	 */
+	public FilterControl(FilterPanel parent, AttributeDefinition attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
+	}
+
+	public FilterControl(FilterPanel parent, InternalAttribute attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
+	}
+
+	public FilterControl(
+			FilterPanel parent,
+			org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter.InternalAttribute attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
 	}
 
 	/**
+	 * New {@link FilterControl} for the given template {@link IFilter}.
+	 */
+	public FilterControl(FilterPanel parent, IFilter template) {
+		super(parent, SWT.FLAT);
+		this.templateFilter = template;
+		this.attribute = template.getAttribute();
+		init();
+	}
+
+
+
+	/**
+	 * Returns the operator selected in the GUI, never null.
+	 * 
+	 * @return
+	 */
+	protected final Operator getOperator() {
+		return getOperators().get(operatorControl.getSelectionIndex());
+	}
+
+	/**
+	 * Typical implementation:
+	 * 
+	 * <pre>
+	 * return ABCFilter.SUPPORTED_OPERATORS.asList();
+	 * </pre>
+	 */
+	protected abstract List<Operator> getOperators();
+
+	/**
+	 * Called when the operator changes. As different operators require
+	 * different numbers of values, the GUI may need to be adapted accordingly.
+	 * 
+	 * If initialize is true, the controls should be initialized from the
+	 * template.
+	 */
+	protected abstract void updateValueControls(boolean initialize);
+
+	/**
 	 * Constructs a Filter object from the current configuration of the Control.
+	 * 
 	 * @return the {@link IFilter} object.
 	 */
 	abstract public IFilter getFilter();
-	
+
+	private void init() {
+		if (attribute == null) throw new NullPointerException();
+		setLayout(new GridLayout(3, false));
+		createOperators();
+		updateValueControls(templateFilter != null);
+	}
+
+	private void createOperators() {
+		operatorControl = new Combo(this, SWT.DROP_DOWN | SWT.BORDER
+				| SWT.READ_ONLY);
+		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+		operatorControl.setLayoutData(layoutData);
+		for (Operator operator : getOperators()) {
+			operatorControl.add(operator.toLocaleString());
+		}
+		operatorControl.select(0);
+		if (templateFilter != null) {
+			operatorControl.select(getOperators().indexOf(
+					templateFilter.getOperator()));
+		}
+
+		operatorControl.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				updateValueControls(false);
+				layout(true);
+			}
+		});
+	}
+
+	// //////////////////////////////////////////////////////////////////////////
+
 	/**
 	 * This factory instantiates the correct FilterControl for a given filter.
 	 */
-	public static FilterControl createFilterControl(FilterPanel parent, IFilter filter) {
-		if (filter instanceof AbstractTextFilter) return new FilterControlString(parent, (AbstractTextFilter)filter);
-		if (filter instanceof DateFilter) return new FilterControlDate(parent, (DateFilter)filter);
-		if (filter instanceof NumberFilter) return new FilterControlNumber(parent, (NumberFilter)filter);
-		if (filter instanceof BoolFilter) return new FilterControlBoolean(parent, (BoolFilter)filter);
-		if (filter instanceof EnumFilter) return new FilterControlEnum(parent, (EnumFilter)filter);
+	public static FilterControl createFilterControl(FilterPanel parent,
+			IFilter filter) {
+		if (filter instanceof AbstractTextFilter)
+			return new FilterControlString(parent, (AbstractTextFilter) filter);
+		if (filter instanceof DateFilter)
+			return new FilterControlDate(parent, (DateFilter) filter);
+		if (filter instanceof NumberFilter)
+			return new FilterControlNumber(parent, (NumberFilter) filter);
+		if (filter instanceof BoolFilter)
+			return new FilterControlBoolean(parent, (BoolFilter) filter);
+		if (filter instanceof EnumFilter)
+			return new FilterControlEnum(parent, (EnumFilter) filter);
 
-		throw new IllegalArgumentException("Don't know how to create: " + filter);		
+		throw new IllegalArgumentException("Don't know how to create: "
+				+ filter);
 	}
 
 	/**
@@ -100,12 +215,13 @@
 		throw new IllegalArgumentException("Don't know how to create (yet): "
 				+ attribute);
 	}
-	
+
 	/**
 	 * This method retrieves a value from the Plugin.
 	 */
 	public static String getString(String key) {
-		// Note that ResourceBundle has nothing to do with Eclipse.  But it's a convenient
+		// Note that ResourceBundle has nothing to do with Eclipse. But it's a
+		// convenient
 		// means of accessing plugin.properties, which we need anyway.
 		return ResourceBundle.getBundle("plugin").getString(key);
 	}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java
index 18be3e8..654d579 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java
@@ -10,61 +10,45 @@
  ******************************************************************************/
 package org.eclipse.rmf.reqif10.search.filter.ui;
 
+import java.util.List;
+
 import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
 import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
 import org.eclipse.rmf.reqif10.search.filter.IFilter;
-import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
 import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Combo;
 
-import com.google.common.collect.ImmutableList;
-
 /**
- * Used for plain text and XHTML
+ * Used for Boolean
  * 
  * @author jastram
  */
 public class FilterControlBoolean extends FilterControl {
 	
 	private Combo valueControl;
-	private Combo attr;
-	private AttributeDefinitionBoolean attribute;
-	private BoolFilter templateFilter;
 
 	public FilterControlBoolean(FilterPanel parent,
 			AttributeDefinitionBoolean attribute) {
-		super(parent, SWT.FLAT);
-		this.attribute = attribute;
-		init();
+		super(parent, attribute);
 	}
 
 	public FilterControlBoolean(FilterPanel parent, BoolFilter template) {
-		super(parent, SWT.FLAT);
-		this.attribute = (AttributeDefinitionBoolean) template.getAttribute();
-		this.templateFilter = template;			
-		init();		
+		super(parent, template);
 	}
 
-	private void init() {
-		if (!(attribute instanceof AttributeDefinitionBoolean)) {
-			throw new IllegalArgumentException("Not allowed: " + attribute);
-		}
-		setLayout(new GridLayout(2, false));
-		createOperators();
-		createValueControl();
-	}
-
-	private void createValueControl() {
-		showValueControl(true);
-		if (templateFilter != null) {
-			boolean value = (Boolean)templateFilter.getFilterValue1();
-			valueControl.select(value ? 1 : 0);
-		}
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET || getOperator() == Operator.IS_NOT_SET) {
+			showValueControl(false);			
+		} else {
+			showValueControl(true);
+			if (initialize) {
+				Boolean defaultValue = (Boolean) templateFilter.getFilterValue1();
+				valueControl.select(Boolean.TRUE.equals(defaultValue) ? 1 : 0);
+			}
+		}		
+		layout();
 	}
 
 	private void showValueControl(boolean show) {
@@ -80,44 +64,15 @@
 			valueControl = null;
 		}
 	}
-	
-	private void createOperators() {
-		attr = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		attr.setLayoutData(layoutData);
-		for (Operator operator : BoolFilter.SUPPORTED_OPERATORS) {
-			attr.add(operator.toLocaleString());			
-		}
-		attr.addSelectionListener(new SelectionAdapter() {			
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateValueControls();
-				layout(true);
-			}
-		});
-
-		attr.select(0);
-		if (templateFilter != null)
-			attr.select(BoolFilter.SUPPORTED_OPERATORS.asList().indexOf(
-					templateFilter.getOperator()));
-	}
-	
-	protected void updateValueControls() {
-		ImmutableList<Operator> operatorList = NumberFilter.SUPPORTED_OPERATORS.asList();
-
-		if (operatorList.indexOf(Operator.IS_SET) == attr.getSelectionIndex()
-				|| NumberFilter.SUPPORTED_OPERATORS.asList().indexOf(
-						Operator.IS_NOT_SET) == attr.getSelectionIndex()) {
-			showValueControl(false);
-		} else {
-			showValueControl(true);
-		}
-		layout();
-	}
 
 	public IFilter getFilter() {
-		Operator operator = BoolFilter.SUPPORTED_OPERATORS.asList().get(attr.getSelectionIndex());
 		Boolean value = valueControl == null ? null : new Boolean(valueControl.getSelectionIndex() == 1);
-		return new BoolFilter(operator, value, attribute);
+		return new BoolFilter(getOperator(), value, (AttributeDefinitionBoolean) attribute);
 	}
+
+	@Override
+	protected List<Operator> getOperators() {
+		return BoolFilter.SUPPORTED_OPERATORS.asList();
+	}
+
 }
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java
index baaf7ea..7ff6b29 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java
@@ -12,6 +12,7 @@
 
 import java.util.Calendar;
 import java.util.GregorianCalendar;
+import java.util.List;
 
 import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
 import org.eclipse.rmf.reqif10.search.filter.DateFilter;
@@ -19,104 +20,88 @@
 import org.eclipse.rmf.reqif10.search.filter.IFilter;
 import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.DateTime;
 
 public class FilterControlDate extends FilterControl {
-	
-	private DateTime date1;
-	private DateTime date2;
-	private Combo attr;
-	private Object attribute;
-	private DateFilter templateFilter;
+
+	private DateTime control[];
 
 	public FilterControlDate(FilterPanel parent, DateFilter.InternalAttribute attribute) {
-		this(parent, (DateFilter)null);
-		this.attribute = attribute;
+		super(parent, attribute);
 	}
 
 	public FilterControlDate(FilterPanel parent,
 			AttributeDefinitionDate attribute) {
-		this(parent, (DateFilter)null);
-		this.attribute = attribute;
+		super(parent, attribute);
 	}
 
 	public FilterControlDate(FilterPanel parent, DateFilter template) {
-		super(parent, SWT.FLAT);
-		if (template != null) {
-			this.attribute = template.getAttribute();
-			this.templateFilter = template;			
-		}
-		setLayout(new GridLayout(3, false));
-		createOperators();
-		createValueControls();		
+		super(parent, template);		
 	}
 
-	private void createValueControls() {
-		date1 = new DateTime(this, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER);
-		GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		date1.setLayoutData(layoutData);
-		updateValueControls();
-		
-		if (templateFilter != null) {
-			GregorianCalendar cal1 = templateFilter.getFilterValue1();
-			date1.setDate(cal1.get(Calendar.YEAR), cal1.get(Calendar.MONTH), cal1.get(Calendar.DAY_OF_MONTH));
-			GregorianCalendar cal2 = templateFilter.getFilterValue2();
-			if (cal2 != null) {
-				date2.setDate(cal2.get(Calendar.YEAR), cal2.get(Calendar.MONTH), cal2.get(Calendar.DAY_OF_MONTH));				
-			}
-		}
+	@Override
+	protected List<Operator> getOperators() {
+		return DateFilter.SUPPORTED_OPERATORS.asList();
 	}
 
-	private void createOperators() {
-		attr = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		attr.setLayoutData(layoutData);
-		for (Operator operator : DateFilter.SUPPORTED_OPERATORS) {
-			attr.add(operator.toLocaleString());			
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(0, false);
+			showControl(1, false);
 		}
-		attr.select(0);
-		if (templateFilter != null)
-			attr.select(DateFilter.SUPPORTED_OPERATORS.asList().indexOf(
-					templateFilter.getOperator()));
-		
-		attr.addSelectionListener(new SelectionAdapter() {			
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateValueControls();
-				layout(true);
-			}
-		});
-	}
-	
-	protected void updateValueControls() {
-		if (DateFilter.SUPPORTED_OPERATORS.asList().indexOf(Operator.BETWEEN) == attr.getSelectionIndex()) {
-			if (date2 == null) {
-				date2 = new DateTime(this, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER);
-				GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-				date2.setLayoutData(layoutData);
-			} 
+		else if (getOperator() == Operator.BETWEEN) {
+			showControl(0, true);
+			showControl(1, true);
 		} else {
-			if (date2 != null) {
-				date2.dispose();
-				date2 = null;
+			showControl(0, true);
+			showControl(1, false);
+		}
+		
+		if (initialize) {
+			if (templateFilter.getFilterValue1() != null) {
+				GregorianCalendar cal = (GregorianCalendar) templateFilter.getFilterValue1();
+				control[0].setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
+			}
+			if (templateFilter.getFilterValue2() != null) {
+				GregorianCalendar cal = (GregorianCalendar) templateFilter.getFilterValue2();
+				control[1].setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
 			}
 		}
+
 		layout();
 	}
 
+	private void showControl(int controlId, boolean show) {
+		 if (control == null) control = new DateTime[2];
+		 
+		if (show && control[controlId] == null) {
+			control[controlId] = new DateTime(this, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			control[controlId].setLayoutData(layoutData);
+		} 
+		if (! show && control[controlId] != null) {
+			control[controlId].dispose();
+			control[controlId] = null;
+		}
+	}
+
+	@Override
 	public IFilter getFilter() {
-		Operator operator = DateFilter.SUPPORTED_OPERATORS.asList().get(attr.getSelectionIndex());
-		GregorianCalendar value1 = new GregorianCalendar(date1.getYear(), date1.getMonth(), date1.getDay());
-		GregorianCalendar value2 = date2 == null ? null : new GregorianCalendar(date2.getYear(), date2.getMonth(), date2.getDay());
+		GregorianCalendar value1 = control[0] == null ? null
+				: new GregorianCalendar(control[0].getYear(),
+						control[0].getMonth(), control[0].getDay());
+		GregorianCalendar value2 = control[1] == null ? null
+				: new GregorianCalendar(control[1].getYear(),
+						control[1].getMonth(), control[1].getDay());
 		if (attribute instanceof InternalAttribute) {
-			return new DateFilter(operator, value1, value2, (InternalAttribute)attribute);
+			return new DateFilter(getOperator(), value1, value2,
+					(InternalAttribute) attribute);
 		} else {
-			return new DateFilter(operator, value1, value2, (AttributeDefinitionDate)attribute);
+			return new DateFilter(getOperator(), value1, value2,
+					(AttributeDefinitionDate) attribute);
 		}
 	}
 }
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java
index bd12ebe..d136e55 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java
@@ -10,10 +10,12 @@
  ******************************************************************************/
 package org.eclipse.rmf.reqif10.search.filter.ui;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
 import org.eclipse.rmf.reqif10.EnumValue;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.EnumSelector;
@@ -24,9 +26,7 @@
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 
@@ -38,57 +38,65 @@
 public class FilterControlEnum extends FilterControl {
 	
 	private Button valueControl;
-	private Combo attr;
-	private AttributeDefinitionEnumeration attribute;
-	private EnumFilter templateFilter;
 	private Collection<EnumValue> items;
 
 	public FilterControlEnum(FilterPanel parent,
 			AttributeDefinitionEnumeration attribute) {
-		super(parent, SWT.FLAT);
-		this.attribute = attribute;
-		init();
+		super(parent, attribute);
 	}
 
 	public FilterControlEnum(FilterPanel parent, EnumFilter template) {
-		super(parent, SWT.FLAT);
-		this.attribute = (AttributeDefinitionEnumeration) template.getAttribute();
-		this.templateFilter = template;			
-		init();		
+		super(parent, template);
 	}
 
-	private void init() {
-		if (!(attribute instanceof AttributeDefinitionEnumeration)) {
-			throw new IllegalArgumentException("Not allowed: " + attribute);
-		}
-		setLayout(new GridLayout(2, false));
-		if (templateFilter != null) {
-			items = templateFilter.getFilterValue1();
+	@Override
+	protected List<Operator> getOperators() {
+		return EnumFilter.SUPPORTED_OPERATORS.asList();
+	}
+
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(false);
 		} else {
-			items = new HashSet<EnumValue>();
+			showControl(true);
 		}
-		createOperators();
-		createValueControl();
-		updateItems(items);
+		if (initialize) {
+			if (valueControl != null) {
+				updateItems(((EnumFilter)templateFilter).getFilterValue1());
+			}
+		}
 	}
 
-	private void createValueControl() {
-		valueControl = new Button(this, SWT.PUSH | SWT.FLAT | SWT.WRAP);
-		GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		layoutData.widthHint = 200;
-		valueControl.setLayoutData(layoutData);
-		valueControl.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				popupSelector(valueControl);
-			}
-		});
+	private void showControl(boolean show) {
+		if (show && valueControl == null) {
+			if (items == null) items = new ArrayList<EnumValue>();
+
+			valueControl = new Button(this, SWT.PUSH | SWT.FLAT | SWT.WRAP);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			layoutData.widthHint = 200;
+			valueControl.setLayoutData(layoutData);
+			valueControl.addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					popupSelector(valueControl);
+				}
+			});
+		}
+		if (!show && valueControl != null) {
+			valueControl.dispose();
+			valueControl = null;
+			items = null;
+		}
 	}
 
 	protected void popupSelector(Control control) {
+		EList<EnumValue> specifiedValues = ((AttributeDefinitionEnumeration) attribute)
+				.getType().getSpecifiedValues();
 		Shell shell = EnumSelector.createShell(control);
-		EnumSelector selector = new EnumSelector(attribute.getType()
-				.getSpecifiedValues(), items, shell, SWT.BORDER);
+		EnumSelector selector = new EnumSelector(specifiedValues, items, shell,
+				SWT.BORDER);
 		int status = selector.showEnumSelector(shell);
 		if (status == SWT.OK) {
 			updateItems(selector.getItems());
@@ -96,13 +104,15 @@
 	}
 
 	private void updateItems(Collection<EnumValue> items) {
+		EList<EnumValue> specifiedValues = ((AttributeDefinitionEnumeration) attribute)
+				.getType().getSpecifiedValues();
 		this.items = items;
 		StringBuilder sb = new StringBuilder();
 		for (Iterator<EnumValue> i = items.iterator(); i.hasNext();) {
 			EnumValue value = i.next();
 
 			// In case items have been removed
-			if (! attribute.getType().getSpecifiedValues().contains(value)) continue;
+			if (! specifiedValues.contains(value)) continue;
 
 			String label = value.getLongName() != null ? value.getLongName() : value.getIdentifier(); 
 			sb.append(label);
@@ -114,22 +124,9 @@
 		getParent().getParent().layout();
 	}
 
-	// TODO use correct operators.
-	private void createOperators() {
-		attr = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		attr.setLayoutData(layoutData);
-		for (Operator operator : EnumFilter.SUPPORTED_OPERATORS) {
-			attr.add(operator.toLocaleString());			
-		}
-		attr.select(0);
-		if (templateFilter != null)
-			attr.select(EnumFilter.SUPPORTED_OPERATORS.asList().indexOf(
-					templateFilter.getOperator()));
-	}
-	
 	public IFilter getFilter() {
-		Operator operator = EnumFilter.SUPPORTED_OPERATORS.asList().get(attr.getSelectionIndex());
-		return new EnumFilter(operator, items, attribute);
+		return new EnumFilter(getOperator(), items,
+				(AttributeDefinitionEnumeration) attribute);
 	}
+
 }
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java
index 7daac69..766f8e6 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java
@@ -11,6 +11,7 @@
 package org.eclipse.rmf.reqif10.search.filter.ui;
 
 import java.math.BigInteger;
+import java.util.List;
 
 import org.eclipse.rmf.reqif10.AttributeDefinition;
 import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
@@ -18,120 +19,82 @@
 import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
 import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.VerifyEvent;
 import org.eclipse.swt.events.VerifyListener;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Spinner;
 import org.eclipse.swt.widgets.Text;
 
-import com.google.common.collect.ImmutableList;
-
 /**
  * This control handles Integers and Reals.
 
  * @author jastram
  */
 public class FilterControlNumber extends FilterControl {
-	
-	private NumberControl num[] = new NumberControl[2];
-	private Combo attr;
-	private AttributeDefinition attribute;
-	private NumberFilter templateFilter;
-	
+
+	private NumberControl control[];
+
 	public FilterControlNumber(FilterPanel parent,
 			AttributeDefinition attribute) {
-		super(parent, SWT.FLAT);
-		this.attribute = attribute;
-		init();
+		super(parent, attribute);
 	}
 
 	public FilterControlNumber(FilterPanel parent, NumberFilter template) {
-		super(parent, SWT.FLAT);
-		this.attribute = template.getAttribute();
-		this.templateFilter = template;			
-		init();
-	}
-
-	private void init() {
-		setLayout(new GridLayout(3, false));
-		createOperators();
-		showNum(1, true);
-		updateValueControls();
-		
-		if (templateFilter != null) {
-			if (templateFilter.getFilterValue1() != null) {
-				num[0].setValue(templateFilter.getFilterValue1());
-			}
-			if (templateFilter.getFilterValue2() != null) {
-				num[1].setValue(templateFilter.getFilterValue2());
-			}
-		}
-	}
-
-	private void createOperators() {
-		attr = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		attr.setLayoutData(layoutData);
-		for (Operator operator : NumberFilter.SUPPORTED_OPERATORS) {
-			attr.add(operator.toLocaleString());			
-		}
-		attr.select(0);
-		if (templateFilter != null)
-			attr.select(NumberFilter.SUPPORTED_OPERATORS.asList().indexOf(
-					templateFilter.getOperator()));
-		
-		attr.addSelectionListener(new SelectionAdapter() {			
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateValueControls();
-				layout(true);
-			}
-		});
+		super(parent, template);
 	}
 	
-	protected void updateValueControls() {
-		ImmutableList<Operator> operatorList = NumberFilter.SUPPORTED_OPERATORS.asList();
+		
+	@Override
+	protected List<Operator> getOperators() {
+		return NumberFilter.SUPPORTED_OPERATORS.asList();	}
 
-		if (operatorList.indexOf(Operator.IS_SET) == attr.getSelectionIndex()
-				|| NumberFilter.SUPPORTED_OPERATORS.asList().indexOf(
-						Operator.IS_NOT_SET) == attr.getSelectionIndex()) {
-			showNum(0, false);
-			showNum(1, false);
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(0, false);
+			showControl(1, false);
 		}
-		else if (NumberFilter.SUPPORTED_OPERATORS.asList().indexOf(Operator.BETWEEN) == attr.getSelectionIndex()) {
-			showNum(0, true);
-			showNum(1, true);
+		else if (getOperator() == Operator.BETWEEN) {
+			showControl(0, true);
+			showControl(1, true);
 		} else {
-			showNum(0, true);
-			showNum(1, false);
+			showControl(0, true);
+			showControl(1, false);
 		}
+		
+		if (initialize) {
+			if (templateFilter.getFilterValue1() != null) {
+				control[0].setValue((Number) templateFilter.getFilterValue1());
+			}
+			if (templateFilter.getFilterValue2() != null) {
+				control[1].setValue((Number) templateFilter.getFilterValue1());
+			}
+		}
+
 		layout();
 	}
-
-	private void showNum(int controlId, boolean show) {
-		if (show && num[controlId] == null) {
-			num[controlId] = new NumberControl(this, attribute instanceof AttributeDefinitionReal);
+	
+	private void showControl(int controlId, boolean show) {
+		 if (control == null) control = new NumberControl[2];
+		 
+		if (show && control[controlId] == null) {
+			control[controlId] = new NumberControl(this, attribute instanceof AttributeDefinitionReal);
 			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-			num[controlId].getControl().setLayoutData(layoutData);
+			control[controlId].getControl().setLayoutData(layoutData);
 		} 
-		if (! show && num[controlId] != null) {
-			num[controlId].getControl().dispose();
-			num[controlId] = null;
+		if (! show && control[controlId] != null) {
+			control[controlId].getControl().dispose();
+			control[controlId] = null;
 		}
 	}
 
+	@Override
 	public IFilter getFilter() {
-		Operator operator = NumberFilter.SUPPORTED_OPERATORS.asList().get(attr.getSelectionIndex());
-		Number value1 = num[0] == null ? null : num[0].getNumber();
-		Number value2 = num[1] == null ? null : num[1].getNumber();
-
-		return new NumberFilter(operator, value1,
-				value2, attribute);
+		Number value1 = control[0] == null ? null : control[0].getNumber();
+		Number value2 = control[1] == null ? null : control[1].getNumber();
+		return new NumberFilter(getOperator(), value1, value2, (AttributeDefinition)attribute);
 	}
 }
 
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java
index a9e1ef4..3a95d0a 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java
@@ -10,6 +10,8 @@
  ******************************************************************************/
 package org.eclipse.rmf.reqif10.search.filter.ui;
 
+import java.util.List;
+
 import org.eclipse.rmf.reqif10.AttributeDefinition;
 import org.eclipse.rmf.reqif10.AttributeDefinitionString;
 import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
@@ -21,101 +23,92 @@
 import org.eclipse.rmf.reqif10.search.filter.XhtmlFilter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Text;
 
-import com.google.common.collect.ImmutableSet;
-
 /**
  * Used for plain text and XHTML
  * 
  * @author jastram
  */
 public class FilterControlString extends FilterControl {
-	
+
 	private Text text;
-	private Combo attr;
 	private Button caseSensitive;
-	private Object attribute;
-	private AbstractTextFilter templateFilter;
-	private ImmutableSet<Operator> operators;
 
 	public FilterControlString(FilterPanel parent, StringFilter.InternalAttribute attribute) {
-		super(parent, SWT.FLAT);
-		this.attribute = attribute;
-		init();
+		super(parent, attribute);
 	}
 
 	public FilterControlString(FilterPanel parent,
 			AttributeDefinition attribute) {
-		super(parent, SWT.FLAT);
-		this.attribute = attribute;
-		init();
+		super(parent, attribute);
 	}
 
 	public FilterControlString(FilterPanel parent, AbstractTextFilter template) {
-		super(parent, SWT.FLAT);
-		this.attribute = template.getAttribute();
-		this.templateFilter = template;			
-		init();		
+		super(parent, template);
 	}
 
-	private void init() {
-		if (!(attribute instanceof AttributeDefinitionXHTML
-				|| attribute instanceof AttributeDefinitionString || attribute instanceof InternalAttribute)) {
-			throw new IllegalArgumentException("Not allowed: " + attribute);
+	@Override
+	protected List<Operator> getOperators() {
+		if (attribute instanceof AttributeDefinitionXHTML) {
+			return XhtmlFilter.SUPPORTED_OPERATORS.asList();
+		} else {
+			return StringFilter.SUPPORTED_OPERATORS.asList();
 		}
-		setLayout(new GridLayout(3, false));
-		createOperators();
-		createCaseSensitive();
-		createText();
 	}
 
-	private void createText() {
-		text = new Text(this, SWT.SINGLE | SWT.BORDER | SWT.FILL);
-		GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		text.setLayoutData(layoutData);
-		if (templateFilter != null) text.setText(templateFilter.getFilterValue1());
-	}
-
-	private void createCaseSensitive() {
-		caseSensitive = new Button(this, SWT.CHECK);
-		caseSensitive.setText("Aa");
-		caseSensitive.setToolTipText("Case Sensitive");
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		caseSensitive.setLayoutData(layoutData);
-		if (templateFilter != null) caseSensitive.setSelection(templateFilter.isCaseSensitive());
-	}
-
-	private void createOperators() {
-		operators = attribute instanceof AttributeDefinitionXHTML ? XhtmlFilter.SUPPORTED_OPERATORS
-				: StringFilter.SUPPORTED_OPERATORS;
-		
-		attr = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-		attr.setLayoutData(layoutData);
-		for (Operator operator : operators) {
-			attr.add(operator.toLocaleString());			
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(false);
+		} else {
+			showControl(true);
 		}
-		attr.select(0);
-		if (templateFilter != null)
-			attr.select(operators.asList().indexOf(
-					templateFilter.getOperator()));
-	}
+		if (initialize) {
+			if (text != null) {
+				caseSensitive.setSelection(((StringFilter) templateFilter)
+						.isCaseSensitive());
+				text.setText((String) templateFilter.getFilterValue1());
 	
+			}
+		}
+	}
+
+	private void showControl(boolean show) {
+		if (show && text == null) {
+			caseSensitive = new Button(this, SWT.CHECK);
+			caseSensitive.setText("Aa");
+			caseSensitive.setToolTipText("Case Sensitive");
+			GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+			caseSensitive.setLayoutData(layoutData);
+			
+			text = new Text(this, SWT.SINGLE | SWT.BORDER | SWT.FILL);
+			layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			text.setLayoutData(layoutData);
+		}
+		if (!show && text != null) {
+			text.dispose();
+			text = null;
+			caseSensitive.dispose();
+			caseSensitive = null;
+		}
+	}
+
 	public IFilter getFilter() {
-		Operator operator = operators.asList().get(attr.getSelectionIndex());
-		String value = text.getText();
+		String value = text == null ? null : text.getText();
+		boolean cv = caseSensitive == null ? false : caseSensitive.getSelection();
+		
 		if (attribute instanceof InternalAttribute) {
-			return new StringFilter(operator, value, (InternalAttribute) attribute, caseSensitive.getSelection());
+			return new StringFilter(getOperator(), value, (InternalAttribute) attribute, cv);
 		} else if (attribute instanceof AttributeDefinitionString) {
-			return new StringFilter(operator, value, (AttributeDefinitionString) attribute, caseSensitive.getSelection());
+			return new StringFilter(getOperator(), value, (AttributeDefinitionString) attribute, cv);
 		} else if (attribute instanceof AttributeDefinitionXHTML) {
-			return new XhtmlFilter(operator, value, (AttributeDefinitionXHTML) attribute, caseSensitive.getSelection());
+			return new XhtmlFilter(getOperator(), value, (AttributeDefinitionXHTML) attribute, cv);
 		} else {
 			throw new IllegalStateException("Can't handle: " + attribute);
 		}
 	}
+
 }