public void initialize()
{
if(!isInitialized)
{
instanceList = new MosaicPanel( new BoxLayout(BoxLayout.Orientation.VERTICAL));
instanceList.setPadding(0);
instanceList.setWidgetSpacing(0);
listBox =
new ListBox<ProcessInstanceRef>(
new String[] {
"<b>Instance</b>", "State", "Start Date"}
);
listBox.setCellRenderer(new ListBox.CellRenderer<ProcessInstanceRef>() {
public void renderCell(ListBox<ProcessInstanceRef> listBox, int row, int column,
ProcessInstanceRef item) {
switch (column) {
case 0:
listBox.setText(row, column, item.getId());
break;
case 1:
listBox.setText(row, column, item.getState().toString());
break;
case 2:
String d = item.getStartDate() != null ? dateFormat.format(item.getStartDate()) : "";
listBox.setText(row, column, d);
break;
default:
throw new RuntimeException("Unexpected column size");
}
}
});
listBox.addRowSelectionHandler(
new RowSelectionHandler()
{
public void onRowSelection(RowSelectionEvent rowSelectionEvent)
{
int index = listBox.getSelectedIndex();
if(index!=-1)
{
ProcessInstanceRef item = listBox.getItem(index);
// enable or disable signal button depending on current activity
if (isSignalable(item)) {
signalBtn.setEnabled(true);
} else {
signalBtn.setEnabled(false);
}
terminateBtn.setEnabled(true);
// update details
controller.handleEvent(
new Event(UpdateInstanceDetailAction.ID,
new InstanceEvent(currentDefinition, item)
)
);
}
}
}
);
// toolbar
final MosaicPanel toolBox = new MosaicPanel();
toolBox.setPadding(0);
toolBox.setWidgetSpacing(5);
final ToolBar toolBar = new ToolBar();
refreshBtn = new Button("Refresh", new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
controller.handleEvent(
new Event(
UpdateInstancesAction.ID,
getCurrentDefinition()
)
);
}
}
);
toolBar.add(refreshBtn);
refreshBtn.setEnabled(false);
toolBar.addSeparator();
startBtn = new Button("Start", new ClickHandler()
{
public void onClick(ClickEvent clickEvent)
{
MessageBox.confirm("Start new execution",
"Do you want to start a new execution of this process?",
new MessageBox.ConfirmationCallback()
{
public void onResult(boolean doIt)
{
if (doIt)
{
String url = getCurrentDefinition().getFormUrl();
boolean hasForm = (url != null && !url.equals(""));
if (hasForm)
{
ProcessDefinitionRef definition = getCurrentDefinition();
iframeWindow = new IFrameWindowPanel(
definition.getFormUrl(), "New Process Instance: " + definition.getId()
);
iframeWindow.setCallback(
new IFrameWindowCallback()
{
public void onWindowClosed()
{
controller.handleEvent(
new Event(UpdateInstancesAction.ID, getCurrentDefinition())
);
}
}
);
iframeWindow.show();
}
else
{
controller.handleEvent(
new Event(
StartNewInstanceAction.ID,
getCurrentDefinition()
)
);
}
}
}
});
}
}
);
terminateBtn = new Button("Terminate", new ClickHandler()
{
public void onClick(ClickEvent clickEvent)
{
if (getSelection() != null)
{
MessageBox.confirm("Terminate instance",
"Terminating this instance will stop further execution.",
new MessageBox.ConfirmationCallback()
{
public void onResult(boolean doIt)
{
if (doIt)
{
ProcessInstanceRef selection = getSelection();
selection.setState(ProcessInstanceRef.STATE.ENDED);
selection.setEndResult(ProcessInstanceRef.RESULT.OBSOLETE);
controller.handleEvent(
new Event(
StateChangeAction.ID,
selection
)
);
}
}
});
}
else
{
MessageBox.alert("Missing selection", "Please select an instance");
}
}
}
);
deleteBtn = new Button("Delete", new ClickHandler()
{
public void onClick(ClickEvent clickEvent)
{
if (getSelection() != null)
{
MessageBox.confirm("Delete instance",
"Deleting this instance will remove any history information and associated tasks as well.",
new MessageBox.ConfirmationCallback()
{
public void onResult(boolean doIt)
{
if (doIt)
{
ProcessInstanceRef selection = getSelection();
selection.setState(ProcessInstanceRef.STATE.ENDED);
controller.handleEvent(
new Event(
DeleteInstanceAction.ID,
selection
)
);
}
}
});
}
else
{
MessageBox.alert("Missing selection", "Please select an instance");
}
}
}
);
signalBtn = new Button("Signal", new ClickHandler()
{
public void onClick(ClickEvent clickEvent)
{
createSignalWindow();
}
}
);
if(!isRiftsawInstance) // riftsaw doesn't support instance operations
{
toolBar.add(startBtn);
toolBar.add(signalBtn);
toolBar.add(deleteBtn);
startBtn.setEnabled(false);
deleteBtn.setEnabled(false);
signalBtn.setEnabled(false);
}
// terminate works on any BPM Engine
toolBar.add(terminateBtn);
terminateBtn.setEnabled(false);
toolBox.add(toolBar, new BoxLayoutData(BoxLayoutData.FillStyle.HORIZONTAL));
instanceList.add(toolBox, new BoxLayoutData(BoxLayoutData.FillStyle.HORIZONTAL));
instanceList.add(listBox, new BoxLayoutData(BoxLayoutData.FillStyle.BOTH));
/*pagingPanel = new PagingPanel(
new PagingCallback()
{
public void rev()
{
renderUpdate();
}
public void ffw()
{
renderUpdate();
}
}
);
instanceList.add(pagingPanel, new BoxLayoutData(BoxLayoutData.FillStyle.HORIZONTAL));*/
// cached data?
if(this.cachedInstances!=null)
bindData(this.cachedInstances);
// layout
MosaicPanel layout = new MosaicPanel(new BorderLayout());
layout.setPadding(0);
layout.add(instanceList, new BorderLayoutData(BorderLayout.Region.CENTER));
// details
InstanceDetailView detailsView = new InstanceDetailView();
controller.addView(InstanceDetailView.ID, detailsView);
controller.addAction(UpdateInstanceDetailAction.ID, new UpdateInstanceDetailAction());
controller.addAction(ClearInstancesAction.ID, new ClearInstancesAction());
controller.addAction(SignalExecutionAction.ID, new SignalExecutionAction());
layout.add(detailsView, new BorderLayoutData(BorderLayout.Region.SOUTH,10,200));
panel.add(layout);
isInitialized = true;