package org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring; import java.util.Date; import javax.jdo.JDOHelper; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Label; import org.nightlabs.base.ui.composite.MessageComposite; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.message.MessageType; import org.nightlabs.base.ui.notification.NotificationAdapterJob; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.base.JFireEjb3Factory; import org.nightlabs.jfire.base.jdo.notification.JDOLifecycleManager; import org.nightlabs.jfire.base.login.ui.Login; import org.nightlabs.jfire.jbpm.graph.def.Statable; import org.nightlabs.jfire.jbpm.ui.state.CurrentStateComposite; import org.nightlabs.jfire.jbpm.ui.transition.next.NextTransitionComposite; import org.nightlabs.jfire.jbpm.ui.transition.next.SignalEvent; import org.nightlabs.jfire.jbpm.ui.transition.next.SignalListener; import org.nightlabs.jfire.timer.Task; import org.nightlabs.jfire.trade.TradeManagerRemote; import org.nightlabs.jfire.trade.id.OfferID; import org.nightlabs.jfire.trade.recurring.RecurringOffer; import org.nightlabs.jfire.trade.recurring.dao.RecurringOfferDAO; import org.nightlabs.jfire.trade.recurring.jbpm.JbpmConstantsRecurringOffer; import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleContainerEditComposite; import org.nightlabs.jfire.trade.ui.articlecontainer.detail.HeaderComposite; import org.nightlabs.jfire.trade.ui.resource.Messages; import org.nightlabs.l10n.DateFormatter; import org.nightlabs.l10n.IDateFormatter; import org.nightlabs.notification.NotificationEvent; import org.nightlabs.notification.NotificationListener; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; /** * @author Fitas Amine - fitas at nightlabs dot de */ public class RecurringOfferHeaderComposite extends HeaderComposite{ private final CurrentStateComposite currentStateComposite; private final NextTransitionComposite nextTransitionComposite; private final XComposite infoStatuesContainerComp; private final Label lastTaskDateLabel; private final Label nextTaskDateLabel; private final Label recurredOfferCount; private final MessageComposite statusMsg; private final MessageComposite recurrenceStatusMsgComposite; private volatile RecurringOffer recurringOffer; public RecurringOfferHeaderComposite(final ArticleContainerEditComposite articleContainerEditComposite, final RecurringOffer recurringOffer) { super(articleContainerEditComposite, articleContainerEditComposite, recurringOffer); this.recurringOffer = recurringOffer; this.setLayout(new GridLayout()); this.setLayoutData(new GridData(GridData.FILL_HORIZONTAL|GridData.HORIZONTAL_ALIGN_CENTER)); this.getGridLayout().numColumns = 1; infoStatuesContainerComp = new XComposite(this, SWT.NONE, LayoutMode.TOP_BOTTOM_WRAPPER, LayoutDataMode.NONE); RowLayout rowLayout = new RowLayout(); rowLayout.wrap = true; rowLayout.pack = false; rowLayout.marginLeft = 0; infoStatuesContainerComp.setLayout(rowLayout); currentStateComposite = new CurrentStateComposite(infoStatuesContainerComp , SWT.WRAP |SWT.NONE); currentStateComposite.setStatable(recurringOffer); currentStateComposite.setLayoutData(null); nextTransitionComposite = new NextTransitionComposite(infoStatuesContainerComp ,SWT.WRAP | SWT.NONE); nextTransitionComposite.setStatable(recurringOffer); nextTransitionComposite.setLayoutData(null); nextTransitionComposite.addSignalListener(new SignalListener() { @Override public void signal(final SignalEvent event) { signalNextTransition(event); } }); final XComposite ordinaryWrapper = new XComposite(this, SWT.NONE, LayoutMode.TOP_BOTTOM_WRAPPER); recurredOfferCount = new Label(ordinaryWrapper, SWT.WRAP |SWT.NONE); recurredOfferCount.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.label.text.recurredOffers") + String.valueOf(recurringOffer.getRecurredOfferCount())); //$NON-NLS-1$ recurrenceStatusMsgComposite = new MessageComposite(this, SWT.NONE, "", MessageType.INFORMATION); //$NON-NLS-1$ recurrenceStatusMsgComposite.setLayoutData(new GridData()); statusMsg = new MessageComposite(this, SWT.NONE, "", MessageType.WARNING); //$NON-NLS-1$ statusMsg.setLayoutData(new GridData()); final XComposite infodateContainerComp = new XComposite(ordinaryWrapper, SWT.NONE, LayoutMode.TOP_BOTTOM_WRAPPER, LayoutDataMode.NONE); rowLayout = new RowLayout(); rowLayout.wrap = true; rowLayout.pack = false; rowLayout.marginLeft = 0; infodateContainerComp.setLayout(rowLayout); lastTaskDateLabel = new Label(infodateContainerComp,SWT.WRAP|SWT.NONE); lastTaskDateLabel.setLayoutData(new RowData()); nextTaskDateLabel = new Label(infodateContainerComp,SWT.WRAP |SWT.NONE); nextTaskDateLabel.setLayoutData(new RowData()); updateState(); JDOLifecycleManager.sharedInstance().addNotificationListener(RecurringOffer.class, offerChangedListener); addDisposeListener(new DisposeListener() { public void widgetDisposed(final DisposeEvent e) { JDOLifecycleManager.sharedInstance().removeNotificationListener(RecurringOffer.class, offerChangedListener); } }); getDisplay().asyncExec(new Runnable() { public void run() { if (isDisposed()) return; getShell().layout(true, true); getDisplay().asyncExec(new Runnable() { public void run() { if (isDisposed()) return; getShell().layout(true, true); } }); } }); } private void updateState() { MessageType iconType = MessageType.INFORMATION; String recurrenceStatusMessage = ""; //$NON-NLS-1$ // shows the status of the recurring Offer whether it s started or stopped. if(recurringOffer.getRecurringOfferConfiguration().getCreatorTask().getTimePatternSet().getTimePatterns().size() > 0) { final Statable _statable = recurringOffer; final String nodeName = _statable.getStatableLocal().getState().getStateDefinition().getJbpmNodeName(); if(nodeName.equals(JbpmConstantsRecurringOffer.Vendor.NODE_NAME_RECURRENCE_STARTED)) recurrenceStatusMessage = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.recurrenceStarted"); //$NON-NLS-1$ // dev.jfire.org:recurrenceStopped if(nodeName.equals(JbpmConstantsRecurringOffer.Vendor.NODE_NAME_RECURRENCE_STOPED)) recurrenceStatusMessage = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.recurrenceStopped"); //$NON-NLS-1$ if(nodeName.equals(JbpmConstantsRecurringOffer.Vendor.NODE_NAME_RECURRENCE_ACCEPTED) ) recurrenceStatusMessage = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.recurrencePaused"); //$NON-NLS-1$ } else recurrenceStatusMessage = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.recurrenceNotConfigured"); //$NON-NLS-1$ // shows the recurrence status !!!! if(recurrenceStatusMessage.isEmpty()) recurrenceStatusMsgComposite.setMessage(recurrenceStatusMessage, MessageType.NONE); else recurrenceStatusMsgComposite.setMessage(recurrenceStatusMessage, iconType); if(recurringOffer.getStatusKey().equals(RecurringOffer.STATUS_KEY_NONE)) setWidgetExcluded((GridData) statusMsg.getLayoutData(),true); else { setWidgetExcluded((GridData) statusMsg.getLayoutData(),false); final String typeKey = RecurringOfferHeaderComposite.class.getName() + ".status.type." + recurringOffer.getStatusKey(); //$NON-NLS-1$ if (Messages.RESOURCE_BUNDLE.containsKey(typeKey)) { final String msgtype = Messages.getString(typeKey); if (msgtype != null && !"".equals(msgtype)) //$NON-NLS-1$ iconType = MessageType.valueOf(msgtype.toUpperCase()); } statusMsg.setMessage(Messages.getString(RecurringOfferHeaderComposite.class.getName() + ".status.message." + recurringOffer.getStatusKey()), iconType); //$NON-NLS-1$ } Date date = recurringOffer.getRecurringOfferConfiguration().getCreatorTask().getLastExecDT(); if(date != null) { lastTaskDateLabel.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.label.text.lastTask") + DateFormatter.formatDate(date, IDateFormatter.FLAGS_DATE_SHORT_TIME_HM)); //$NON-NLS-1$ setWidgetExcluded((RowData) lastTaskDateLabel.getLayoutData(),false); } else setWidgetExcluded((RowData) lastTaskDateLabel.getLayoutData(),true); date = recurringOffer.getRecurringOfferConfiguration().getCreatorTask().getNextExecDT(); if(date != null) { nextTaskDateLabel.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.label.text.nextTask") + DateFormatter.formatDate(date, IDateFormatter.FLAGS_DATE_SHORT_TIME_HM)); //$NON-NLS-1$ setWidgetExcluded((RowData) nextTaskDateLabel.getLayoutData(),false); } else setWidgetExcluded((RowData) nextTaskDateLabel.getLayoutData(),true); if(recurringOffer.getStatusKey().equals(RecurringOffer.STATUS_KEY_SUSPENDED)) setWidgetExcluded((RowData) nextTaskDateLabel.getLayoutData(),true); recurredOfferCount.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.label.text.recurredOffers") + String.valueOf(recurringOffer.getRecurredOfferCount())); //$NON-NLS-1$ } private void setWidgetExcluded(final RowData data , final boolean exclude) { data.exclude = exclude; } private void setWidgetExcluded(final GridData data , final boolean exclude) { data.exclude = exclude; } private void onOfferModified(final RecurringOffer recurringOffer, final ProgressMonitor monitor) { monitor.beginTask(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.job.task.name.updateUI"), 100); //$NON-NLS-1$ try { this.recurringOffer = recurringOffer; currentStateComposite.setStatable(recurringOffer, new SubProgressMonitor(monitor, 1)); nextTransitionComposite.setStatable(recurringOffer, new SubProgressMonitor(monitor, 1)); getDisplay().asyncExec(new Runnable() { public void run() { if (isDisposed()) return; updateState(); getShell().layout(true, true); //recurringOffer.getRecurringOfferConfiguration(). } }); } finally { monitor.done(); } } private final NotificationListener offerChangedListener = new NotificationAdapterJob(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.offer.OfferHeaderComposite.loadOfferJob.name")) { //$NON-NLS-1$ public void notify(final NotificationEvent notificationEvent) { final ProgressMonitor monitor = getProgressMonitor(); monitor.beginTask( Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.offer.OfferHeaderComposite.loadOfferMonitor.task.name"), //$NON-NLS-1$ 3 ); final RecurringOffer _offer = RecurringOfferDAO.sharedInstance().getRecurringOffer( (OfferID) JDOHelper.getObjectId(recurringOffer), RecurringArticleContainerEditComposite.FETCH_GROUPS_RECURRING_ARTICLE_CONTAINER_WITHOUT_ARTICLES, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 1)); onOfferModified(_offer, new SubProgressMonitor(monitor, 2)); monitor.done(); } }; private void signalNextTransition(final SignalEvent event) { final Job job = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.offer.OfferHeaderComposite.performTransitionJob.name")) { //$NON-NLS-1$ @Override protected IStatus run(final ProgressMonitor monitor) { try { final TradeManagerRemote tm = JFireEjb3Factory.getRemoteBean(TradeManagerRemote.class, Login.getLogin().getInitialContextProperties()); if (JbpmConstantsRecurringOffer.Vendor.TRANSITION_NAME_START_RECURRENCE.equals(event.getTransition().getJbpmTransitionName())) { final Task recurringTask = recurringOffer.getRecurringOfferConfiguration().getCreatorTask(); if(!recurringTask.getTimePatternSet().getTimePatterns().isEmpty()) tm.signalOffer((OfferID)JDOHelper.getObjectId(recurringOffer), event.getTransition().getJbpmTransitionName()); else { nextTransitionComposite.getDisplay().asyncExec(new Runnable() { public void run() { MessageDialog.openError(getDisplay().getActiveShell(), Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.dialog.title"), Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.recurring.RecurringOfferHeaderComposite.dialog.message")); //$NON-NLS-1$ //$NON-NLS-2$ nextTransitionComposite.setEnabled(true); } }); } } else tm.signalOffer((OfferID)JDOHelper.getObjectId(recurringOffer), event.getTransition().getJbpmTransitionName()); } catch (final Exception x) { throw new RuntimeException(x); } return Status.OK_STATUS; } }; job.setPriority(Job.SHORT); job.setUser(true); job.schedule(); } }