package org.lobobrowser.html.domimpl; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.lobobrowser.html.style.ComputedJStyleProperties; import org.lobobrowser.html.style.JStyleProperties; import org.lobobrowser.js.HideFromJS; import org.w3c.dom.Text; import cz.vutbr.web.css.NodeData; import cz.vutbr.web.css.Term; import cz.vutbr.web.css.TermFunction; import cz.vutbr.web.css.TermIdent; import cz.vutbr.web.css.TermList; import cz.vutbr.web.css.TermString; import cz.vutbr.web.css.TermURI; // TODO: Extend a common interface or a minimal class instead of HTMLElementImpl public class GeneratedElement extends HTMLElementImpl { private final NodeData nodeData; private JStyleProperties currentStyle; private final @NonNull TermList content; public GeneratedElement(final HTMLElementImpl parent, final NodeData nodeData, final @NonNull TermList content) { super(""); setParentImpl(parent); setOwnerDocument(parent.getOwnerDocument()); this.nodeData = nodeData; this.content = content; } @HideFromJS public @NonNull JStyleProperties getCurrentStyle() { synchronized (this) { if (currentStyle != null) { return currentStyle; } currentStyle = new ComputedJStyleProperties(this, nodeData, true); return currentStyle; } } @Override public NodeImpl[] getChildrenArray() { final ArrayList<NodeImpl> nodeList = new ArrayList<>(); for (final Term<?> c : content) { if (c instanceof TermIdent) { // TODO } else if (c instanceof TermString) { final String value = ((TermString) c).getValue(); final Text txt = getOwnerDocument().createTextNode(value); nodeList.add((NodeImpl) txt); } else if (c instanceof TermURI) { // TODO } else if (c instanceof TermFunction) { final TermFunction f = (TermFunction) c; if (f.getFunctionName().equals("attr")) { final List<Term<?>> params = f.getValue(); if (params.size() > 0) { final String val = ((ElementImpl) getParentNode()).getAttribute(params.get(0).toString()); if (val != null) { final Text txt = getOwnerDocument().createTextNode(val); nodeList.add((NodeImpl) txt); } } } else { // TODO } } } return nodeList.toArray(new NodeImpl[nodeList.size()]); } }