/* * Smart GWT (GWT for SmartClient) * Copyright 2008 and beyond, Isomorphic Software, Inc. * * Smart GWT is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. Smart GWT is also * available under typical commercial license terms - see * http://smartclient.com/license * * This software 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 * Lesser General Public License for more details. */ package com.smartgwt.client.util.workflow; import com.smartgwt.client.event.*; import com.smartgwt.client.core.*; import com.smartgwt.client.types.*; import com.smartgwt.client.data.*; import com.smartgwt.client.data.events.*; import com.smartgwt.client.rpc.*; import com.smartgwt.client.widgets.*; import com.smartgwt.client.widgets.events.*; import com.smartgwt.client.widgets.form.*; import com.smartgwt.client.widgets.form.validator.*; import com.smartgwt.client.widgets.form.fields.*; import com.smartgwt.client.widgets.tile.*; import com.smartgwt.client.widgets.tile.events.*; import com.smartgwt.client.widgets.grid.*; import com.smartgwt.client.widgets.grid.events.*; import com.smartgwt.client.widgets.chart.*; import com.smartgwt.client.widgets.layout.*; import com.smartgwt.client.widgets.layout.events.*; import com.smartgwt.client.widgets.menu.*; import com.smartgwt.client.widgets.tab.*; import com.smartgwt.client.widgets.toolbar.*; import com.smartgwt.client.widgets.tree.*; import com.smartgwt.client.widgets.tree.events.*; import com.smartgwt.client.widgets.viewer.*; import com.smartgwt.client.widgets.calendar.*; import com.smartgwt.client.widgets.calendar.events.*; import com.smartgwt.client.widgets.cube.*; import java.util.*; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.Element; import com.smartgwt.client.util.*; import com.google.gwt.event.shared.*; import com.google.gwt.event.shared.HasHandlers; /** * A ProcessElement is an abstract superclass for elements involved in a {@link com.smartgwt.client.util.workflow.Process}, * such as a {@link com.smartgwt.client.util.workflow.Task} or {@link com.smartgwt.client.util.workflow.XORGateway}. */ public abstract class ProcessElement extends BaseClass { public ProcessElement(){ scClassName = "ProcessElement"; } public ProcessElement(JavaScriptObject jsObj){ super(jsObj); } public ProcessElement(String ID) { setID(ID); scClassName = "ProcessElement"; } public ProcessElement(String ID, String nextElement) { setID(ID); setNextElement(nextElement); scClassName = "ProcessElement"; } public native JavaScriptObject create()/*-{ var config = this.@com.smartgwt.client.core.BaseClass::getConfig()(); var scClassName = this.@com.smartgwt.client.core.BaseClass::scClassName; return $wnd.isc[scClassName].create(config); }-*/; // ********************* Properties / Attributes *********************** /** * Optional ID for this process element, allowing it to be referred to from {@link * com.smartgwt.client.util.workflow.ProcessElement#getGateway Gateway}s, or as the {@link * com.smartgwt.client.util.workflow.Process#getStartElement startElement}. See {@link * com.smartgwt.client.util.workflow.ProcessSequence} and {@link com.smartgwt.client.util.workflow.Process} to understand * when this is required or can be omitted. <P> Unlike {@link com.smartgwt.client.widgets.Canvas#getID ID} a * <code>processElement</code>'s is a not a globally unique variable, it need only by unique within it's process. <P> When * assigned an ID, a <code>processElement</code> can be retrieve via {@link * com.smartgwt.client.util.workflow.Process#getElement Process.getElement}. * * @param ID ID Default value is null * @throws IllegalStateException this property cannot be changed after the underlying component has been created */ public void setID(String ID) throws IllegalStateException { setAttribute("ID", ID, false); } /** * Optional ID for this process element, allowing it to be referred to from {@link * com.smartgwt.client.util.workflow.ProcessElement#getGateway Gateway}s, or as the {@link * com.smartgwt.client.util.workflow.Process#getStartElement startElement}. See {@link * com.smartgwt.client.util.workflow.ProcessSequence} and {@link com.smartgwt.client.util.workflow.Process} to understand * when this is required or can be omitted. <P> Unlike {@link com.smartgwt.client.widgets.Canvas#getID ID} a * <code>processElement</code>'s is a not a globally unique variable, it need only by unique within it's process. <P> When * assigned an ID, a <code>processElement</code> can be retrieve via {@link * com.smartgwt.client.util.workflow.Process#getElement Process.getElement}. * * * @return String */ public String getID() { return getAttributeAsString("ID"); } /** * Next {@link com.smartgwt.client.util.workflow.Process#getSequences sequence} or {@link * com.smartgwt.client.util.workflow.Process#getElements element} to execute after this one completes. Sequences are * checked first. <code>nextElement</code> does not need to be specified on most elements if you use {@link * com.smartgwt.client.util.workflow.Process#getSequences sequences}. * * @param nextElement nextElement Default value is null * @throws IllegalStateException this property cannot be changed after the underlying component has been created */ public void setNextElement(String nextElement) throws IllegalStateException { setAttribute("nextElement", nextElement, false); } /** * Next {@link com.smartgwt.client.util.workflow.Process#getSequences sequence} or {@link * com.smartgwt.client.util.workflow.Process#getElements element} to execute after this one completes. Sequences are * checked first. <code>nextElement</code> does not need to be specified on most elements if you use {@link * com.smartgwt.client.util.workflow.Process#getSequences sequences}. * * * @return String */ public String getNextElement() { return getAttributeAsString("nextElement"); } // ********************* Methods *********************** // ********************* Static Methods *********************** // *********************************************************** private JavaScriptObject jsObj; private Map<String, ProcessElement[]> elementParameters = new HashMap<String, ProcessElement[]>(); // IDs for elements are not unique, also all elements should be created when process // started, so elements don't act as BaseClass public boolean isCreated(){ return this.jsObj != null; } public JavaScriptObject getJsObj(){ return this.jsObj; } public JavaScriptObject getOrCreateJsObj() { if (this.jsObj == null) { this.jsObj = create(); for (String key : elementParameters.keySet()) { setProperty(key, ProcessElement.convertToJavaScriptArray(elementParameters.get(key))); } JSOHelper.setAttribute(jsObj, SC.REF, this); onInit(); } return this.jsObj; } public void setAttribute(String attribute, ProcessElement[] value, boolean allowPostCreate) { if (!isCreated()) { elementParameters.put(attribute, value); } else if (allowPostCreate) { elementParameters.put(attribute, value); setProperty(attribute, ProcessElement.convertToJavaScriptArray(value)); } else { error(attribute, value.toString(), allowPostCreate); } } public ProcessElement[] getProcessElements(String attribute) { return elementParameters.get(attribute); } public static JavaScriptObject convertToJavaScriptArray(ProcessElement[] array) { if(array == null) return null; JavaScriptObject jsArray = JSOHelper.createJavaScriptArray(); for (int i = 0; i < array.length; i++) { JSOHelper.setArrayValue(jsArray, i, array[i].getOrCreateJsObj()); } return jsArray; } }