blob: b5e9cd08a51abbbea5d920f474615ad8a209f2dc [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.serializers;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.css.CSSStyleDeclaration;
/**
* CSS Serializer to retrieve default CSSStyleDeclaration of the SWT Widgets.
*/
public class CSSSerializer {
public CSSSerializer() {
}
/**
* Build CSS Style Sheet content of the <code>element</code> Object by
* using {@link CSSEngine} engine configuration. The serialization result is
* stored into the <code>writer</code>. If
* <code>serializeChildNodes</code> is true, the method will serialize too
* the child nodes of the <code>element</code>.
*
* @param writer
* @param engine
* @param element
* @param serializeChildNodes
* @throws IOException
*/
public void serialize(Writer writer, CSSEngine engine, Object element,
boolean serializeChildNodes) throws IOException {
serialize(writer, engine, element, serializeChildNodes, null);
}
/**
* Build CSS Style Sheet content of the <code>element</code> Object by
* using {@link CSSEngine} engine configuration. The serialization result is
* stored into the <code>writer</code>. If
* <code>serializeChildNodes</code> is true, the method will serialize too
* the child nodes of the <code>element</code>. The
* {@link CSSSerializerConfiguration} <code>configuration</code> is used
* to generate selector with condition like Text[style='SWT.MULTI'].
*
* @param writer
* @param engine
* @param element
* @param serializeChildNodes
* @param configuration
* @throws IOException
*/
public void serialize(Writer writer, CSSEngine engine, Object element,
boolean serializeChildNodes,
CSSSerializerConfiguration configuration) throws IOException {
Map selectors = new HashMap();
serialize(writer, engine, element, serializeChildNodes, selectors,
configuration);
boolean firstSelector = true;
for (Iterator iterator = selectors.entrySet().iterator(); iterator
.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
String selectorName = (String) entry.getKey();
CSSStyleDeclaration styleDeclaration = (CSSStyleDeclaration) entry
.getValue();
if (styleDeclaration != null) {
int length = styleDeclaration.getLength();
// Start selector
startSelector(writer, selectorName, firstSelector);
firstSelector = false;
for (int i = 0; i < length; i++) {
String propertyName = styleDeclaration.item(i);
String propertyValue = styleDeclaration
.getPropertyValue(propertyName);
property(writer, propertyName, propertyValue);
}
// End selector
endSelector(writer, selectorName);
}
}
}
/**
* Build CSS Style Sheet content of the <code>element</code> Object by
* using {@link CSSEngine} engine configuration. The serialization result is
* stored into the <code>writer</code>. If
* <code>serializeChildNodes</code> is true, the method will serialize too
* the child nodes of the <code>element</code>. The
* {@link CSSSerializerConfiguration} <code>configuration</code> is used
* to generate selector with condition like Text[style='SWT.MULTI'].
*
* Map of <code>selectors</code> contains the selector already built.
*
* @param writer
* @param engine
* @param element
* @param serializeChildNodes
* @param selectors
* @param configuration
* @throws IOException
*/
protected void serialize(Writer writer, CSSEngine engine, Object element,
boolean serializeChildNodes, Map selectors,
CSSSerializerConfiguration configuration) throws IOException {
Element elt = engine.getElement(element);
if (elt != null) {
String selectorName = elt.getLocalName();
CSSStyleDeclaration styleDeclaration = engine
.getDefaultStyleDeclaration(element, null);
if (configuration != null) {
String[] attributesFilter = configuration.getAttributesFilter();
for (int i = 0; i < attributesFilter.length; i++) {
String attributeFilter = attributesFilter[i];
String value = elt.getAttribute(attributeFilter);
if (value != null && value.length() > 0) {
if (value.indexOf(".") != -1) {
value = "'" + value + "'";
}
selectorName += "[" + attributeFilter + "=" + value
+ "]";
break;
}
}
}
selectors.put(selectorName, styleDeclaration);
if (serializeChildNodes) {
NodeList nodes = elt.getChildNodes();
if (nodes != null) {
for (int k = 0; k < nodes.getLength(); k++) {
serialize(writer, engine, nodes.item(k),
serializeChildNodes, selectors, configuration);
}
}
}
}
}
/**
* Generate start selector.
*
* @param writer
* @param selectorName
* @param firstSelector
* @throws IOException
*/
protected void startSelector(Writer writer, String selectorName,
boolean firstSelector) throws IOException {
if (firstSelector == false)
writer.write("\n\n");
writer.write(selectorName + " {");
}
/**
* Generate end selector.
*
* @param writer
* @param selectorName
* @throws IOException
*/
protected void endSelector(Writer writer, String selectorName)
throws IOException {
writer.write("\n}");
}
/**
* Generate CSS Property.
*
* @param writer
* @param propertyName
* @param propertyValue
* @throws IOException
*/
private void property(Writer writer, String propertyName,
String propertyValue) throws IOException {
writer.write("\n\t" + propertyName + ":" + propertyValue + ";");
}
}