Bug 417315 - Improve "Explorer editing CSS with orion" with SWT
OrionControl

Export packages + remove .setting to .gitignore + remove extra blank in
the HTMLEditor.htmljet

Change-Id: I47ece36a9c9c57f789b09718dcb44b98c9514186
Signed-off-by: Angelo ZERR <angelo.zerr@gmail.com>
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/.gitignore b/bundles/org.eclipse.e4.tools.orion.css.editor/.gitignore
new file mode 100644
index 0000000..84a4913
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.e4.tools.orion.css.editor/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c537b63..0000000
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.orion.css.editor/META-INF/MANIFEST.MF
index 86e07e9..5f324e7 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/META-INF/MANIFEST.MF
@@ -1,6 +1,8 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Editor
+Bundle-Localization: plugin
+Bundle-Vendor: %providerName
+Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.e4.tools.orion.css.editor;singleton:=true
 Bundle-Version: 0.15.0.qualifier
 Bundle-Activator: org.eclipse.e4.tools.orion.css.editor.Activator
@@ -9,6 +11,8 @@
  org.eclipse.e4.ui.css.swt.theme;bundle-version="0.9.100",
  org.eclipse.e4.ui.model.workbench;bundle-version="1.0.0",
  org.eclipse.e4.core.contexts;bundle-version="1.3.0",
- org.eclipse.e4.ui.workbench
+ org.eclipse.e4.ui.workbench,
+ org.eclipse.e4.tools.orion.editor
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.e4.tools.orion.css.editor
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/build.properties b/bundles/org.eclipse.e4.tools.orion.css.editor/build.properties
index b5e6baf..c88359b 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/build.properties
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/build.properties
@@ -4,4 +4,4 @@
                META-INF/,\
                .,\
                icons/,\
-               web/
+               plugin.properties
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/plugin.properties b/bundles/org.eclipse.e4.tools.orion.css.editor/plugin.properties
new file mode 100644
index 0000000..44153c6
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/plugin.properties
@@ -0,0 +1,2 @@
+pluginName = CSS Orion Editor
+providerName = Eclipse.org
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/CSSEditorPreferences.java b/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/CSSEditorPreferences.java
index 40cd283..58c0d47 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/CSSEditorPreferences.java
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/CSSEditorPreferences.java
@@ -24,6 +24,9 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.RegistryFactory;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.e4.tools.orion.editor.builder.css.CSSBuilder;
+import org.eclipse.e4.tools.orion.editor.builder.css.E4CSSBuilder;
+import org.eclipse.e4.tools.orion.editor.swt.OrionEditorControl;
 import org.eclipse.e4.ui.css.swt.internal.theme.ThemeEngine;
 import org.eclipse.e4.ui.css.swt.theme.ITheme;
 import org.eclipse.e4.ui.css.swt.theme.IThemeEngine;
@@ -46,8 +49,7 @@
 	ITheme selection;
 	IThemeEngine engine;
 	boolean resetCurrentTheme;
-	private Browser browser;
-	private String editorHtml;
+	private OrionEditorControl editor;
 	private String editorContent;
 	private Path filePath;
 
@@ -67,8 +69,6 @@
 		try {
 			initContent();
 
-			loadEditorHtml();
-
 			// Render it
 			Composite composite3 = new Composite(parent, SWT.BORDER);
 			composite3.setLayout(new FillLayout());
@@ -77,8 +77,10 @@
 			data.heightHint = 500;
 			composite3.setLayoutData(data);
 
-			browser = new Browser(composite3, SWT.NONE);
-			browser.setText(editorHtml, true);
+			// Create Orion control and fill the editor with the selected CSS theme.
+			editor = new OrionEditorControl(composite3, SWT.NONE, E4CSSBuilder.getInstance());
+			editor.setText(editorContent);
+
 		} catch (IOException e) {
 			Activator
 					.getDefault()
@@ -89,25 +91,6 @@
 		}
 	}
 
-	private void loadEditorHtml() throws IOException {
-		final Bundle bundle = Activator.getDefault().getBundle();
-		final InputStream contentAssistInput = bundle.getEntry(
-				"/web/swtContentAssist.js").openStream();
-		String contentAssistTemplate = loadFile(contentAssistInput, 1024);
-		String keywords = loadKeywords();
-		String contentAssist = String.format(contentAssistTemplate, keywords);
-		final InputStream cssTemplateInput = bundle.getEntry("/web/css.html")
-				.openStream();
-		String cssTemplate = loadFile(cssTemplateInput, 1024);
-		final String editorCssUrl = FileLocator.toFileURL(
-				bundle.getEntry("/web/built-editor.css")).toExternalForm();
-		final String editorJsUrl = FileLocator.toFileURL(
-				bundle.getEntry("/web/built-editor.js")).toExternalForm();
-
-		editorHtml = String.format(cssTemplate, editorCssUrl, editorJsUrl,
-				contentAssist, editorContent);
-	}
-
 	private void initContent() throws MalformedURLException, IOException {
 		final ITheme theme = selection;
 		List<String> sheets = ((ThemeEngine) engine).getStylesheets(theme);
@@ -127,45 +110,6 @@
 		}
 	}
 
