| /******************************************************************************* |
| * Copyright (c) 2014 Formal Mind GmbH. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Michael Jastram - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.rmf.reqif10.search.filter.ui; |
| |
| import java.util.List; |
| import java.util.ResourceBundle; |
| |
| import org.eclipse.rmf.reqif10.AttributeDefinition; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionDate; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionInteger; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionReal; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionString; |
| import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML; |
| 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. The infrastructure manages the operator. |
| * |
| * Also provides factory methods for building {@link FilterControl} instances. |
| * |
| * @author jastram |
| */ |
| public abstract class FilterControl extends Composite { |
| |
| 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); |
| |
| throw new IllegalArgumentException("Don't know how to create: " |
| + filter); |
| } |
| |
| /** |
| * This factory instantiates the correct FilterControl for a given filter. |
| */ |
| public static FilterControl createFilterControl(FilterPanel parent, |
| AbstractTextFilter.InternalAttribute internalTextAttribute) { |
| return new FilterControlString(parent, internalTextAttribute); |
| } |
| |
| /** |
| * This factory instantiates the correct FilterControl for a given filter. |
| */ |
| public static FilterControl createFilterControl(FilterPanel parent, |
| DateFilter.InternalAttribute internalDateAttribute) { |
| return new FilterControlDate(parent, internalDateAttribute); |
| } |
| |
| /** |
| * This factory instantiates the correct FilterControl for a given filter. |
| */ |
| public static FilterControl createFilterControl(FilterPanel parent, |
| AttributeDefinition attribute) { |
| if (attribute instanceof AttributeDefinitionString |
| || attribute instanceof AttributeDefinitionXHTML) { |
| return new FilterControlString(parent, attribute); |
| } else if (attribute instanceof AttributeDefinitionInteger |
| || attribute instanceof AttributeDefinitionReal) { |
| return new FilterControlNumber(parent, attribute); |
| } else if (attribute instanceof AttributeDefinitionDate) { |
| return new FilterControlDate(parent, |
| (AttributeDefinitionDate) attribute); |
| } else if (attribute instanceof AttributeDefinitionBoolean) { |
| return new FilterControlBoolean(parent, |
| (AttributeDefinitionBoolean) attribute); |
| } else if (attribute instanceof AttributeDefinitionEnumeration) { |
| return new FilterControlEnum(parent, |
| (AttributeDefinitionEnumeration) attribute); |
| } |
| 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 |
| // means of accessing plugin.properties, which we need anyway. |
| return ResourceBundle.getBundle("plugin").getString(key); |
| } |
| |
| } |