FormChoiceListField.java 10.5 KB
/*
 * Decompiled with CFR 0_118.
 */
package com.adobe.xfa.form;

import com.adobe.xfa.AppModel;
import com.adobe.xfa.Attribute;
import com.adobe.xfa.Chars;
import com.adobe.xfa.Document;
import com.adobe.xfa.Element;
import com.adobe.xfa.Generator;
import com.adobe.xfa.Model;
import com.adobe.xfa.Node;
import com.adobe.xfa.Schema;
import com.adobe.xfa.StringAttr;
import com.adobe.xfa.TextNode;
import com.adobe.xfa.XFA;
import com.adobe.xfa.XMLMultiSelectNode;
import com.adobe.xfa.content.Content;
import com.adobe.xfa.content.ExDataValue;
import com.adobe.xfa.content.TextValue;
import com.adobe.xfa.data.DataModel;
import com.adobe.xfa.data.DataNode;
import com.adobe.xfa.form.FormDataListener;
import com.adobe.xfa.form.FormField;
import com.adobe.xfa.ut.StringUtils;

public class FormChoiceListField
extends FormField {
    public FormChoiceListField(Element parent, Node prevSibling) {
        super(parent, prevSibling);
    }

    @Override
    void setDataNode(DataNode dataNode, boolean bUpdateData, boolean bPeerNode, String sConnectPicture, boolean bDefault) {
        if (this.getFormDataListener() != null && bPeerNode) {
            this.setFormDataListener(null);
        }
        if (dataNode == null || dataNode.getClassTag() != XFA.DATAGROUPTAG) {
            return;
        }
        if (bPeerNode) {
            this.setFormDataListener(new FormDataListener(this, dataNode));
        }
        if (bPeerNode && null != this.getFormDataListener()) {
            this.getFormDataListener().deafen();
        }
        if (bUpdateData) {
            this.setData(dataNode);
        } else {
            this.setFromData(dataNode);
        }
        if (bPeerNode && null != this.getFormDataListener()) {
            this.getFormDataListener().unDeafen();
        }
    }

    public boolean getIsNull(boolean bCheckData) {
        DataNode dataNode = this.getDataNode();
        if (bCheckData && dataNode != null) {
            return dataNode.getIsNull();
        }
        Element value = this.getElement(XFA.VALUETAG, true, 0, false, false);
        if (value != null) {
            Content content = (Content)value.getOneOfChild(true, false);
            if (content == null) {
                return true;
            }
            if (content.getIsNull()) {
                return true;
            }
            if (!content.couldBeNull()) {
                return false;
            }
        } else {
            return true;
        }
        return false;
    }

    @Override
    public void setIsNull(boolean bNull, boolean bNotify) {
    }

    void setFromData(DataNode dataNode) {
        String sValue;
        Attribute attr;
        boolean bDefault = true;
        if (dataNode == null) {
            bDefault = false;
            FormDataListener listener = this.getFormDataListener();
            if (listener != null) {
                dataNode = listener.getDataNode();
            } else {
                return;
            }
        }
        if (!dataNode.isSameClass("dataGroup")) {
            return;
        }
        Element value = this.getElement(XFA.VALUETAG, 0);
        Element valueContent = (Element)value.getOneOfChild();
        if (!valueContent.isSameClass(XFA.EXDATATAG)) {
            TextNode textNode;
            String sValue2 = "";
            if (valueContent.isSameClass(XFA.TEXTTAG) && (textNode = valueContent.getText(true, false, false)) != null) {
                sValue2 = textNode.getValue();
            }
            valueContent.remove();
            Model model = this.getModel();
            Element exData = model.getSchema().getInstance(XFA.EXDATATAG, model, value, null, true);
            StringAttr oContentType = new StringAttr("contentType", "text/xml");
            exData.setAttribute(oContentType, XFA.CONTENTTYPETAG);
            value.setOneOfChild(exData);
            valueContent = (Element)value.getOneOfChild();
            if (!StringUtils.isEmpty(sValue2)) {
                Element exData2 = (Element)value.getOneOfChild();
                Element oMultiSelect = model.getSchema().getInstance(XFA.XMLMULTISELECTNODETAG, model, exData2, null, true);
                ((XMLMultiSelectNode)oMultiSelect).setValue(sValue2);
            }
        } else {
            String sContentType;
            int index = valueContent.findAttr(null, "contentType");
            if (index != -1 && !"text/xml".equals(sContentType = valueContent.getAttrVal(index))) {
                StringAttr contentType = new StringAttr("contentType", "text/xml");
                valueContent.setAttribute(contentType, XFA.CONTENTTYPETAG);
            }
        }
        Element fvNode = valueContent;
        Node dvNode = dataNode.getXmlPeer();
        Node importedNode = fvNode.getOwnerDocument().importNode(dvNode, true);
        if (importedNode instanceof Element && null != (attr = ((Element)importedNode).getAttributeByName("dataNode", false)) && null != (sValue = attr.getAttrValue()) && sValue.equals("dataGroup")) {
            ((Element)importedNode).removeAttr(attr.getNS(), attr.getName());
        }
        ((ExDataValue)valueContent).setContent(importedNode, bDefault);
    }

    @Override
    void setData(DataNode dataNode) {
        Node valueContent;
        Element value;
        if (dataNode == null) {
            FormDataListener listener = this.getFormDataListener();
            if (listener != null) {
                dataNode = listener.getDataNode();
            }
            if (dataNode == null) {
                return;
            }
        }
        if (dataNode.getClassTag() != XFA.DATAGROUPTAG) {
            return;
        }
        while (dataNode.getFirstXFAChild() != null) {
            dataNode.getFirstXFAChild().remove();
        }
        if (this.getIsNull(false)) {
            value = this.getElement(XFA.VALUETAG, true, 0, false, false);
            boolean bLegacyScripting = false;
            if (this.getAppModel().getLegacySetting(AppModel.XFA_LEGACY_V34_SCRIPTING)) {
                bLegacyScripting = true;
            }
            if (value == null || !bLegacyScripting && value.isDefault(false)) {
                value = this.getElement(XFA.VALUETAG, false, 0, false, false);
                Model model = this.getModel();
                Element exData = model.getSchema().getInstance(XFA.EXDATATAG, model, value, null, true);
                StringAttr contentType = new StringAttr("contentType", "text/xml");
                exData.setAttribute(contentType, XFA.CONTENTTYPETAG);
                model.getSchema().getInstance(XFA.XMLMULTISELECTNODETAG, model, exData, null, true);
            }
        }
        if ((valueContent = (value = this.getElement(XFA.VALUETAG, 0)).getOneOfChild()) instanceof Content) {
            Model model;
            String sValue;
            Node valueContentChild = null;
            if (valueContent instanceof ExDataValue) {
                ExDataValue exDataValue = (ExDataValue)valueContent;
                valueContentChild = exDataValue.getOneOfChild(true, false);
                if (valueContentChild == null) {
                    Model model2 = this.getModel();
                    valueContentChild = model2.getSchema().getInstance(XFA.XMLMULTISELECTNODETAG, model2, exDataValue, null, true);
                }
            } else if (valueContent instanceof TextValue) {
                TextValue textValue = (TextValue)valueContent;
                sValue = textValue.toString();
                valueContent.remove();
                model = this.getModel();
                Element exData = model.getSchema().getInstance(XFA.EXDATATAG, model, value, null, true);
                StringAttr contentType = new StringAttr("contentType", "text/xml");
                exData.setAttribute(contentType, XFA.CONTENTTYPETAG);
                value.setOneOfChild(exData);
                exData = (Element)value.getOneOfChild();
                valueContentChild = exData.getOneOfChild(true, false);
                if (valueContentChild == null) {
                    valueContentChild = model.getSchema().getInstance(XFA.XMLMULTISELECTNODETAG, model, exData, null, true);
                    if (!StringUtils.isEmpty(sValue)) {
                        ((XMLMultiSelectNode)valueContentChild).setValue(sValue);
                    }
                }
            } else {
                return;
            }
            if (valueContentChild != null) {
                if (valueContentChild instanceof XMLMultiSelectNode) {
                    Node fvNode = valueContentChild;
                    Element dvNode = (Element)dataNode.getXmlPeer();
                    Document doc = dvNode.getOwnerDocument();
                    DataModel dataModel = (DataModel)dataNode.getModel();
                    for (Node fvChild = fvNode.getFirstXMLChild(); fvChild != null; fvChild = fvChild.getNextXMLSibling()) {
                        if (fvChild instanceof Chars && ((Chars)fvChild).isXMLSpace()) continue;
                        Node importedNode = doc.importNode(fvChild, true);
                        dvNode.appendChild(importedNode);
                        dataModel.loadNode(dataNode, importedNode, new Generator("", ""));
                    }
                } else if (valueContentChild instanceof TextNode) {
                    Node domTextNode = valueContentChild;
                    sValue = domTextNode.getData();
                    model = this.getModel();
                    assert (model != null);
                    if (model != null) {
                        valueContentChild = model.getSchema().getInstance(XFA.XMLMULTISELECTNODETAG, model, value, null, true);
                        value.setOneOfChild(valueContentChild);
                        Document doc = dataNode.getOwnerDocument();
                        DataModel dataModel = (DataModel)dataNode.getModel();
                        assert (dataModel != null);
                        if (dataModel != null) {
                            String sSeparator = "\n";
                            String[] split = sValue.split(sSeparator);
                            for (int i = 0; i < split.length; ++i) {
                                String sToken = split[i];
                                model.createTextNode(value, valueContentChild, sToken);
                                Node importedNode = doc.importNode(valueContentChild, true);
                                dataNode.appendChild(importedNode);
                                dataModel.loadNode(dataNode, importedNode, new Generator("", ""));
                            }
                        }
                    }
                } else assert (false);
            }
        }
    }
}