Bug 410841 - Explorer editing CSS with orion

Hook in basic keyword completion from the extension point.
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/views/SampleCSSView.java b/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/views/SampleCSSView.java
index 544d8af..d4ec3c6 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/views/SampleCSSView.java
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/src/org/eclipse/e4/tools/orion/css/editor/views/SampleCSSView.java
@@ -6,9 +6,16 @@
 import java.io.Reader;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.core.runtime.FileLocator;
+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;
 import org.eclipse.e4.tools.orion.css.editor.Activator;
 import org.eclipse.e4.ui.css.swt.internal.theme.ThemeEngine;
 import org.eclipse.e4.ui.css.swt.theme.ITheme;
@@ -64,33 +71,85 @@
 		try {
 			initContent();
 			final Bundle bundle = Activator.getDefault().getBundle();
-			final InputStream in = bundle
-					.getEntry("/web/css.html").openStream();
-			String cssTemplate = loadFile(in, 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, editorContent);
+			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);
 			System.out.println(editorHtml);
 		} catch (IOException e) {
 			throw new PartInitException("Failed to load CSS editor", e);
 		}
 	}
-	
+
+	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();
+	}
+
 	private void initContent() throws MalformedURLException, IOException {
-		IThemeEngine engine = (IThemeEngine) getSite().getService(IThemeEngine.class);
+		IThemeEngine engine = (IThemeEngine) getSite().getService(
+				IThemeEngine.class);
 		final ITheme theme = engine.getActiveTheme();
-		final List<String> sheets = ((ThemeEngine)engine).getStylesheets(theme);
-		if (sheets.size()>0) {
+		final List<String> sheets = ((ThemeEngine) engine)
+				.getStylesheets(theme);
+		if (sheets.size() > 0) {
 			String path = sheets.get(0);
-			final InputStream in = FileLocator.toFileURL(new URL(sheets.get(0))).openStream();
+			final InputStream in = FileLocator
+					.toFileURL(new URL(sheets.get(0))).openStream();
 			editorContent = loadFile(in, 1024);
 		} else {
 			editorContent = "/*\n * This is an Orion editor sample.\n */\nfunction() {\n    var a = 'hi there!';\n    window.console.log(a);\n}";
 		}
 	}
 
-	public String loadFile(final InputStream in, final int bufferSize) throws IOException {
+	public String loadFile(final InputStream in, final int bufferSize)
+			throws IOException {
 		final char[] buffer = new char[bufferSize];
 		final StringBuilder out = new StringBuilder();
 		final Reader reader = new InputStreamReader(in, "UTF-8");
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
index 8455588..716dd05 100644
--- a/bundles/org.eclipse.e4.tools.orion.css.editor/web/css.html
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/web/css.html
@@ -1,16 +1,44 @@
 <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>
-	require(["orion/editor/edit"], function(edit) {
-		window.editor = edit({className: "editor"})[0];
+%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>
-<h2>Sample CSS Editor</h2>
-<pre id="regulus" class="editor" data-editor-lang="css">
+<body spellcheck="false">
+<pre id="editor" class="editor" data-editor-lang="css">
 %s
 </pre>
 </body>
diff --git a/bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js b/bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js
new file mode 100644
index 0000000..b371f6d
--- /dev/null
+++ b/bundles/org.eclipse.e4.tools.orion.css.editor/web/swtContentAssist.js
@@ -0,0 +1,66 @@
+

+/*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