package org.nightlabs.jfire.jbpm.ui.state; import javax.jdo.FetchPlan; import javax.jdo.JDOHelper; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.forms.widgets.Hyperlink; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.job.Job; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.jbpm.dao.StateDAO; import org.nightlabs.jfire.jbpm.graph.def.Statable; import org.nightlabs.jfire.jbpm.graph.def.State; import org.nightlabs.jfire.jbpm.graph.def.StateDefinition; import org.nightlabs.jfire.jbpm.graph.def.id.StateID; import org.nightlabs.jfire.jbpm.ui.JFireJbpmPlugin; import org.nightlabs.jfire.jbpm.ui.resource.Messages; import org.nightlabs.l10n.GlobalDateFormatter; import org.nightlabs.l10n.IDateFormatter; import org.nightlabs.progress.ProgressMonitor; public class CurrentStateComposite extends XComposite { private Hyperlink stateDefinitionName; private Hyperlink timestamp; private Hyperlink userName; public CurrentStateComposite(Composite parent, int style) { super(parent, style); getGridLayout().numColumns = 3; getGridData().grabExcessHorizontalSpace = false; getGridData().grabExcessVerticalSpace = false; getGridData().horizontalAlignment = SWT.BEGINNING; getGridData().verticalAlignment = SWT.BEGINNING; this.stateDefinitionName = new Hyperlink(this, SWT.NONE); this.stateDefinitionName.setText(""); //$NON-NLS-1$ this.timestamp = new Hyperlink(this, SWT.NONE); this.timestamp.setText(""); //$NON-NLS-1$ this.userName = new Hyperlink(this, SWT.NONE); this.userName.setText(""); //$NON-NLS-1$ addMouseListenerForStateHistoryDialog(this); } private MouseListener mouseListenerForStateHistoryDialog = new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { if (statable == null) return; StateHistoryDialog stateHistoryDialog = new StateHistoryDialog(getShell(), (ObjectID) JDOHelper.getObjectId(statable)); stateHistoryDialog.open(); } }; private void addMouseListenerForStateHistoryDialog(Composite composite) { Control[] children = composite.getChildren(); for (Control child : children) { child.addMouseListener(mouseListenerForStateHistoryDialog); child.setToolTipText(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.CurrentStateComposite.statableHistoryWidget.tooltip")); //$NON-NLS-1$ if (child instanceof Composite) addMouseListenerForStateHistoryDialog((Composite) child); } } private Statable statable; public Statable getStatable() { return statable; } public void setStatable(final Statable _statable) { Job job = new Job(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.CurrentStateComposite.loadJob.name")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) { setStatable(_statable, monitor); return Status.OK_STATUS; } }; job.setRule(JFireJbpmPlugin.stateCompositeSchedulingRule); job.schedule(); } private State state; public static final String[] FETCH_GROUPS_STATE = { FetchPlan.DEFAULT, State.FETCH_GROUP_STATE_DEFINITION, State.FETCH_GROUP_USER, StateDefinition.FETCH_GROUP_NAME }; public void setStatable(Statable _statable, ProgressMonitor monitor) { this.statable = _statable; StateID stateID = (StateID) JDOHelper.getObjectId(statable.getStatableLocal().getState()); this.state = StateDAO.sharedInstance().getState(stateID, FETCH_GROUPS_STATE, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); Runnable runnable = new Runnable() { public void run() { if (stateDefinitionName.isDisposed()) return; stateDefinitionName.setText(state.getStateDefinition().getName().getText()); timestamp.setText(GlobalDateFormatter.sharedInstance().formatDate(state.getCreateDT(), IDateFormatter.FLAGS_DATE_SHORT_TIME_HMS)); userName.setText(state.getUser().getName()); // + " (" + state.getUser().getOrganisationID() + ")"); getParent().layout(true, true); } }; if (Display.getCurrent() == null) Display.getDefault().asyncExec(runnable); else runnable.run(); } }