blob: df482160ee5e544ea19609e9f9c9d04bec19e699 [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.dom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.e4.ui.css.core.dom.ExtendedCSSRule;
import org.eclipse.e4.ui.css.core.dom.ExtendedDocumentCSS;
import org.w3c.css.sac.ConditionalSelector;
import org.w3c.css.sac.Selector;
import org.w3c.css.sac.SelectorList;
import org.w3c.dom.Element;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.DocumentCSS;
import org.w3c.dom.stylesheets.StyleSheet;
import org.w3c.dom.stylesheets.StyleSheetList;
/**
* w3c {@link DocumentCSS} implementation.
*/
public class DocumentCSSImpl implements ExtendedDocumentCSS {
private StyleSheetListImpl styleSheetList = new StyleSheetListImpl();
/**
* key=selector type, value = CSSStyleDeclaration
*/
private Map styleDeclarationMap = null;
/*
* (non-Javadoc)
* @see org.w3c.dom.stylesheets.DocumentStyle#getStyleSheets()
*/
public StyleSheetList getStyleSheets() {
return styleSheetList;
}
/*
* (non-Javadoc)
* @see org.w3c.dom.css.DocumentCSS#getOverrideStyle(org.w3c.dom.Element, java.lang.String)
*/
public CSSStyleDeclaration getOverrideStyle(Element element, String s) {
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.e4.css.core.dom.ExtendedDocumentCSS#addStyleSheet(org.w3c.dom.stylesheets.StyleSheet)
*/
public void addStyleSheet(StyleSheet styleSheet) {
styleSheetList.addStyleSheet(styleSheet);
}
/*
* (non-Javadoc)
* @see org.eclipse.e4.css.core.dom.ExtendedDocumentCSS#removeAllStyleSheets()
*/
public void removeAllStyleSheets() {
styleSheetList.removeAllStyleSheets();
this.styleDeclarationMap = null;
}
public List queryConditionSelector(int conditionType) {
return querySelector(Selector.SAC_CONDITIONAL_SELECTOR, conditionType);
}
public List querySelector(int selectorType, int conditionType) {
List list = getCSSStyleDeclarationList(selectorType, conditionType);
if (list != null)
return list;
int l = styleSheetList.getLength();
for (int i = 0; i < l; i++) {
CSSStyleSheet styleSheet = (CSSStyleSheet) styleSheetList.item(i);
CSSRuleList ruleList = styleSheet.getCssRules();
list = querySelector(ruleList, selectorType, conditionType);
setCSSStyleDeclarationList(list, selectorType, conditionType);
}
return list;
}
protected List querySelector(CSSRuleList ruleList, int selectorType,
int selectorConditionType) {
List list = new ArrayList();
int length = ruleList.getLength();
for (int i = 0; i < length; i++) {
CSSRule rule = ruleList.item(i);
switch (rule.getType()) {
case CSSRule.STYLE_RULE: {
if (rule instanceof ExtendedCSSRule) {
ExtendedCSSRule r = (ExtendedCSSRule) rule;
SelectorList selectorList = r.getSelectorList();
// Loop for SelectorList
int l = selectorList.getLength();
for (int j = 0; j < l; j++) {
Selector selector = (Selector) selectorList.item(j);
if (selector.getSelectorType() == selectorType) {
switch (selectorType) {
case Selector.SAC_CONDITIONAL_SELECTOR:
// It's conditional selector
ConditionalSelector conditionalSelector = (ConditionalSelector) selector;
short conditionType = conditionalSelector
.getCondition().getConditionType();
if (selectorConditionType == conditionType) {
// current selector match the current CSS
// Rule
// CSSStyleRule styleRule = (CSSStyleRule)
// rule;
list.add(selector);
}
}
}
}
}
}
}
}
return list;
}
protected List getCSSStyleDeclarationList(int selectorType,
int conditionType) {
Integer key = getKey(selectorType, conditionType);
return (List) getStyleDeclarationMap().get(key);
}
protected void setCSSStyleDeclarationList(List list, int selectorType,
int conditionType) {
Integer key = getKey(selectorType, conditionType);
getStyleDeclarationMap().put(key, list);
}
protected Integer getKey(int selectorType, int conditionType) {
if (selectorType == Selector.SAC_CONDITIONAL_SELECTOR) {
if (conditionType == SAC_CLASS_CONDITION.intValue())
return SAC_CLASS_CONDITION;
if (conditionType == SAC_ID_CONDITION.intValue())
return SAC_ID_CONDITION;
if (conditionType == SAC_PSEUDO_CLASS_CONDITION.intValue())
return SAC_PSEUDO_CLASS_CONDITION;
return OTHER_SAC_CONDITIONAL_SELECTOR;
}
return OTHER_SAC_SELECTOR;
}
protected Map getStyleDeclarationMap() {
if (styleDeclarationMap == null)
styleDeclarationMap = new HashMap();
return styleDeclarationMap;
}
}