blob: 40d6ab0a679f39a9dbd3f75828af466119418efc [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.examples.css.editor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import org.eclipse.e4.ui.css.core.dom.IElementProvider;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.core.engine.CSSErrorHandler;
import org.eclipse.e4.ui.css.core.serializers.CSSHTMLSerializerConfiguration;
import org.eclipse.e4.ui.css.core.serializers.CSSSerializer;
import org.eclipse.e4.ui.css.core.serializers.CSSSerializerConfiguration;
/**
* Abstract CSS Editor.
*/
public abstract class AbstractCSSEditor {
/**
* CSS Engine.
*/
protected CSSEngine engine;
/**
* CSS Serializer
*/
protected CSSSerializer serializer;
protected String nativeWidgetDir;
protected java.util.List cssFiles = new ArrayList();
protected AbstractCSSEditor(String nativeWidgetDir) {
this.nativeWidgetDir = nativeWidgetDir;
}
/**
* Return CSS Engine configured.
*
* @return
*/
protected CSSEngine getCSSEngine() {
if (engine == null) {
// Get SWT CSS Engine
engine = createCSSEngine();
// Error
engine.setErrorHandler(new CSSErrorHandler() {
public void error(Exception e) {
handleExceptions(e);
}
});
} else {
// Remove all style sheets.
engine.reset();
}
if (isHTMLSelector()) {
// Register HTML Element Provider to retrieve
// w3c Element HTMLElement coming from Native Widget.
engine.setElementProvider(getHTMLElementProvider());
} else {
// Register Native Widget (SWT, Swing...) Element Provider to
// retrieve
// w3c Element Element coming from Native Widget.
engine.setElementProvider(getNativeWidgetElementProvider());
}
return engine;
}
/**
* Apply Styles comming from <code>getStyleSheetContent()</code> method to
* implement <code>widget</code>.
*
* @param widget
*/
protected void applyStyles(Object widget) {
try {
Date d1 = new Date();
engine = getCSSEngine();
// 1. Parse Style Sheet coming from getStyleSheetContent().
StringReader reader = new StringReader(getStyleSheetContent());
engine.parseStyleSheet(reader);
// 2. Apply styles
engine.applyStyles(widget, true, true);
Date d2 = new Date();
// 3. Display time elapsed
setCSSEngineStatuts("Apply style with "
+ (d2.getTime() - d1.getTime()) + "ms.");
} catch (Exception ex) {
handleExceptions(ex);
}
}
/**
* Apply styles to the fully window or left panel widget.
*/
protected void applyStyles() {
if (mustApplyStylesToWindow()) {
applyStyles(getWindowNativeWidget());
} else
applyStyles(getLeftPanelNativeWidget());
}
protected void fillTextareaWithStyleSheetContent(File file) {
try {
fillTextareaWithStyleSheetContent(new FileInputStream(file));
} catch (Exception e) {
handleExceptions(e);
}
}
/**
* Fill the TextArea which store the style sheet content with the
* <code>stream</code> content.
*
* @param stream
*/
protected void fillTextareaWithStyleSheetContent(InputStream stream) {
try {
StringWriter writer = new StringWriter();
InputStreamReader streamReader = new InputStreamReader(stream);
BufferedReader buffer = new BufferedReader(streamReader);
String line = "";
boolean b = false;
while (null != (line = buffer.readLine())) {
if (b)
writer.write("\n");
writer.write(line);
b = true;
}
buffer.close();
streamReader.close();
String content = writer.toString();
setStyleSheetContent(content);
} catch (Exception e) {
handleExceptions(e);
}
}
protected void fillTextareaWithDefaultStyleSheetContent() {
if (mustApplyStylesToWindow())
fillTextareaWithDefaultStyleSheetContent(getWindowNativeWidget());
else
fillTextareaWithDefaultStyleSheetContent(getLeftPanelNativeWidget());
}
protected void fillTextareaWithDefaultStyleSheetContent(Object widget) {
if (serializer == null)
this.serializer = new CSSSerializer();
StringWriter writer = new StringWriter();
try {
CSSSerializerConfiguration configuration = (isHTMLSelector() ? getCSSHTMLSerializerConfiguration()
: getCSSNativeWidgetSerializerConfiguration());
serializer.serialize(writer, getCSSEngine(), widget, true,
configuration);
setStyleSheetContent(writer.toString());
} catch (Exception e) {
handleExceptions(e);
}
}
protected void applyStylesFromSelectedFile() {
int index = getCSSFilesWidgetSelectionIndex();
if (index == -1)
if (getCSSFilesWidgetItemCount() > 1) {
index = 1;
selectCSSFilesWidget(index);
// cssFilesWidget.select(index);
}
if (index < 1) {
setStyleSheetContent("");
return;
}
File file = (File) cssFiles.get(index - 1);
fillTextareaWithStyleSheetContent(file);
}
protected void populateCSSFiles() {
removeAllCSSFilesWidget();
int size = cssFiles.size();
for (int i = 0; i < size; i++) {
cssFiles.remove(0);
}
addItemCSSFilesWidget("None");
File baseDir = getBaseStyleDir();
File[] files = baseDir.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isFile()) {
addItemCSSFilesWidget(file.getName());
cssFiles.add(file);
}
}
}
/**
* Display CSS Engine error
*
* @param e
*/
protected void handleExceptions(Exception e) {
e.printStackTrace();
}
protected File getBaseStyleDir() {
if (isHTMLSelector())
return new File(getBaseStyleDirName() + "/html");
if (nativeWidgetDir != null)
return new File(getBaseStyleDirName() + "/" + nativeWidgetDir);
return new File(getBaseStyleDirName());
}
protected String getBaseStyleDirName() {
return "styles";
}
/**
* Create Instance of CSS Engine
*
* @return
*/
protected abstract CSSEngine createCSSEngine();
/**
* Return true if HTML selector must be used and false if Native Widget
* Selector must be used.
*
* @return
*/
protected abstract boolean isHTMLSelector();
/**
* Return Native Widget Element provider.
*
* @return
*/
protected abstract IElementProvider getNativeWidgetElementProvider();
/**
* Return HTML Element provider.
*
* @return
*/
protected abstract IElementProvider getHTMLElementProvider();
/**
* Return style sheet content.
*
* @return
*/
protected abstract String getStyleSheetContent();
/**
* Set style sheet content.
*
* @param content
*/
protected abstract void setStyleSheetContent(String content);
/**
* Set CSS Engine status.
*
* @param status
*/
protected abstract void setCSSEngineStatuts(String status);
/**
* Return true if Styles must be applied to the fully Window and false
* otherwise.
*
* @return
*/
protected abstract boolean mustApplyStylesToWindow();
/**
* Get Window Native Widget.
*
* @return
*/
protected abstract Object getWindowNativeWidget();
/**
* Get Left Panel Native widget.
*
* @return
*/
protected abstract Object getLeftPanelNativeWidget();
/**
* Return CSS Serializer configuration for Native Widget.
*
* @return
*/
protected abstract CSSSerializerConfiguration getCSSNativeWidgetSerializerConfiguration();
/**
* Return CSS Serializer configuration for HTML.
*
* @return
*/
protected CSSSerializerConfiguration getCSSHTMLSerializerConfiguration() {
return CSSHTMLSerializerConfiguration.INSTANCE;
}
/**
* Return selection index of CSS files widget.
*
* @return
*/
protected abstract int getCSSFilesWidgetSelectionIndex();
/**
* Return item count of CSS files widget.
*
* @return
*/
protected abstract int getCSSFilesWidgetItemCount();
/**
* Select item of CSS files widget at <code>index</code>.
*
* @param index
*/
protected abstract void selectCSSFilesWidget(int index);
/**
* Remove all items of CSS files widget.
*/
protected abstract void removeAllCSSFilesWidget();
/**
* Add item of CSS files widget.
*
* @param item
*/
protected abstract void addItemCSSFilesWidget(String item);
}