/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.ie.widget;
import java.awt.Font;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import java.util.logging.Logger;
import org.apache.commons.lang.StringUtils;
import org.openflexo.foundation.AttributeDataModification;
import org.openflexo.foundation.bindings.AbstractBinding;
import org.openflexo.foundation.bindings.BindingDefinition.BindingDefinitionType;
import org.openflexo.foundation.bindings.StaticBinding;
import org.openflexo.foundation.bindings.StringStaticBinding;
import org.openflexo.foundation.bindings.WidgetBindingDefinition;
import org.openflexo.foundation.dkv.Domain;
import org.openflexo.foundation.ie.ComponentInstance;
import org.openflexo.foundation.ie.ComponentInstanceOwner;
import org.openflexo.foundation.ie.HTMLListDescriptor;
import org.openflexo.foundation.ie.IEObject;
import org.openflexo.foundation.ie.IEPopupComponent;
import org.openflexo.foundation.ie.IEWOComponent;
import org.openflexo.foundation.ie.IObject;
import org.openflexo.foundation.ie.OperationComponentInstance;
import org.openflexo.foundation.ie.PopupComponentInstance;
import org.openflexo.foundation.ie.cl.ComponentDefinition;
import org.openflexo.foundation.ie.cl.OperationComponentDefinition;
import org.openflexo.foundation.ie.cl.PopupComponentDefinition;
import org.openflexo.foundation.ie.cl.TabComponentDefinition;
import org.openflexo.foundation.ie.dm.ContentTypeChanged;
import org.openflexo.foundation.ie.dm.IEDataModification;
import org.openflexo.foundation.ie.dm.WidgetAttributeChanged;
import org.openflexo.foundation.ie.util.ClientSideEventType;
import org.openflexo.foundation.ie.util.HyperlinkActionType;
import org.openflexo.foundation.ie.util.HyperlinkType;
import org.openflexo.foundation.ie.util.TextFieldType;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.validation.FixProposal;
import org.openflexo.foundation.validation.ValidationError;
import org.openflexo.foundation.validation.ValidationIssue;
import org.openflexo.foundation.validation.ValidationRule;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.dm.WKFAttributeDataModification;
import org.openflexo.foundation.wkf.node.ActionNode;
import org.openflexo.foundation.wkf.node.OperationNode;
import org.openflexo.foundation.xml.FlexoComponentBuilder;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.ToolBox;
/**
* Represents an hyperlink widget
*
* @author bmangez
*/
public class IEHyperlinkWidget extends IEControlWidget implements ComponentInstanceOwner, Comparable<IEHyperlinkWidget>,
IEWidgetWithValueList, IEWidgetWithMainBinding {
private static final Logger logger = FlexoLogger.getLogger(IEHyperlinkWidget.class.getPackage().getName());
private static final java.awt.Font BUTTON_FONT = new Font("SansSerif", Font.BOLD, 10);
public static final String HYPERLINK_WIDGET = "hyperlink_widget";
public static final String CUSTOM_METHOD = "customMethod";
private Domain domain;
private String domainName;
private TextFieldType _fieldType;
private boolean isHTML = false;
private HyperlinkType _hyperlinkType = null;
private boolean _isSubmittingOpener = true;
private String _link;
private boolean _openInNewWindow = false;
private PopupComponentInstance _popupComponentInstance;
private String helpMessage;
private String _value;
private String _prototypeValues;
private AbstractBinding _bindingLink;
private AbstractBinding _bindingValue;
private String _bindingValueWhenEmpty;
private AbstractBinding _bindingMailSubject;
private AbstractBinding _bindingMailToAdress;
private AbstractBinding _bindingUrl;
private AbstractBinding _bindingMailBody;
private AbstractBinding _bindingClientSideScriptCode;
private ClientSideEventType _clientSideEventType;
private HyperlinkActionType _actionType;
private AbstractBinding _customMethod;
private boolean includePopupInPage = false;
private boolean isMandatoryFlexoAction = false;
private String _input;
private String _behavior;
private String _funcName;
private String _confirmMessage;
private String nextPageTabName;
private TabComponentDefinition nextPageTab;
private String _methodName;
private IETextFieldWidget dateTextfield;
private boolean submitForm = false;
private boolean isClosingPopup = false;
private boolean _isValidatingForm = true;
private boolean _isSavingChanges = false;
private boolean isCustomButton = false;
// ==========================================================================
// ============================= Constructor
// ================================
// ==========================================================================
public IEHyperlinkWidget(FlexoComponentBuilder builder) {
this(builder.woComponent, null, builder.getProject());
initializeDeserialization(builder);
}
public IEHyperlinkWidget(IEWOComponent woComponent, IEObject parent, FlexoProject prj) {
super(woComponent, parent, prj);
}
@Override
public String getDefaultInspectorName() {
return "Hyperlink.inspector";
}
@Override
public void performOnDeleteOperations() {
if (_popupComponentInstance != null) {
_popupComponentInstance.delete();
}
super.performOnDeleteOperations();
}
// ==========================================================================
// =================== AbstractButtonWidgetInterface accessors
// =====================
// ==========================================================================
public HyperlinkType getHyperlinkType() {
return _hyperlinkType;
}
public void setHyperlinkType(HyperlinkType type) {
if (getWOComponent() instanceof IEPopupComponent
&& (HyperlinkType.FLEXOACTION.equals(type) || HyperlinkType.DISPLAYACTION.equals(type))) {
return;
}
_hyperlinkType = type;
if (!isDeserializing() && !isBeingCloned() && !isCreatedByCloning()) {
if (type == HyperlinkType.FLEXOACTION || type == HyperlinkType.DISPLAYACTION) {
setIsMandatoryFlexoAction(true);
setSubmitForm(true);
}
}
setChanged();
notifyObservers(new IEDataModification("hyperlinkType", null, type));
if (type == HyperlinkType.MAILTO) {
setActionType(null);
}
}
public String getLink() {
return _link;
}
public void setLink(String link) {
this._link = link;
setChanged();
notifyObservers(new IEDataModification("link", null, link));
}
public boolean getOpenInNewWindow() {
return _openInNewWindow;
}
public void setOpenInNewWindow(boolean openInNewWindow) {
_openInNewWindow = openInNewWindow;
setChanged();
notifyObservers(new IEDataModification("openInNewWindow", null, new Boolean(openInNewWindow)));
}
public String getPrototypeValues() {
return _prototypeValues;
}
public void setPrototypeValues(String values) {
_prototypeValues = values;
setChanged();
notifyObservers(new IEDataModification("prototypeValues", null, values));
}
/**
* @see org.openflexo.foundation.ie.widget.IEWidgetWithValueList#getValueList()
*/
@Override
public List<Object> getValueList() {
return getValueList(null);
}
/**
* @see org.openflexo.foundation.ie.widget.IEWidgetWithValueList#getValueList(org.openflexo.foundation.wkf.FlexoProcess)
*/
@Override
public List<Object> getValueList(FlexoProcess process) {
return parseValueListToAppropriateType(getValue(), getPrototypeValues(), getFieldType(), getDomain(), process);
}
public String getDefaultValue() {
if (isCustomButton()) {
return ToolBox.capitalize(FlexoLocalization.localizedForKey("your_text"));
} else {
return ToolBox.capitalize(FlexoLocalization.localizedForKey("link"));
}
}
public String getValue() {
return _value;
}
public void setValue(String value) {
if (value == null || value.equals("")) {
value = "link";
}
this._value = value;
setChanged();
notifyObservers(new IEDataModification("value", null, value));
}
public Vector<ActionNode> getAllActionNodesLinkedToThisButton() {
Vector<ActionNode> actions = new Vector<ActionNode>();
for (OperationNode operatioNode : getComponentDefinition().getAllOperationNodesLinkedToThisComponent()) {
ActionNode a = operatioNode.getActionNodeForButton(this);
if (a != null) {
actions.add(a);
}
}
return actions;
}
public WidgetBindingDefinition getBindingLinkDefinition() {
return WidgetBindingDefinition.get(this, "bindingLink", String.class, BindingDefinitionType.GET, false);
}
public AbstractBinding getBindingLink() {
if (isBeingCloned()) {
return null;
}
return _bindingLink;
}
public void setBindingLink(AbstractBinding value) {
_bindingLink = value;
if (_bindingLink != null) {
_bindingLink.setOwner(this);
_bindingLink.setBindingDefinition(getBindingLinkDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingLink", null, _bindingLink));
}
public WidgetBindingDefinition getBindingValueDefinition() {
if (getFieldType() != null && getFieldType() == TextFieldType.DATE) {
return WidgetBindingDefinition.get(this, "binding_value", Date.class, BindingDefinitionType.GET, false);
}
if (getFieldType() != null && getFieldType() == TextFieldType.INTEGER) {
return WidgetBindingDefinition.get(this, "binding_value", Number.class, BindingDefinitionType.GET, false);
}
if (getFieldType() != null && getFieldType() == TextFieldType.FLOAT) {
return WidgetBindingDefinition.get(this, "binding_value", Float.class, BindingDefinitionType.GET, false);
}
if (getFieldType() != null && getFieldType() == TextFieldType.DOUBLE) {
return WidgetBindingDefinition.get(this, "binding_value", Double.class, BindingDefinitionType.GET, false);
}
return WidgetBindingDefinition.get(this, "binding_value", String.class, BindingDefinitionType.GET, false);
}
public AbstractBinding getBindingValue() {
if (isBeingCloned()) {
return null;
}
return _bindingValue;
}
public void setBindingValue(AbstractBinding value) {
_bindingValue = value;
if (_bindingValue != null) {
_bindingValue.setOwner(this);
_bindingValue.setBindingDefinition(getBindingValueDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingValue", null, _bindingValue));
}
/**
* @return Returns the _valueWhenEmpty.
*/
public String getBindingValueWhenEmpty() {
return _bindingValueWhenEmpty;
}
/**
* @param whenEmpty
* The _valueWhenEmpty to set.
*/
public void setBindingValueWhenEmpty(String whenEmpty) {
_bindingValueWhenEmpty = whenEmpty;
setChanged();
notifyObservers(new IEDataModification("bindingValueWhenEmpty", null, _bindingValueWhenEmpty));
}
public AbstractBinding getBindingMailSubject() {
if (isBeingCloned()) {
return null;
}
return _bindingMailSubject;
}
public void setBindingMailSubject(AbstractBinding value) {
_bindingMailSubject = value;
if (_bindingMailSubject != null) {
_bindingMailSubject.setOwner(this);
_bindingMailSubject.setBindingDefinition(getBindingMailSubjectDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingMailSubject", null, _bindingMailSubject));
}
public WidgetBindingDefinition getBindingMailSubjectDefinition() {
return WidgetBindingDefinition.get(this, "bindingMailSubject", String.class, BindingDefinitionType.GET, false);
}
public AbstractBinding getBindingMailBody() {
if (isBeingCloned()) {
return null;
}
return _bindingMailBody;
}
public void setBindingMailBody(AbstractBinding value) {
_bindingMailBody = value;
if (_bindingMailBody != null) {
_bindingMailBody.setOwner(this);
_bindingMailBody.setBindingDefinition(getBindingMailBodyDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingMailBody", null, _bindingMailBody));
}
public WidgetBindingDefinition getBindingMailBodyDefinition() {
return WidgetBindingDefinition.get(this, "bindingMailBody", String.class, BindingDefinitionType.GET, false);
}
public AbstractBinding getBindingMailToAdress() {
if (isBeingCloned()) {
return null;
}
return _bindingMailToAdress;
}
public void setBindingMailToAdress(AbstractBinding value) {
_bindingMailToAdress = value;
if (_bindingMailToAdress != null) {
_bindingMailToAdress.setOwner(this);
_bindingMailToAdress.setBindingDefinition(getBindingMailToAdressDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingMailToAdress", null, _bindingMailToAdress));
}
public WidgetBindingDefinition getBindingMailToAdressDefinition() {
return WidgetBindingDefinition.get(this, "bindingMailToAdress", String.class, BindingDefinitionType.GET, false);
}
public String getUrl() {
if (getBindingUrl() != null && getBindingUrl() instanceof StringStaticBinding) {
return ((StringStaticBinding) getBindingUrl()).getValue();
}
return null;
}
public void setUrl(String url) {
if (url != null) {
if (!(getBindingUrl() instanceof StringStaticBinding)) {
setBindingUrl(new StringStaticBinding(getBindingUrlDefinition(), this, url));
}
((StringStaticBinding) getBindingUrl()).setValue(url);
setChanged();
notifyModification("url", null, url);
} else {
setBindingUrl(null);
}
}
public AbstractBinding getBindingUrl() {
if (isBeingCloned() && !(_bindingUrl instanceof StaticBinding)) {
return null;
}
return _bindingUrl;
}
public void setBindingUrl(AbstractBinding value) {
_bindingUrl = value;
if (_bindingUrl != null) {
_bindingUrl.setOwner(this);
_bindingUrl.setBindingDefinition(getBindingUrlDefinition());
}
setChanged();
notifyObservers(new IEDataModification("bindingUrl", null, _bindingUrl));
}
public WidgetBindingDefinition getBindingUrlDefinition() {
return WidgetBindingDefinition.get(this, "bindingUrl", String.class, BindingDefinitionType.GET, false);
}
public PopupComponentInstance getPopupComponentInstance() {
return _popupComponentInstance;
}
public void setPopupComponentInstance(PopupComponentInstance popup) {
if (_popupComponentInstance != null) {
_popupComponentInstance.delete();
}
_popupComponentInstance = popup;
_popupComponentInstance.setOwner(this);
setChanged();
notifyObservers(new IEDataModification("popupComponentInstance", null, popup));
}
/**
* call by inspector when setting the property "popupComponentInstance". It must be done because the choosen value in the inspector's
* dropdown is of type PopupComponentDefinition.
*
* @param popupDef
*/
public void setPopupComponentDefinition(PopupComponentDefinition popupDef) {
if (popupDef != null && isInPopup()) {
logger.warning("Cannot bind a popup from a popup... sorry");
popupDef = null;
}
if (_popupComponentInstance == null && popupDef == null) {
return;
}
if (popupDef != null && _popupComponentInstance != null && _popupComponentInstance.getComponentDefinition().equals(popupDef)) {
return;
}
setChanged();
if (_popupComponentInstance != null) {
_popupComponentInstance.delete();
_popupComponentInstance = null;
}
if (popupDef != null) {
if (popupDef.isHelper()) {
setHyperlinkType(null);
}
// setting the new operationcomponent instance.
_popupComponentInstance = new PopupComponentInstance(popupDef, getWOComponent());
_popupComponentInstance.setOwner(this);
// popupDef.addToReferences(_popupComponentInstance);
}
}
public PopupComponentDefinition getPopupComponentDefinition() {
if (_popupComponentInstance == null) {
return null;
}
return _popupComponentInstance.getPopupComponentDefinition();
}
/**
* Return a Vector of embedded IEObjects at this level. NOTE that this is NOT a recursive method
*
* @return a Vector of IEObject instances
*/
@Override
public Vector<IObject> getEmbeddedIEObjects() {
Vector<IObject> answer = new Vector<IObject>();
if (getPopupComponentInstance() != null) {
answer.add(getPopupComponentInstance());
}
return answer;
}
@Override
public String getFullyQualifiedName() {
return "Hyperlink : " + (getValue() != null ? getValue() : getCalculatedLabel());
}
public static class HyperlinkUrlMustHaveAnUrl extends ValidationRule<HyperlinkUrlMustHaveAnUrl, IEHyperlinkWidget> {
public HyperlinkUrlMustHaveAnUrl() {
super(IEHyperlinkWidget.class, "hyperlink_url_must_have_an_url");
}
@Override
public ValidationIssue<HyperlinkUrlMustHaveAnUrl, IEHyperlinkWidget> applyValidation(IEHyperlinkWidget hl) {
if (hl.getHyperlinkType() == HyperlinkType.URL && StringUtils.isEmpty(hl.getUrl()) && hl.getBindingUrl() == null) {
ValidationError<HyperlinkUrlMustHaveAnUrl, IEHyperlinkWidget> error = new ValidationError<HyperlinkUrlMustHaveAnUrl, IEHyperlinkWidget>(
this, hl, "hyperlink_($object.value)_must_have_an_url");
return error;
}
return null;
}
}
public String getBehavior() {
return _behavior;
}
public void setBehavior(String behavior) {
_behavior = behavior;
setChanged();
notifyObservers(new IEDataModification("behavior", null, behavior));
}
public String getInput() {
return _input;
}
public void setInput(String input) {
_input = input;
setChanged();
notifyObservers(new IEDataModification("input", null, input));
}
public String getFuncName() {
return _funcName;
}
public void setFuncName(String s) {
_funcName = s;
setChanged();
notifyObservers(new IEDataModification("_funcName", null, _funcName));
}
/**
*
* @return
* @deprecated use getHyperlinkType()
*/
@Deprecated
public HyperlinkActionType getActionType() {
return _actionType;
}
/**
*
* @param actionType
* @deprecated use setHyperlinkType(HyperlinkType)
*/
@Deprecated
public void setActionType(HyperlinkActionType actionType) {
if (actionType != null) {
if (actionType == HyperlinkActionType.FLEXO_ACTION) {
setHyperlinkType(HyperlinkType.FLEXOACTION);
} else {
setHyperlinkType(HyperlinkType.DISPLAYACTION);
}
}
HyperlinkActionType old = _actionType;
_actionType = null;
setChanged();
notifyObservers(new WidgetAttributeChanged(WidgetAttributeChanged.ACTION_TYPE, old, actionType));
}
public boolean hasActionType() {
return getIsDisplayAction() || getIsFlexoAction();
}
public boolean getIsMandatoryFlexoAction() {
return isMandatoryFlexoAction;
}
public void setIsMandatoryFlexoAction(boolean isMandatory) {
boolean old = this.isMandatoryFlexoAction;
this.isMandatoryFlexoAction = isMandatory;
setChanged();
notifyObservers(new WidgetAttributeChanged(WidgetAttributeChanged.IS_MANDATORY_FLEXO_ACTION, new Boolean(old), new Boolean(
isMandatoryFlexoAction)));
}
public String getBeautifiedName() {
String s;
s = getLabel();
if (s == null || s.trim().length() == 0) {
s = getName();
}
if (s == null || s.trim().length() == 0) {
s = getValue();
}
if (s != null) {
return s.replace('"', ' ');
}
return s;
}
public TabComponentDefinition getNextPageTab() {
if (nextPageTab == null && nextPageTabName != null) {
nextPageTab = (TabComponentDefinition) getProject().getFlexoComponentLibrary().getComponentNamed(nextPageTabName);
}
return nextPageTab;
}
public void setNextPageTab(TabComponentDefinition nextPageTab) {
this.nextPageTab = nextPageTab;
if (nextPageTab != null) {
nextPageTabName = nextPageTab.getComponentName();
} else {
nextPageTabName = null;
}
setChanged();
notifyObservers(new IEDataModification("nextPageTab", null, nextPageTab));
}
public String getNextPageTabName() {
return nextPageTabName;
}
public void setNextPageTabName(String nextPageTabName) {
this.nextPageTabName = nextPageTabName;
nextPageTab = null;
setChanged();
notifyObservers(new IEDataModification("nextPageTabName", null, nextPageTabName));
}
public String getMethodName() {
return _methodName;
}
public void setMethodName(String methodName) {
_methodName = methodName;
setChanged();
}
/**
* Overrides getClassNameKey
*
* @see org.openflexo.foundation.FlexoModelObject#getClassNameKey()
*/
@Override
public String getClassNameKey() {
return HYPERLINK_WIDGET;
}
public IETextFieldWidget getDateTextfield() {
return dateTextfield;
}
public void setDateTextfield(IETextFieldWidget field) {
/*
* if (isCreatedByCloning()) return;
*/
IETextFieldWidget old = dateTextfield;
dateTextfield = field;
setChanged();
notifyObservers(new IEDataModification("dateTextfield", old, dateTextfield));
}
/**
* Overrides setWOComponent
*
* @see org.openflexo.foundation.ie.widget.IEWidget#setWOComponent(org.openflexo.foundation.ie.IEWOComponent)
*/
@Override
public void setWOComponent(IEWOComponent woComponent) {
if (noWOChange(woComponent)) {
return;
}
if (_popupComponentInstance != null) {
_popupComponentInstance.updateDependancies(getWOComponent(), woComponent);
}
super.setWOComponent(woComponent);// This call is very important because
// it will update the WOComponent
// components cache
if (woComponent instanceof IEPopupComponent) {
if (getHyperlinkType() == HyperlinkType.FLEXOACTION || getHyperlinkType() == HyperlinkType.DISPLAYACTION) {
setHyperlinkType(null);
}
}
}
public String getBindingValueCodeStringRepresentation() {
// TODO... but is it needed ?
return null;
}
public String getConfirmMessage() {
return _confirmMessage;
}
public WidgetBindingDefinition getBindingClientSideScriptDefinition() {
return WidgetBindingDefinition.get(this, "bindingScriptMethod", String.class, BindingDefinitionType.GET, false);
}
public String getJavascriptConfirmMessage() {
if (hasConfirmMessage()) {
return ToolBox.getJavascriptComment(_confirmMessage);
}
return null;
}
public boolean hasConfirmMessage() {
return _confirmMessage != null && _confirmMessage.trim().length() > 0;
}
public void setConfirmMessage(String m) {
String old = _confirmMessage;
_confirmMessage = m;
notifyModification("confirmMessage", old, _confirmMessage);
}
public boolean isInstantiatedInOperation(OperationNode op) {
if (!hasActionType()) {
return true;
}
Enumeration<ActionNode> en = op.getAllActionNodes().elements();
while (en.hasMoreElements()) {
ActionNode a = en.nextElement();
if (a.getAssociatedButtonWidget() != null && a.getAssociatedButtonWidget().equals(this)) {
if (!a.isActivatedByAToken()) {
return false;
} else {
return true;
}
}
}
return false;
}
@Override
public boolean areComponentInstancesValid() {
return getPopupComponentInstance() == null || getPopupComponentInstance().isValidInstance();
}
@Override
public void removeInvalidComponentInstances() {
if (getPopupComponentInstance() != null && !getPopupComponentInstance().isValidInstance()) {
_popupComponentInstance = null;// Cannot remove the dependance,
// because we don't have the
// component def anymore
}
}
/**
* Overrides getRawRowKeyPath
*
* @see org.openflexo.foundation.ie.widget.IEWidget#getRawRowKeyPath()
*/
@Override
public String getRawRowKeyPath() {
HTMLListDescriptor desc = getHTMLListDescriptor();
if (desc == null) {
return null;
}
String item = desc.getItemName();
if (item == null) {
return null;
}
if (getBindingValue() == null) {
return null;
}
if (getBindingValue().getCodeStringRepresentation().indexOf(item) > -1
&& getBindingValue().getCodeStringRepresentation().indexOf(item) + item.length() + 1 <= getBindingValue()
.getCodeStringRepresentation().length()) {
return getBindingValue().getCodeStringRepresentation().substring(
getBindingValue().getCodeStringRepresentation().indexOf(item) + item.length() + 1);
} else {
return null;
}
}
public boolean needAWorkflowConditional() {
return (getIsDisplayAction() || getIsFlexoAction()) && !isAlwaysVisible();
}
private boolean isAlwaysVisible() {
ComponentDefinition cd = getWOComponent().getComponentDefinition();
Enumeration<ComponentInstance> en = null;
if (cd instanceof OperationComponentDefinition) {
en = cd.getComponentInstances().elements();
} else if (cd instanceof TabComponentDefinition) {
en = ((TabComponentDefinition) cd).getComponentInstances().elements();
} else {
return true;
}
while (en.hasMoreElements()) {
ComponentInstance inst = en.nextElement();
if (!isInstantiatedInOperation(((OperationComponentInstance) inst).getOperationNode())) {
return false;
}
}
return true;
}
public String workflowConditionalBindingName() {
return getLabel() != null ? "showHyperlink_" + ToolBox.getJavaName(getLabel()) : "showHyperlink_" + getFlexoID();
}
public boolean isSearch() {
return getHyperlinkType() == HyperlinkType.SEARCH;
}
public boolean getSubmitForm() {
if (getHyperlinkType() != null) {
if (getHyperlinkType() == HyperlinkType.CLIENTSIDESCRIPT) {
return false;
}
}
return getIsFlexoAction() || submitForm;
}
public void setSubmitForm(boolean submitForm) {
boolean old = this.submitForm;
this.submitForm = submitForm;
setChanged();
notifyObservers(new IEDataModification("submitForm", old, submitForm));
}
@Override
public int compareTo(IEHyperlinkWidget o) {
if (getFlexoID() < o.getFlexoID()) {
return -1;
} else if (getFlexoID() == o.getFlexoID()) {
return 0;
}
return 1;
}
public boolean getIsDisplayAction() {
return getHyperlinkType() == HyperlinkType.DISPLAYACTION;
}
public boolean getIsFlexoAction() {
return getHyperlinkType() == HyperlinkType.FLEXOACTION;
}
public AbstractBinding getBindingScriptMethod() {
return _bindingClientSideScriptCode;
}
public ClientSideEventType getClientSideEventType() {
return _clientSideEventType;
}
public void setBindingScriptMethod(AbstractBinding value) {
AbstractBinding old = _bindingClientSideScriptCode;
_bindingClientSideScriptCode = value;
notifyModification("bindingScriptMethod", old, _bindingClientSideScriptCode);
}
public void setClientSideEventType(ClientSideEventType eventType) {
ClientSideEventType old = _clientSideEventType;
_clientSideEventType = eventType;
notifyModification("clientSideEventType", old, _clientSideEventType);
}
public boolean seemsToBeASelectAllLink() {
return _value != null && _value.toLowerCase().equals("all") && getRelatedCheckBox() != null;
}
public IECheckBoxWidget getRelatedCheckBox() {
if (findTDInParent() != null) {
Enumeration<IObject> en = findTDInParent().tr().htmlTable().getAllEmbeddedIEObjects().elements();
IObject temp = null;
while (en.hasMoreElements()) {
temp = en.nextElement();
if (temp instanceof IECheckBoxWidget) {
return (IECheckBoxWidget) temp;
}
}
}
return null;
}
public boolean getIsSubmittingOpener() {
return _isSubmittingOpener;
}
public void setIsSubmittingOpener(boolean value) {
boolean old = _isSubmittingOpener;
_isSubmittingOpener = value;
notifyModification("isSubmittingOpener", old, _isSubmittingOpener);
}
public boolean getIsValidatingForm() {
return _isValidatingForm;
}
public void setIsValidatingForm(boolean validate) {
boolean old = _isValidatingForm;
_isValidatingForm = validate;
notifyModification("isValidatingForm", old, _isValidatingForm);
}
public boolean getIsSavingChanges() {
return _isSavingChanges;
}
public void setIsSavingChanges(boolean validate) {
boolean old = _isSavingChanges;
_isSavingChanges = validate;
notifyModification("isSavingChanges", old, _isSavingChanges);
}
public WidgetBindingDefinition getCustomMethodBindingDefinition() {
return WidgetBindingDefinition.get(this, CUSTOM_METHOD, null, BindingDefinitionType.EXECUTE, false);
}
public AbstractBinding getCustomMethod() {
if (isBeingCloned()) {
return null;
}
return _customMethod;
}
public void setCustomMethod(AbstractBinding executionPrimitive) {
AbstractBinding oldBindingValue = _customMethod;
_customMethod = executionPrimitive;
if (_customMethod != null) {
_customMethod.setOwner(this);
_customMethod.setBindingDefinition(getCustomMethodBindingDefinition());
}
setChanged();
notifyObservers(new WKFAttributeDataModification(CUSTOM_METHOD, oldBindingValue, executionPrimitive));
}
public boolean getIncludePopupInPage() {
return includePopupInPage;
}
public void setIncludePopupInPage(boolean includePopupInPage) {
boolean old = this.includePopupInPage;
this.includePopupInPage = includePopupInPage;
setChanged();
notifyObservers(new AttributeDataModification("includePopupInPage", old, includePopupInPage));
}
@Override
protected Hashtable<String, String> getLocalizableProperties(Hashtable<String, String> props) {
if (StringUtils.isNotEmpty(getValue()) && getBindingValue() == null) {
props.put("value", getValue());
}
if (StringUtils.isNotEmpty(getConfirmMessage())) {
props.put("confirmMessage", getConfirmMessage());
}
return super.getLocalizableProperties(props);
}
public Domain getDomain() {
if (domain == null && domainName != null) {
domain = getProject().getDKVModel().getDomainNamed(domainName);
if (domain == null) {
setDomainName(null);
}
}
return domain;
}
public void setDomain(Domain domain) {
unregisterDomainObserving();
Domain old = this.domain;
this.domain = domain;
registerDomainObserving();
setChanged();
notifyObservers(new IEDataModification("domain", old, domain));
}
public String getDomainName() {
if (getDomain() != null) {
return getDomain().getName();
} else {
return null;
}
}
public void setDomainName(String domainName) {
String old = this.domainName;
this.domainName = domainName;
domain = null;
setChanged();
notifyObservers(new IEDataModification("domainName", old, domainName));
}
private void registerDomainObserving() {
if (getDomain() != null) {
getDomain().addObserver(this);
getDomain().getKeyList().addObserver(this);
getDomain().getValueList().addObserver(this);
}
}
/**
*
*/
private void unregisterDomainObserving() {
if (getDomain() != null) {
getDomain().deleteObserver(this);
getDomain().getKeyList().deleteObserver(this);
getDomain().getValueList().deleteObserver(this);
}
}
public boolean isDKVField() {
return TextFieldType.KEYVALUE.equals(getFieldType());
}
public boolean isDateField() {
return TextFieldType.DATE.equals(getFieldType());
}
public boolean isStatusField() {
return TextFieldType.STATUS_LIST.equals(getFieldType());
}
/**
* @return Returns the _formatType.
*/
public TextFieldType getFieldType() {
return _fieldType;
}
/**
* @param type
* The _formatType to set.
*/
public void setFieldType(TextFieldType type) {
TextFieldType oldType = getFieldType();
if (oldType != type) {
_fieldType = type;
setChanged();
notifyObservers(new WKFAttributeDataModification("fieldType", oldType, type));
}
}
public boolean isCustomButton() {
return isCustomButton;
}
public void setIsCustomButton(boolean isCustomButton) {
this.isCustomButton = isCustomButton;
setChanged();
notifyObservers(new IEDataModification("isCustomButton", !isCustomButton, isCustomButton));
}
public boolean getIsClosingPopup() {
return isClosingPopup;
}
public void setIsClosingPopup(boolean value) {
isClosingPopup = value;
setChanged();
notifyObservers(new IEDataModification("isClosingPopup", !isClosingPopup, isClosingPopup));
}
/**
* Getter method for the attribute isHTML
*
* @return Returns the isHTML.
*/
public boolean getIsHTML() {
return isHTML;
}
/**
* Setter method for the isHTML attribute
*
* @param isHTML
* The isHTML to set.
*/
public void setIsHTML(boolean isHTML) {
this.isHTML = isHTML;
setChanged();
notifyObservers(new ContentTypeChanged("isHTML", isHTML));
}
@Override
public String getCalculatedLabel() {
if (getLabel() != null && getLabel().trim().length() > 0) {
return ensureCalculatedLabelIsAcceptable(getLabel());
}
return ensureCalculatedLabelIsAcceptable(getValue());
}
public boolean isHyperlink() {
return true;
}
public boolean isImageButton() {
return false;
}
@Override
public final Vector<IEHyperlinkWidget> getAllButtonInterface() {
Vector<IEHyperlinkWidget> v = new Vector<IEHyperlinkWidget>();
v.add(this);
return v;
}
public boolean isDateAssistantPopup() {
return getPopupComponentDefinition() != null && getPopupComponentDefinition().getName().equals("WDLDateAssistant");
}
@Override
public String getNiceName() {
String niceName = getBeautifiedName();
if (niceName == null || niceName.trim().length() == 0) {
niceName = getCalculatedLabel();
}
if (niceName == null || niceName.trim().length() == 0) {
niceName = getFuncName();
}
if (niceName == null || niceName.trim().length() == 0) {
return getWidgetType();
}
if (Character.isDigit(niceName.trim().charAt(0))) {
return "_" + ToolBox.getJavaName(niceName);
} else {
return ToolBox.getJavaName(niceName);
}
}
public static Font getButtonFont() {
return BUTTON_FONT;
}
/**
* Validation
*/
public static class DateAssistantPopupMustBeLinkedWithADateTextField extends
ValidationRule<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget> {
public DateAssistantPopupMustBeLinkedWithADateTextField() {
super(IEHyperlinkWidget.class, "date_assistant_popup_must_be_linked_with_a_date_text_field");
}
@Override
public ValidationIssue<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget> applyValidation(IEHyperlinkWidget button) {
if (button.isDateAssistantPopup() && (button.getDateTextfield() == null || button.getDateTextfield().getParent() == null)) {
ValidationError<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget> error = new ValidationError<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget>(
this, button, "date_assistant_popup_must_be_linked_with_a_date_text_field");
IETextFieldWidget potential = findPotentialDateTextField(button);
if (potential != null) {
error.addToFixProposals(new LinkToDateTextField(potential, button));
} else {
potential = findHypotheticDateTextField(button);
if (potential != null) {
error.addToFixProposals(new ChangeFieldTypeAndLinkToDateTextField(potential, button));
}
}
return error;
}
return null;
}
IETextFieldWidget findHypotheticDateTextField(IEHyperlinkWidget bt) {
if (bt.getParent() instanceof IESequenceWidget) {
IESequenceWidget seq = (IESequenceWidget) bt.getParent();
Object prev = seq.getPrevious(bt);
if (prev != null) {
if (prev instanceof IETextFieldWidget) {
return (IETextFieldWidget) prev;
}
} else {
IETDWidget td = seq.td();
if (td != null) {
IETDWidget previousTD = (IETDWidget) td.getParent().getPrevious(td);
if (previousTD != null) {
if (previousTD.getSequenceWidget().size() == 1) {
Object pot = previousTD.getSequenceWidget().get(0);
if (pot instanceof IETextFieldWidget) {
return (IETextFieldWidget) pot;
}
}
}
}
}
}
return null;
}
IETextFieldWidget findPotentialDateTextField(IEHyperlinkWidget bt) {
if (bt.getParent() instanceof IESequenceWidget) {
IESequenceWidget seq = (IESequenceWidget) bt.getParent();
Object prev = seq.getPrevious(bt);
if (prev != null) {
if (prev instanceof IETextFieldWidget && ((IETextFieldWidget) prev).getFieldType() == TextFieldType.DATE) {
return (IETextFieldWidget) prev;
}
} else {
IETDWidget td = seq.td();
if (td != null) {
IETDWidget previousTD = (IETDWidget) td.getParent().getPrevious(td);
if (previousTD != null) {
if (previousTD.getSequenceWidget().size() == 1) {
Object pot = previousTD.getSequenceWidget().get(0);
if (pot instanceof IETextFieldWidget && ((IETextFieldWidget) pot).getFieldType() == TextFieldType.DATE) {
return (IETextFieldWidget) pot;
}
}
}
}
}
}
return null;
}
}
public static class ChangeFieldTypeAndLinkToDateTextField extends
FixProposal<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget> {
public IETextFieldWidget textField;
public IEHyperlinkWidget button;
public ChangeFieldTypeAndLinkToDateTextField(IETextFieldWidget tf, IEHyperlinkWidget bt) {
super("change_field_type_of_previous_text_field_and_link_date_assistant_with_it");
textField = tf;
button = bt;
}
@Override
protected void fixAction() {
textField.setFieldType(TextFieldType.DATE);
button.setDateTextfield(textField);
}
}
public static class LinkToDateTextField extends FixProposal<DateAssistantPopupMustBeLinkedWithADateTextField, IEHyperlinkWidget> {
public IETextFieldWidget textField;
public IEHyperlinkWidget button;
public LinkToDateTextField(IETextFieldWidget tf, IEHyperlinkWidget bt) {
super("link_date_assistant_popup_to_previous_date_textfield");
textField = tf;
button = bt;
}
@Override
protected void fixAction() {
button.setDateTextfield(textField);
}
}
public static class SetLinkTypeSearch<V extends ValidationRule<V, H>, H extends IEHyperlinkWidget> extends FixProposal<V, H> {
public IEHyperlinkWidget button;
public SetLinkTypeSearch(H bt) {
super("set_link_type_search");
button = bt;
}
@Override
protected void fixAction() {
button.setHyperlinkType(HyperlinkType.SEARCH);
}
}
public static class SetLinkTypeMailto<V extends ValidationRule<V, H>, H extends IEHyperlinkWidget> extends FixProposal<V, H> {
public IEHyperlinkWidget button;
public SetLinkTypeMailto(H bt) {
super("set_link_type_mailto");
button = bt;
}
@Override
protected void fixAction() {
button.setHyperlinkType(HyperlinkType.MAILTO);
}
}
public String getHelpMessage() {
return helpMessage;
}
public void setHelpMessage(String helpMessage) {
String old = this.helpMessage;
this.helpMessage = helpMessage;
setChanged();
notifyModification("helpMessage", old, helpMessage);
}
@Override
public String getProcessInstanceDictionaryKey() {
if (isStatusField()) {
return FlexoProcess.PROCESSINSTANCE_STATUS_KEY;
}
return super.getProcessInstanceDictionaryKey();
}
/**
* @see org.openflexo.foundation.ie.widget.IEWidgetWithMainBinding#getMainBinding()
*/
@Override
public AbstractBinding getMainBinding() {
return getBindingValue();
}
}