/*******************************************************************************
 * 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.engine;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.eclipse.e4.ui.css.core.dom.IElementProvider;
import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler;
import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverter;
import org.eclipse.e4.ui.css.core.resources.IResourcesRegistry;
import org.eclipse.e4.ui.css.core.util.resources.IResourcesLocatorManager;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.Element;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.CSSValue;
import org.w3c.dom.css.DocumentCSS;
import org.w3c.dom.css.ViewCSS;
import org.w3c.dom.stylesheets.StyleSheet;

/**
 * CSS Engine interface used to parse style sheet and apply styles to something
 * (UI SWT, UI Swing...).
 * 
 */
public interface CSSEngine {

	/*--------------- Parse style sheet -----------------*/

	/**
	 * Parse style sheet from Reader reader.
	 * 
	 * @param reader
	 * @return
	 * @throws IOException
	 */
	public StyleSheet parseStyleSheet(Reader reader) throws IOException;

	/**
	 * Parse style sheet from InputStream stream.
	 * 
	 * @param stream
	 * @return
	 * @throws IOException
	 */
	public StyleSheet parseStyleSheet(InputStream stream) throws IOException;

	/**
	 * Parse style sheet from InputSource source.
	 * 
	 * @param source
	 * @return
	 * @throws IOException
	 */
	public StyleSheet parseStyleSheet(InputSource source) throws IOException;

	/*--------------- Parse style declaration -----------------*/

	/**
	 * Parse style declaration from String style.
	 * 
	 * @param style
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseStyleDeclaration(String style)
			throws IOException;

	/**
	 * Parse style declaration from Reader reader.
	 * 
	 * @param reader
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseStyleDeclaration(Reader reader)
			throws IOException;

	/**
	 * Parse style declaration from InputStream stream.
	 * 
	 * @param stream
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseStyleDeclaration(InputStream stream)
			throws IOException;

	/**
	 * Parse style declaration from InputSource source.
	 * 
	 * @param source
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseStyleDeclaration(InputSource source)
			throws IOException;

	/*--------------- Parse CSS Property Value-----------------*/

	/**
	 * Parse CSSValue from String value.
	 * 
	 * @param value
	 * @return
	 * @throws IOException
	 */
	public CSSValue parsePropertyValue(String value) throws IOException;

	/**
	 * Parse CSSValue from InputStream stream.
	 * 
	 * @param reader
	 * @return
	 * @throws IOException
	 */
	public CSSValue parsePropertyValue(InputStream stream) throws IOException;

	/**
	 * Parse CSSValue from Reader reader.
	 * 
	 * @param reader
	 * @return
	 * @throws IOException
	 */
	public CSSValue parsePropertyValue(Reader reader) throws IOException;

	/**
	 * Parse CSSValue from InputSource source.
	 * 
	 * @param source
	 * @return
	 * @throws IOException
	 */
	public CSSValue parsePropertyValue(InputSource source) throws IOException;

	/*--------------- Apply styles -----------------*/

	/**
	 * Apply styles to the Object node (SWT Text,...). If
	 * <code>applyStylesToChildNodes</code> is true, apply styles to the child
	 * nodes (ex : if node is SWT Composite, styles are applied to the child
	 * controls too).
	 * 
	 * @param node
	 * @param applyStylesToChildNodes
	 */
	public void applyStyles(Object node, boolean applyStylesToChildNodes);

	/**
	 * Apply styles to the Object node (SWT Text,...). If
	 * <code>applyStylesToChildNodes</code> is true, apply styles to the child
	 * nodes (ex : if node is SWT Composite, styles are applied to the child
	 * controls too). If <code>computeDefaultStyle</code> is true, default
	 * style is computed before apply styles.
	 * 
	 * @param node
	 * @param applyStylesToChildNodes
	 * @param computeDefaultStyle
	 */
	public void applyStyles(Object node, boolean applyStylesToChildNodes,
			boolean computeDefaultStyle);

	/*--------------- Apply style declaration -----------------*/

