package org.nightlabs.jfire.reporting.ui.layout.scheduled.delivery;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.nightlabs.base.ui.composite.XComboComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.notification.IDirtyStateManager;
import org.nightlabs.jfire.reporting.scheduled.IScheduledReportDeliveryDelegate;
/**
* @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de -->
*
*/
public class DeliveryDelegateEditComposite extends XComposite {
private XComboComposite<IScheduledReportDeliveryDelegateEditFactory> factoriesCombo;
private Map<String, EditComposite> editComposites = new HashMap<String, EditComposite>();
private Composite stackComposite;
private StackLayout stackLayout;
private IDirtyStateManager dirtyStateManager;
class EditComposite extends Composite {
private IScheduledReportDeliveryDelegateEdit delegateEdit;
public EditComposite(Composite parent, IScheduledReportDeliveryDelegateEdit delegateEdit) {
super(parent, SWT.NONE);
this.delegateEdit = delegateEdit;
setLayout(XComposite.getLayout(LayoutMode.TIGHT_WRAPPER));
Control editControl = delegateEdit.createControl(this);
editControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
public IScheduledReportDeliveryDelegateEdit getDelegateEdit() {
return delegateEdit;
}
}
/**
* @param parent
* @param style
*/
public DeliveryDelegateEditComposite(Composite parent, int style, IDirtyStateManager dirtyStateManager) {
super(parent, style);
this.dirtyStateManager = dirtyStateManager;
init();
}
/**
* @param parent
* @param style
* @param layoutDataMode
*/
public DeliveryDelegateEditComposite(Composite parent, int style, LayoutDataMode layoutDataMode, IDirtyStateManager dirtyStateManager) {
super(parent, style, layoutDataMode);
this.dirtyStateManager = dirtyStateManager;
init();
}
protected void init() {
Label factoriesLabel = new Label(this, SWT.WRAP);
factoriesLabel.setText("Delivery configuration");
factoriesCombo = new XComboComposite<IScheduledReportDeliveryDelegateEditFactory>(this, SWT.READ_ONLY);
List<IScheduledReportDeliveryDelegateEditFactory> factories = new ArrayList<IScheduledReportDeliveryDelegateEditFactory>(
ScheduledReportDeliveryDelegateEditRegistry.sharedInstance().getFactories());
Collections.sort(factories, new Comparator<IScheduledReportDeliveryDelegateEditFactory>() {
@Override
public int compare(IScheduledReportDeliveryDelegateEditFactory o1, IScheduledReportDeliveryDelegateEditFactory o2) {
return o1.getName().compareTo(o2.getName());
}
});
factoriesCombo.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent arg0) {
updateEditComposite();
}
});
factoriesCombo.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
return ((IScheduledReportDeliveryDelegateEditFactory) element).getName();
}
});
factoriesCombo.addElements(factories);
stackComposite = new Composite(this, SWT.NONE);
stackComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
stackLayout = new StackLayout();
stackComposite.setLayout(stackLayout);
if (factories.size() > 0) {
factoriesCombo.selectElement(factories.get(0));
updateEditComposite();
}
}
protected EditComposite updateEditComposite() {
IScheduledReportDeliveryDelegateEditFactory factory = factoriesCombo.getSelectedElement();
if (factory == null) {
return null;
}
EditComposite editComposite = editComposites.get(factory.getId());
if (editComposite == null) {
IScheduledReportDeliveryDelegateEdit delegateEdit = factory.createDeliveryDelegateEdit();
if (delegateEdit != null) {
editComposite = new EditComposite(stackComposite, delegateEdit);
delegateEdit.setDirtyStateManager(dirtyStateManager);
editComposites.put(factory.getId(), editComposite);
}
}
if (editComposite != null) {
stackLayout.topControl = editComposite;
stackComposite.layout();
layoutEnvironment();
}
return editComposite;
}
protected void layoutEnvironment() {
getParent().layout(true, true);
}
public void setDeliveryDelegate(IScheduledReportDeliveryDelegate deliveryDelegate) {
List<IScheduledReportDeliveryDelegateEditFactory> factories = factoriesCombo.getElements();
for (IScheduledReportDeliveryDelegateEditFactory factory : factories) {
if (factory.canHandleDeliveryDelegate(deliveryDelegate)) {
factoriesCombo.selectElement(factory);
EditComposite editComposite = updateEditComposite();
if (editComposite != null)
editComposite.getDelegateEdit().setDeliveryDelegate(deliveryDelegate);
return;
} else {
// If this is not the Edit that matches, we clear the ui
EditComposite editComposite = editComposites.get(factory.getId());
if (editComposite != null) {
editComposite.getDelegateEdit().clear();
}
}
}
// If we come here no appropriate factory was found, or the delegate is null, so we cleare the current one
EditComposite editComposite = updateEditComposite();
if (editComposite != null) {
}
}
public IScheduledReportDeliveryDelegate getDeliveryDelegate() {
IScheduledReportDeliveryDelegateEditFactory factory = factoriesCombo.getSelectedElement();
EditComposite editComposite = editComposites.get(factory.getId());
if (editComposite == null) {
return null;
}
return editComposite.getDelegateEdit().getScheduledReportDeliveryDelegate();
}
}