package org.nightlabs.jfire.dynamictrade.admin.ui.priceconfig;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.nightlabs.jfire.accounting.gridpriceconfig.TransientStablePriceConfig;
import org.nightlabs.jfire.dynamictrade.accounting.priceconfig.DynamicTradePriceConfig;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.Dimension;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionValue;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionValueSelectorComboImpl;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionValue.PriceFragmentTypeDimensionValue;
public class DimensionValueSelectorImpl
extends DimensionValueSelectorComboImpl
{
private PriceConfigComposite pcComp = null;
public DimensionValueSelectorImpl(Composite parent)
{
super(parent, SWT.NONE);
getGridData().grabExcessVerticalSpace = true;
}
public DimensionValueSelectorImpl(Composite parent, PriceConfigComposite pcComp)
{
this(parent);
this.pcComp = pcComp;
}
private PriceFragmentTypeTable priceFragmentTypeTable;
@Override
protected void createDimensionUIElements(Label[] dimensionLabels, Combo[] dimensionCombos, int dimensionIdx, Dimension<?> dimension)
{
if (dimension instanceof Dimension.PriceFragmentTypeDimension) {
priceFragmentTypeTable = new PriceFragmentTypeTable(this);
priceFragmentTypeTable.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event)
{
fireSelectionChangedEvent();
}
});
createDimensionUIElements_createAddButton(dimensionLabels, dimensionCombos, dimensionIdx, dimension);
}
else
super.createDimensionUIElements(dimensionLabels, dimensionCombos, dimensionIdx, dimension);
}
List<InputPriceFragmentType> inputPriceFragmentTypes;
@Override
protected void fillDimensionCombo(Dimension<?> dimension, Combo dimensionCombo)
{
if (dimension instanceof Dimension.PriceFragmentTypeDimension) {
TransientStablePriceConfig tspc = (TransientStablePriceConfig) getGridPriceConfig();
DynamicTradePriceConfig dynamicTradePriceConfig = null;
if (tspc != null)
dynamicTradePriceConfig = (DynamicTradePriceConfig) tspc.getBasePriceConfig();
List<PriceFragmentTypeDimensionValue> priceFragmentTypes = ((Dimension.PriceFragmentTypeDimension)dimension).getValues();
inputPriceFragmentTypes = new ArrayList<InputPriceFragmentType>(priceFragmentTypes.size());
if (dynamicTradePriceConfig != null) {
for (Iterator<PriceFragmentTypeDimensionValue> it = priceFragmentTypes.iterator(); it.hasNext();) {
PriceFragmentTypeDimensionValue priceFragmentTypeDimensionValue = it.next();
// PriceFragmentType priceFragmentType = (PriceFragmentType) it.next();
InputPriceFragmentType inputPriceFragmentType = new InputPriceFragmentType(priceFragmentTypeDimensionValue);
inputPriceFragmentType.setInput(dynamicTradePriceConfig.getInputPriceFragmentTypes().contains(priceFragmentTypeDimensionValue.getObject()));
inputPriceFragmentTypes.add(inputPriceFragmentType);
}
}
priceFragmentTypeTable.setInput(dynamicTradePriceConfig, inputPriceFragmentTypes);
}
else {
super.fillDimensionCombo(dimension, dimensionCombo);
}
}
private int priceFragmentTypeDimensionIndex = -1;
protected int getPriceFragmentTypeDimensionIndex()
{
if (priceFragmentTypeDimensionIndex < 0) {
int index = 0;
for (Dimension<?> dimension : getDimensions()) {
if (dimension instanceof Dimension.PriceFragmentTypeDimension) {
priceFragmentTypeDimensionIndex = index;
break;
}
++index;
}
}
if (priceFragmentTypeDimensionIndex < 0)
throw new IllegalStateException("No PriceFragmentType Dimension!!!"); //$NON-NLS-1$
return priceFragmentTypeDimensionIndex;
}
@Override
public DimensionValue getSelectedDimensionValue(int dimensionIdx, boolean throwExceptionIfNothingSelected)
{
if (dimensionIdx != getPriceFragmentTypeDimensionIndex())
return super.getSelectedDimensionValue(dimensionIdx, throwExceptionIfNothingSelected);
Collection<InputPriceFragmentType> c = priceFragmentTypeTable.getSelectedElements();
if (c.isEmpty()) {
if (inputPriceFragmentTypes == null)
return null;
else
return inputPriceFragmentTypes.isEmpty() ? null : inputPriceFragmentTypes.get(0).getPriceFragmentTypeDimensionValue();
}
return (c.iterator().next()).getPriceFragmentTypeDimensionValue();
}
@Override
public void setDimensionEnabled(int dimensionIdx, boolean enabled)
{
if (dimensionIdx != getPriceFragmentTypeDimensionIndex())
super.setDimensionEnabled(dimensionIdx, enabled);
}
public PriceConfigComposite getPriceConfigComposite()
{
return this.pcComp;
}
}