/**
* Copyright 2010 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.examples.checklist.impl;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import org.jbpm.examples.checklist.ChecklistContextConstraint;
import org.jbpm.examples.checklist.ChecklistItem;
import org.jbpm.examples.checklist.ChecklistItem.Status;
import org.jbpm.examples.checklist.ChecklistManager;
import org.jbpm.test.JBPMHelper;
import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.manager.RuntimeEnvironment;
import org.kie.api.runtime.manager.RuntimeEnvironmentBuilder;
import org.kie.api.task.UserGroupCallback;
public class ChecklistUI extends JFrame {
private static final long serialVersionUID = 510l;
private static ImageIcon[] ICONS = {
new ImageIcon(ChecklistUI.class.getResource("/checklist/status/check32.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/status/inprogress32.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/status/abort32.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/status/optional32.png"))
};
private static ImageIcon[] TYPE_ICONS = {
new ImageIcon(ChecklistUI.class.getResource("/checklist/type/UserTask.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/type/ScriptTask.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/type/CallActivity.png")),
new ImageIcon(ChecklistUI.class.getResource("/checklist/type/ServiceTask.png"))
};
private ChecklistManager checklistManager;
List<ChecklistItem> items = null;
private JComboBox contexts;
private JTable itemTable;
private JTextField userNameTextField;
private boolean ctrl = false;
public ChecklistUI() {
setSize(new Dimension(450, 350));
setTitle("Checklist");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
initializeComponent();
JBPMHelper.startH2Server();
JBPMHelper.setupDataSource();
RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get().newDefaultBuilder()
.userGroupCallback(new UserGroupCallback() {
public List<String> getGroupsForUser(String userId) {
List<String> result = new ArrayList<String>();
if ("actor4".equals(userId)) {
result.add("group1");
} else if ("krisv".equals(userId)) {
result.add("employee");
} else if ("john".equals(userId)) {
result.add("manager");
}
return result;
}
public boolean existsUser(String arg0) {
return true;
}
public boolean existsGroup(String arg0) {
return true;
}
})
.addAsset(KieServices.Factory.get().getResources().newClassPathResource("checklist/SampleChecklistProcess.bpmn"), ResourceType.BPMN2)
.addAsset(KieServices.Factory.get().getResources().newClassPathResource("checklist/AdHocProcess.bpmn"), ResourceType.BPMN2)
.addAsset(KieServices.Factory.get().getResources().newClassPathResource("checklist/travel.bpmn"), ResourceType.BPMN2)
.addAsset(KieServices.Factory.get().getResources().newClassPathResource("checklist/expenses.bpmn"), ResourceType.BPMN2)
.get();
checklistManager = new DefaultChecklistManager(environment);
}
private void initializeComponent() {
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
getRootPane().setLayout(new BorderLayout());
getRootPane().add(panel, BorderLayout.CENTER);
JButton createButton = new JButton("New...");
createButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
create();
}
});
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.WEST;
panel.add(createButton, c);
contexts = new JComboBox(new DefaultComboBoxModel());
contexts.setPreferredSize(new Dimension(80, 24));
contexts.setSize(new Dimension(80, 24));
c = new GridBagConstraints();
c.weightx = 1;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
panel.add(contexts, c);
contexts.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refresh();
}
});
JButton refreshButton = new JButton("Refresh");
refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
refresh();
}
});
c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
panel.add(refreshButton, c);
itemTable = new JTable(1, 6);
itemTable.setRowHeight(35);
itemTable.setShowHorizontalLines(false);
itemTable.setShowVerticalLines(false);
itemTable.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
ctrl = false;
}
public void keyPressed(KeyEvent e) {
if (e.isControlDown()) {
ctrl = true;
}
}
});
itemTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int index = e.getFirstIndex();
if (index >= 0 && index < items.size()) {
ChecklistItem item = items.get(index);
if (item.getStatus() == Status.Created) {
String actorId = getActorId();
try {
checklistManager.claimTask(actorId, item.getTaskId());
if (ctrl) {
checklistManager.abortTask(actorId, item.getTaskId());
} else {
checklistManager.completeTask(actorId, item.getTaskId());
}
} catch (Throwable t) {
// Do nothing
}
refresh();
} else if (item.getStatus() == Status.Reserved) {
String actorId = getActorId();
if (item.getActors().equals(actorId)) {
try {
if (ctrl) {
checklistManager.abortTask(actorId, item.getTaskId());
} else {
checklistManager.completeTask(actorId, item.getTaskId());
}
} catch (Throwable t) {
// Do nothing
}
refresh();
}
} else if (item.getStatus() == Status.Optional) {
try {
checklistManager.selectOptionalTask(item.getName(), Long.valueOf((String) contexts.getSelectedItem()));
} catch (Throwable t) {
// Do nothing
t.printStackTrace();
}
refresh();
}
}
}
});
// TODO:
// default width of columns
// icons for state
// not-editable
// no selection
// (scratch for aborted?)
// replace refresh, create, etc. by icon
c = new GridBagConstraints();
c.gridy = 1;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 3;
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(5, 5, 5, 5);
panel.add(itemTable, c);
JLabel nameLabel = new JLabel("Logged in as:");
c = new GridBagConstraints();
c.gridy = 2;
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.WEST;
panel.add(nameLabel, c);
userNameTextField = new JTextField("krisv");
userNameTextField.setPreferredSize(new Dimension(80, 20));
userNameTextField.setSize(new Dimension(80, 20));
c = new GridBagConstraints();
c.gridy = 2;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.WEST;
panel.add(userNameTextField, c);
JButton createItemButton = new JButton("+");
createItemButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
createNewItem();
}
});
c = new GridBagConstraints();
c.gridy = 2;
c.insets = new Insets(5, 5, 5, 5);
c.anchor = GridBagConstraints.EAST;
panel.add(createItemButton, c);
panel.doLayout();
}
private String getActorId() {
return userNameTextField.getText();
}
private void refresh() {
Long processInstanceId = getSelectedProcessInstance();
if (processInstanceId != null) {
List<ChecklistContextConstraint> contexts = null;
items = checklistManager.getTasks(processInstanceId, contexts);
} else {
items = new ArrayList<ChecklistItem>();
}
DefaultTableModel tableModel = new DefaultTableModel(items.size(), 5);
for (int i = 0; i < items.size(); i++) {
ChecklistItem item = items.get(i);
String orderingNb = item.getOrderingNb();
if (orderingNb == null) {
orderingNb = "";
} else if (orderingNb.endsWith("+")) {
orderingNb = "*";
}
tableModel.setValueAt(item.getStatus(), i, 0);
tableModel.setValueAt("(" + orderingNb + ")", i, 1);
tableModel.setValueAt(item.getName(), i, 2);
tableModel.setValueAt(item.getType(), i, 3);
tableModel.setValueAt(item.getActors(), i, 4);
// tableModel.setValueAt(item.getPriority(), i, 4);
}
itemTable.setModel(tableModel);
itemTable.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
private static final long serialVersionUID = 6L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
JLabel label = new JLabel();
if (value != null) {
label.setHorizontalAlignment(JLabel.CENTER);
switch ((Status) value) {
case Completed: label.setIcon(ICONS[0]); break;
case Aborted: label.setIcon(ICONS[2]); break;
case InProgress: label.setIcon(ICONS[1]); break;
case Created: label.setIcon(ICONS[1]); break;
case Reserved: label.setIcon(ICONS[1]); break;
case Ready: label.setIcon(ICONS[1]); break;
case Optional: label.setIcon(ICONS[3]); break;
case Pending: break;
default: break;
}
}
return label;
}
});
itemTable.getColumnModel().getColumn(3).setCellRenderer(new DefaultTableCellRenderer() {
private static final long serialVersionUID = 6L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
JLabel label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
if (value != null) {
String s = (String) value;
if ("HumanTaskNode".equals(s)) {
label.setIcon(TYPE_ICONS[0]);
} else if ("ActionNode".equals(s)) {
label.setIcon(TYPE_ICONS[1]);
} else if ("SubProcessNode".equals(s)) {
label.setIcon(TYPE_ICONS[2]);
} else if ("WorkItemNode".equals(s)) {
label.setIcon(TYPE_ICONS[3]);
}
}
return label;
}
});
itemTable.getColumnModel().getColumn(0).setPreferredWidth(32);
itemTable.getColumnModel().getColumn(0).setMaxWidth(32);
itemTable.getColumnModel().getColumn(1).setPreferredWidth(40);
itemTable.getColumnModel().getColumn(2).setPreferredWidth(230);
itemTable.getColumnModel().getColumn(3).setPreferredWidth(32);
itemTable.getColumnModel().getColumn(3).setMaxWidth(32);
itemTable.getColumnModel().getColumn(4).setPreferredWidth(120);
}
private void create() {
String s = (String) JOptionPane.showInputDialog(
this, "Select Checklist Template:", "Select Template",
JOptionPane.PLAIN_MESSAGE, null,
new Object[] {
"None",
"Business Trip",
"Sample1"
},
"None");
if (s == null) {
return;
}
String processId = null;
if ("Sample1".equals(s)) {
processId = "org.jbpm.examples.checklist.sample1";
} else if ("Business Trip".equals(s)) {
processId = "org.jbpm.examples.checklist.travel";
}
long processInstanceId = checklistManager.createContext(processId, getActorId());
String contextName = processInstanceId + "";
contexts.addItem(contextName);
contexts.setSelectedItem(contextName);
refresh();
}
private Long getSelectedProcessInstance() {
Object selected = contexts.getSelectedItem();
if (selected != null) {
try {
return new Long((String) selected);
} catch (NumberFormatException e) {
// Do nothing
}
}
return null;
}
private void createNewItem() {
if (getSelectedProcessInstance() != null) {
CreateItemDialog dialog = new CreateItemDialog(this, getActorId());
dialog.setVisible(true);
String name = dialog.getItemName();
if (name != null) {
ChecklistItem item = getSelectedItem();
String orderingNb = null;
if (item != null) {
orderingNb = item.getOrderingNb() + "+";
} else {
if (items.size() == 0) {
orderingNb = "1+";
} else {
orderingNb = items.get(items.size() - 1).getOrderingNb() + "+";
}
}
String[] actors = null;
String actorIds = dialog.getActors();
if (actorIds.trim().length() == 0) {
actors = new String[0];
} else {
actors = actorIds.split(",");
}
String[] groups = null;
String groupIds = dialog.getGroups();
if (groupIds.trim().length() == 0) {
groups = new String[0];
} else {
groups = groupIds.split(",");
}
checklistManager.addTask(
dialog.getActors(),
actors,
groups,
name,
orderingNb,
getSelectedProcessInstance());
refresh();
}
}
}
private ChecklistItem getSelectedItem() {
int index = itemTable.getSelectedRow();
if (index >= 0) {
return items.get(index);
}
return null;
}
public static void main(String[] args) {
new ChecklistUI().setVisible(true);
}
}