package org.nightlabs.jfire.scripting.ui.condition;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.nightlabs.base.ui.composite.AbstractListComposite;
import org.nightlabs.base.ui.composite.XComboComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.jfire.scripting.condition.CompareOperator;
import org.nightlabs.jfire.scripting.condition.ILabelProvider;
import org.nightlabs.jfire.scripting.condition.ISimpleCondition;
import org.nightlabs.jfire.scripting.condition.ScriptConditioner;
import org.nightlabs.jfire.scripting.condition.SimpleCondition;
import org.nightlabs.jfire.scripting.id.ScriptRegistryItemID;
import org.nightlabs.jfire.scripting.ui.resource.Messages;
/**
* @author Daniel.Mazurek [at] NightLabs [dot] de
*
*/
public class SimpleConditionComposite
extends XComposite
{
public SimpleConditionComposite(Collection<ScriptConditioner> scriptConditioners, Composite parent, int style)
{
super(parent, style);
this.scriptConditioners = scriptConditioners;
createComposite(this);
}
public SimpleConditionComposite(Collection<ScriptConditioner> scriptConditioners,
Composite parent, int style, LayoutMode layoutMode, LayoutDataMode layoutDataMode)
{
super(parent, style, layoutMode, layoutDataMode);
this.scriptConditioners = scriptConditioners;
createComposite(this);
}
private Collection<ScriptConditioner> scriptConditioners;
private Map<ScriptRegistryItemID, List<Object>> variable2PossibleValues;
private Map<ScriptRegistryItemID, List<CompareOperator>> variable2CompareOperators;
private Map<ScriptRegistryItemID, String> variable2Name;
private Map<Object, String> value2Name;
private XComboComposite<ScriptRegistryItemID> variableCombo;
private XComboComposite<CompareOperator> operatorCombo;
private XComboComposite<Object> valueCombo;
protected void createComposite(Composite parent)
{
GridLayout layout = new GridLayout(3, true);
XComposite.configureLayout(LayoutMode.TOP_BOTTOM_WRAPPER, layout);
parent.setLayout(layout);
int size = scriptConditioners.size();
List<ScriptRegistryItemID> variableNames = new ArrayList<ScriptRegistryItemID>(size);
variable2PossibleValues = new HashMap<ScriptRegistryItemID, List<Object>>(size);
variable2CompareOperators = new HashMap<ScriptRegistryItemID, List<CompareOperator>>(size);
variable2Name = new HashMap<ScriptRegistryItemID, String>(size);
value2Name = new HashMap<Object, String>();
for (ScriptConditioner scriptConditioner : scriptConditioners) {
variableNames.add(scriptConditioner.getScriptRegistryItemID());
variable2PossibleValues.put(scriptConditioner.getScriptRegistryItemID(),
new ArrayList<Object>(scriptConditioner.getPossibleValues()));
variable2CompareOperators.put(scriptConditioner.getScriptRegistryItemID(),
scriptConditioner.getCompareOperators());
variable2Name.put(scriptConditioner.getScriptRegistryItemID(),
scriptConditioner.getScript().getName().getText());
ILabelProvider labelProvider = scriptConditioner.getValueLabelProvider();
for (Object value : scriptConditioner.getPossibleValues()) {
value2Name.put(value, labelProvider.getText(value));
}
}
int defaultWidgetStyle = AbstractListComposite.getDefaultWidgetStyle(this);
variableCombo = new XComboComposite<ScriptRegistryItemID>( parent, defaultWidgetStyle,
(String) null, scriptLabelProvider );
variableCombo.setInput( variableNames );
variableCombo.setLayoutData(new GridData(GridData.FILL_BOTH));
variableCombo.addSelectionListener(variableListener);
variableCombo.selectElementByIndex(0);
selectedVariable = variableCombo.getSelectedElement();
operatorCombo = new XComboComposite<CompareOperator>( parent, defaultWidgetStyle,
(String) null , compareOperatorLableProvider );
operatorCombo.setInput( variable2CompareOperators.get(selectedVariable) );
operatorCombo.setLayoutData(new GridData(GridData.FILL_BOTH));
operatorCombo.addSelectionListener(operatorListener);
valueCombo = new XComboComposite<Object>( parent, defaultWidgetStyle,
(String) null, valueLabelProvider );
valueCombo.setInput( variable2PossibleValues.get(selectedVariable) );
valueCombo.setLayoutData(new GridData(GridData.FILL_BOTH));
valueCombo.addSelectionListener(valueListener);
refresh();
variableCombo.selectElementByIndex(0);
}
private org.eclipse.jface.viewers.ILabelProvider scriptLabelProvider = new LabelProvider(){
@Override
public String getText(Object object) {
return variable2Name.get(object);
}
};
private org.eclipse.jface.viewers.ILabelProvider valueLabelProvider = new LabelProvider(){
@Override
public String getText(Object object) {
return value2Name.get(object);
}
};
private org.eclipse.jface.viewers.ILabelProvider compareOperatorLableProvider = new LabelProvider() {
@Override
public String getText(Object object) {
if (object instanceof CompareOperator) {
CompareOperator compareOperator = (CompareOperator) object;
switch (compareOperator) {
case EQUAL:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.equal"); //$NON-NLS-1$
case NOT_EQUAL:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.notEqual"); //$NON-NLS-1$
case GREATER_THEN:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.greaterThen"); //$NON-NLS-1$
case SMALLER_THEN:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.smallerThen"); //$NON-NLS-1$
case GREATER_OR_EQUAL_THEN:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.greaterOrEqualThen"); //$NON-NLS-1$
case SMALLER_OR_EQUAL_THEN:
return Messages.getString("org.nightlabs.jfire.scripting.ui.condition.SimpleConditionComposite.compareOperator.smallerOrEqualThen"); //$NON-NLS-1$
}
}
return super.getText(object);
}
};
private SelectionListener operatorListener = new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
condition = null;
selectedCompareOperator = operatorCombo.getSelectedElement();
fireConditionChanged();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
private SelectionListener valueListener = new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
condition = null;
selectedValue = valueCombo.getSelectedElement();
fireConditionChanged();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
private SelectionListener variableListener = new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
refresh();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
protected void refresh()
{
condition = null;
selectedVariable = variableCombo.getSelectedElement();
operatorCombo.setInput(variable2CompareOperators.get(selectedVariable));
valueCombo.setInput(variable2PossibleValues.get(selectedVariable));
operatorCombo.selectElementByIndex(0);
if (valueCombo.getElements().size() > 0)
valueCombo.selectElementByIndex(0);
selectedVariable = variableCombo.getSelectedElement();
selectedCompareOperator = operatorCombo.getSelectedElement();
if (valueCombo.getElements().size() > 0)
selectedValue = valueCombo.getSelectedElement();
else
selectedValue = ""; //$NON-NLS-1$
fireConditionChanged();
layout(true, true);
}
private void selectVariable(ScriptRegistryItemID scriptID) {
variableCombo.selectElement(scriptID);
refresh();
}
private void selectCompareOperator(CompareOperator compareOperator) {
operatorCombo.selectElement(compareOperator);
selectedCompareOperator = compareOperator;
}
private void selectValue(Object value) {
valueCombo.selectElement(value);
selectedValue = value;
}
private ScriptRegistryItemID selectedVariable;
private CompareOperator selectedCompareOperator;
private Object selectedValue;
private ISimpleCondition condition;
public ISimpleCondition getCondition()
{
if (condition == null) {
condition = new SimpleCondition(selectedVariable,
selectedCompareOperator, selectedValue);
}
return condition;
}
public void setSimpleCondition(ISimpleCondition simpleCondition)
{
selectVariable(simpleCondition.getScriptRegistryItemID());
selectCompareOperator(simpleCondition.getCompareOperator());
selectValue(simpleCondition.getValue());
}
private ListenerList listeners = new ListenerList();
public void addConditionChangedListener(ConditionChangeListener listener) {
listeners.add(listener);
}
public void removeConditionChangedListener(ConditionChangeListener listener) {
listeners.remove(listener);
}
private void fireConditionChanged()
{
for (int i=0; i<listeners.getListeners().length; i++) {
ConditionChangeListener listener = (ConditionChangeListener) listeners.getListeners()[i];
listener.conditonChanged(new ConditionChangedEvent(getCondition(), this));
}
}
}