package org.nightlabs.jfire.trade.admin.ui.editor;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.PartInitException;
import org.nightlabs.jfire.base.login.ui.part.ICloseOnLogoutEditorPart;
import org.nightlabs.jfire.base.ui.editlock.EditLockCallback;
import org.nightlabs.jfire.base.ui.editlock.EditLockCarrier;
import org.nightlabs.jfire.base.ui.editlock.EditLockHandle;
import org.nightlabs.jfire.base.ui.editlock.EditLockMan;
import org.nightlabs.jfire.base.ui.editlock.InactivityAction;
import org.nightlabs.jfire.base.ui.entity.editor.ActiveEntityEditor;
import org.nightlabs.jfire.editlock.EditLock;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.store.dao.ProductTypeDAO;
import org.nightlabs.jfire.store.id.ProductTypeID;
import org.nightlabs.jfire.trade.JFireTradeEAR;
import org.nightlabs.jfire.trade.admin.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
/**
* The Base Class of all {@link ProductType} AdminEditors. It automatically extracts the correct
* title and checks for {@link EditLock}.
*
* <p> Note: This Editor should only be subclassed if used for ProductType configuration. The
* {@link EditLock}s should only be used if necessary.
* </p>
*
* @author Marius Heinzmann [marius[at]NightLabs[dot]de]
* @author Tobias Langner <!-- tobias[dot]langner[at]nightlabs[dot]de -->
* @author Khaireel Mohamed - khaireel at nightlabs dot de
*/
public abstract class AbstractProductTypeAdminEditor extends ActiveEntityEditor //EntityEditor
implements ICloseOnLogoutEditorPart
{
private final String managedBy = null;
private EditLockHandle editLockHandle;
private final EditLockCallback editLockCallback = new EditLockCallback() {
@Override
public InactivityAction getEditLockAction(EditLockCarrier editLockCarrier) {
return !isDirty() ? InactivityAction.DIALOG_ABOUT_TO_EXPIRE : InactivityAction.DIALOG_BLOCKING_DUE_TO_INACTIVITY;
}
@Override
public void doDiscardAndRelease() {
close(false);
}
@Override
public void doSaveAndRelease() {
doSave(new NullProgressMonitor());
close(false);
}
};
private final IPropertyListener dirtyStateListener = new IPropertyListener() {
public void propertyChanged(Object source, int propID) {
if (PROP_DIRTY == propID) {
editLockHandle.refresh();
}
}
};
@Override
public void init(final IEditorSite site, final IEditorInput input) throws PartInitException {
super.init(site, input);
editLockHandle = EditLockMan.sharedInstance().acquireEditLockAsynchronously(
JFireTradeEAR.EDIT_LOCK_TYPE_ID_PRODUCT_TYPE, ((ProductTypeEditorInput)input).getJDOObjectID(),
Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractProductTypeAdminEditor.editLock.description"), editLockCallback //$NON-NLS-1$
);
//
// addPropertyListener(dirtyStateListener);
// Job loadPropertiesJob = new Job(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractProductTypeAdminEditor.loadTitleJob.name")) { //$NON-NLS-1$
// @Override
// protected IStatus run(ProgressMonitor monitor) throws Exception {
// final ProductType productType = ProductTypeDAO.sharedInstance().getProductType(
// ((ProductTypeEditorInput)getEditorInput()).getJDOObjectID(),
// new String[] { FetchPlan.DEFAULT, ProductType.FETCH_GROUP_NAME, ProductType.FETCH_GROUP_PRODUCT_TYPE_LOCAL },
// 1, monitor);
// Display.getDefault().asyncExec(new Runnable() {
// public void run() {
// String partTitle = productType.getName().getText();
// managedBy = productType.getProductTypeLocal().getManagedBy();
// if (managedBy != null) {
// MessageDialog.openInformation(site.getShell(),
// Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractProductTypeAdminEditor.dialog.title"), //$NON-NLS-1$
// String.format(
// Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractProductTypeAdminEditor.dialog.message"), //$NON-NLS-1$
// partTitle, managedBy)
// );
// partTitle += String.format(Messages.getString("org.nightlabs.jfire.trade.admin.ui.editor.AbstractProductTypeAdminEditor.managedBy"), managedBy); //$NON-NLS-1$
// }
// setPartName(partTitle);
// setTitle(partTitle);
// }
// });
// return Status.OK_STATUS;
// }
// };
// loadPropertiesJob.schedule();
}
@Override
protected String getEditorTitleFromEntity(Object entity) {
return entity instanceof ProductType ? ((ProductType)entity).getName().getText() : null;
}
@Override
protected Object retrieveEntityForEditorTitle(ProgressMonitor monitor) {
ProductTypeID productTypeID = ((ProductTypeEditorInput)getEditorInput()).getJDOObjectID();
assert productTypeID != null;
return ProductTypeDAO.sharedInstance().getProductType(productTypeID, new String[] { FetchPlan.DEFAULT, ProductType.FETCH_GROUP_NAME, ProductType.FETCH_GROUP_PRODUCT_TYPE_LOCAL }, 1, monitor);
}
@Override
public void doSave(IProgressMonitor monitor) {
if (managedBy != null)
return;
super.doSave(monitor);
}
@Override
public void dispose() {
super.dispose();
removePropertyListener(dirtyStateListener);
if (editLockHandle != null)
editLockHandle.release();
}
// /**
// * Returns the Class of the ProductType this editor is used for.
// * @return the Class of the ProductType this editor is used for
// */
// public abstract Class<? extends ProductType> getProductTypeClass();
}