/******************************************************************************* * Copyright (c) 2008, 2015 Angelo Zerr and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation *******************************************************************************/ package org.eclipse.e4.ui.css.core.dom; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.e4.ui.css.core.engine.CSSEngine; import org.eclipse.e4.ui.css.core.impl.dom.CSSExtendedPropertiesImpl; import org.w3c.dom.Attr; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.TypeInfo; import org.w3c.dom.UserDataHandler; import org.w3c.dom.css.CSSStyleDeclaration; /** * {@link Element} implementation. */ public abstract class ElementAdapter implements Element, CSSStylableElement { private static final String[] EMPTY_STRING = new String[0]; private Object nativeWidget; protected CSSEngine engine; private Map <String, CSSStyleDeclaration> defaultStyleDeclarationMap = new HashMap<>(); private CSSExtendedProperties style; private List<String> staticPseudoInstances; public ElementAdapter(Object nativeWidget, CSSEngine engine) { this.nativeWidget = nativeWidget; this.engine = engine; } /** * Add static pseudo instance * * @param instance */ public void addStaticPseudoInstance(String pseudoE) { if (staticPseudoInstances == null) { staticPseudoInstances = new ArrayList<>(); } staticPseudoInstances.add(pseudoE); } @Override public boolean isStaticPseudoInstance(String s) { if (staticPseudoInstances == null) { return false; } return staticPseudoInstances.contains(s); } @Override public void copyDefaultStyleDeclarations(CSSStylableElement stylableElement) { // Copy default style decalaration this.setDefaultStyleDeclaration(null, stylableElement .getDefaultStyleDeclaration(null)); // Copy all static pseudo instances String[] staticPseudoInstances = stylableElement .getStaticPseudoInstances(); if (staticPseudoInstances != null) { for (String pseudoE : staticPseudoInstances) { CSSStyleDeclaration declaration = stylableElement .getDefaultStyleDeclaration(pseudoE); this.setDefaultStyleDeclaration(pseudoE, declaration); } } } @Override public abstract String getLocalName(); @Override public abstract String getAttribute(String arg0); @Override public String getAttributeNS(String namespace, String attr) throws DOMException { return getAttribute(attr); }; @Override public Attr getAttributeNode(String arg0) { return null; } @Override public Attr getAttributeNodeNS(String arg0, String arg1) throws DOMException { return null; } @Override public NodeList getElementsByTagName(String arg0) { return null; } @Override public NodeList getElementsByTagNameNS(String arg0, String arg1) throws DOMException { return null; } @Override public boolean hasAttribute(String arg0) { return getAttribute(arg0)!=null; } @Override public boolean hasAttributeNS(String namespace, String attr) throws DOMException { return hasAttribute(attr); } @Override public void removeAttribute(String arg0) throws DOMException { } @Override public void removeAttributeNS(String arg0, String arg1) throws DOMException { } @Override public Attr removeAttributeNode(Attr arg0) throws DOMException { return null; } @Override public void setAttribute(String arg0, String arg1) throws DOMException { } @Override public void setAttributeNS(String arg0, String arg1, String arg2) throws DOMException { } @Override public Attr setAttributeNode(Attr arg0) throws DOMException { return null; } @Override public Attr setAttributeNodeNS(Attr arg0) throws DOMException { return null; } @Override public Node appendChild(Node newChild) throws DOMException { return insertBefore(newChild, null); } @Override public Node cloneNode(boolean arg0) { return null; } @Override public NamedNodeMap getAttributes() { return null; } @Override public Node getFirstChild() { return null; } @Override public Node getLastChild() { return null; } @Override public String getTagName() { return getLocalName(); } @Override public Node getNextSibling() { return null; } @Override public String getNodeName() { // By default Node name is the same thing like localName return getLocalName(); } @Override public short getNodeType() { return ELEMENT_NODE; } @Override public String getNodeValue() throws DOMException { return null; } @Override public Document getOwnerDocument() { return null; } @Override public String getPrefix() { return null; } @Override public Node getPreviousSibling() { return null; } @Override public boolean hasAttributes() { return false; } @Override public boolean hasChildNodes() { return false; } @Override public Node insertBefore(Node newChild, Node refChild) throws DOMException { return null; } @Override public boolean isSupported(String arg0, String arg1) { return false; } @Override public void normalize() { } @Override public Node removeChild(Node arg0) throws DOMException { return null; } @Override public Node replaceChild(Node arg0, Node arg1) throws DOMException { return null; } @Override public void setNodeValue(String arg0) throws DOMException { } @Override public void setPrefix(String arg0) throws DOMException { } @Override public void setIdAttribute(String name, boolean isId) throws DOMException { } @Override public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) throws DOMException { } @Override public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException { } @Override public short compareDocumentPosition(Node other) throws DOMException { return 0; } @Override public String getBaseURI() { return null; } @Override public Object getFeature(String feature, String version) { return null; } @Override public String getTextContent() throws DOMException { return null; } @Override public Object getUserData(String key) { return null; } @Override public boolean isDefaultNamespace(String namespaceURI) { return false; } @Override public boolean isEqualNode(Node arg) { return false; } @Override public boolean isSameNode(Node other) { return false; } @Override public String lookupNamespaceURI(String prefix) { return null; } @Override public String lookupPrefix(String namespaceURI) { return null; } @Override public void setTextContent(String textContent) throws DOMException { } @Override public Object getNativeWidget() { return nativeWidget; } @Override public Object setUserData(String key, Object data, UserDataHandler handler) { return null; } @Override public TypeInfo getSchemaTypeInfo() { return null; } @Override public CSSStyleDeclaration getDefaultStyleDeclaration(String pseudoE) { return defaultStyleDeclarationMap.get(pseudoE); } @Override public void setDefaultStyleDeclaration(String pseudoE, CSSStyleDeclaration declaration) { this.defaultStyleDeclarationMap.put(pseudoE, declaration); } @Override public void onStylesApplied(NodeList nodes) { // Do Nothing } protected Element getElement(Object widget) { return engine.getElement(widget); } @Override public CSSExtendedProperties getStyle() { if (style == null) { style = new CSSExtendedPropertiesImpl(nativeWidget, engine); } return style; } @Override public String[] getStaticPseudoInstances() { if (staticPseudoInstances == null) { return EMPTY_STRING; } return staticPseudoInstances.toArray(EMPTY_STRING); } @Override public boolean isPseudoInstanceOf(String s) { if (staticPseudoInstances == null) { return false; } return staticPseudoInstances.contains(s); } @Override public void initialize() { } @Override public void dispose() { } /** * Apply styles for the native widget. */ protected void doApplyStyles() { try { engine.applyStyles(getNativeWidget(), false, true); } catch (Exception ex) { engine.handleExceptions(ex); } } }