| /******************************************************************************* |
| * Copyright (c) 2004, 2005 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.internal.image; |
| |
| |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.wst.css.core.internal.metamodel.CSSMMProperty; |
| import org.eclipse.wst.css.core.internal.metamodel.CSSMetaModel; |
| import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelFinder; |
| import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelUtil; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorItem; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorList; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSimpleSelector; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule; |
| 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; |
| } |