package org.nightlabs.jfire.dynamictrade.admin.ui.priceconfig;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.swt.widgets.Composite;
import org.nightlabs.base.ui.notification.IDirtyStateManager;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.accounting.gridpriceconfig.AssignInnerPriceConfigCommand;
import org.nightlabs.jfire.accounting.gridpriceconfig.GridPriceConfig;
import org.nightlabs.jfire.accounting.gridpriceconfig.PriceCalculator;
import org.nightlabs.jfire.accounting.priceconfig.IInnerPriceConfig;
import org.nightlabs.jfire.accounting.priceconfig.id.PriceConfigID;
import org.nightlabs.jfire.base.JFireEjb3Factory;
import org.nightlabs.jfire.base.login.ui.Login;
import org.nightlabs.jfire.dynamictrade.DynamicTradeManagerRemote;
import org.nightlabs.jfire.dynamictrade.accounting.priceconfig.DynamicTradePriceConfig;
import org.nightlabs.jfire.dynamictrade.dao.DynamicTradePriceConfigDAO;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.store.id.ProductTypeID;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.CellReferenceProductTypeSelector;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionValueSelector;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.ProductTypeSelector;
import org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.wizard.AbstractChooseGridPriceConfigWizard;
import org.nightlabs.progress.NullProgressMonitor;
import org.nightlabs.util.CollectionUtil;
import org.nightlabs.util.Util;
public class PriceConfigComposite
extends org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.PriceConfigComposite
{
public PriceConfigComposite(Composite parent) {
super(parent);
}
public PriceConfigComposite(Composite parent, IDirtyStateManager dirtyStateManager) {
super(parent, dirtyStateManager);
}
@Override
protected <P extends GridPriceConfig> Collection<P> storePriceConfigs(Collection<P> priceConfigs, AssignInnerPriceConfigCommand assignInnerPriceConfigCommand)
{
try {
Collection<DynamicTradePriceConfig> dynamicTradePriceConfigs = new ArrayList<DynamicTradePriceConfig>();
if (!priceConfigs.isEmpty()){
ClassLoader classLoader = null;
Iterator<P> iterator = priceConfigs.iterator();
while (iterator.hasNext()) {
P priceConfig = (P) iterator.next();
if (priceConfig != null){
classLoader = priceConfig.getClass().getClassLoader();
break;
}
}
Collection<P> clonedPCs = Util.cloneSerializableAll(priceConfigs, classLoader);
// We clear the packaging result price configs for optimisation reasons (prevent transferring to the server).
// They are cleared in any case during pre-attach and pre-store of DynamicTradePriceConfig.
for (P priceConfig : clonedPCs) {
DynamicTradePriceConfig dtpc = (DynamicTradePriceConfig) priceConfig;
dtpc.clearPackagingResultPriceConfigs();
dynamicTradePriceConfigs.add(dtpc);
}
}
DynamicTradeManagerRemote dtm = JFireEjb3Factory.getRemoteBean(DynamicTradeManagerRemote.class, Login.getLogin().getInitialContextProperties());
dynamicTradePriceConfigs = dtm.storeDynamicTradePriceConfigs(dynamicTradePriceConfigs, true, assignInnerPriceConfigCommand);
return CollectionUtil.castCollection(dynamicTradePriceConfigs);
} catch (Exception x) {
throw new RuntimeException(x);
}
}
// @Override
// protected Composite createLeftCarrierComposite(Composite parent)
// {
// SashForm sf = new SashForm(parent, SWT.VERTICAL);
// sf.setWeights(new int[] {1, 4});
// return sf;
// }
@Override
protected ProductTypeSelector createProductTypeSelector(Composite parent)
{
return new ProductTypeSelectorHiddenImpl();
}
@Override
protected DimensionValueSelector createDimensionValueSelector(Composite parent)
{
//return new DimensionValueSelectorImpl(parent);
return new DimensionValueSelectorImpl(parent, this);
// return super.createDimensionValueSelector(parent);
}
@Override
protected IInnerPriceConfig retrieveInnerPriceConfigForEditing(PriceConfigID priceConfigID)
{
return DynamicTradePriceConfigDAO.sharedInstance().getDynamicTradePriceConfig(
priceConfigID,
FETCH_GROUPS_INNER_PRICE_CONFIG_FOR_EDITING,
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new NullProgressMonitor());
}
@Override
protected PriceCalculator createPriceCalculator(
ProductType packageProductType) {
return new org.nightlabs.jfire.dynamictrade.accounting.priceconfig.PriceCalculator(packageProductType, createCustomerGroupMapper(), createTariffMapper());
}
@Override
public AbstractChooseGridPriceConfigWizard createChoosePriceConfigWizard(ProductTypeID parentProductTypeID)
{
return new ChooseDynamicTradePriceConfigWizard(parentProductTypeID);
}
@Override
public void _setPackageProductType(ProductType packageProductType)
{
packageProductType.setPackagePriceConfig(null); // this will not be stored to the server - during price-calculation, we need an IResultPriceConfig (which is done by the PriceCalculator, if this field is null)
super._setPackageProductType(packageProductType);
}
@Override
public boolean submit()
{
return super.submit();
}
@Override
public CellReferenceProductTypeSelector createCellReferenceProductTypeSelector() {
return null; // we do not have nested dynamic product types => no need for this dimension
}
}