package pl.net.bluesoft.rnd.processtool.ui.tasks;
import com.vaadin.Application;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.event.FieldEvents;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.ui.*;
import com.vaadin.ui.Table.ColumnGenerator;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.bpm.BpmEvent;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession;
import pl.net.bluesoft.rnd.processtool.model.BpmTask;
import pl.net.bluesoft.rnd.processtool.ui.newprocess.NewProcessPane;
import pl.net.bluesoft.rnd.processtool.ui.process.ProcessDataPane;
import pl.net.bluesoft.rnd.processtool.ui.process.WindowProcessDataDisplayContext;
import pl.net.bluesoft.rnd.util.i18n.I18NSource;
import org.aperteworkflow.util.vaadin.VaadinUtility.Refreshable;
import pl.net.bluesoft.util.eventbus.EventListener;
import java.io.Serializable;
import java.util.List;
import static org.aperteworkflow.util.vaadin.VaadinExceptionHandler.Util.withErrorHandling;
import static org.aperteworkflow.util.vaadin.VaadinUtility.horizontalLayout;
import static org.aperteworkflow.util.vaadin.VaadinUtility.refreshIcon;
import static pl.net.bluesoft.util.lang.Strings.hasText;
public class TasksMainPane extends VerticalLayout implements Refreshable {
private I18NSource i18NSource;
private TextField searchField = new TextField();
private ProcessToolBpmSession session;
private EventListener<BpmEvent> eventListener;
private BeanItemContainer<TaskTableItem> bic;
private Application application;
private String filterExpression;
public TasksMainPane(I18NSource i18NSource, ProcessToolBpmSession session, Application application) {
this.i18NSource = i18NSource;
this.session = session;
this.application = application;
initUI();
}
public TasksMainPane(ProcessToolBpmSession session) {
this.session = session;
initUI();
}
private void initUI() {
addComponent(new Label(getMessage("tasks.help.short")));
searchField.setWidth("100%");
searchField.setTextChangeEventMode(AbstractTextField.TextChangeEventMode.LAZY);
searchField.setTextChangeTimeout(500);
searchField.setInputPrompt(i18NSource.getMessage("search.prompt"));
searchField.addListener(new FieldEvents.TextChangeListener() {
@Override
public void textChange(FieldEvents.TextChangeEvent event) {
filterExpression = event.getText();
refreshData();
}
});
Component rb = refreshIcon(application, this);
HorizontalLayout hl = horizontalLayout(searchField, rb);
hl.setMargin(new MarginInfo(false, false, true, false));
addComponent(hl);
Table table = getUserTasksTable();
addComponent(table);
addComponent(new NewProcessPane(session, i18NSource, null));
}
private Table getUserTasksTable() {
final Table table = new Table();
table.setWidth("100%");
table.setHeight("200px");
table.setImmediate(true); // react at once when something is selected
table.setSelectable(true);
bic = new BeanItemContainer<TaskTableItem>(TaskTableItem.class);
fillTaskList(bic);
table.setContainerDataSource(bic);
table.addGeneratedColumn("definitionName", new ColumnGenerator() {
@Override
public Component generateCell(Table source, Object itemId, Object columnId) {
TaskTableItem tti = bic.getItem(itemId).getBean();
String definitionName = getMessage(tti.getDefinitionName());
return new Label(definitionName, Label.CONTENT_XHTML);
}
});
table.addGeneratedColumn("state", new ColumnGenerator() {
@Override
public Component generateCell(Table source, Object itemId, Object columnId) {
TaskTableItem tti = bic.getItem(itemId).getBean();
String state = getMessage(tti.getState());
return new Label(state, Label.CONTENT_XHTML);
}
});
table.setVisibleColumns(new Object[] {"definitionName", "internalId", "externalId", "state"});
for (Object o : table.getVisibleColumns()) {
table.setColumnHeader(o, getMessage("tasks." + o));
}
table.addListener(new ItemClickEvent.ItemClickListener() {
public void itemClick(final ItemClickEvent event) {
if (event.isDoubleClick()) {
withErrorHandling(getApplication(), new Runnable() {
public void run() {
BeanItem<TaskTableItem> beanItem = bic.getItem(event.getItemId());
TaskTableItem tti = beanItem.getBean();
Window w = new Window(tti.getInternalId());
w.setContent(new ProcessDataPane(getApplication(), session, i18NSource, tti.getTask(), new WindowProcessDataDisplayContext(w)));
w.center();
getWindow().addWindow(w);
w.focus();
}
});
}
}
});
if (eventListener == null) {
session.getEventBusManager().subscribe(BpmEvent.class, eventListener = new MyEventListener());
}
return table;
}
public void refreshData() {
bic.removeAllItems();
fillTaskList(bic);
}
private void fillTaskList(BeanItemContainer<TaskTableItem> bic) {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
List<BpmTask> tasks = session.findUserTasks(0, 1000, ctx);
for (BpmTask task : tasks) {
TaskTableItem tti = new TaskTableItem(task);
if (!hasText(filterExpression) || tti.matchSearchCriteria(filterExpression)) {
bic.addBean(tti);
}
}
}
private String getMessage(String key) {
return i18NSource.getMessage(key);
}
public I18NSource getI18NSource() {
return i18NSource;
}
public void setI18NSource(I18NSource i18NSource) {
this.i18NSource = i18NSource;
}
public TextField getSearchField() {
return searchField;
}
public void setSearchField(TextField searchField) {
this.searchField = searchField;
}
private class MyEventListener implements EventListener<BpmEvent>, Serializable {
@Override
public void onEvent(BpmEvent e) {
if (TasksMainPane.this.isVisible() && TasksMainPane.this.getApplication() != null) {
refreshData();
}
}
}
}