package org.nightlabs.jfire.voucher.admin.ui.createvouchertype;
import java.util.List;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.nightlabs.base.ui.composite.AbstractListComposite;
import org.nightlabs.base.ui.composite.ListComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.wizard.WizardHop;
import org.nightlabs.base.ui.wizard.WizardHopPage;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.accounting.priceconfig.IPackagePriceConfig;
import org.nightlabs.jfire.accounting.priceconfig.PriceConfig;
import org.nightlabs.jfire.accounting.priceconfig.id.PriceConfigID;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.store.id.ProductTypeID;
import org.nightlabs.jfire.voucher.accounting.VoucherPriceConfig;
import org.nightlabs.jfire.voucher.admin.ui.VoucherAdminPlugin;
import org.nightlabs.jfire.voucher.admin.ui.resource.Messages;
import org.nightlabs.jfire.voucher.dao.VoucherPriceConfigDAO;
import org.nightlabs.jfire.voucher.dao.VoucherTypeDAO;
import org.nightlabs.jfire.voucher.store.VoucherType;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.util.NLLocale;
public class SelectVoucherPriceConfigPage
extends WizardHopPage
{
private final ProductTypeID parentVoucherTypeID;
public static enum Mode {
INHERIT,
CREATE,
SELECT,
NONE
}
private Mode mode;
private Button inheritPriceConfig;
private Button createPriceConfig;
private Button selectPriceConfig;
private Button assignNoneConfig;
private ListComposite<VoucherPriceConfig> priceConfigList;
private CreateVoucherPriceConfigPage createVoucherPriceConfigPage = null;
public SelectVoucherPriceConfigPage(final ProductTypeID parentVoucherTypeID)
{
super(SelectVoucherPriceConfigPage.class.getName(), Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.title"), //$NON-NLS-1$
SharedImages.getWizardPageImageDescriptor(VoucherAdminPlugin.getDefault(), SelectVoucherPriceConfigPage.class));
this.setDescription(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.description")); //$NON-NLS-1$
this.parentVoucherTypeID = parentVoucherTypeID;
new WizardHop(this);
}
private VoucherPriceConfig selectedPriceConfig = null;
private void addCreateVoucherPriceConfigPage()
{
if (createVoucherPriceConfigPage == null) {
createVoucherPriceConfigPage = new CreateVoucherPriceConfigPage();
}
if (!getWizardHop().getHopPages().contains(createVoucherPriceConfigPage)) {
getWizardHop().addHopPage(createVoucherPriceConfigPage);
}
}
private void removeCreateVoucherPriceConfigPage()
{
if (createVoucherPriceConfigPage == null) {
return;
}
getWizardHop().removeHopPage(createVoucherPriceConfigPage);
}
private void updateUI()
{
if (inheritPriceConfig.getSelection()) {
mode = Mode.INHERIT;
} else if (createPriceConfig.getSelection()) {
mode = Mode.CREATE;
} else if (selectPriceConfig.getSelection()) {
mode = Mode.SELECT;
} else if (assignNoneConfig.getSelection()) {
mode = Mode.NONE;
} else {
throw new IllegalStateException("What's that?!"); //$NON-NLS-1$
}
if (mode == Mode.NONE) {
priceConfigList.setEnabled(false);
} else {
priceConfigList.setEnabled(true);
}
if (mode == Mode.CREATE) {
addCreateVoucherPriceConfigPage();
} else {
removeCreateVoucherPriceConfigPage();
}
getContainer().updateButtons();
}
private void setInheritedPriceConfigName(final String name)
{
inheritPriceConfig.setText(String.format(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.inheritPriceConfigRadio.text"), name)); //$NON-NLS-1$
}
@Override
public Control createPageContents(final Composite parent)
{
final XComposite page = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER);
inheritPriceConfig = new Button(page, SWT.RADIO);
inheritPriceConfig.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
inheritPriceConfig.setSelection(true);
mode = Mode.INHERIT;
inheritPriceConfig.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e)
{
updateUI();
}
});
setInheritedPriceConfigName(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.inheritedPriceConfigName_loadingData")); //$NON-NLS-1$
createPriceConfig = new Button(page, SWT.RADIO);
createPriceConfig.setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.createPriceConfigRadio.text")); //$NON-NLS-1$
createPriceConfig.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createPriceConfig.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e)
{
updateUI();
}
});
selectPriceConfig = new Button(page, SWT.RADIO);
selectPriceConfig.setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.selectPriceConfigRadio.text")); //$NON-NLS-1$
selectPriceConfig.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
selectPriceConfig.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e)
{
updateUI();
}
}
);
assignNoneConfig = new Button(page, SWT.RADIO);
assignNoneConfig.setText("Assign None"); //$NON-NLS-1$
assignNoneConfig.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
assignNoneConfig.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e)
{
updateUI();
}
}
);
priceConfigList = new ListComposite<VoucherPriceConfig>(page,
AbstractListComposite.getDefaultWidgetStyle(page),(String) null,
new LabelProvider() {
@Override
public String getText(final Object element)
{
final VoucherPriceConfig vpc = (VoucherPriceConfig) element;
return vpc.getName().getText();
}
});
final VoucherPriceConfig dummy = new VoucherPriceConfig(PriceConfigID.create("dummy.org", "dummy")); //$NON-NLS-1$ //$NON-NLS-2$
dummy.getName().setText(NLLocale.getDefault().getLanguage(), Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.priceConfigList.item_loadingData")); //$NON-NLS-1$
priceConfigList.addElement(dummy);
priceConfigList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent event)
{
inheritPriceConfig.setSelection(false);
createPriceConfig.setSelection(false);
assignNoneConfig.setSelection(false);
selectPriceConfig.setSelection(true); // because of a bug in swt, we must clear the selection above - it doesn't clear itself here
selectedPriceConfig = priceConfigList.getSelectedElement();
updateUI();
}
});
page.setEnabled(false);
final Job job = new Job(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.loadJob.name")) { //$NON-NLS-1$
@Override
protected IStatus run(final ProgressMonitor monitor) throws Exception
{
final VoucherType parentVoucherType = parentVoucherTypeID == null ? null : VoucherTypeDAO.sharedInstance().getVoucherType(
parentVoucherTypeID,
new String[] { FetchPlan.DEFAULT, ProductType.FETCH_GROUP_PACKAGE_PRICE_CONFIG, PriceConfig.FETCH_GROUP_NAME},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
final List<VoucherPriceConfig> voucherPriceConfigs = VoucherPriceConfigDAO.sharedInstance().getVoucherPriceConfigs(
new String[] { FetchPlan.DEFAULT, PriceConfig.FETCH_GROUP_NAME }, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
inheritedPriceConfig = parentVoucherType == null ? null : parentVoucherType.getPackagePriceConfig();
if (inheritedPriceConfig == null) {
setInheritedPriceConfigName(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.createvouchertype.SelectVoucherPriceConfigPage.inheritedPriceConfigName_noneAssigned")); //$NON-NLS-1$
} else {
setInheritedPriceConfigName(inheritedPriceConfig.getName().getText());
}
priceConfigList.removeAll();
priceConfigList.addElements(voucherPriceConfigs);
page.setEnabled(true);
updateUI();
}
});
return Status.OK_STATUS;
}
};
job.setPriority(org.eclipse.core.runtime.jobs.Job.SHORT);
job.schedule();
return page;
}
private IPackagePriceConfig inheritedPriceConfig;
public IPackagePriceConfig getInheritedPriceConfig()
{
return inheritedPriceConfig;
}
public VoucherPriceConfig createPriceConfig()
{
if (mode != Mode.CREATE) {
throw new IllegalStateException("mode != Mode.CREATE"); //$NON-NLS-1$
}
return createVoucherPriceConfigPage.createPriceConfig();
}
public Mode getMode()
{
return mode;
}
public VoucherPriceConfig getSelectedPriceConfig()
{
if (mode != Mode.SELECT) {
return null;
}
return selectedPriceConfig;
}
@Override
public boolean isPageComplete()
{
if (mode != null) {
switch (mode) {
case INHERIT:
return true;
case CREATE:
return true;
case SELECT:
return getSelectedPriceConfig() != null;
case NONE:
return true;
default:
throw new IllegalStateException("What's this?!"); //$NON-NLS-1$
}
} else {
return false;
}
}
}