package org.nightlabs.jfire.jbpm.ui.state; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.jdo.FetchPlan; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.layout.WeightedTableLayout; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.table.TableLabelProvider; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.jbpm.dao.StateDAO; import org.nightlabs.jfire.jbpm.graph.def.State; import org.nightlabs.jfire.jbpm.graph.def.StateDefinition; 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 StateHistoryComposite extends AbstractTableComposite<State> { private static class StateHistoryLabelProvider extends TableLabelProvider { public String getColumnText(Object element, int columnIndex) { if (!(element instanceof State)) { if (columnIndex == 0) return String.valueOf(element); else return ""; //$NON-NLS-1$ } State state = (State) element; switch (columnIndex) { case 0: return GlobalDateFormatter.sharedInstance().formatDate(state.getCreateDT(), IDateFormatter.FLAGS_DATE_SHORT_TIME_HMS_WEEKDAY); case 1: return state.getStateDefinition().getName().getText(); case 2: return state.getUser().getName(); default: return ""; //$NON-NLS-1$ } } } public StateHistoryComposite(Composite parent, int style) { super(parent, style); } @Override protected void createTableColumns(TableViewer tableViewer, Table table) { TableColumn tc; tc = new TableColumn(table, SWT.RIGHT); tc.setText(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.StateHistoryComposite.columnDateTime.text")); //$NON-NLS-1$ tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.StateHistoryComposite.columnState.text")); //$NON-NLS-1$ tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.StateHistoryComposite.columnUser.text")); //$NON-NLS-1$ table.setLayout(new WeightedTableLayout( new int[] {-1, 30, 70}, new int[] {140} )); } @Override protected void setTableProvider(TableViewer tableViewer) { tableViewer.setLabelProvider(new StateHistoryLabelProvider()); tableViewer.setContentProvider(new ArrayContentProvider()); } public static final String[] FETCH_GROUPS_STATE = { FetchPlan.DEFAULT, State.FETCH_GROUP_STATE_DEFINITION, State.FETCH_GROUP_USER, StateDefinition.FETCH_GROUP_NAME }; // private Statable statable; public void setStatableID(final ObjectID statableID) { Display.getDefault().syncExec(new Runnable() { public void run() { setInput(new String[] {Messages.getString("org.nightlabs.jfire.jbpm.ui.state.StateHistoryComposite.loadingInput.text")}); //$NON-NLS-1$ } }); Job job = new Job(Messages.getString("org.nightlabs.jfire.jbpm.ui.state.StateHistoryComposite.loadJob.name")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) { final List<State> states = StateDAO.sharedInstance().getStates(statableID, FETCH_GROUPS_STATE, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); Collections.sort(states, new Comparator<State>() { public int compare(State o1, State o2) { int res = o1.getCreateDT().compareTo(o2.getCreateDT()); if (res != 0) return res; if (o1.getOrganisationID().equals(o2.getOrganisationID())) { res = o1.getStateID() < o2.getStateID() ? -1 : (o1.getStateID() == o2.getStateID() ? 0 : 1); } return res; } }); Display.getDefault().asyncExec(new Runnable() { public void run() { setInput(states); // getShell().layout(true, true); } }); return Status.OK_STATUS; } }; job.setPriority(org.eclipse.core.runtime.jobs.Job.SHORT); job.schedule(); } }