	/**
	 * Apply style declaration to the object node.
	 * 
	 * @param node
	 * @param style
	 * @param pseudo
	 */
	public void applyStyleDeclaration(Object node, CSSStyleDeclaration style,
			String pseudo);

	/**
	 * Parse and apply style declaration from Reader reader.
	 * 
	 * @param node
	 * @param reader
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseAndApplyStyleDeclaration(Object node,
			Reader reader) throws IOException;

	/**
	 * Parse and apply style declaration from InputStream stream.
	 * 
	 * @param node
	 * @param stream
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseAndApplyStyleDeclaration(Object node,
			InputStream stream) throws IOException;

	/**
	 * Parse and apply style declaration from InputSource source.
	 * 
	 * @param node
	 * @param source
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseAndApplyStyleDeclaration(Object node,
			InputSource sourcee) throws IOException;

	/**
	 * Parse and apply style declaration from String style.
	 * 
	 * @param node
	 * @param style
	 * @return
	 * @throws IOException
	 */
	public CSSStyleDeclaration parseAndApplyStyleDeclaration(Object node,
			String style) throws IOException;

	/*--------------- Apply inline style -----------------*/

	/**
	 * Apply inline style of the object node. If
	 * <code>applyStylesToChildNodes</code> is true, apply style inline to the
	 * child nodes (ex : if node is SWT Composite, styles are applied to the
	 * child controls too).
	 * 
	 * @param node
	 * @param applyStylesToChildNodes
	 * @throws IOException
	 */
	public void applyInlineStyle(Object node, boolean applyStylesToChildNodes)
			throws IOException;

	/**
	 * Return {@link CSSErrorHandler} used to handles exception error.
	 * 
	 * @return
	 */
	public CSSErrorHandler getErrorHandler();

	/**
	 * Register the {@link CSSErrorHandler} used to handles exception error.
	 * 
	 * @param errorHandler
	 */
	public void setErrorHandler(CSSErrorHandler errorHandler);

	/*--------------- Resources -----------------*/

	/**
	 * Set the {@link IResourcesLocatorManager} to use manage resources.
	 * 
	 * @param resourcesLocatorManager
	 */
	public void setResourcesLocatorManager(
			IResourcesLocatorManager resourcesLocatorManager);

	/**
	 * Get the {@link IResourcesLocatorManager} to use manage resources.
	 * 
	 * @return
	 */
	public IResourcesLocatorManager getResourcesLocatorManager();

	/*--------------- Document/View CSS -----------------*/

	/**
	 * Return the {@link DocumentCSS} used to store {@link CSSStyleSheet}.
	 * 
	 * @return
	 */
	public DocumentCSS getDocumentCSS();

	/**
	 * Return the {@link ViewCSS} used to compute {@link CSSStyleDeclaration}.
	 * 
	 * @return
	 */
	public ViewCSS getViewCSS();

	/*--------------- w3c Element -----------------*/

	/**
	 * Get {@link IElementProvider} registered used to retrieve w3c
	 * {@link Element} which wrap native widget.
	 * 
	 * @return
	 */
	public IElementProvider getElementProvider();

	/**
	 * Set {@link IElementProvider} registered used to retrieve w3c
	 * {@link Element} which wrap native widget.
	 * 
	 * @param elementProvider
	 */
	public void setElementProvider(IElementProvider elementProvider);

	/*--------------- CSS Property Handler -----------------*/

	/**
	 * Apply CSS property <code>property</code> to the <code>node</code>
	 * with <code>value</code>.
	 * 
	 * @param node
	 * @param property
	 * @param value
	 * @param pseudo
	 * @return
	 * @throws Exception
	 */
	public ICSSPropertyHandler applyCSSProperty(Object node, String property,
			CSSValue value, String pseudo) throws Exception;

	/**
	 * Retrieve String of {@link CSSValue} of the CSS <code>property</code> of
	 * the <code>node</code>.
	 * 
	 * @param widget
	 * @param property
	 * @param pseudo
	 * @return
	 */
	public String retrieveCSSProperty(Object node, String property, String pseudo);


