package pl.net.bluesoft.rnd.processtool.ui.widgets.taskitem; import static com.vaadin.terminal.Sizeable.UNITS_PIXELS; import static com.vaadin.ui.Alignment.MIDDLE_CENTER; import static com.vaadin.ui.Alignment.MIDDLE_LEFT; import static org.aperteworkflow.util.vaadin.VaadinUtility.horizontalLayout; import static org.aperteworkflow.util.vaadin.VaadinUtility.labelWithIcon; import static pl.net.bluesoft.rnd.processtool.ui.activity.MyProcessesListPane.getDeadlineDate; import static pl.net.bluesoft.rnd.processtool.ui.activity.MyProcessesListPane.isOutdated; import static pl.net.bluesoft.util.lang.Formats.nvl; import java.text.SimpleDateFormat; import java.util.Date; import org.aperteworkflow.util.taskitem.ProcessInfoBuilder; import org.aperteworkflow.util.vaadin.VaadinUtility; import pl.net.bluesoft.rnd.processtool.model.BpmTask; import pl.net.bluesoft.rnd.processtool.model.ProcessInstance; import pl.net.bluesoft.rnd.processtool.model.UserData; import pl.net.bluesoft.rnd.processtool.model.config.ProcessDefinitionConfig; import pl.net.bluesoft.rnd.processtool.ui.common.CssStyles; import com.vaadin.event.LayoutEvents; import com.vaadin.event.MouseEvents; import com.vaadin.terminal.Resource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.Embedded; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; /** * User: POlszewski * Date: 2011-12-14 * Time: 09:46:29 */ //@AliasName(name = "Default") public class TaskItemProviderBase { private TaskItemProvider impl; public TaskItemProviderBase(TaskItemProvider enhancement) { this.impl = enhancement; } public Component getTaskPane(final TaskItemProviderParams params) { Component res = impl != null ? impl.getTaskPane(params) : null; if (res != null) { return res; } // ikona Component taskIcon = createTaskIcon(params); VerticalLayout til = new VerticalLayout(); til.setHeight("100%"); til.setWidth(60, UNITS_PIXELS); til.setMargin(false); til.addComponent(taskIcon); til.setComponentAlignment(taskIcon, Alignment.MIDDLE_CENTER); til.setExpandRatio(taskIcon, 1.0f); // górny pasek Component processIdButton = createTaskPaneProcessId(params); Component processDescButton = createTaskPaneProcessDesc(params); processDescButton.addStyleName(CssStyles.PROCESS_DESC_BUTTON); processIdButton.addStyleName(CssStyles.PROCESS_ID_BUTTON); HorizontalLayout hl = new HorizontalLayout(); hl.setSpacing(true); hl.setWidth("100%"); hl.addComponent(processDescButton); hl.addComponent(processIdButton); //hl.setExpandRatio(processDescButton, 1.0f); hl.setComponentAlignment(processDescButton, Alignment.MIDDLE_LEFT); hl.setComponentAlignment(processIdButton, Alignment.MIDDLE_RIGHT); // dolny pasek - opis Component taskDescription = createTaskPaneTaskDesc(params); // dolny pasek - info Component processInfoLayout = getTaskItemProcessInfo(params); GridLayout mainLayout = new GridLayout(3, 2); mainLayout.setWidth("100%"); mainLayout.setSpacing(true); mainLayout.addListener(new LayoutEvents.LayoutClickListener() { @Override public void layoutClick(LayoutEvents.LayoutClickEvent event) { if (event.getButton() == MouseEvents.ClickEvent.BUTTON_LEFT) { params.onClick(); } } }); mainLayout.setColumnExpandRatio(mainLayout.getColumns() - 1, 1); mainLayout.setRowExpandRatio(mainLayout.getRows() - 1, 1); mainLayout.addComponent(til, 0, 0, 0, 1); mainLayout.setComponentAlignment(til, Alignment.MIDDLE_CENTER); mainLayout.addComponent(hl, 1, 0, 2, 0); mainLayout.addComponent(taskDescription, 1, 1, 1, 1); mainLayout.setComponentAlignment(taskDescription, Alignment.MIDDLE_LEFT); if (processInfoLayout != null) { mainLayout.addComponent(processInfoLayout, 2, 1, 2, 1); mainLayout.setComponentAlignment(processInfoLayout, Alignment.MIDDLE_LEFT); } Panel p = new Panel(); p.addStyleName("tti-panel"); p.setWidth("100%"); p.addComponent(mainLayout); return p; } protected Component createTaskIcon(TaskItemProviderParams params) { BpmTask task = params.getTask(); final ProcessDefinitionConfig cfg = task.getProcessInstance().getDefinition(); String path = cfg.getProcessLogo() != null ? cfg.getBpmDefinitionKey() + "_" + cfg.getId() + "_logo.png" : "/img/aperte-logo.png"; Resource res = params.getResource(path); if (res == null) { if (cfg.getProcessLogo() != null) { res = params.getStreamResource(path, cfg.getProcessLogo()); } else { res = params.getImage(path); } } Embedded embedded = new Embedded(null, res); embedded.setDescription(getProcessDescription(params)); return embedded; } protected String getProcessDescription(TaskItemProviderParams params) { return params.getMessage(params.getProcessInstance().getRootProcessInstance().getDefinition().getDescription()); } protected Component createTaskPaneProcessDesc(TaskItemProviderParams params) { String processDesc = getProcessDescription(params); return createOpenProcessInstanceButton(processDesc, getTaskPaneStyleName(params), params, true); } protected String getTaskPaneStyleName(TaskItemProviderParams params) { boolean running = params.getBpmSession().isProcessRunning(params.getProcessInstance().getInternalId(), params.getCtx()); boolean outdated = running && isOutdated(new Date(), getDeadlineDate(params.getTask())); return "link tti-head" + (outdated ? "-outdated" : !running ? "-ended" : ""); } protected Component createTaskPaneTaskDesc(TaskItemProviderParams params) { Label taskDescription = new Label(params.getMessage(params.getState())); taskDescription.setWidth(250, UNITS_PIXELS); taskDescription.addStyleName("tti-details"); taskDescription.setDescription(params.getMessage("activity.state")); return taskDescription; } protected Component createOpenProcessInstanceButton(String caption, String styleName, final TaskItemProviderParams params, boolean showExclamation) { Button b = VaadinUtility.button(caption, caption, styleName, new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { params.onClick(); } }); if(showExclamation){ if(Boolean.valueOf(params.getProcessInstance().getRootProcessInstance().getSimpleAttributeValue("markedImportant", "false"))){ b.setIcon(params.getImage("/img/exclamation_mark.png")); b.setDescription(params.getMessage("activity.task.important")); } } b.setHeight("26px"); b.setWidth(null); return b; } public Component createTaskPaneProcessId(TaskItemProviderParams params) { Component res = impl != null ? impl.createTaskPaneProcessId(params) : null; if (res != null) { return res; } ProcessInstance pi = params.getProcessInstance(); return createOpenProcessInstanceButton(getProcessId(pi), getTaskPaneStyleName(params), params, false); } public Component getTaskItemProcessInfo(TaskItemProviderParams params) { params.setReplaceDefault(false); Component res = impl != null ? impl.getTaskItemProcessInfo(params) : null; if (res != null && params.isReplaceDefault()) { return res; } ProcessInfoBuilder builder = new ProcessInfoBuilder(params); builder.addComponent(createCreatorLabel(builder.getParams()), MIDDLE_CENTER); builder.addComponent(createCreateDateLabel(builder.getParams()), MIDDLE_CENTER); builder.addComponent(createAssigneeLabel(builder.getParams()), MIDDLE_CENTER); builder.addComponent(createDeadlineDateLabel(builder.getParams()), MIDDLE_LEFT); if (res != null) { VerticalLayout layout = new VerticalLayout(); layout.setWidth("100%"); layout.setSpacing(true); layout.addComponent(builder.buildLayout()); layout.addComponent(res); return layout; } else { return builder.buildLayout(); } } public Component createQueuePaneProcessInfo(TaskItemProviderParams params) { return impl != null ? impl.createQueuePaneProcessInfo(params) : null; // if (res != null) { // return res; // } // return null; } protected Component createCreatorLabel(TaskItemProviderParams params) { String creatorName = params.getProcessInstance().getCreator().getRealName(); return labelWithIcon(params.getImage("/img/user_creator.png"), creatorName, "tti-person", params.getMessage("activity.creator")); } protected Component createCreateDateLabel(TaskItemProviderParams params) { Date createDate = params.getProcessInstance().getRootProcessInstance().getCreateDate(); return labelWithIcon(params.getImage("/img/date_standard.png"), formatDate(createDate), "tti-date", params.getMessage("activity.creationDate")); } protected Component createAssigneeLabel(TaskItemProviderParams params) { String assignedName = null; if (impl != null) { assignedName = impl.getAssigneeName(params); } if (assignedName == null) { UserData owner = params.getTask().getOwner(); if (owner != null && owner.getLogin() != null){ if(owner.getLastName() != null){ assignedName = owner.getRealName(); } else{ assignedName = owner.getLogin(); } }else{ assignedName = params.getMessage("activity.assigned.empty"); } } return labelWithIcon(params.getImage("/img/user_assigned.png"), assignedName, "tti-person", params.getMessage("activity.assigned")); } protected Component createDeadlineDateLabel(TaskItemProviderParams params) { Date deadlineDate = getDeadlineDate(params.getTask()); boolean running = params.getBpmSession().isProcessRunning(params.getProcessInstance().getInternalId(), params.getCtx()); boolean outdated = running && isOutdated(new Date(), deadlineDate); return labelWithIcon(params.getImage("/img/date_deadline.png"), deadlineDate != null ? formatDate(deadlineDate) : params.getMessage("activity.nodeadline"), outdated ? "tti-date outdated" : "tti-date", params.getMessage("activity.deadlineDate")); } protected String formatDate(Date date) { return new SimpleDateFormat("yyyy-MM-dd").format(date); } /////////////////////////////////////////////////////////////////////////////// // @Override public Component getQueuePane(TaskItemProviderParams params) { Component res = impl != null ? impl.getQueuePane(params) : null; if (res != null) { return res; } final ProcessInstance pi = params.getProcessInstance(); Panel p = new Panel(getQueuePaneHeader(params)); VerticalLayout vl = new VerticalLayout(); Component titleLabel = createQueuePaneTitle(params); HorizontalLayout hl = horizontalLayout("100%", titleLabel); hl.setExpandRatio(titleLabel, 1.0f); vl.addComponent(hl); Component button = createQueuePaneAssignButton(params); Component comment = createQueuePaneStateCommentary(params); vl.addComponent(horizontalLayout(comment, button)); Component processInfo = createQueuePaneProcessInfo(params); if (processInfo != null) { vl.addComponent(processInfo); } vl.setWidth("100%"); if (pi.getKeyword() != null) { vl.addComponent(createQueuePaneKeyword(params)); } if (pi.getDescription() != null) { vl.addComponent(createQueuePaneDescription(params)); } p.setWidth("100%"); p.addComponent(vl); return p; } protected String getQueuePaneHeader(TaskItemProviderParams params) { return getProcessDescription(params) + " " + getProcessId(params.getProcessInstance()) + " " + formatDate(params.getProcessInstance().getCreateDate()); } protected String getProcessId(ProcessInstance pi) { return nvl(pi.getExternalKey(), pi.getInternalId()); } protected Component createQueuePaneTitle(TaskItemProviderParams params) { Label titleLabel = new Label(params.getMessage(params.getState())); titleLabel.addStyleName("h2 color processtool-title"); titleLabel.setWidth("100%"); return titleLabel; } protected Component createQueuePaneStateCommentary(TaskItemProviderParams params) { return new Label(nvl(params.getMessage(params.getProcessStateConfiguration().getCommentary()), ""), Label.CONTENT_XHTML); } protected Component createQueuePaneKeyword(TaskItemProviderParams params) { return new Label(params.getProcessInstance().getKeyword()); } protected Component createQueuePaneDescription(TaskItemProviderParams params) { return new Label(params.getProcessInstance().getDescription()); } protected Component createQueuePaneAssignButton(final TaskItemProviderParams params) { return VaadinUtility.link(params.getMessage("activity.tasks.task-claim"), new Button.ClickListener() { @Override public void buttonClick(final Button.ClickEvent event) { params.onClick(); } }); } protected Component join(Component c1, Component c2) { if (c1 == null) { return c2; } if (c2 == null) { return c1; } VerticalLayout vl = new VerticalLayout(); vl.addComponent(c1); vl.addComponent(c2); return vl; } }