blob: 9efa575dcfe85a1397ba28479fd5cb16973da267 [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.css.ui.image;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.wst.css.core.document.ICSSDocument;
import org.eclipse.wst.css.core.document.ICSSModel;
import org.eclipse.wst.css.core.document.ICSSNode;
import org.eclipse.wst.css.core.document.ICSSPrimitiveValue;
import org.eclipse.wst.css.core.document.ICSSSelector;
import org.eclipse.wst.css.core.document.ICSSSelectorItem;
import org.eclipse.wst.css.core.document.ICSSSelectorList;
import org.eclipse.wst.css.core.document.ICSSSimpleSelector;
import org.eclipse.wst.css.core.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.document.ICSSStyleRule;
import org.eclipse.wst.css.core.metamodel.CSSMMProperty;
import org.eclipse.wst.css.core.metamodel.CSSMetaModel;
import org.eclipse.wst.css.core.metamodel.util.CSSMetaModelFinder;
import org.eclipse.wst.css.core.metamodel.util.CSSMetaModelUtil;
import org.w3c.dom.css.CSSCharsetRule;
import org.w3c.dom.css.CSSFontFaceRule;
import org.w3c.dom.css.CSSImportRule;
import org.w3c.dom.css.CSSMediaRule;
import org.w3c.dom.css.CSSPageRule;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSValue;
/**
*/
public class CSSImageType {
private final String fName;
private CSSImageType(String name) {
this.fName = name;
}
public String toString() {
return fName;
}
public static final CSSImageType STYLESHEET = new CSSImageType("STYLESHEET"); //$NON-NLS-1$
public static final CSSImageType RULE_CHARSET = new CSSImageType("RULE_CHARSET"); //$NON-NLS-1$
public static final CSSImageType RULE_FONTFACE = new CSSImageType("RULE_FONTFACE"); //$NON-NLS-1$
public static final CSSImageType RULE_IMPORT = new CSSImageType("RULE_IMPORT"); //$NON-NLS-1$
public static final CSSImageType RULE_MEDIA = new CSSImageType("RULE_MEDIA"); //$NON-NLS-1$
public static final CSSImageType RULE_PAGE = new CSSImageType("RULE_PAGE"); //$NON-NLS-1$
public static final CSSImageType RULE_STYLE = new CSSImageType("RULE_STYLE"); //$NON-NLS-1$
public static final CSSImageType RULE_UNKNOWN = new CSSImageType("RULE_UNKNOWN"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_CLASS = new CSSImageType("SELECTOR_CLASS"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_ID = new CSSImageType("SELECTOR_ID"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_DEFAULT = new CSSImageType("SELECTOR_DEFAULT"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_PSEUDO = new CSSImageType("SELECTOR_PSEUDO"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_TAG = new CSSImageType("SELECTOR_TAG"); //$NON-NLS-1$
public static final CSSImageType SELECTOR_LINK = new CSSImageType("SELECTOR_LINK"); //$NON-NLS-1$
public static final CSSImageType VALUE_FUNCTION = new CSSImageType("VALUE_FUNCTION"); //$NON-NLS-1$
public static final CSSImageType VALUE_NUMBER = new CSSImageType("VALUE_NUMBER"); //$NON-NLS-1$
public static final CSSImageType VALUE_STRING = new CSSImageType("VALUE_STRING"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_AURAL = new CSSImageType("CATEGORY_AURAL"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_BOX = new CSSImageType("CATEGORY_BOX"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_COLORANDBACKGROUND = new CSSImageType("CATEGORY_COLORANDBACKGROUND"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_CONTENT = new CSSImageType("CATEGORY_CONTENT"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_FONT = new CSSImageType("CATEGORY_FONT"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_PAGE = new CSSImageType("CATEGORY_PAGE"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_TABLES = new CSSImageType("CATEGORY_TABLES"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_TEXT = new CSSImageType("CATEGORY_TEXT"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_UI = new CSSImageType("CATEGORY_UI"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_VISUAL = new CSSImageType("CATEGORY_VISUAL"); //$NON-NLS-1$
public static final CSSImageType CATEGORY_DEFAULT = new CSSImageType("CATEGORY_DEFAULT"); //$NON-NLS-1$
/**
* by node
*/
public static CSSImageType getImageType(ICSSNode node) {
CSSImageType imageType = null;
if (node instanceof CSSCharsetRule) {
imageType = RULE_CHARSET;
} else if (node instanceof CSSFontFaceRule) {
imageType = RULE_FONTFACE;
} else if (node instanceof CSSImportRule) {
imageType = RULE_IMPORT;
} else if (node instanceof CSSMediaRule) {
imageType = RULE_MEDIA;
} else if (node instanceof CSSPageRule) {
imageType = RULE_PAGE;
} else if (node instanceof CSSStyleRule) {
imageType = getImageType(((ICSSStyleRule) node).getSelectors());
} else if (node instanceof CSSStyleDeclaration) {
ICSSNode parent = node.getParentNode();
if (parent != null) {
return getImageType(parent);
}
} else if (node instanceof ICSSStyleDeclItem) {
String name = ((ICSSStyleDeclItem) node).getPropertyName();
ICSSDocument doc = node.getOwnerDocument();
ICSSModel model = (doc != null) ? doc.getModel() : null;
CSSMetaModelFinder finder = CSSMetaModelFinder.getInstance();
CSSMetaModel metaModel = finder.findMetaModelFor(model);
// is font-face rule ?
ICSSNode parent = node.getParentNode();
if (parent != null) {
parent = parent.getParentNode();
if (parent instanceof CSSFontFaceRule) {
imageType = CSSImageType.CATEGORY_FONT;
}
}
if (imageType == null) {
CSSMMProperty prop = new CSSMetaModelUtil(metaModel).getProperty(name);
if (prop != null) {
String category = prop.getAttribute("category"); //$NON-NLS-1$
imageType = getImageType(category);
}
if (imageType == null) {
imageType = CSSImageType.CATEGORY_DEFAULT;
}
}
} else if (node instanceof CSSValue) {
switch (((CSSValue) node).getCssValueType()) {
case CSSPrimitiveValue.CSS_NUMBER :
case CSSPrimitiveValue.CSS_PERCENTAGE :
case CSSPrimitiveValue.CSS_EMS :
case CSSPrimitiveValue.CSS_EXS :
case CSSPrimitiveValue.CSS_PX :
case CSSPrimitiveValue.CSS_CM :
case CSSPrimitiveValue.CSS_MM :
case CSSPrimitiveValue.CSS_IN :
case CSSPrimitiveValue.CSS_PT :
case CSSPrimitiveValue.CSS_PC :
case CSSPrimitiveValue.CSS_DEG :
case CSSPrimitiveValue.CSS_RAD :
case CSSPrimitiveValue.CSS_GRAD :
case CSSPrimitiveValue.CSS_MS :
case CSSPrimitiveValue.CSS_S :
case CSSPrimitiveValue.CSS_HZ :
case CSSPrimitiveValue.CSS_KHZ :
case CSSPrimitiveValue.CSS_DIMENSION :
case ICSSPrimitiveValue.CSS_INTEGER :
case ICSSPrimitiveValue.CSS_HASH :
imageType = VALUE_NUMBER;
break;
case CSSPrimitiveValue.CSS_ATTR :
case CSSPrimitiveValue.CSS_COUNTER :
case CSSPrimitiveValue.CSS_RECT :
case CSSPrimitiveValue.CSS_RGBCOLOR :
case CSSPrimitiveValue.CSS_URI :
case ICSSPrimitiveValue.CSS_FORMAT :
case ICSSPrimitiveValue.CSS_LOCAL :
imageType = VALUE_FUNCTION;
break;
default :
imageType = VALUE_STRING;
break;
}
}
return imageType;
}
public static CSSImageType getImageType(ICSSSelectorList selectorList) {
if (selectorList == null || selectorList.getLength() == 0) {
return SELECTOR_DEFAULT;
}
CSSImageType imageType = null;
int nSelectors = selectorList.getLength();
for (int i = 0; i < nSelectors; i++) {
CSSImageType candidate = getImageType(selectorList.getSelector(i));
if (imageType == null) {
imageType = candidate;
} else if (imageType != candidate) {
imageType = null;
break;
}
}
return (imageType == null) ? SELECTOR_DEFAULT : imageType;
}
public static CSSImageType getImageType(ICSSSelector selector) {
CSSImageType imageType = SELECTOR_DEFAULT;
if (selector == null || selector.getLength() == 0) {
return imageType;
}
ICSSSelectorItem item = selector.getItem(selector.getLength() - 1);
if (item.getItemType() == ICSSSelectorItem.SIMPLE) {
ICSSSimpleSelector ss = (ICSSSimpleSelector) item;
if (0 < ss.getNumOfIDs()) {
imageType = SELECTOR_ID;
} else if (0 < ss.getNumOfClasses()) {
imageType = SELECTOR_CLASS;
} else if (0 < ss.getNumOfPseudoNames()) {
imageType = SELECTOR_PSEUDO;
} else {
imageType = SELECTOR_TAG;
}
}
return imageType;
}
public static CSSImageType getImageType(String category) {
if (fCategoryMap == null) {
fCategoryMap = new HashMap();
fCategoryMap.put("aural", CATEGORY_AURAL); //$NON-NLS-1$
fCategoryMap.put("box", CATEGORY_BOX); //$NON-NLS-1$
fCategoryMap.put("colorandbackground", CATEGORY_COLORANDBACKGROUND); //$NON-NLS-1$
fCategoryMap.put("content", CATEGORY_CONTENT); //$NON-NLS-1$
fCategoryMap.put("font", CATEGORY_FONT); //$NON-NLS-1$
fCategoryMap.put("page", CATEGORY_PAGE); //$NON-NLS-1$
fCategoryMap.put("tables", CATEGORY_TABLES); //$NON-NLS-1$
fCategoryMap.put("text", CATEGORY_TEXT); //$NON-NLS-1$
fCategoryMap.put("ui", CATEGORY_UI); //$NON-NLS-1$
fCategoryMap.put("visual", CATEGORY_VISUAL); //$NON-NLS-1$
}
CSSImageType imageType = (CSSImageType) fCategoryMap.get(category);
return (imageType == null) ? CATEGORY_DEFAULT : imageType;
}
private static Map fCategoryMap = null;
}