package org.nightlabs.jfire.trade.admin.ui.editor;
import java.lang.reflect.Field;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.forms.editor.IFormPage;
import org.nightlabs.base.ui.action.InheritanceAction;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.editor.ToolBarSectionPart;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.store.NestedProductTypeLocal;
import org.nightlabs.jfire.store.NestedProductTypeLocalMapInheriter;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.store.ProductTypeLocal;
import org.nightlabs.jfire.store.dao.ProductTypeDAO;
import org.nightlabs.jfire.store.id.ProductTypeID;
import org.nightlabs.jfire.trade.admin.ui.TradeAdminPlugin;
import org.nightlabs.jfire.trade.admin.ui.producttype.NestedProductTypeTable;
import org.nightlabs.jfire.trade.admin.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.progress.SubProgressMonitor;
/**
* @author Daniel.Mazurek [at] NightLabs [dot] de
*
*/
public abstract class AbstractNestedProductTypeSection
extends ToolBarSectionPart
implements IProductTypeSectionPart
{
/**
* @param page
* @param parent
* @param style
* @param title
*/
public AbstractNestedProductTypeSection(IFormPage page,
Composite parent, int style, String title)
{
super(page, parent, style, title);
XComposite compNestHeader = new XComposite(getContainer(), SWT.NONE, LayoutMode.TIGHT_WRAPPER);
compNestHeader.getGridLayout().numColumns = 2;
compNestHeader.getGridData().grabExcessVerticalSpace = false;
compNestHeader.getGridData().verticalAlignment = GridData.VERTICAL_ALIGN_END;
new Label(compNestHeader, SWT.NONE).setText(
Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.containedProductTypesLabel.text")); //$NON-NLS-1$
nestedProductTypeTable = new NestedProductTypeTable(getContainer());
nestedProductTypeTable.setInput(null);
nestedProductTypeTable.addSelectionChangedListener(nestesProductTypeTabelListener);
AddNestedProductTypeAction addNestedProductTypeAction = new AddNestedProductTypeAction();
getToolBarManager().add(addNestedProductTypeAction);
RemoveNestedProductTypeAction removeNestedProductTypeAction = new RemoveNestedProductTypeAction();
getToolBarManager().add(removeNestedProductTypeAction);
inheritNestedProductTypesAction = new InheritanceAction(){
@Override
public void run() {
inheritNestedProductTypesClicked();
// setSelection(!isSelection());
}
};
getToolBarManager().add(inheritNestedProductTypesAction);
inheritNestedProductTypesAction.setEnabled(false);
MenuManager menuManager = new MenuManager();
menuManager.add(addNestedProductTypeAction);
menuManager.add(removeNestedProductTypeAction);
Menu menu = menuManager.createContextMenu(nestedProductTypeTable.getControl());
nestedProductTypeTable.setMenu(menu);
updateToolBarManager();
}
private ProductType productType = null;
public ProductType getProductType() {
return productType;
}
// public void setProductType(ProductType productType)
// {
// if (productType == null || getSection() == null || getSection().isDisposed() || nestedProductTypeTable.isDisposed())
// return;
//
// this.productType = productType;
// if (productType == null) {
// setInheritanceSelection(false);
// }
// else {
// if (productType.getProductTypeLocal().getFieldMetaData("nestedProductTypeLocals") != null) //$NON-NLS-1$
// setInheritanceSelection(productType.getProductTypeLocal().getFieldMetaData("nestedProductTypeLocals").isValueInherited()); //$NON-NLS-1$
//// TODO sort nestedProductTypes alphabetically
// }
//
// nestedProductTypeTable.setInput(productType);
// }
//TODO I have to implement those two methods
private AbstractProductTypePageController<ProductType> productTypePageController;
public void setProductTypePageController(AbstractProductTypePageController<ProductType> pageController)
{
if (pageController == null || getSection() == null || getSection().isDisposed()|| nestedProductTypeTable.isDisposed())
return;
productTypePageController = pageController;
this.productType = pageController.getProductType();
if (productType == null) {
setInheritanceSelection(false);
inheritNestedProductTypesAction.setEnabled(false);
}
else {
if (productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals) != null) {
setInheritanceSelection(
productType.getProductTypeLocal().getFieldMetaData(
ProductTypeLocal.FieldName.nestedProductTypeLocals
).isValueInherited()
);
}
inheritNestedProductTypesAction.setEnabled(productType.getExtendedProductTypeID() != null);
}
// TODO sort nestedProductTypes alphabetically
nestedProductTypeTable.setInput(productType);
}
public AbstractProductTypePageController<ProductType> getProductTypePageController()
{
return productTypePageController;
}
private InheritanceAction inheritNestedProductTypesAction = null;
private NestedProductTypeTable nestedProductTypeTable = null;
// public static final String[] FETCH_GROUPS_SIMPLE_PRODUCT_TYPE = new String[]{
// FetchPlan.DEFAULT,
// ProductType.FETCH_GROUP_FIELD_METADATA_MAP,
// ProductTypeLocal.FETCH_GROUP_FIELD_METADATA_MAP,
// ProductType.FETCH_GROUP_NAME,
// ProductType.FETCH_GROUP_PRODUCT_TYPE_LOCAL,
// ProductTypeLocal.FETCH_GROUP_NESTED_PRODUCT_TYPE_LOCALS,
// NestedProductTypeLocal.FETCH_GROUP_INNER_PRODUCT_TYPE};
private ISelectionChangedListener nestesProductTypeTabelListener = new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent event) {
// removeNestedProductTypeButton.setEnabled(!event.getSelection().isEmpty());
}
};
/**
* This method is called asynchronously by {@link #inheritNestedProductTypesClicked()} if
* the extended product type is required to copy the nested product-types.
* <p>
* If your subclass requires other fetch-groups or other special handling, you might override this method.
* </p>
*/
protected ProductType getExtendedProductTypeWithNestedProductTypes(ProgressMonitor monitor)
{
ProductType pt = ProductTypeDAO.sharedInstance().getProductType(
(ProductTypeID)JDOHelper.getObjectId(productType),
new String[] { ProductType.FETCH_GROUP_EXTENDED_PRODUCT_TYPE },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new SubProgressMonitor(monitor, 1)
);
return ProductTypeDAO.sharedInstance().getProductType((
ProductTypeID)JDOHelper.getObjectId(pt.getExtendedProductType()),
new String[] {
FetchPlan.DEFAULT,
ProductType.FETCH_GROUP_PRODUCT_TYPE_LOCAL,
ProductTypeLocal.FETCH_GROUP_FIELD_METADATA_MAP,
ProductTypeLocal.FETCH_GROUP_NESTED_PRODUCT_TYPE_LOCALS,
NestedProductTypeLocal.FETCH_GROUP_INNER_PRODUCT_TYPE,
ProductType.FETCH_GROUP_NAME
},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new SubProgressMonitor(monitor, 1)
);
}
protected void inheritNestedProductTypesClicked()
{
if (productType == null)
return;
boolean inherited = getInheritanceSelection();
productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals).setValueInherited(inherited);
if (inherited) {
Job job = new Job(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.loadInheritanceDataJob.name")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor)
{
monitor.beginTask(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.loadInheritanceDataMonitor.task.name"), 3); //$NON-NLS-1$
try {
ProductType mother = getExtendedProductTypeWithNestedProductTypes(monitor);
Field field = ProductTypeLocal.class.getDeclaredField(ProductTypeLocal.FieldName.nestedProductTypeLocals);
new NestedProductTypeLocalMapInheriter().copyFieldValue(
mother.getProductTypeLocal(), productType.getProductTypeLocal(),
mother.getProductTypeLocal().getClass(), productType.getProductTypeLocal().getClass(),
field,
field,
mother.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals),
productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals));
monitor.worked(1);
monitor.done();
} catch (Exception x) {
monitor.setCanceled(true);
throw new RuntimeException(x);
} finally {
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
nestedProductTypeTable.setEnabled(true);
refreshNestedProductTypes();
markDirty();
}
});
}
return Status.OK_STATUS;
}
};
job.setPriority(org.eclipse.core.runtime.jobs.Job.SHORT);
nestedProductTypeTable.setEnabled(false);
job.schedule();
} // if (inherited) {
}
public void refreshNestedProductTypes()
{
nestedProductTypeTable.refresh();
if (productType != null && productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals) != null)
setInheritanceSelection(productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals).isValueInherited());
}
public void removeSelectedNestedProductTypes()
{
if (productType == null)
return;
if (productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals) != null)
productType.getProductTypeLocal().getFieldMetaData(ProductTypeLocal.FieldName.nestedProductTypeLocals).setValueInherited(false);
for (NestedProductTypeLocal nestedProductTypeLocal : nestedProductTypeTable.getSelectedElements()) {
productType.getProductTypeLocal().removeNestedProductTypeLocal(
nestedProductTypeLocal.getInnerProductTypeOrganisationID(),
nestedProductTypeLocal.getInnerProductTypeProductTypeID());
}
if (!nestedProductTypeTable.getSelectedElements().isEmpty())
markDirty();
refreshNestedProductTypes();
}
protected abstract void createNestedProductTypeClicked();
class AddNestedProductTypeAction
extends Action
{
public AddNestedProductTypeAction() {
super();
setId(AddNestedProductTypeAction.class.getName());
setImageDescriptor(SharedImages.getSharedImageDescriptor(
TradeAdminPlugin.getDefault(),
AbstractNestedProductTypeSection.class,
"Create")); //$NON-NLS-1$
setToolTipText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.AddNestedProductTypeAction.toolTipText")); //$NON-NLS-1$
setText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.AddNestedProductTypeAction.text")); //$NON-NLS-1$
}
@Override
public void run() {
createNestedProductTypeClicked();
}
}
class RemoveNestedProductTypeAction
extends Action
{
public RemoveNestedProductTypeAction() {
super();
setId(RemoveNestedProductTypeAction.class.getName());
setImageDescriptor(SharedImages.getSharedImageDescriptor(
TradeAdminPlugin.getDefault(),
AbstractNestedProductTypeSection.class,
"Remove")); //$NON-NLS-1$
setToolTipText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.RemoveNestedProductTypeAction.toolTipText")); //$NON-NLS-1$
setText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractNestedProductTypeSection.RemoveNestedProductTypeAction.text")); //$NON-NLS-1$
}
@Override
public void run() {
removeSelectedNestedProductTypes();
}
}
protected void setInheritanceSelection(boolean inherit) {
inheritNestedProductTypesAction.setChecked(inherit);
}
protected boolean getInheritanceSelection() {
return inheritNestedProductTypesAction.isChecked();
}
}