	/*--------------- Default Style -----------------*/

	/**
	 * Apply initial style of the object node. If
	 * <code>applyStylesToChildNodes</code> is true, apply style inline to the
	 * child nodes (ex : if node is SWT Composite, styles are applied to the
	 * child controls too).
	 * 
	 * @param node
	 * @param applyStylesToChildNodes
	 * @throws IOException
	 */
	public void applyDefaultStyleDeclaration(Object node,
			boolean applyStylesToChildNodes);

	/**
	 * Get default {@link CSSStyleDeclaration} of the <code>node</code> for
	 * pseudo element <code>pseudoE</code> which can be null.
	 * 
	 * @param element
	 * @return
	 */
	public CSSStyleDeclaration getDefaultStyleDeclaration(Object node,
			String pseudoE);

	/*--------------- Dispose/Reset -----------------*/

	/**
	 * Call reset and dispose all resources
	 */
	public void dispose();

	/**
	 * Reset all style sheet registered into CSS Engine. This method must be
	 * called if you want parse and apply new StyleSheet and remove the old
	 * StyleSheet parsed.
	 */
	public void reset();

	/*--------------- Resources Registry -----------------*/

	/**
	 * Get the {@link IResourcesRegistry} registered used to cache/dispose
	 * resources.
	 * 
	 * @return
	 */
	public IResourcesRegistry getResourcesRegistry();

	/**
	 * Register {@link IResourcesRegistry} used to cache/dispose resources.
	 * 
	 * @param resourcesRegistry
	 */
	public void setResourcesRegistry(IResourcesRegistry resourcesRegistry);

	/*--------------- CSS Value Converter -----------------*/

	/**
	 * Register CSSValue converter {@link ICSSValueConverter}.
	 * 
	 * @param converter
	 */
	public void registerCSSValueConverter(ICSSValueConverter converter);

	/**
	 * Unregister CSSValue converter {@link ICSSValueConverter}.
	 * 
	 * @param converter
	 */
	public void unregisterCSSValueConverter(ICSSValueConverter converter);

	/**
	 * Get CSSValue converter {@link ICSSValueConverter} which is enable to
	 * convert <code>toType</code> Object.
	 * 
	 * @param toType
	 * @return
	 */
	public ICSSValueConverter getCSSValueConverter(Object toType);

	/**
	 * Convert CSSValue into Object type of <code>toType</code>. (ex :
	 * convert CSSValue color:red into java.awt.Color). If
	 * {@link IResourcesRegistry} is registered into {@link CSSEngine} this
	 * method search before into cache of {@link IResourcesRegistry} if the
	 * Object was already converted.
	 * 
	 * @param value
	 * @param toType
	 * @param context
	 *            can be null. For SWT context is
	 *            org.eclipse.swt.widgets.Display.
	 * @return
	 * @throws Exception
	 */
	public Object convert(CSSValue value, Object toType, Object context)
			throws Exception;

	/**
	 * Convert Object type of <code>toType</code> into CSSValue String.
	 * 
	 * @param value
	 * @param toType
	 * @param context
	 * @return
	 * @throws Exception
	 */
	public String convert(Object value, Object toType, Object context)
			throws Exception;

	/**
	 * Get the w3c {@link Element} which wrap Oqbject <code>node</code>.
	 * 
	 * @param node
	 * @return
	 */
	public Element getElement(Object node);

	/**
	 * Get the {@link CSSElementContext} context of the object <code>node</code>.
	 * 
	 * @param node
	 * @return
	 */
	public CSSElementContext getCSSElementContext(Object node);

	/**
	 * Return array of CSS property name of the CSS <code>property</code>.
	 * 
	 * @param property
	 * @return
	 */
	public String[] getCSSCompositePropertiesNames(String property);

	/**
	 * Handle exceptions.
	 * 
	 * @param e
	 */
	public void handleExceptions(Exception e);
}
