blob: 83318dfa0c71b56e18f2298d4de34f78a9d29a47 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.html.core.internal.htmlcss;
import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter;
import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
*/
public class StyleAdapterFactory implements INodeAdapterFactory {
private static StyleAdapterFactory instance = null;
// private static String CSS_CONTENT_TYPE = "text/css";//$NON-NLS-1$
/**
*/
private StyleAdapterFactory() {
super();
}
/**
*/
public INodeAdapter adapt(INodeNotifier notifier) {
if (notifier == null)
return null;
Node node = (Node) notifier;
short nodeType = node.getNodeType();
if (nodeType == Node.DOCUMENT_NODE) {
INodeAdapter adapter = notifier.getExistingAdapter(IStyleSheetListAdapter.class);
if (adapter != null)
return adapter;
HTMLDocumentAdapter newAdapter = new HTMLDocumentAdapter();
newAdapter.setDocument((Document) node);
notifier.addAdapter(newAdapter);
return newAdapter;
}
if (nodeType != Node.ELEMENT_NODE)
return null;
Element element = (Element) node;
String tagName = element.getTagName();
if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE)) {
if (!isTagAvailable(element.getOwnerDocument(), HTML40Namespace.ElementName.STYLE)) {
return null;
}
// String type = element.getAttribute(HTML40Namespace.ATTR_NAME_TYPE);
// if (type != null && ! type.equalsIgnoreCase(CSS_CONTENT_TYPE)) {
// return null;
// }
INodeAdapter adapter = notifier.getExistingAdapter(IStyleSheetAdapter.class);
if (adapter != null)
return adapter;
StyleElementAdapter newAdapter = new StyleElementAdapter();
newAdapter.setElement(element);
notifier.addAdapter(newAdapter);
return newAdapter;
}
else if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.LINK)) {
if (!isTagAvailable(element.getOwnerDocument(), HTML40Namespace.ElementName.LINK)) {
return null;
}
INodeAdapter adapter = notifier.getExistingAdapter(IStyleSheetAdapter.class);
if (adapter != null)
return adapter;
LinkElementAdapter newAdapter = new LinkElementAdapter();
newAdapter.setElement(element);
notifier.addAdapter(newAdapter);
return newAdapter;
}
INodeAdapter adapter = notifier.getExistingAdapter(IStyleDeclarationAdapter.class);
if (adapter != null)
return adapter;
if (!isAttributeAvailable(element, HTML40Namespace.ATTR_NAME_STYLE)) {
return null;
}
StyleAttrAdapter newAdapter = new StyleAttrAdapter();
newAdapter.setElement(element);
notifier.addAdapter(newAdapter);
return newAdapter;
}
/**
*/
public synchronized static StyleAdapterFactory getInstance() {
if (instance == null)
instance = new StyleAdapterFactory();
return instance;
}
/**
*/
public boolean isFactoryForType(Object type) {
return (type == IStyleSheetAdapter.class || type == IStyleDeclarationAdapter.class || type == IStyleSheetListAdapter.class);
}
public void release() {
// default is to do nothing
}
private static boolean isTagAvailable(Document document, String elementName) {
ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
if (modelQuery != null) {
CMDocument cmdoc = modelQuery.getCorrespondingCMDocument(document);
CMNamedNodeMap map = cmdoc.getElements();
if ((CMElementDeclaration) map.getNamedItem(elementName) != null) {
return true;
}
}
return false;
}
private static boolean isAttributeAvailable(Element element, String attrName) {
ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
if (modelQuery != null) {
CMElementDeclaration decl = modelQuery.getCMElementDeclaration(element);
if (decl != null) {
CMNamedNodeMap map = decl.getAttributes();
if ((CMAttributeDeclaration) map.getNamedItem(attrName) != null) {
return true;
}
}
}
return false;
}
/**
* Overriding Object's clone() method
*/
public INodeAdapterFactory copy() {
return getInstance();
}
}