blob: fc5ef0a4f0e634d84ce56976cb5e8feefbdd258d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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.impl.sac;
import java.util.Stack;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.e4.ui.css.core.dom.CSSProperty;
import org.eclipse.e4.ui.css.core.impl.dom.CSSImportRuleImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSPageRuleImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSPropertyImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSRuleListImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSStyleDeclarationImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSStyleRuleImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSStyleSheetImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSUnknownRuleImpl;
import org.eclipse.e4.ui.css.core.impl.dom.CSSValueFactory;
import org.eclipse.e4.ui.css.core.impl.dom.MediaListImpl;
import org.eclipse.e4.ui.css.core.sac.ExtendedDocumentHandler;
import org.w3c.css.sac.CSSException;
import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.LexicalUnit;
import org.w3c.css.sac.SACMediaList;
import org.w3c.css.sac.SelectorList;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleSheet;
/**
* This class provides an implementation for the
* {@link org.eclipse.ui.css.core.sac.ExtendedDocumentHandler} interface.
*/
public class CSSDocumentHandlerImpl implements ExtendedDocumentHandler {
private static Log logger = LogFactory.getLog(CSSDocumentHandlerImpl.class);
private Stack nodeStack;
private Object nodeRoot = null;
private CSSStyleSheet parentStyleSheet;
private boolean ignore;
public CSSDocumentHandlerImpl() {
}
public Object getRoot() {
return nodeRoot;
}
public void startDocument(InputSource source) throws CSSException {
if (getNodeStack().empty()) {
CSSStyleSheetImpl styleSheet = new CSSStyleSheetImpl();
parentStyleSheet = styleSheet;
// Create the rule list
CSSRuleListImpl rules = new CSSRuleListImpl();
styleSheet.setRuleList(rules);
getNodeStack().push(styleSheet);
getNodeStack().push(rules);
} else {
// Error
}
}
public void endDocument(InputSource source) throws CSSException {
// Pop the rule list and style sheet nodes
getNodeStack().pop();
nodeRoot = getNodeStack().pop();
}
public void comment(String text) throws CSSException {
}
public void ignorableAtRule(String atRule) throws CSSException {
// Create the unknown rule and add it to the rule list
CSSUnknownRuleImpl ir = new CSSUnknownRuleImpl(parentStyleSheet, null,
atRule);
if (!getNodeStack().empty()) {
((CSSRuleListImpl) getNodeStack().peek()).add(ir);
} else {
// _getNodeStack().push(ir);
nodeRoot = ir;
}
}
public void namespaceDeclaration(String prefix, String uri)
throws CSSException {
if (logger.isDebugEnabled()) {
logger.debug("Declare namespace [prefix=" + prefix + ", uri=" + uri
+ "]");
}
}
public void importStyle(String uri, SACMediaList media,
String defaultNamespaceURI) throws CSSException {
// Create the import rule and add it to the rule list
CSSImportRuleImpl ir = new CSSImportRuleImpl(parentStyleSheet, null,
uri, new MediaListImpl(media));
if (!getNodeStack().empty()) {
((CSSRuleListImpl) getNodeStack().peek()).add(ir);
} else {
// _getNodeStack().push(ir);
nodeRoot = ir;
}
}
public void startMedia(SACMediaList media) throws CSSException {
ignore = true;
// // Create the media rule and add it to the rule list
// CSSMediaRuleImpl mr = new CSSMediaRuleImpl(parentStyleSheet, null,
// new MediaListImpl(media));
// if (!getNodeStack().empty()) {
// ((CSSRuleListImpl) getNodeStack().peek()).add(mr);
// }
//
// // Create the rule list
// CSSRuleListImpl rules = new CSSRuleListImpl();
// mr.setRuleList(rules);
// getNodeStack().push(mr);
// getNodeStack().push(rules);
}
public void endMedia(SACMediaList media) throws CSSException {
ignore = false;
// // Pop the rule list and media rule nodes
// getNodeStack().pop();
// nodeRoot = getNodeStack().pop();
}
public void startPage(String name, String pseudo_page) throws CSSException {
// // Create the page rule and add it to the rule list
CSSPageRuleImpl pageRule = new CSSPageRuleImpl(parentStyleSheet, null,
name, pseudo_page);
if (!getNodeStack().empty()) {
((CSSRuleListImpl) getNodeStack().peek()).add(pageRule);
}
// Create the style declaration
CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(pageRule);
pageRule.setStyle(decl);
getNodeStack().push(pageRule);
getNodeStack().push(decl);
}
public void endPage(String name, String pseudo_page) throws CSSException {
// Pop both the style declaration and the page rule nodes
getNodeStack().pop();
nodeRoot = getNodeStack().pop();
}
public void startFontFace() throws CSSException {
ignore = true;
// // Create the font face rule and add it to the rule list
// CSSFontFaceRuleImpl fontFaceRule = new CSSFontFaceRuleImpl(
// parentStyleSheet, null);
// if (!getNodeStack().empty()) {
// ((CSSRuleListImpl) getNodeStack().peek()).add(fontFaceRule);
// }
//
// // Create the style declaration
// CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(fontFaceRule);
// fontFaceRule.setStyle(decl);
// getNodeStack().push(fontFaceRule);
// getNodeStack().push(decl);
}
public void endFontFace() throws CSSException {
ignore = false;
// // Pop both the style declaration and the font face rule nodes
// getNodeStack().pop();
// nodeRoot = getNodeStack().pop();
}
public void startSelector(SelectorList selectors) throws CSSException {
// Create the style rule and add it to the rule list
CSSStyleRuleImpl rule = new CSSStyleRuleImpl(parentStyleSheet, null,
selectors);
if (!getNodeStack().empty()) {
((CSSRuleListImpl) getNodeStack().peek()).add(rule);
}
// Create the style declaration
CSSStyleDeclarationImpl decl = new CSSStyleDeclarationImpl(rule);
rule.setStyle(decl);
getNodeStack().push(rule);
getNodeStack().push(decl);
}
public void endSelector(SelectorList selectors) throws CSSException {
// Pop both the style declaration and the style rule nodes
getNodeStack().pop();
nodeRoot = getNodeStack().pop();
}
public void property(String name, LexicalUnit value, boolean important)
throws CSSException {
if (!ignore) {
CSSStyleDeclarationImpl decl = (CSSStyleDeclarationImpl) getNodeStack()
.peek();
decl.addProperty(getCSSProperty(decl, name, value, important));
}
}
protected CSSProperty getCSSProperty(CSSStyleDeclaration styleDeclaration,
String name, LexicalUnit value, boolean important) {
return new CSSPropertyImpl(name, CSSValueFactory.newValue(value), important);
}
public Object getNodeRoot() {
return nodeRoot;
}
public void setNodeStack(Stack nodeStack) {
this.nodeStack = nodeStack;
}
public Stack getNodeStack() {
if (nodeStack == null)
nodeStack = new Stack();
return nodeStack;
}
}