-	private String loadKeywords() {
-		StringBuilder buf = new StringBuilder();
-
-		IExtensionRegistry registry = RegistryFactory.getRegistry();
-		IExtensionPoint extPoint = registry
-				.getExtensionPoint("org.eclipse.e4.ui.css.core.propertyHandler");
-		ArrayList<IConfigurationElement> matchingElements = new ArrayList<IConfigurationElement>();
-		ArrayList<IConfigurationElement> controlAdapters = new ArrayList<IConfigurationElement>();
-		for (IExtension e : extPoint.getExtensions()) {
-			IConfigurationElement[] elements = e.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				controlAdapters.add(element);
-				IConfigurationElement[] child = element
-						.getChildren("property-name");
-				for (int j = 0; j < child.length; j++) {
-					matchingElements.add(child[j]);
-				}
-			}
-		}
-		Iterator<IConfigurationElement> iter = matchingElements.iterator();
-		boolean once = true;
-		while (iter.hasNext()) {
-			IConfigurationElement type = iter.next();
-			String name = type.getAttribute("name");
-			if (!once) {
-				buf.append(',');
-				buf.append('\n');
-			}
-			buf.append('"');
-			buf.append(name);
-			buf.append('"');
-			once = false;
-		}
-		buf.append('\n');
-
-		return buf.toString();
-	}
-
 	public String loadFile(final InputStream in, final int bufferSize)
 			throws IOException {
 		final char[] buffer = new char[bufferSize];
@@ -192,9 +136,13 @@
 			if (oldSelection != null
 					&& !newTheme.getId().equals(oldSelection.getId())) {
 				try {
-					initContent();
-					loadEditorHtml();
-					browser.setText(editorHtml, true);
+					if (!editor.isDisposed()) {
+						// The editor is not disposed, fill the Orion editor with the selected CSS Theme..
+						initContent();
+						editor.setText(editorContent);
+						editor.setDirty(false);
+					}
+
 				} catch (IOException e) {
 					Activator
 							.getDefault()
@@ -209,11 +157,7 @@
 	}
 
 	private boolean isDirty() {
-		final Object rc = browser.evaluate("return window.editor.isDirty();");
-		if (rc instanceof Boolean) {
-			return (Boolean) rc;
-		}
-		return false;
+		return editor.isDirty();
 	}
 
 	@Override
@@ -242,8 +186,7 @@
 			IPath path = new Path(e4CSSPath
 					+ System.getProperty("file.separator")
 					+ filePath.lastSegment());
-			final Object rc = browser
-					.evaluate("return window.editor.getText();");
+			final Object rc = editor.getText();
 			if (!(rc instanceof String)) {
 				Activator
 						.getDefault()
@@ -336,8 +279,8 @@
 
 		try {
 			initContent();
-			loadEditorHtml();
-			browser.setText(editorHtml, true);
+			editor.setText(editorContent);
+			editor.setDirty(false);
 		} catch (IOException e) {
 			Activator
 					.getDefault()
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/css.html b/bundles/org.eclipse.e4.tools.orion.css.editor/web/css.html
deleted file mode 100644
index 716dd05..0000000
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/web/css.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<html>
-<head>
-<title>Theme CSS editor</title>
-<style>
-#editor {
-	border: 1px solid teal;
-	position: absolute;
-	top: 0px;
-	left: 0px;
-	bottom: 0px;
-	right: 0px;
-	margin: 20px;
-}
-
-pre {
-	margin: 0px;
-}
-</style>
-<link rel="stylesheet" type="text/css" href="%s"/>
-<script src="%s"></script>
-<script>
-%s
-</script>
-<script>
-	/*globals require*/
-	require(["orion/editor/edit", "examples/editor/swtContentAssist"], function(edit, mSWTContentAssist) {
-		var editor = edit({
-			lang: "css"
-		});
-		//ADD THE SWT CONTENT ASSIST
-		var contentAssist = editor.getContentAssist ? editor.getContentAssist() : editor._contentAssist;
-		contentAssist.addEventListener("Activating", function() { //$NON-NLS-0$
-			contentAssist.providers.push(new mSWTContentAssist.SWTContentAssistProvider());
-		});
-		window.editor = editor;
-		//----------------
-	});
-</script>
-</head>
-<body spellcheck="false">
-<pre id="editor" class="editor" data-editor-lang="css">
-%s
-</pre>
-</body>
-</html>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/.classpath b/bundles/org.eclipse.e4.tools.orion.editor.samples/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/.gitignore b/bundles/org.eclipse.e4.tools.orion.editor.samples/.gitignore
new file mode 100644
index 0000000..84a4913
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/.project b/bundles/org.eclipse.e4.tools.orion.editor.samples/.project
new file mode 100644
index 0000000..f60b79d
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.e4.tools.orion.editor.samples</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.orion.editor.samples/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c44eabb
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Localization: plugin
+Bundle-Vendor: %providerName
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.e4.tools.orion.editor.samples
+Bundle-Version: 0.15.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.e4.tools.orion.editor,
+ org.eclipse.swt;bundle-version="3.102.0"
+Export-Package: org.eclipse.e4.tools.orion.swt.samples
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/build.properties b/bundles/org.eclipse.e4.tools.orion.editor.samples/build.properties
new file mode 100644
index 0000000..aa1a008
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/plugin.properties b/bundles/org.eclipse.e4.tools.orion.editor.samples/plugin.properties
new file mode 100644
index 0000000..c75a61c
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/plugin.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2013 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
+###############################################################################
+pluginName = SWT Orion Control - Samples
+providerName = Eclipse.org
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/CSSEditor.java b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/CSSEditor.java
new file mode 100644
index 0000000..9a05916
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/CSSEditor.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.swt.samples;
+
+import java.io.File;
+
+import org.eclipse.e4.tools.orion.editor.builder.css.CSSBuilder;
+import org.eclipse.e4.tools.orion.editor.swt.IDirtyListener;
+import org.eclipse.e4.tools.orion.editor.swt.OrionEditorControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Java main which uses {@link OrionEditorControl} to load CSS content with Orion
+ * editor.
+ */
+public class CSSEditor {
+
+	public static void main(String[] args) {
+
+		Display display = new Display();
+		Shell shell = new Shell(display);
+		shell.setSize(500, 500);
+		shell.setText("Orion CSS Editor");
+		shell.setLayout(new GridLayout());
+
+		CSSBuilder builder = new CSSBuilder(new File(
+				"../org.eclipse.e4.tools.orion.editor"), "");
+		OrionEditorControl editor = new OrionEditorControl(shell, SWT.BORDER, builder);
+		editor.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		// Menu
+		Menu menuBar = createMenu(shell, editor);
+		shell.setMenuBar(menuBar);
+
+		editor.setText("body {\n\tcolor:red;\n}");
+
+		shell.open();
+		editor.setFocus();
+		while (!shell.isDisposed()) {
+			if (!display.readAndDispatch())
+				display.sleep();
+		}
+		display.dispose();
+
+	}
+
+	private static Menu createMenu(final Shell shell, final OrionEditorControl editor) {
+		Menu menuBar = new Menu(shell, SWT.BAR);
+		// File menu
+		createFileMenu(shell, menuBar, editor);
+		return menuBar;
+	}
+
+	private static void createFileMenu(final Shell shell, Menu menuBar,
+			final OrionEditorControl editor) {
+		MenuItem fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
+		fileMenuHeader.setText("&File");
+
+		Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
+		fileMenuHeader.setMenu(fileMenu);
+
+		// Save
+		final MenuItem fileSaveItem = new MenuItem(fileMenu, SWT.PUSH);
+		fileSaveItem.setText("&Save");
+		fileSaveItem.setEnabled(false);
+		fileSaveItem.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				editor.setDirty(false);
+			}
+		});
+
+		editor.addDirtyListener(new IDirtyListener() {
+			public void dirtyChanged(boolean dirty) {
+				fileSaveItem.setEnabled(dirty);
+			}
+		});
+
+		// Exit
+		MenuItem fileExitItem = new MenuItem(fileMenu, SWT.PUSH);
+		fileExitItem.setText("E&xit");
+		fileExitItem.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent event) {
+				shell.close();
+				// shell.getDisplay().dispose();
+			}
+		});
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/HTMLEditorTest.java b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/HTMLEditorTest.java
new file mode 100644
index 0000000..5e9aae5
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/HTMLEditorTest.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.swt.samples;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.e4.tools.orion.editor.builder.HTMLEditor;
+import org.eclipse.e4.tools.orion.editor.builder.EditorOptions;
+import org.eclipse.e4.tools.orion.editor.builder.css.CSSEdit;
+
+/**
+ * Main which shows how to use {@link HTMLEditor} builder to generate HTML Orion
+ * editor.
+ * 
+ */
+public class HTMLEditorTest {
+
+	public static void main(String[] args) throws IOException {
+		HTMLEditor builder = new HTMLEditor();
+
+		File f = new File("");
+
+		EditorOptions context = new EditorOptions(f, "css");
+
+		String keywords = "";
+		String cssEdit = new CSSEdit().generate(keywords);
+		context.addScript(cssEdit);
+
+		context.getScripts();
+
+		String s = builder.generate(context);
+		System.err.println(s);
+
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/JSEditor.java b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/JSEditor.java
new file mode 100644
index 0000000..d0f8331
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor.samples/src/org/eclipse/e4/tools/orion/swt/samples/JSEditor.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.swt.samples;
+
+import java.io.File;
+
+import org.eclipse.e4.tools.orion.editor.builder.js.JSBuilder;
+import org.eclipse.e4.tools.orion.editor.swt.IDirtyListener;
+import org.eclipse.e4.tools.orion.editor.swt.OrionEditorControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Java main which uses {@link OrionEditorControl} to load JS content with Orion
+ * editor.
+ */
+public class JSEditor {
+
+	public static void main(String[] args) {
+
+		Display display = new Display();
+		Shell shell = new Shell(display);
+		shell.setSize(500, 500);
+		shell.setText("Orion JS Editor");
+		shell.setLayout(new GridLayout());
+
+		JSBuilder builder = new JSBuilder(new File(
+				"../org.eclipse.e4.tools.orion.editor"));
+		OrionEditorControl editor = new OrionEditorControl(shell, SWT.BORDER, builder);
+		editor.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		// Menu
+		Menu menuBar = createMenu(shell, editor);
+		shell.setMenuBar(menuBar);
+
+		editor.setText("var arr = [];");
+
+		shell.open();
+		editor.setFocus();
+		while (!shell.isDisposed()) {
+			if (!display.readAndDispatch())
+				display.sleep();
+		}
+		display.dispose();
+
+	}
+
+	private static Menu createMenu(final Shell shell, final OrionEditorControl editor) {
+		Menu menuBar = new Menu(shell, SWT.BAR);
+		// File menu
+		createFileMenu(shell, menuBar, editor);
+		return menuBar;
+	}
+
+	private static void createFileMenu(final Shell shell, Menu menuBar,
+			final OrionEditorControl editor) {
+		MenuItem fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);
+		fileMenuHeader.setText("&File");
+
+		Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
+		fileMenuHeader.setMenu(fileMenu);
+
+		// Save
+		final MenuItem fileSaveItem = new MenuItem(fileMenu, SWT.PUSH);
+		fileSaveItem.setText("&Save");
+		fileSaveItem.setEnabled(false);
+		fileSaveItem.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				editor.setDirty(false);
+			}
+		});
+
+		editor.addDirtyListener(new IDirtyListener() {
+			public void dirtyChanged(boolean dirty) {
+				fileSaveItem.setEnabled(dirty);
+			}
+		});
+
+		// Exit
+		MenuItem fileExitItem = new MenuItem(fileMenu, SWT.PUSH);
+		fileExitItem.setText("E&xit");
+		fileExitItem.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent event) {
+				shell.close();
+				// shell.getDisplay().dispose();
+			}
+		});
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/.classpath b/bundles/org.eclipse.e4.tools.orion.editor/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/.gitignore b/bundles/org.eclipse.e4.tools.orion.editor/.gitignore
new file mode 100644
index 0000000..84a4913
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/.jetproperties b/bundles/org.eclipse.e4.tools.orion.editor/.jetproperties
new file mode 100644
index 0000000..2907c83
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/.jetproperties
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jet-settings>
+	<template-container>templates</template-container>	<source-container>src</source-container>
+</jet-settings>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/.project b/bundles/org.eclipse.e4.tools.orion.editor/.project
new file mode 100644
index 0000000..01104f9
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.e4.tools.orion.editor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.emf.codegen.JETBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.emf.codegen.jet.IJETNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.orion.editor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fdf98eb
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Localization: plugin
+Bundle-Vendor: %providerName
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.e4.tools.orion.editor;singleton:=true
+Bundle-Version: 0.15.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.osgi.framework
+Require-Bundle: org.eclipse.swt;resolution:=optional,
+ org.eclipse.rap.rwt;resolution:=optional,
+ org.eclipse.core.runtime,
+ org.apache.commons.lang;bundle-version="2.6.0"
+Export-Package: org.eclipse.e4.tools.orion.editor.builder,
+ org.eclipse.e4.tools.orion.editor.builder.css,
+ org.eclipse.e4.tools.orion.editor.builder.js,
+ org.eclipse.e4.tools.orion.editor.internal,
+ org.eclipse.e4.tools.orion.editor.swt
+Bundle-Activator: org.eclipse.e4.tools.orion.editor.internal.Activator
+Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/build.properties b/bundles/org.eclipse.e4.tools.orion.editor/build.properties
new file mode 100644
index 0000000..d605380
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2013 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               web/,\
+               plugin.properties
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/plugin.properties b/bundles/org.eclipse.e4.tools.orion.editor/plugin.properties
new file mode 100644
index 0000000..68fd8e9
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/plugin.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2013 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
+###############################################################################
+pluginName = SWT Orion Control
+providerName = Eclipse.org
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/AbstractHTMLBuilder.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/AbstractHTMLBuilder.java
new file mode 100644
index 0000000..bfab55c
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/AbstractHTMLBuilder.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder;
+
+/**
+ * Abstract class to build the Orion HTML editor.
+ * 
+ */
+public class AbstractHTMLBuilder implements IHTMLBuilder {
+
+	private final String html;
+
+	public AbstractHTMLBuilder(EditorOptions options) {
+		this.html = generateHTML(options);
+	}
+
+	@Override
+	public String getHTML() {
+		return html;
+	}
+
+	/**
+	 * Generate the Orion HTML editor by using the JET template
+	 * HTMLEditor.htmljet
+	 * 
+	 * @param options
+	 *            the editor options.
+	 * @return the Orion HTML editor.
+	 */
+	private String generateHTML(EditorOptions options) {
+		HTMLEditor template = new HTMLEditor();
+		return template.generate(options);
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/EditorOptions.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/EditorOptions.java
new file mode 100644
index 0000000..4bd317f
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/EditorOptions.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.e4.tools.orion.editor.internal.Activator;
+
+/**
+ * Editor options used in the JET template HTMLEditor.htmljet to generate Orion
+ * HTML editor.
+ * 
+ */
+public class EditorOptions {
+
+	public static final String BUILT_EDITOR_JS = "/web/built-editor.js";
+	public static final String BUILT_EDITOR_CSS = "/web/built-editor.css";
+	private static final String FILE_START_URL = "file://";
+
+	private final String editorCssUrl;
+	private final String editorJsUrl;
+	private final String lang;
+	private final Collection<String> scripts;
+
+	/**
+	 * Constructor of the editor options with URL of CSS and JS.
+	 * 
+	 * @param editorJsUrl
+	 *            the full URL of "built-editor.js".
+	 * @param editorCssUrl
+	 *            the full URL of "built-editor.css".
+	 * @param lang
+	 *            the mode of the editor (css, js, html, java).
+	 */
+	public EditorOptions(String editorJsUrl, String editorCssUrl, String lang) {
+		this.editorCssUrl = editorCssUrl;
+		this.editorJsUrl = editorJsUrl;
+		this.scripts = new ArrayList<String>();
+		this.lang = lang;
+	}
+
+	/**
+	 * Constructor of the editor options with the base URL of CSS and JS.
+	 * 
+	 * @param baseURL
+	 *            base URL of the CSS and JS.
+	 * @param lang
+	 *            the mode of the editor (css, js, html, java).
+	 */
+	public EditorOptions(String baseURL, String lang) {
+		this(baseURL + BUILT_EDITOR_JS, baseURL + BUILT_EDITOR_CSS, lang);
+	}
+
+	/**
+	 * Constructor of the editor options with the file base dir of CSS and JS.
+	 * 
+	 * @param baseDir
+	 *            file base directory of the CSS and JS.
+	 * @param lang
+	 *            the mode of the editor (css, js, html, java).
+	 */
+	public EditorOptions(File baseDir, String lang) {
+		this(toURL(baseDir), lang);
+	}
+
+	/**
+	 * Constructor of the editor options to use only on OSGi context.
+	 * 
+	 * @param lang
+	 *            the mode of the editor (css, js, html, java).
+	 */
+	public EditorOptions(String lang) throws IOException {
+		this(getURL(BUILT_EDITOR_JS), getURL(BUILT_EDITOR_CSS), lang);
+	}
+
+	/**
+	 * Returns the full URL of the given path.
+	 * 
+	 * @param path
+	 *            path to resolve.
+	 * @return the full URL of the given path.
+	 * @throws IOException
+	 */
+	private static String getURL(String path) throws IOException {
+		if (Activator.getContext() == null) {
+			throw new IOException("Cannot resolve the path=" + path
+					+ ". This constructor must be used only on OSGi context");
+		}
+		return FileLocator.toFileURL(
+				Activator.getContext().getBundle().getEntry(path))
+				.toExternalForm();
+	}
+
+	/**
+	 * Returns the file URL formatted with file://
+	 * 
+	 * @param file
+	 *            the file
+	 * @return the file URL formatted with file://
+	 */
+	private static String toURL(File file) {
+		try {
+			return new StringBuilder(FILE_START_URL).append(
+					file.getCanonicalPath()).toString();
+		} catch (IOException e) {
+			return new StringBuilder(FILE_START_URL).append(file.getPath())
+					.toString();
+		}
+	}
+
+	/**
+	 * Returns the full URL of the Orion Javascript /web/built-editor.js
+	 * 
+	 * @return the full URL of the Orion Javascript /web/built-editor.js
+	 */
+	public String getEditorCssUrl() {
+		return editorCssUrl;
+	}
+
+	/**
+	 * Returns the full URL of the Orion CSS /web/built-editor.css
+	 * 
+	 * @return the full URL of the Orion CSS /web/built-editor.css
+	 */
+	public String getEditorJsUrl() {
+		return editorJsUrl;
+	}
+
+	/**
+	 * Add content script.
+	 * 
+	 * @param script
+	 *            the content script to add.
+	 */
+	public void addScript(String script) {
+		this.scripts.add(script);
+	}
+
+	/**
+	 * Returns list of script content to add.
+	 * 
+	 * @return
+	 */
+	public Collection<String> getScripts() {
+		return scripts;
+	}
+
+	/**
+	 * Returns the mode of the editor (css, js, html, java).
+	 * 
+	 * @return the mode of the editor (css, js, html, java).
+	 */
+	public String getLang() {
+		return lang;
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/HTMLEditor.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/HTMLEditor.java
new file mode 100644
index 0000000..b6412fe
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/HTMLEditor.java
@@ -0,0 +1,46 @@
+package org.eclipse.e4.tools.orion.editor.builder;
+
+public class HTMLEditor
+{
+  protected static String nl;
+  public static synchronized HTMLEditor create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    HTMLEditor result = new HTMLEditor();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected final String TEXT_1 = "<!DOCTYPE html>" + NL + "<html>" + NL + "<head>" + NL + "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />" + NL + "<title>Theme CSS editor</title>" + NL + "<style>" + NL + "#editor {" + NL + "\t//border: 1px solid teal;" + NL + "\tposition: absolute;" + NL + "\ttop: 0px;" + NL + "\tleft: 0px;" + NL + "\tbottom: 0px;" + NL + "\tright: 0px;" + NL + "\t//margin: 20px;" + NL + "\tmargin: 0px;" + NL + "}" + NL + "" + NL + "pre {" + NL + "\tmargin: 0px;" + NL + "}" + NL + "</style>" + NL + "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
+  protected final String TEXT_2 = "\"/>" + NL + "<script src=\"";
+  protected final String TEXT_3 = "\"></script>" + NL + "" + NL + "<script>" + NL + "\tfunction setOrionEditor(editor) {" + NL + "\t  window.editor = editor;" + NL + "\t  if (typeof orion_onLoad == 'function') orion_onLoad();" + NL + "\t}" + NL + "</script>" + NL;
+  protected final String TEXT_4 = NL + "<script>";
+  protected final String TEXT_5 = NL;
+  protected final String TEXT_6 = NL + "</script>";
+  protected final String TEXT_7 = NL + NL + "</head>" + NL + "<body spellcheck=\"false\">" + NL + "<pre id=\"editor\" class=\"editor\" data-editor-lang=\"";
+  protected final String TEXT_8 = "\" data-editor-show-folding-ruler=\"true\" >" + NL + "</pre>" + NL + "</body>" + NL + "</html>";
+  protected final String TEXT_9 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     EditorOptions options = (EditorOptions)argument; 
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append( options.getEditorCssUrl() );
+    stringBuffer.append(TEXT_2);
+    stringBuffer.append( options.getEditorJsUrl() );
+    stringBuffer.append(TEXT_3);
+     for (String script : options.getScripts()) { 
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append(TEXT_5);
+    stringBuffer.append( script );
+    stringBuffer.append(TEXT_6);
+     } 
+    stringBuffer.append(TEXT_7);
+    stringBuffer.append( options.getLang() );
+    stringBuffer.append(TEXT_8);
+    stringBuffer.append(TEXT_9);
+    return stringBuffer.toString();
+  }
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/IHTMLBuilder.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/IHTMLBuilder.java
new file mode 100644
index 0000000..a79436a
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/IHTMLBuilder.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder;
+
+/**
+ * API of Orion HTML Editor builder.
+ * 
+ */
+public interface IHTMLBuilder {
+
+	/**
+	 * Returns the HTML of the Orion editor.
+	 * 
+	 * @return
+	 */
+	String getHTML();
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSBuilder.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSBuilder.java
new file mode 100644
index 0000000..b2e5abf
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSBuilder.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder.css;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.e4.tools.orion.editor.builder.AbstractHTMLBuilder;
+import org.eclipse.e4.tools.orion.editor.builder.IHTMLBuilder;
+
+/**
+ * {@link IHTMLBuilder} to build the Orion HTML editor for CSS mode.
+ * 
+ */
+public class CSSBuilder extends AbstractHTMLBuilder {
+
+	/**
+	 * Constructor with {@link CSSOptions}.
+	 * 
+	 * @param options
+	 *            the CSS options.
+	 */
+	public CSSBuilder(CSSOptions options) {
+		super(options);
+	}
+
+	/**
+	 * Constructor with file base dir.
+	 * 
+	 * @param baseDir
+	 *            base directory of the CSS and JS.
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public CSSBuilder(File baseDir, String keywords) {
+		this(new CSSOptions(baseDir, keywords));
+	}
+
+	/**
+	 * Constructor to use only on OSGi context.
+	 * 
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public CSSBuilder(String keywords) throws IOException {
+		this(new CSSOptions(keywords));
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSEdit.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSEdit.java
new file mode 100644
index 0000000..adc3f94
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSEdit.java
@@ -0,0 +1,29 @@
+package org.eclipse.e4.tools.orion.editor.builder.css;
+
+public class CSSEdit
+{
+  protected static String nl;
+  public static synchronized CSSEdit create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    CSSEdit result = new CSSEdit();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected final String TEXT_1 = " " + NL + "" + NL + "/*global define */" + NL + "" + NL + "define('examples/editor/swtContentAssist', [ //$NON-NLS-0$" + NL + "\t'orion/editor/templates' //$NON-NLS-0$" + NL + "], function(mTemplates) {" + NL + "" + NL + "\tvar colorValues = {" + NL + "\t\ttype: \"link\", //$NON-NLS-0$" + NL + "\t\tvalues: [" + NL + "\t\t\t\"COLOR_BLACK\", //$NON-NLS-0$" + NL + "\t\t\t\"COLOR_INFO_BACKGROUND\", //$NON-NLS-0$" + NL + "\t\t\t\"black\", //$NON-NLS-0$" + NL + "\t\t\t\"white\", //$NON-NLS-0$" + NL + "\t\t\t\"red\", //$NON-NLS-0$" + NL + "\t\t\t\"green\", //$NON-NLS-0$" + NL + "\t\t\t\"blue\", //$NON-NLS-0$" + NL + "\t\t\t\"magenta\", //$NON-NLS-0$" + NL + "\t\t\t\"yellow\", //$NON-NLS-0$" + NL + "\t\t\t\"cyan\", //$NON-NLS-0$" + NL + "\t\t\t\"grey\", //$NON-NLS-0$" + NL + "\t\t\t\"darkred\", //$NON-NLS-0$" + NL + "\t\t\t\"darkgreen\", //$NON-NLS-0$" + NL + "\t\t\t\"darkblue\", //$NON-NLS-0$" + NL + "\t\t\t\"darkmagenta\", //$NON-NLS-0$" + NL + "\t\t\t\"darkcyan\", //$NON-NLS-0$" + NL + "\t\t\t\"darkyellow\", //$NON-NLS-0$" + NL + "\t\t\t\"darkgray\", //$NON-NLS-0$" + NL + "\t\t\t\"lightgray\" //$NON-NLS-0$" + NL + "\t\t]" + NL + "\t};" + NL + "\tfunction fromJSON(o) {" + NL + "\t\treturn JSON.stringify(o).replace(\"}\", \"\\\\}\"); //$NON-NLS-1$ //$NON-NLS-0$" + NL + "\t}" + NL + "\tvar templates = [" + NL + "\t\t{" + NL + "\t\t\tprefix: \"swt-outer-keyline-color\", //$NON-NLS-0$" + NL + "\t\t\tdescription: \"ctab folder keyline - keyline color\", //$NON-NLS-0$" + NL + "\t\t\ttemplate: \"swt-outer-keyline-color: ${color:\" + fromJSON(colorValues) + \"};\" //$NON-NLS-1$ //$NON-NLS-0$" + NL + "\t\t}," + NL + "\t\t{" + NL + "\t\t\tprefix: \"frame-image\", //$NON-NLS-0$" + NL + "\t\t\tdescription: \"image - the frame image\", //$NON-NLS-0$" + NL + "\t\t\ttemplate: \"frame-image: url(\\\"${uri}\\\");\" //$NON-NLS-0$" + NL + "\t\t}" + NL + "\t];" + NL + "\tvar keywords = [" + NL + "\t\t";
+  protected final String TEXT_2 = NL + "\t];" + NL + "" + NL + "\tfunction SWTContentAssistProvider() {" + NL + "\t}" + NL + "\tSWTContentAssistProvider.prototype = new mTemplates.TemplateContentAssist(keywords, templates);" + NL + "\t" + NL + "\tSWTContentAssistProvider.prototype.getPrefix = function(buffer, offset, context) {" + NL + "\t\tvar index = offset;" + NL + "\t\twhile (index && /[A-Za-z\\-\\@]/.test(buffer.charAt(index - 1))) {" + NL + "\t\t\tindex--;" + NL + "\t\t}" + NL + "\t\treturn index ? buffer.substring(index, offset) : \"\";" + NL + "\t};" + NL + "" + NL + "\treturn {" + NL + "\t\tSWTContentAssistProvider: SWTContentAssistProvider" + NL + "\t};" + NL + "});" + NL + "" + NL + "/*globals require*/" + NL + "require([\"orion/editor/edit\", \"examples/editor/swtContentAssist\"], function(edit, mSWTContentAssist) {" + NL + "\tvar editor = edit({" + NL + "\t\tlang: \"css\"" + NL + "\t});" + NL + "\t//ADD THE SWT CONTENT ASSIST" + NL + "\tvar contentAssist = editor.getContentAssist ? editor.getContentAssist() : editor._contentAssist;" + NL + "\tcontentAssist.addEventListener(\"Activating\", function() { //$NON-NLS-0$" + NL + "\t\tcontentAssist.providers.push(new mSWTContentAssist.SWTContentAssistProvider());" + NL + "\t});" + NL + "\tsetOrionEditor(editor);" + NL + "\t//----------------" + NL + "});";
+  protected final String TEXT_3 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     String keywords = (String)argument; 
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append( keywords );
+    stringBuffer.append(TEXT_2);
+    stringBuffer.append(TEXT_3);
+    return stringBuffer.toString();
+  }
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSOptions.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSOptions.java
new file mode 100644
index 0000000..69adcad
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/CSSOptions.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder.css;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.e4.tools.orion.editor.builder.EditorOptions;
+
+/**
+ * CSS Editor options.
+ * 
+ */
+public class CSSOptions extends EditorOptions {
+
+	private static final String CSS_LANG = "css";
+
+	/**
+	 * Constructor of the editor options with URL of CSS and JS.
+	 * 
+	 * @param editorJsUrl
+	 *            the full URL of "built-editor.js".
+	 * @param editorCssUrl
+	 *            the full URL of "built-editor.css".
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public CSSOptions(String editorJsUrl, String editorCssUrl, String keywords) {
+		super(editorJsUrl, editorCssUrl, CSS_LANG);
+		createEditor(keywords);
+	}
+
+	/**
+	 * Constructor of the editor options with the base URL of CSS and JS.
+	 * 
+	 * @param baseURL
+	 *            base URL of the CSS and JS.
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public CSSOptions(String baseURL, String keywords) {
+		super(baseURL, CSS_LANG);
+		createEditor(keywords);
+	}
+
+	/**
+	 * Constructor of the editor options with the file base dir of CSS and JS.
+	 * 
+	 * @param baseDir
+	 *            file base directory of the CSS and JS.
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public CSSOptions(File baseDir, String keywords) {
+		super(baseDir, CSS_LANG);
+		createEditor(keywords);
+	}
+
+	/**
+	 * Constructor of the editor options to use only on OSGi context.
+	 * 
+	 * @param keywords
+	 *            to customize CSS completion.
+	 * @throws IOException
+	 */
+	public CSSOptions(String keywords) throws IOException {
+		super(CSS_LANG);
+		createEditor(keywords);
+	}
+
+	/**
+	 * Create the Orion editor with edit function.
+	 * 
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	private void createEditor(String keywords) {
+		String cssEdit = new CSSEdit().generate(keywords);
+		super.addScript(cssEdit);
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/E4CSSBuilder.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/E4CSSBuilder.java
new file mode 100644
index 0000000..d29f9ee
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/css/E4CSSBuilder.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder.css;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.RegistryFactory;
+
+/**
+ * Build the Orion HTML editor for CSS mode with E4 CSS selectors.
+ * 
+ */
+public class E4CSSBuilder extends CSSBuilder {
+
+	private static E4CSSBuilder instance;
+
+	/**
+	 * Returns an instance of E4CSSBuilder. Since instances of this class do not
+	 * maintain any state, they can be shared between multiple clients.
+	 * 
+	 * @return an instance of E4CSSBuilder
+	 * @throws IOException
+	 */
+	public static E4CSSBuilder getInstance() throws IOException {
+		synchronized (E4CSSBuilder.class) {
+			if (instance == null) {
+				instance = new E4CSSBuilder();
+			}
+			return instance;
+		}
+	}
+
+	public E4CSSBuilder() throws IOException {
+		super(loadKeywords());
+	}
+
+	/**
+	 * Returns keywords for CSS completion with E4 CSS Engine properties to
+	 * customize completion;
+	 * 
+	 * @return keywords for CSS completion with E4 CSS Engine properties.
+	 */
+	private static String loadKeywords() {
+		StringBuilder buf = new StringBuilder();
+
+		IExtensionRegistry registry = RegistryFactory.getRegistry();
+		IExtensionPoint extPoint = registry
+				.getExtensionPoint("org.eclipse.e4.ui.css.core.propertyHandler");
+		ArrayList<IConfigurationElement> matchingElements = new ArrayList<IConfigurationElement>();
+		ArrayList<IConfigurationElement> controlAdapters = new ArrayList<IConfigurationElement>();
+		for (IExtension e : extPoint.getExtensions()) {
+			IConfigurationElement[] elements = e.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++) {
+				IConfigurationElement element = elements[i];
+				controlAdapters.add(element);
+				IConfigurationElement[] child = element
+						.getChildren("property-name");
+				for (int j = 0; j < child.length; j++) {
+					matchingElements.add(child[j]);
+				}
+			}
+		}
+		Iterator<IConfigurationElement> iter = matchingElements.iterator();
+		boolean once = true;
+		while (iter.hasNext()) {
+			IConfigurationElement type = iter.next();
+			String name = type.getAttribute("name");
+			if (!once) {
+				buf.append(',');
+				buf.append('\n');
+			}
+			buf.append('"');
+			buf.append(name);
+			buf.append('"');
+			once = false;
+		}
+		buf.append('\n');
+
+		return buf.toString();
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSBuilder.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSBuilder.java
new file mode 100644
index 0000000..04c495c
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSBuilder.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder.js;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.e4.tools.orion.editor.builder.AbstractHTMLBuilder;
+import org.eclipse.e4.tools.orion.editor.builder.IHTMLBuilder;
+
+/**
+ * {@link IHTMLBuilder} to build the Orion HTML editor for JS mode.
+ * 
+ */
+public class JSBuilder extends AbstractHTMLBuilder {
+
+	/**
+	 * Constructor with {@link JSOptions}.
+	 * 
+	 * @param options
+	 *            the JS options.
+	 */
+	public JSBuilder(JSOptions options) {
+		super(options);
+	}
+
+	/**
+	 * Constructor with file base dir.
+	 * 
+	 * @param baseDir
+	 *            base directory of the CSS and JS.
+	 */
+	public JSBuilder(File baseDir) {
+		this(new JSOptions(baseDir));
+	}
+
+	/**
+	 * Constructor to use only on OSGi context.
+	 * 
+	 * @throws IOException
+	 * 
+	 */
+	public JSBuilder() throws IOException {
+		this(new JSOptions());
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSEdit.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSEdit.java
new file mode 100644
index 0000000..1ff0abf
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSEdit.java
@@ -0,0 +1,25 @@
+package org.eclipse.e4.tools.orion.editor.builder.js;
+
+public class JSEdit
+{
+  protected static String nl;
+  public static synchronized JSEdit create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    JSEdit result = new JSEdit();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected final String TEXT_1 = NL + "/*globals require*/" + NL + "require([\"orion/editor/edit\"], function(edit) {" + NL + "\tvar editor = edit({" + NL + "\t\tlang: \"js\"" + NL + "\t});" + NL + "\tsetOrionEditor(editor);" + NL + "\t//----------------" + NL + "});";
+  protected final String TEXT_2 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(TEXT_2);
+    return stringBuffer.toString();
+  }
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSOptions.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSOptions.java
new file mode 100644
index 0000000..5d5b344
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/builder/js/JSOptions.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.builder.js;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.e4.tools.orion.editor.builder.EditorOptions;
+
+/**
+ * JS Editor options.
+ * 
+ */
+public class JSOptions extends EditorOptions {
+
+	private static final String JS_LANG = "js";
+
+	/**
+	 * Constructor of the editor options with URL of CSS and JS.
+	 * 
+	 * @param editorJsUrl
+	 *            the full URL of "built-editor.js".
+	 * @param editorCssUrl
+	 *            the full URL of "built-editor.css".
+	 */
+	public JSOptions(String editorJsUrl, String editorCssUrl) {
+		super(editorJsUrl, editorCssUrl, JS_LANG);
+		createEditor();
+	}
+
+	/**
+	 * Constructor of the editor options with the base URL of CSS and JS.
+	 * 
+	 * @param baseURL
+	 *            base URL of the CSS and JS.
+	 */
+	public JSOptions(String baseURL) {
+		super(baseURL, JS_LANG);
+		createEditor();
+	}
+
+	/**
+	 * Constructor of the editor options with the file base dir of CSS and JS.
+	 * 
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	public JSOptions(File baseDir) {
+		super(baseDir, JS_LANG);
+		createEditor();
+	}
+
+	/**
+	 * Constructor of the editor options to use only on OSGi context.
+	 * 
+	 * @throws IOException
+	 */
+	public JSOptions() throws IOException {
+		super(JS_LANG);
+		createEditor();
+	}
+
+	/**
+	 * Create the Orion editor with edit function.
+	 * 
+	 * @param keywords
+	 *            to customize CSS completion.
+	 */
+	private void createEditor() {
+		String jsEdit = new JSEdit().generate(null);
+		super.addScript(jsEdit);
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/internal/Activator.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/internal/Activator.java
new file mode 100644
index 0000000..7d69979
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/internal/Activator.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator implements BundleActivator {
+
+	private static BundleContext context;
+
+	public static BundleContext getContext() {
+		return context;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
+	 * )
+	 */
+	public void start(BundleContext bundleContext) throws Exception {
+		Activator.context = bundleContext;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext bundleContext) throws Exception {
+		Activator.context = null;
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/BrowserFactory.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/BrowserFactory.java
new file mode 100644
index 0000000..3d62a25
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/BrowserFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * SWT {@link Browser} factory.
+ * 
+ * With this factory it's possible to set the default browser style to create
+ * (for instance with a Preferences Page).
+ * 
+ */
+public class BrowserFactory {
+
+	private static int defaultBrowserStyle = SWT.NONE;
+
+	/**
+	 * Set the default browser style.
+	 * 
+	 * @param defaultBrowserStyle
+	 */
+	public static void setDefaultBrowserStyle(int defaultBrowserStyle) {
+		BrowserFactory.defaultBrowserStyle = defaultBrowserStyle;
+	}
+
+	/**
+	 * Returns the default browser style.
+	 * 
+	 * @return
+	 */
+	public static int getDefaultBrowserStyle() {
+		return defaultBrowserStyle;
+	}
+
+	/**
+	 * Create an instance of SWT {@link Browser}.
+	 * 
+	 * @param parent
+	 *            a widget which will be the parent of the new instance (cannot
+	 *            be null)
+	 * @param style
+	 *            the style of widget to construct. If null use the default.
+	 *            style
+	 * @return an instance of SWT {@link Browser}.
+	 */
+	public static Browser create(Composite parent, Integer style) {
+		if (style == null) {
+			// none style, use the default style.
+			style = getDefaultBrowserStyle();
+		}
+		return new Browser(parent, style);
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/IDirtyListener.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/IDirtyListener.java
new file mode 100644
index 0000000..9f7e04b
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/IDirtyListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.swt;
+
+/**
+ * Listener to observe the dirty changed.
+ */
+public interface IDirtyListener {
+
+	/**
+	 * call when dirty changed.
+	 * 
+	 * @param dirty
+	 */
+	void dirtyChanged(boolean dirty);
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/OrionEditorControl.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/OrionEditorControl.java
new file mode 100644
index 0000000..d6ab01f
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/OrionEditorControl.java
@@ -0,0 +1,336 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.swt;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.e4.tools.orion.editor.builder.IHTMLBuilder;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.BrowserFunction;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Layout;
+
+/**
+ * SWT Orion Editor control.
+ * 
+ */
+public class OrionEditorControl extends Composite {
+
+	/**
+	 * The SWT Browser which loads the HTML Orion editor.
+	 */
+	private final Browser browser;
+
+	/**
+	 * True when Orion editor is loaded and flase otherwise.
+	 */
+	private boolean loaded;
+
+	/**
+	 * Dirty listener.
+	 */
+	private ListenerList dirtyListeners;
+
+	/**
+	 * Text to set for Orion the editor although the editor is not loaded.
+	 */
+	private String textToBeSet;
+
+	/**
+	 * True if focus should be set for Orion the editor although the editor is
+	 * not loaded.
+	 */
+	private Boolean focusToBeSet;
+
+	/**
+	 * Not null if dirty should be set for Orion the editor although the editor
+	 * is not loaded.
+	 */
+	private Boolean dirtyToBeSet;
+
+	/**
+	 * Orion control constructor.
+	 * 
+	 * @param parent
+	 *            widget which will be the parent of the new instance (cannot be
+	 *            null)
+	 * @param style
+	 *            the style of the composite which wraps the SWT Browser.
+	 * @param builder
+	 *            the HTML builder to use to load the Orion editor with SWT
+	 *            Browser.
+	 */
+	public OrionEditorControl(Composite parent, int style, IHTMLBuilder builder) {
+		super(parent, style);
+		super.setLayout(new FillLayout());
+		this.browser = BrowserFactory.create(this, getBrowserStyle());
+		// System.err.println(builder.getHTML());
+		browser.setText(builder.getHTML());
+		createBrowserFunctions();
+	}
+
+	/**
+	 * Create Broser functions.
+	 */
+	protected void createBrowserFunctions() {
+		// onload function
+		new BrowserFunction(browser, "orion_onLoad") {
+			public Object function(Object[] arguments) {
+				onLoad();
+				return null;
+			}
+		};
+		// dirty function
+		new BrowserFunction(browser, "orion_dirty") {
+			public Object function(Object[] arguments) {
+				notifyDirtyListeners();
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * Returns the Browser style to use.
+	 * 
+	 * @return the Browser style to use.
+	 */
+	protected Integer getBrowserStyle() {
+		return null;
+	}
+
+	@Override
+	public void setLayout(Layout layout) {
+		throw new UnsupportedOperationException(
+				"Cannot change internal layout of Editor");
+	}
+
+	// ------------------------- Load methods -----------------------
+
+	/**
+	 * Callback called when Orion editor is loaded.
+	 */
+	protected void onLoad() {
+		loaded = true;
+		// Set text if need
+		if (textToBeSet != null) {
+			setText(textToBeSet);
+			textToBeSet = null;
+		}
+		// Set focus if need
+		if (focusToBeSet != null) {
+			if (focusToBeSet) {
+				browser.evaluate("editor.focus();");
+			}
+			focusToBeSet = null;
+		}
+		// add dirty event listener.
+		browser.evaluate("window.editor.addEventListener('DirtyChanged', orion_dirty, true)");
+		// Set dirty if need
+		if (dirtyToBeSet != null) {
+			setDirty(dirtyToBeSet);
+			dirtyToBeSet = null;
+		}
+	}
+
+	/**
+	 * Returns true if Orion editor is loaded and false otherwise.
+	 * 
+	 * @return
+	 */
+	public boolean isLoaded() {
+		return loaded;
+	}
+
+	// ------------------------- Text methods -----------------------
+
+	/**
+	 * Set the text in the Orion editor.
+	 * 
+	 * @param text
+	 *            the text to set.
+	 */
+	public void setText(String text) {
+		if (text == null || text.length() == 0) {
+			text = "";
+		}
+
+		if (isLoaded()) {
+			// orion editor is loaded, set the text in the editor
+			doSetText(text);
+		} else {
+			// Orion editor is not loaded, set the text in the textToBeSet
+			textToBeSet = text;
+		}
+	}
+
+	/**
+	 * Set text in the Orion editor by using Javascript function editor.setInput
+	 * 
+	 * @param text
+	 *            the text to set.
+	 */
+	protected void doSetText(String text) {
+		String js = new StringBuilder("window.editor.setInput(null, null, \"")
+				.append(StringEscapeUtils.escapeJavaScript(text))
+				.append("\", false );").toString();
+		browser.evaluate(js);
+	}
+
+	/**
+	 * Returns the text of the Orion editor.
+	 * 
+	 * @return
+	 */
+	public String getText() {
+		if (!isLoaded()) {
+			if (textToBeSet != null) {
+				return textToBeSet;
+			} else {
+				return "";
+			}
+		}
+		return doGetText();
+	}
+
+	/**
+	 * Returns the text of the Orion editor by using Javascript function
+	 * editor.getText
+	 * 
+	 * @return the text of the Orion editor by using Javascript function
+	 *         editor.getText
+	 */
+	private String doGetText() {
+		return (String) browser.evaluate("return editor.getText();");
+	}
+
+	// ------------------------- Focus methods -----------------------
+
+	@Override
+	public boolean setFocus() {
+		boolean result = browser.setFocus();
+		if (result) {
+			if (isLoaded()) {
+				browser.evaluate("window.editor.focus();");
+			} else {
+				focusToBeSet = true;
+			}
+		}
+		return result;
+	}
+
+	// ------------------------- Dirty methods -----------------------
+
+	/**
+	 * Add dirty listener.
+	 * 
+	 * @param listener
+	 *            dirty listener to add.
+	 */
+	public void addDirtyListener(IDirtyListener dirtyListener) {
+		if (dirtyListener == null) {
+			throw new NullPointerException("Cannot add a null dirty listener"); //$NON-NLS-1$
+		}
+		if (dirtyListeners == null) {
+			dirtyListeners = new ListenerList(ListenerList.IDENTITY);
+		}
+		dirtyListeners.add(dirtyListener);
+
+	}
+
+	/**
+	 * Remove dirty listener.
+	 * 
+	 * @param listener
+	 *            dirty listener to remove.
+	 */
+	public void removeDirtyListener(IDirtyListener dirtyListener) {
+		if (dirtyListener == null) {
+			throw new NullPointerException(
+					"Cannot remove a null dirty listener"); //$NON-NLS-1$
+		}
+
+		if (dirtyListeners != null) {
+			dirtyListeners.remove(dirtyListener);
+			if (dirtyListeners.isEmpty()) {
+				dirtyListeners = null;
+			}
+		}
+	}
+
+	/**
+	 * Notify dirty listeners if need.
+	 */
+	private void notifyDirtyListeners() {
+		if (dirtyListeners == null) {
+			return;
+		}
+		Display.getCurrent().asyncExec(new Runnable() {
+			public void run() {
+				boolean dirty = isDirty();
+				final Object[] listeners = dirtyListeners.getListeners();
+				for (int i = 0; i < listeners.length; i++) {
+					IDirtyListener dirtyListener = (IDirtyListener) listeners[i];
+					dirtyListener.dirtyChanged(dirty);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Set the dirty flag.
+	 * 
+	 * @param dirty
+	 *            the dirty flag.
+	 */
+	public void setDirty(boolean dirty) {
+		if (isLoaded()) {
+			// orion editor is loaded, set the dirty in the editor
+			doSetDirty(dirty);
+		} else {
+			// Orion editor is not loaded, set the dirty in the dirtyToBeSet
+			dirtyToBeSet = dirty;
+		}
+	}
+
+	/**
+	 * Set the dirty flag in the orion editor with Javascript function
+	 * editor.setDirty.
+	 * 
+	 * @param dirty
+	 *            the dirty flag.
+	 */
+	public void doSetDirty(boolean dirty) {
+		String js = new StringBuilder("window.editor.setDirty(").append(dirty)
+				.append(");").toString();
+		browser.evaluate(js);
+	}
+
+	/**
+	 * Returns true if Orion control is dirty and false otherwise.
+	 * 
+	 * @return true if Orion control is dirty and false otherwise.
+	 */
+	public boolean isDirty() {
+		if (!isLoaded()) {
+			if (dirtyToBeSet != null) {
+				return dirtyToBeSet;
+			}
+			return false;
+		}
+		final Object rc = browser.evaluate("return window.editor.isDirty();");
+		if (rc instanceof Boolean) {
+			return (Boolean) rc;
+		}
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/WebBrowserType.java b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/WebBrowserType.java
new file mode 100644
index 0000000..3b50c7e
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/src/org/eclipse/e4/tools/orion/editor/swt/WebBrowserType.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.tools.orion.editor.swt;
+
+import org.eclipse.swt.SWT;
+
+/**
+ * Web Browser type.
+ * 
+ */
+public enum WebBrowserType {
+
+	Mozilla(SWT.MOZILLA), WebKit(SWT.WEBKIT), Default(SWT.NONE);
+
+	private final int style;
+
+	private WebBrowserType(int style) {
+		this.style = style;
+	}
+
+	public int getStyle() {
+		return style;
+	}
+
+	public String getName() {
+		return name();
+	}
+
+	public static WebBrowserType getWebBrowserType(String name) {
+		for (WebBrowserType browserType : values()) {
+			if (browserType.getName().equals(name)) {
+				return browserType;
+			}
+		}
+		return WebBrowserType.Default;
+	}
+}
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js b/bundles/org.eclipse.e4.tools.orion.editor/templates/CSSEdit.jsjet
similarity index 72%
rename from bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js
rename to bundles/org.eclipse.e4.tools.orion.editor/templates/CSSEdit.jsjet
index b371f6d..b140083 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js
+++ b/bundles/org.eclipse.e4.tools.orion.editor/templates/CSSEdit.jsjet
@@ -1,66 +1,82 @@
-

-/*global define */

-

-define('examples/editor/swtContentAssist', [ //$NON-NLS-0$

-	'orion/editor/templates' //$NON-NLS-0$

-], function(mTemplates) {

-

-	var colorValues = {

-		type: "link", //$NON-NLS-0$

-		values: [

-			"COLOR_BLACK", //$NON-NLS-0$

-			"COLOR_INFO_BACKGROUND", //$NON-NLS-0$

-			"black", //$NON-NLS-0$

-			"white", //$NON-NLS-0$

-			"red", //$NON-NLS-0$

-			"green", //$NON-NLS-0$

-			"blue", //$NON-NLS-0$

-			"magenta", //$NON-NLS-0$

-			"yellow", //$NON-NLS-0$

-			"cyan", //$NON-NLS-0$

-			"grey", //$NON-NLS-0$

-			"darkred", //$NON-NLS-0$

-			"darkgreen", //$NON-NLS-0$

-			"darkblue", //$NON-NLS-0$

-			"darkmagenta", //$NON-NLS-0$

-			"darkcyan", //$NON-NLS-0$

-			"darkyellow", //$NON-NLS-0$

-			"darkgray", //$NON-NLS-0$

-			"lightgray" //$NON-NLS-0$

-		]

-	};

-	function fromJSON(o) {

-		return JSON.stringify(o).replace("}", "\\}"); //$NON-NLS-1$ //$NON-NLS-0$

-	}

-	var templates = [

-		{

-			prefix: "swt-outer-keyline-color", //$NON-NLS-0$

-			description: "ctab folder keyline - keyline color", //$NON-NLS-0$

-			template: "swt-outer-keyline-color: ${color:" + fromJSON(colorValues) + "};" //$NON-NLS-1$ //$NON-NLS-0$

-		},

-		{

-			prefix: "frame-image", //$NON-NLS-0$

-			description: "image - the frame image", //$NON-NLS-0$

-			template: "frame-image: url(\"${uri}\");" //$NON-NLS-0$

-		}

-	];

-	var keywords = [

-		%s

-	];

-

-	function SWTContentAssistProvider() {

-	}

-	SWTContentAssistProvider.prototype = new mTemplates.TemplateContentAssist(keywords, templates);

-	

-	SWTContentAssistProvider.prototype.getPrefix = function(buffer, offset, context) {

-		var index = offset;

-		while (index && /[A-Za-z\-\@]/.test(buffer.charAt(index - 1))) {

-			index--;

-		}

-		return index ? buffer.substring(index, offset) : "";

-	};

-

-	return {

-		SWTContentAssistProvider: SWTContentAssistProvider

-	};

-});
\ No newline at end of file
+<%@ jet package="org.eclipse.e4.tools.orion.editor.builder.css" class="CSSEdit" %>
+<% String keywords = (String)argument; %> 
+
+/*global define */
+
+define('examples/editor/swtContentAssist', [ //$NON-NLS-0$
+	'orion/editor/templates' //$NON-NLS-0$
+], function(mTemplates) {
+
+	var colorValues = {
+		type: "link", //$NON-NLS-0$
+		values: [
+			"COLOR_BLACK", //$NON-NLS-0$
+			"COLOR_INFO_BACKGROUND", //$NON-NLS-0$
+			"black", //$NON-NLS-0$
+			"white", //$NON-NLS-0$
+			"red", //$NON-NLS-0$
+			"green", //$NON-NLS-0$
+			"blue", //$NON-NLS-0$
+			"magenta", //$NON-NLS-0$
+			"yellow", //$NON-NLS-0$
+			"cyan", //$NON-NLS-0$
+			"grey", //$NON-NLS-0$
+			"darkred", //$NON-NLS-0$
+			"darkgreen", //$NON-NLS-0$
+			"darkblue", //$NON-NLS-0$
+			"darkmagenta", //$NON-NLS-0$
+			"darkcyan", //$NON-NLS-0$
+			"darkyellow", //$NON-NLS-0$
+			"darkgray", //$NON-NLS-0$
+			"lightgray" //$NON-NLS-0$
+		]
+	};
+	function fromJSON(o) {
+		return JSON.stringify(o).replace("}", "\\}"); //$NON-NLS-1$ //$NON-NLS-0$
+	}
+	var templates = [
+		{
+			prefix: "swt-outer-keyline-color", //$NON-NLS-0$
+			description: "ctab folder keyline - keyline color", //$NON-NLS-0$
+			template: "swt-outer-keyline-color: ${color:" + fromJSON(colorValues) + "};" //$NON-NLS-1$ //$NON-NLS-0$
+		},
+		{
+			prefix: "frame-image", //$NON-NLS-0$
+			description: "image - the frame image", //$NON-NLS-0$
+			template: "frame-image: url(\"${uri}\");" //$NON-NLS-0$
+		}
+	];
+	var keywords = [
+		<%= keywords %>
+	];
+
+	function SWTContentAssistProvider() {
+	}
+	SWTContentAssistProvider.prototype = new mTemplates.TemplateContentAssist(keywords, templates);
+	
+	SWTContentAssistProvider.prototype.getPrefix = function(buffer, offset, context) {
+		var index = offset;
+		while (index && /[A-Za-z\-\@]/.test(buffer.charAt(index - 1))) {
+			index--;
+		}
+		return index ? buffer.substring(index, offset) : "";
+	};
+
+	return {
+		SWTContentAssistProvider: SWTContentAssistProvider
+	};
+});
+
+/*globals require*/
+require(["orion/editor/edit", "examples/editor/swtContentAssist"], function(edit, mSWTContentAssist) {
+	var editor = edit({
+		lang: "css"
+	});
+	//ADD THE SWT CONTENT ASSIST
+	var contentAssist = editor.getContentAssist ? editor.getContentAssist() : editor._contentAssist;
+	contentAssist.addEventListener("Activating", function() { //$NON-NLS-0$
+		contentAssist.providers.push(new mSWTContentAssist.SWTContentAssistProvider());
+	});
+	setOrionEditor(editor);
+	//----------------
+});
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/templates/HTMLEditor.htmljet b/bundles/org.eclipse.e4.tools.orion.editor/templates/HTMLEditor.htmljet
new file mode 100644
index 0000000..f202c7f
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/templates/HTMLEditor.htmljet
@@ -0,0 +1,45 @@
+<%@ jet package="org.eclipse.e4.tools.orion.editor.builder" class="HTMLEditor" %>
+<% EditorOptions options = (EditorOptions)argument; %>
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<title>Theme CSS editor</title>
+<style>
+#editor {
+	//border: 1px solid teal;
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	bottom: 0px;
+	right: 0px;
+	//margin: 20px;
+	margin: 0px;
+}
+
+pre {
+	margin: 0px;
+}
+</style>
+<link rel="stylesheet" type="text/css" href="<%= options.getEditorCssUrl() %>"/>
+<script src="<%= options.getEditorJsUrl() %>"></script>
+
+<script>
+	function setOrionEditor(editor) {
+	  window.editor = editor;
+	  if (typeof orion_onLoad == 'function') orion_onLoad();
+	}
+</script>
+
+<% for (String script : options.getScripts()) { %>
+<script>
+<%= script %>
+</script>
+<% } %>
+
+</head>
+<body spellcheck="false">
+<pre id="editor" class="editor" data-editor-lang="<%= options.getLang() %>" data-editor-show-folding-ruler="true" >
+</pre>
+</body>
+</html>
diff --git a/bundles/org.eclipse.e4.tools.orion.editor/templates/JSEdit.jsjet b/bundles/org.eclipse.e4.tools.orion.editor/templates/JSEdit.jsjet
new file mode 100644
index 0000000..ec8f975
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.editor/templates/JSEdit.jsjet
@@ -0,0 +1,10 @@
+<%@ jet package="org.eclipse.e4.tools.orion.editor.builder.js" class="JSEdit" %>
+
+/*globals require*/
+require(["orion/editor/edit"], function(edit) {
+	var editor = edit({
+		lang: "js"
+	});
+	setOrionEditor(editor);
+	//----------------
+});
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/built-editor.css b/bundles/org.eclipse.e4.tools.orion.editor/web/built-editor.css
similarity index 100%
rename from bundles/org.eclipse.e4.tools.orion.css.editor/web/built-editor.css
rename to bundles/org.eclipse.e4.tools.orion.editor/web/built-editor.css
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/built-editor.js b/bundles/org.eclipse.e4.tools.orion.editor/web/built-editor.js
similarity index 100%
rename from bundles/org.eclipse.e4.tools.orion.css.editor/web/built-editor.js
rename to bundles/org.eclipse.e4.tools.orion.editor/web/built-editor.js
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/orion.editor.txt b/bundles/org.eclipse.e4.tools.orion.editor/web/orion.editor.txt
similarity index 98%
rename from bundles/org.eclipse.e4.tools.orion.css.editor/web/orion.editor.txt
rename to bundles/org.eclipse.e4.tools.orion.editor/web/orion.editor.txt
index 1d2983e..86a3d79 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/web/orion.editor.txt
+++ b/bundles/org.eclipse.e4.tools.orion.editor/web/orion.editor.txt
@@ -1,3 +1,2 @@
 The current built-editor.css and built-editor.js 
 are from orion 4.0 I20130910-1040
-