package org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PartInitException;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.util.RCPUtil;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.base.JFireEjb3Factory;
import org.nightlabs.jfire.base.login.ui.Login;
import org.nightlabs.jfire.store.id.ProductID;
import org.nightlabs.jfire.store.reverse.AlreadyReversedArticleReverseProductError;
import org.nightlabs.jfire.store.reverse.IReverseProductError;
import org.nightlabs.jfire.store.reverse.ReverseProductException;
import org.nightlabs.jfire.trade.Offer;
import org.nightlabs.jfire.trade.TradeManagerRemote;
import org.nightlabs.jfire.trade.id.OfferID;
import org.nightlabs.jfire.trade.ui.TradePlugin;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleContainerEditor;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleContainerEditorInput;
import org.nightlabs.jfire.trade.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
/**
* @author Daniel Mazurek - daniel [at] nightlabs [dot] de
*
*/
public class ReverseProductAction
extends Action
{
private static final Logger logger = Logger.getLogger(ReverseProductAction.class);
private Shell shell = null;
public ReverseProductAction(Shell shell) {
super(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductAction.text"), //$NON-NLS-1$
SharedImages.getSharedImageDescriptor(TradePlugin.getDefault(), ReverseProductAction.class));
if (shell == null) {
throw new IllegalArgumentException("Param shell must not be null!"); //$NON-NLS-1$
}
this.shell = shell;
}
// @Override
// public void run()
// {
// ReverseProductWizard wizard = new ReverseProductWizard();
// DynamicPathWizardDialog dlg = new DynamicPathWizardDialog(shell, wizard);
// dlg.open();
// }
@Override
public void run()
{
ReverseProductDialog dialog = new ReverseProductDialog(getShell(), null);
int returnCode = dialog.open();
if (returnCode == Window.OK) {
ProductID productID = dialog.getProductID();
boolean reverseAll = dialog.getReverseProductComposite().isReverseAll();
// boolean reversePaymentAndDelivery = dialog.getReverseProductComposite().isReversePaymentAndDelivery();
// boolean releaseArticles = dialog.getReverseProductComposite().isReleaseArticles();
// createReversingOffer(productID, reverseAll, reversePaymentAndDelivery, releaseArticles);
createReversingOffer(productID, reverseAll, false, false);
}
}
private void createReversingOffer(final ProductID productID, final boolean completeOffer,
final boolean reversePaymentAndDelivery, final boolean releaseArticles)
{
Job searchJob = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductAction.job.name")){ //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception {
TradeManagerRemote tm = JFireEjb3Factory.getRemoteBean(TradeManagerRemote.class, Login.getLogin().getInitialContextProperties());
try {
final Offer reversingOffer = tm.createReverseOfferForProduct(productID, completeOffer, true,
new String[] {FetchPlan.DEFAULT}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT);
if (reversingOffer == null) {
showNothingFound();
}
else {
openReversingOffer(reversingOffer, reversePaymentAndDelivery, releaseArticles);
}
} catch (Exception e) {
if (e instanceof ReverseProductException) {
final ReverseProductException exception = (ReverseProductException) e;
final IReverseProductError error = exception.getReverseProductError();
if (error != null) {
if (error instanceof AlreadyReversedArticleReverseProductError) {
showAlreadyReversed((AlreadyReversedArticleReverseProductError) error);
}
}
else {
showError(exception);
}
}
else {
logger.warn("Problem occured when trying to create a reversing offer for productID "+productID, e); //$NON-NLS-1$
}
}
return Status.OK_STATUS;
}
};
searchJob.schedule();
}
private Shell getShell() {
return shell;
}
private Display getDisplay() {
return shell.getDisplay();
}
private void showNothingFound() {
getDisplay().syncExec(new Runnable(){
@Override
public void run() {
MessageDialog.openError(getShell(),
Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductAction.nothingFound.dialog.title"), //$NON-NLS-1$
Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductAction.nothingFound.dialog.message")); //$NON-NLS-1$
}
});
}
private void showAlreadyReversed(final AlreadyReversedArticleReverseProductError error) {
getDisplay().syncExec(new Runnable(){
@Override
public void run() {
AlreadyReversedArticleReverseProductError alreadyReversedError = error;
Dialog dialog = new OpenAlreadyReversedOfferDialog(getShell(), alreadyReversedError);
dialog.open();
}
});
}
private void showError(final ReverseProductException exception) {
getDisplay().syncExec(new Runnable(){
@Override
public void run() {
MessageDialog.openError(getShell(),
Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductAction.dialog.title"), //$NON-NLS-1$
exception.getDescription());
}
});
}
private void openReversingOffer(final Offer reversingOffer, final boolean reversePaymentAndDelivery, final boolean releaseArticles) {
getDisplay().syncExec(new Runnable(){
@Override
public void run() {
try {
OfferID offerID = (OfferID) JDOHelper.getObjectId(reversingOffer);
RCPUtil.openEditor(
new ArticleContainerEditorInput(offerID),
ArticleContainerEditor.ID_EDITOR);
} catch (PartInitException e) {
throw new RuntimeException(e);
}
}
});
}
}