/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.openkm.frontend.client.widget.dashboard.workflow; import java.util.List; import java.util.ListIterator; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.openkm.frontend.client.Main; import com.openkm.frontend.client.bean.GWTTaskInstance; import com.openkm.frontend.client.widget.ConfirmPopup; import com.openkm.frontend.client.widget.dashboard.Status; /** * WorkflowWidget * * @author jllort * */ public class WorkflowWidget extends Composite { private static final int TYPE_PENDING_TASK = 1; private static final int TYPE_POOLED_TASK = 2; private static int HEADER_SQUARE = 24; private static int SEPARATOR_HEIGHT = 20; private static int SEPARATOR_WIDTH = 20; private VerticalPanel vPanel; private SimplePanel spTop; private HorizontalPanel hPanel; private SimplePanel spLeft; private VerticalPanel vCenterPanel; private SimplePanel spRight; private Header header; private SimplePanel panelData; private FlexTable table; private Image zoomImage; private boolean zoom = false; private boolean flagZoom = true; public Status status; private String headerTextKey; private int widgetType = TYPE_PENDING_TASK; private GWTTaskInstance taskInstancePooled = null; private double processToExecuteNextTask = -1; /** * WorkflowWidget */ public WorkflowWidget(String headerTextKey, String iconUrl, boolean zoom) { status = new Status(); status.setStyleName("okm-StatusPopup"); spTop = new SimplePanel(); spLeft = new SimplePanel(); spRight = new SimplePanel(); panelData = new SimplePanel(); table = new FlexTable(); vCenterPanel = new VerticalPanel(); hPanel = new HorizontalPanel(); header = new Header(iconUrl, zoom); vPanel = new VerticalPanel(); this.headerTextKey = headerTextKey; // Sets or unsets visible table table.setVisible(zoom); header.setHeaderText(Main.i18n(headerTextKey)); panelData.add(table); vCenterPanel.add(header); vCenterPanel.add(panelData); hPanel.add(spLeft); hPanel.add(vCenterPanel); hPanel.add(spRight); vPanel.add(spTop); vPanel.add(hPanel); spTop.setHeight(""+SEPARATOR_HEIGHT); spLeft.setWidth(""+SEPARATOR_WIDTH); spRight.setWidth(""+SEPARATOR_WIDTH); vPanel.setStyleName("okm-DashboardWidget "); panelData.setStyleName("data"); table.setStyleName("okm-NoWrap"); panelData.setWidth("99.6%"); header.setWidth("100%"); table.setCellPadding(0); table.setCellSpacing(0); vPanel.addStyleName("okm-DisableSelect"); initWidget(vPanel); } /** * setHeaderText * * @param text */ public void setHeaderText(String text) { header.setHeaderText(text); } /** * setHeaderResults * * @param value */ public void setHeaderResults(int value) { header.setHeaderResults(value); } /** * setWidth * * @param width */ public void setWidth(int width) { vCenterPanel.setWidth(""+(width-2*SEPARATOR_WIDTH)); } /** * removeAllRows */ private void removeAllRows() { while (table.getRowCount()>0) { table.removeRow(0); } } /** * Setting documents * * @param docList document list */ public void setTasks(List<GWTTaskInstance> taskIntanceList) { int tasksNotViewed = 0; removeAllRows(); for (ListIterator<GWTTaskInstance> it = taskIntanceList.listIterator(); it.hasNext();) { int row = table.getRowCount(); final GWTTaskInstance taskInstanceResult = it.next(); if (taskInstanceResult.getProcessInstance().getId() == processToExecuteNextTask) { processToExecuteNextTask = -1; Main.get().mainPanel.dashboard.workflowDashboard.workflowFormPanel.setTaskInstance(taskInstanceResult); } Anchor taskName = new Anchor(); taskName.setText(taskInstanceResult.getName()); taskName.setTitle(taskInstanceResult.getProcessInstance().getProcessDefinition().getName()); switch (widgetType) { case TYPE_PENDING_TASK: taskName.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Main.get().mainPanel.dashboard.workflowDashboard.workflowFormPanel.setTaskInstance(taskInstanceResult); } }); break; case TYPE_POOLED_TASK: taskName.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Main.get().confirmPopup.setConfirm(ConfirmPopup.CONFIRM_GET_POOLED_WORKFLOW_TASK); Main.get().confirmPopup.show(); taskInstancePooled = taskInstanceResult; } }); break; } taskName.setStyleName("okm-Hyperlink"); table.setHTML(row, 0, ""); table.setWidget(row, 1, taskName); DateTimeFormat dtf = DateTimeFormat.getFormat(Main.i18n("general.date.pattern")); table.setHTML(row, 2, dtf.format(taskInstanceResult.getCreate())); table.getCellFormatter().setWidth(row, 0, "20"); table.getCellFormatter().setWidth(row, 1, "100%"); // Table sets de 100% of space table.getCellFormatter().setHorizontalAlignment(row, 2, HasAlignment.ALIGN_RIGHT); tasksNotViewed++; table.getRowFormatter().setStyleName(row, "okm-NotViewed"); } header.setHeaderNotViewedResults(tasksNotViewed); } /** * getNotViewed * * @return */ public int getNotViewed() { return header.getNotViewed(); } /** * Refreshing language */ public void langRefresh() { header.setHeaderText(Main.i18n(headerTextKey)); header.setHeaderNotViewedResults(header.getNotViewed()); } /** * Header * * @author jllort * */ private class Header extends HorizontalPanel implements HasClickHandlers { private SimplePanel spLeft; private SimplePanel spRight; private SimplePanel iconImagePanel; private HorizontalPanel center; private HorizontalPanel titlePanel; private HTML headerText; private HTML headerResults; private HTML headerNotViewedResults; private int notViewed = 0; private Image iconImage; /** * Header */ public Header(String iconUrl, boolean visible) { super(); sinkEvents(Event.ONCLICK); iconImage = new Image(iconUrl); zoom = visible; if (zoom) { zoomImage = new Image("img/zoom_out.gif"); } else { zoomImage = new Image("img/zoom_in.gif"); } zoomImage.setStyleName("okm-Hyperlink"); addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (flagZoom) { zoom = !zoom; table.setVisible(zoom); if (zoom) { zoomImage.setUrl("img/zoom_out.gif"); } else { zoomImage.setUrl("img/zoom_in.gif"); } } else { flagZoom = true; } } }); setHeight(""+HEADER_SQUARE); spLeft = new SimplePanel(); spRight = new SimplePanel(); iconImagePanel = new SimplePanel(); center = new HorizontalPanel(); titlePanel = new HorizontalPanel(); headerText = new HTML(""); headerResults = new HTML(""); headerNotViewedResults = new HTML(""); iconImagePanel.add(iconImage); titlePanel.add(headerText); titlePanel.add(headerResults); center.add(iconImagePanel); center.add(titlePanel); center.add(headerNotViewedResults); center.add(zoomImage); spLeft.setSize(""+HEADER_SQUARE, ""+HEADER_SQUARE); center.setWidth("100%"); center.setCellVerticalAlignment(iconImagePanel, HasAlignment.ALIGN_MIDDLE); center.setCellHorizontalAlignment(iconImagePanel, HasAlignment.ALIGN_LEFT); center.setCellHorizontalAlignment(zoomImage, HasAlignment.ALIGN_RIGHT); center.setCellVerticalAlignment(titlePanel, HasAlignment.ALIGN_MIDDLE); center.setCellVerticalAlignment(headerNotViewedResults, HasAlignment.ALIGN_MIDDLE); center.setCellHorizontalAlignment(headerNotViewedResults, HasAlignment.ALIGN_RIGHT); center.setCellVerticalAlignment(zoomImage, HasAlignment.ALIGN_MIDDLE); center.setCellWidth(iconImagePanel, "22"); center.setCellWidth(zoomImage, "16"); center.setHeight(""+HEADER_SQUARE); spRight.setSize(""+HEADER_SQUARE, ""+HEADER_SQUARE); titlePanel.setCellVerticalAlignment(headerResults, HasAlignment.ALIGN_MIDDLE); titlePanel.setCellVerticalAlignment(headerNotViewedResults, HasAlignment.ALIGN_MIDDLE); titlePanel.setCellHorizontalAlignment(headerResults, HasAlignment.ALIGN_LEFT); titlePanel.setCellHorizontalAlignment(headerNotViewedResults, HasAlignment.ALIGN_LEFT); add(spLeft); add(center); add(spRight); spLeft.setStyleName("topLeft"); center.setStyleName("topCenter"); spRight.setStyleName("topRight"); setCellWidth(spLeft, ""+HEADER_SQUARE); setCellWidth(spRight, ""+HEADER_SQUARE); setCellVerticalAlignment(center, HasAlignment.ALIGN_MIDDLE); } /** * setHeaderText * * @param text */ public void setHeaderText(String text) { headerText.setHTML(text); } /** * setHeaderResults * * @param value */ public void setHeaderResults(int value) { headerResults.setHTML("  (" + value + ")  "); } /** * setHeaderNotViewedResults * * @param value */ public void setHeaderNotViewedResults(int value) { notViewed = value; if (value>0) { headerNotViewedResults.setHTML(" " + value + "  "); titlePanel.setStyleName("okm-NotViewed"); headerNotViewedResults.setStyleName("okm-NotViewed"); } else { headerNotViewedResults.setHTML(""); titlePanel.removeStyleName("okm-NotViewed"); headerNotViewedResults.removeStyleName("okm-NotViewed"); } } /** * getNotViewed * * @return */ public int getNotViewed() { return notViewed; } /* (non-Javadoc) * @see com.google.gwt.event.dom.client.HasClickHandlers#addClickHandler(com.google.gwt.event.dom.client.ClickHandler) */ @Override public HandlerRegistration addClickHandler(ClickHandler handler) { return addHandler(handler, ClickEvent.getType()); } } /** * Sets the refreshing */ public void setRefreshing() { int left = getAbsoluteLeft() + ((getOffsetWidth()-status.getOffsetWidth())/2); int top = getAbsoluteTop() + ((getOffsetHeight()-status.getOffsetHeight())/2); status.setFlag_getDashboard(); if (zoom) { status.refresh(left, top); } } /** * Unsets the refreshing */ public void unsetRefreshing() { status.unsetFlag_getDashboard(); } /** * Sets the widget as pending task */ public void setIsWidgetPendingTask() { widgetType = TYPE_PENDING_TASK; } /** * Sets the widget as pooled task */ public void setIsWidgetPooledTask() { widgetType = TYPE_POOLED_TASK; } /** * The users gets the pooled task instance */ public GWTTaskInstance getPooledTaskInstance() { return taskInstancePooled; } /** * resets the pooled task instance */ public void resetPooledTaskInstance() { taskInstancePooled = null; } /** * @param processToExecuteNextTask */ public void setProcessToExecuteNextTask(double processToExecuteNextTask) { this.processToExecuteNextTask = processToExecuteNextTask; } }