/** * */ package org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse; import java.lang.reflect.InvocationTargetException; import javax.jdo.FetchPlan; import javax.jdo.JDOHelper; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PartInitException; import org.nightlabs.base.ui.progress.ProgressMonitorWrapper; import org.nightlabs.base.ui.util.RCPUtil; import org.nightlabs.base.ui.wizard.DynamicPathWizard; 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.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; import org.nightlabs.progress.SubProgressMonitor; /** * @author daniel[at]nightlabs[dot]de * */ public class ReverseProductWizard extends DynamicPathWizard //extends CombiTransferArticleContainerWizard { private static final Logger logger = Logger.getLogger(ReverseProductWizard.class); private ReverseProductWizardPage reverseProductWizardPage; public ReverseProductWizard() { super(); } @Override public void addPages() { reverseProductWizardPage = new ReverseProductWizardPage(); addPage(reverseProductWizardPage); // reverseProductWizardPage.getReverseProductComposite().addReverseProductListener(new IReverseProductListener(){ // @Override // public void reverseProductChanged(ReverseProductEvent event) { // if (event.isReversePaymentAndDelivery()) { // // } // } // }); } /* (non-Javadoc) * @see org.eclipse.jface.wizard.Wizard#performFinish() */ @Override public boolean performFinish() { try { getContainer().run(false, false, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { createReverseOffer(new ProgressMonitorWrapper(monitor)); } catch (Exception e) { throw new RuntimeException(e); } } }); } catch (Exception e) { throw new RuntimeException(e); } return true; } private Display getDisplay() { return getShell().getDisplay(); } private Offer createReverseOffer(ProgressMonitor monitor) throws Exception { ProductID productID = reverseProductWizardPage.getReverseProductComposite().getProductID( new SubProgressMonitor(monitor, 100)); boolean completeOffer = reverseProductWizardPage.getReverseProductComposite().isReverseAll(); try { return createReversingOffer(productID, completeOffer, new SubProgressMonitor(monitor, 100)); } catch (Exception e) { throw new RuntimeException(e); } } private Offer createReversingOffer(final ProductID productID, final boolean completeOffer, 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(); return null; } else { 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); } } }); return reversingOffer; } } 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 null; } } 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()); } }); } // protected ProgressMonitor getProgressMonitor() // { // if (getContainer() instanceof DynamicPathWizardDialog) { // DynamicPathWizardDialog dlg = (DynamicPathWizardDialog) getContainer(); // return new ProgressMonitorWrapper(dlg.getProgressMonitor()); // } // return new NullProgressMonitor(); // } @Override public void setContainer(IWizardContainer wizardContainer) { super.setContainer(wizardContainer); setWindowTitle(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.reverse.ReverseProductWizard.window.title")); //$NON-NLS-1$ } }