/*******************************************************************************
* Copyright (c) 2008, 2015 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
* IBM Corporation
*******************************************************************************/
package org.eclipse.e4.ui.css.core.dom.properties.providers;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.e4.ui.css.core.dom.CSSStylableElement;
import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyBackgroundHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyBorderHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyClassificationHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyDimensionHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyFontHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyMarginHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyPaddingHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyTextHandler;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.w3c.dom.css.CSSStyleDeclaration;
/**
* CSS property handler with static strategy. {@link ICSSPropertyHandler} are
* retrieved after the CSS Engine register the handler with
* registerCSSPropertyHandler method.
*/
public class CSSPropertyHandlerSimpleProviderImpl extends
AbstractCSSPropertyHandlerProvider {
/**
* Default <code>Map</code> of <code>ICSSPropertyHandler</code> stored
* under a CSS property <code>name</code> key.
*/
private static Map<String, Class<? extends ICSSPropertyHandler>> defaultCSSProperties = new HashMap<>();
private Map<Class<?>, List<ICSSPropertyHandler>> propertiesHandler = new HashMap<>();
/**
* Custom <code>Map</code> of <code>ICSSPropertyHandler</code> stored
* under a CSS property <code>name</code> key.
*/
private Map<String, Class<? extends ICSSPropertyHandler>> customCSSProperties = new HashMap<>();
/**
* True if custom CSS properties is merged with default CSS Properties.
*/
private boolean isCSSPropertiesInitialized;
static {
// http://www.w3schools.com/css/css_reference.asp
// Register CSS2 properties
// Register CSS2 Background Properties
registerDefaultCSSProperty("background",
ICSSPropertyBackgroundHandler.class);
registerDefaultCSSProperty("background-attachment",
ICSSPropertyBackgroundHandler.class);
registerDefaultCSSProperty("background-color",
ICSSPropertyBackgroundHandler.class);
registerDefaultCSSProperty("background-image",
ICSSPropertyBackgroundHandler.class);
registerDefaultCSSProperty("background-position",
ICSSPropertyBackgroundHandler.class);
registerDefaultCSSProperty("background-repeat",
ICSSPropertyBackgroundHandler.class);
// Register CSS2 Border Properties
registerDefaultCSSProperty("border", ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-bottom",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-bottom-color",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-bottom-style",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-bottom-width",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-color",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-left",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-left-color",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-left-style",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-left-width",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-right",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-right-color",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-right-style",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-right-width",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-style",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-top",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-top-color",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-top-style",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-top-width",
ICSSPropertyBorderHandler.class);
registerDefaultCSSProperty("border-width",
ICSSPropertyBorderHandler.class);
// Register CSS2 Classification Properties
registerDefaultCSSProperty("clear",
ICSSPropertyClassificationHandler.class);
registerDefaultCSSProperty("cursor",
ICSSPropertyClassificationHandler.class);
registerDefaultCSSProperty("display",
ICSSPropertyClassificationHandler.class);
registerDefaultCSSProperty("float",
ICSSPropertyClassificationHandler.class);
registerDefaultCSSProperty("position",
ICSSPropertyClassificationHandler.class);
registerDefaultCSSProperty("visibility",
ICSSPropertyClassificationHandler.class);
// Register CSS2 Dimension Properties
registerDefaultCSSProperty("height", ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("line-height",
ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("max-height",
ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("max-width",
ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("min-height",
ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("min-width",
ICSSPropertyDimensionHandler.class);
registerDefaultCSSProperty("width", ICSSPropertyDimensionHandler.class);
// Register CSS2 Font Properties
registerDefaultCSSProperty("font", ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-family", ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-size", ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-size-adjust",
ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-stretch",
ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-style", ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-variant",
ICSSPropertyFontHandler.class);
registerDefaultCSSProperty("font-weight", ICSSPropertyFontHandler.class);
// Register CSS2 Text Properties
registerDefaultCSSProperty("color", ICSSPropertyTextHandler.class);
registerDefaultCSSProperty("text-transform",
ICSSPropertyTextHandler.class);
// Register Margin Properties
registerDefaultCSSProperty("margin", ICSSPropertyMarginHandler.class);
registerDefaultCSSProperty("margin-bottom",
ICSSPropertyMarginHandler.class);
registerDefaultCSSProperty("margin-left",
ICSSPropertyMarginHandler.class);
registerDefaultCSSProperty("margin-top",
ICSSPropertyMarginHandler.class);
registerDefaultCSSProperty("margin-right",
ICSSPropertyMarginHandler.class);
// Register Padding Properties
registerDefaultCSSProperty("padding", ICSSPropertyPaddingHandler.class);
registerDefaultCSSProperty("padding-bottom",
ICSSPropertyPaddingHandler.class);
registerDefaultCSSProperty("padding-left",
ICSSPropertyPaddingHandler.class);
registerDefaultCSSProperty("padding-top",
ICSSPropertyPaddingHandler.class);
registerDefaultCSSProperty("padding-right",
ICSSPropertyPaddingHandler.class);
}
@Override
public Collection<ICSSPropertyHandler> getCSSPropertyHandlers(
String property) throws Exception {
Class<? extends ICSSPropertyHandler> cl = getCSSPropertyHandlerClass(property);
return propertiesHandler.get(cl);
}
/*--------------- CSS Property Handler -----------------*/
public void registerCSSPropertyHandler(Class<?> cl,
ICSSPropertyHandler handler) {
List<ICSSPropertyHandler> handlers = propertiesHandler.get(cl);
if (handlers == null) {
propertiesHandler.put(cl,
handlers = new LinkedList<>());
}
handlers.add(handler);
}
protected Class<? extends ICSSPropertyHandler> getCSSPropertyHandlerClass(
String property) {
initializeCSSPropertiesIfNeed();
return customCSSProperties.get(property);
}
public void registerCSSProperty(String propertyName,
Class<? extends ICSSPropertyHandler> propertyHandlerClass) {
customCSSProperties.put(propertyName, propertyHandlerClass);
}
public static void registerDefaultCSSProperty(String propertyName,
Class<? extends ICSSPropertyHandler> propertyHandlerClass) {
defaultCSSProperties.put(propertyName, propertyHandlerClass);
}
/**
* Merge custom CSS Properties with default CSS properties.
*/
private void initializeCSSPropertiesIfNeed() {
if (isCSSPropertiesInitialized)
return;
customCSSProperties.putAll(defaultCSSProperties);
isCSSPropertiesInitialized = true;
}
public Collection<String> getAllCSSPropertyNames() {
initializeCSSPropertiesIfNeed();
return customCSSProperties.keySet();
}
@Override
public CSSStyleDeclaration getDefaultCSSStyleDeclaration(CSSEngine engine,
CSSStylableElement stylableElement, CSSStyleDeclaration newStyle,
String pseudoE) throws Exception {
CSSStyleDeclaration defaultStyleDeclaration = stylableElement
.getDefaultStyleDeclaration(pseudoE);
if (defaultStyleDeclaration != null)
// default style is already computed for the stylable element ,
// return it.
return defaultStyleDeclaration;
// Default style must be computed.
StringBuffer style = null;
Collection<String> propertyNames = getAllCSSPropertyNames();
for (String propertyName : propertyNames) {
String s = getCSSPropertyStyle(engine, stylableElement,
propertyName, pseudoE);
if (s != null) {
if (style == null)
style = new StringBuffer();
style.append(s);
}
}
if (style != null) {
defaultStyleDeclaration = engine.parseStyleDeclaration(style
.toString());
stylableElement.setDefaultStyleDeclaration(pseudoE,
defaultStyleDeclaration);
return defaultStyleDeclaration;
}
return null;
}
@Override
public Collection<ICSSPropertyHandler> getCSSPropertyHandlers(
Object element, String property) throws Exception {
return getCSSPropertyHandlers(property);
}
@Override
public Collection<String> getCSSProperties(Object element) {
return getAllCSSPropertyNames();
}
}