The preference page which configures editor colors.

git-svn-id: https://svn.apache.org/repos/asf/incubator/click/trunk/tools/eclipse@715798 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/net.sf.clickide/plugin.properties b/net.sf.clickide/plugin.properties
index 2b37c50..050f1ca 100644
--- a/net.sf.clickide/plugin.properties
+++ b/net.sf.clickide/plugin.properties
@@ -7,7 +7,8 @@
 contentType.clickXML=Click Configuration File
 contentType.template=Click Page Template
 validator.clickXML=Click Configuration Validator
-preference.template=Template
+preference.wizardTemplate=Wizard Template
+preference.templateEditor=Template Editor
 action.newClickPage=New Click Page
 action.switchToHTML=Switch to HTML
 action.switchToClass=Switch to Class
diff --git a/net.sf.clickide/plugin.xml b/net.sf.clickide/plugin.xml
index 15a6f03..bcce7c9 100644
--- a/net.sf.clickide/plugin.xml
+++ b/net.sf.clickide/plugin.xml
@@ -168,8 +168,13 @@
      <page
            class="net.sf.clickide.preferences.ClickTemplatePreferencePage"
            id="net.sf.clickide.preferences.ClickTemplatePreferencePage"
-           name="%preference.template"
+           name="%preference.wizardTemplate"
            category="net.sf.clickide.preferences.ClickPreferencePage"/>
+     <page
+           category="net.sf.clickide.preferences.ClickPreferencePage"
+           class="net.sf.clickide.preferences.TemplateEditorPreferencePage"
+           id="net.sf.clickide.preferences.TemplateEditorPreferencePage"
+           name="%preference.templateEditor"/>
   </extension>
   <extension
         point="org.eclipse.core.runtime.preferences">
diff --git a/net.sf.clickide/plugin_ja.properties b/net.sf.clickide/plugin_ja.properties
index 5c44606..788ec22 100644
--- a/net.sf.clickide/plugin_ja.properties
+++ b/net.sf.clickide/plugin_ja.properties
@@ -7,7 +7,8 @@
 contentType.clickXML=Click\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb
 contentType.template=Click\u30da\u30fc\u30b8\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
 validator.clickXML=Click\u8a2d\u5b9a\u30d0\u30ea\u30c7\u30fc\u30bf
-preference.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
+preference.wizardTemplate=\u30a6\u30a3\u30b6\u30fc\u30c9\u30fb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
+preference.templateEditor=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30fb\u30a8\u30c7\u30a3\u30bf
 action.newClickPage=\u65b0\u898fClick\u30da\u30fc\u30b8\u306e\u4f5c\u6210
 action.switchToHTML=HTML\u30d5\u30a1\u30a4\u30eb\u306b\u5207\u308a\u66ff\u3048
 action.switchToClass=\u30da\u30fc\u30b8\u30af\u30e9\u30b9\u306b\u5207\u308a\u66ff\u3048
\ No newline at end of file
diff --git a/net.sf.clickide/src/net/sf/clickide/ClickPlugin.java b/net.sf.clickide/src/net/sf/clickide/ClickPlugin.java
index 284126d..5fda51b 100644
--- a/net.sf.clickide/src/net/sf/clickide/ClickPlugin.java
+++ b/net.sf.clickide/src/net/sf/clickide/ClickPlugin.java
@@ -21,6 +21,7 @@
 	//The shared instance.
 	private static ClickPlugin plugin;
 	private ResourceBundle resource;
+	private ColorManager colorManager;
 	
 	public static final String CLICK_PAGE_CLASS = "net.sf.click.Page";
 	public static final String CLICK_CONTROL_IF = "net.sf.click.Control";
@@ -53,6 +54,9 @@
 	public static final String[] HEADER_TYPE_VALUES = {"String", "Integer", "Date"};
 	
 	public static final String PREF_TEMPLATES = "click.templates";
+	public static final String PREF_COLOR_VAR = "click.color.variable";
+	public static final String PREF_COLOR_DIR = "click.color.directive";
+	public static final String PREF_COLOR_CMT = "click.color.comment";
 	
 	/**
 	 * The constructor.
@@ -62,6 +66,13 @@
 		resource = ResourceBundle.getBundle("net.sf.clickide.ClickPlugin");
 	}
 	
+	public ColorManager getColorManager(){
+		if(this.colorManager==null){
+			this.colorManager = new ColorManager();
+		}
+		return this.colorManager;
+	}
+	
 	/**
 	 * Returns the localized message from <tt>ClickPlugin.properties</tt>.
 	 * 
@@ -96,6 +107,7 @@
 	 */
 	public void stop(BundleContext context) throws Exception {
 		super.stop(context);
+		colorManager.dispose();
 		plugin = null;
 	}
 
diff --git a/net.sf.clickide/src/net/sf/clickide/ClickPlugin.properties b/net.sf.clickide/src/net/sf/clickide/ClickPlugin.properties
index 44d2bba..174ea0f 100644
--- a/net.sf.clickide/src/net/sf/clickide/ClickPlugin.properties
+++ b/net.sf.clickide/src/net/sf/clickide/ClickPlugin.properties
@@ -69,8 +69,12 @@
 wizard.newPage.dialog.selectSourceFolder=Select Source Folder
 
 # for preference pages
-preferences.template=Template
+preferences.template=Wizard Template
 preferences.template.name=Name
 preferences.template.pageClass=Page Class
 preferences.template.htmlTemplate=HTML Template
 preferences.template.dialog.variables=following valiables are available:
+preferences.templateEditor=Template Editor
+preferences.templateEditor.colorVariable=&Variable:
+preferences.templateEditor.colorDirective=&Directive:
+preferences.templateEditor.colorComment=&Comment:
diff --git a/net.sf.clickide/src/net/sf/clickide/ClickPlugin_ja.properties b/net.sf.clickide/src/net/sf/clickide/ClickPlugin_ja.properties
index c084f81..dc3379b 100644
--- a/net.sf.clickide/src/net/sf/clickide/ClickPlugin_ja.properties
+++ b/net.sf.clickide/src/net/sf/clickide/ClickPlugin_ja.properties
@@ -69,8 +69,12 @@
 wizard.newPage.dialog.selectSourceFolder=\u30bd\u30fc\u30b9\u30d5\u30a9\u30eb\u30c0\u306e\u9078\u629e
 
 # for preference pages
-preferences.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
+preferences.template=\u30a6\u30a3\u30b6\u30fc\u30c9\u30fb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
 preferences.template.name=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d
 preferences.template.pageClass=\u30da\u30fc\u30b8\u30af\u30e9\u30b9
 preferences.template.htmlTemplate=HTML\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8
 preferences.template.dialog.variables=\u4ee5\u4e0b\u306e\u5909\u6570\u304c\u5229\u7528\u53ef\u80fd\u3067\u3059:
+preferences.templateEditor=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30fb\u30a8\u30c7\u30a3\u30bf
+preferences.templateEditor.colorVariable=\u5909\u6570(&V):
+preferences.templateEditor.colorDirective=\u30c7\u30a3\u30ec\u30af\u30c6\u30a3\u30d6(&D):
+preferences.templateEditor.colorComment=\u30b3\u30e1\u30f3\u30c8(&C):
diff --git a/net.sf.clickide/src/net/sf/clickide/ColorManager.java b/net.sf.clickide/src/net/sf/clickide/ColorManager.java
new file mode 100644
index 0000000..bf82487
--- /dev/null
+++ b/net.sf.clickide/src/net/sf/clickide/ColorManager.java
@@ -0,0 +1,71 @@
+package net.sf.clickide;

+

+import java.util.HashMap;

+import java.util.Iterator;

+import java.util.Map;

+

+import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.jface.resource.StringConverter;

+import org.eclipse.jface.util.IPropertyChangeListener;

+import org.eclipse.jface.util.PropertyChangeEvent;

+import org.eclipse.swt.graphics.Color;

+import org.eclipse.swt.widgets.Display;

+

+/**

+ * Manages SWT's <code>Color</code> objects which are configued by the preference page.

+ * 

+ * @author Naoki Takezoe

+ */

+public class ColorManager {

+	

+	private IPreferenceStore store;

+	private Map colors = new HashMap();

+	

+	private IPropertyChangeListener listener = new IPropertyChangeListener(){

+		public void propertyChange(PropertyChangeEvent event) {

+			updateColors();

+		}

+	};

+	

+	public ColorManager(){

+		store = ClickPlugin.getDefault().getPreferenceStore();

+		store.addPropertyChangeListener(listener);

+		updateColors();

+	}

+	

+	/**

+	 * Returns the cached <code>Color<code> object.

+	 * 

+	 * @param key the preference key defined as the static variable in <code>ClickPlugin</code>

+	 * @return the <code>Color</code> object

+	 */

+	public Color get(String key){

+		return (Color)colors.get(key);

+	}

+	

+	private void updateColors(){

+		colors.put(ClickPlugin.PREF_COLOR_VAR, new Color(Display.getDefault(), 

+				StringConverter.asRGB(store.getString(ClickPlugin.PREF_COLOR_VAR))));

+		colors.put(ClickPlugin.PREF_COLOR_DIR, new Color(Display.getDefault(), 

+				StringConverter.asRGB(store.getString(ClickPlugin.PREF_COLOR_DIR))));

+		colors.put(ClickPlugin.PREF_COLOR_CMT, new Color(Display.getDefault(), 

+				StringConverter.asRGB(store.getString(ClickPlugin.PREF_COLOR_CMT))));

+	}

+	

+	private void disposeColors(){

+		for(Iterator i = colors.values().iterator(); i.hasNext();){

+			Color color = (Color)i.next();

+			color.dispose();

+		}

+		colors.clear();

+	}

+	

+	/**

+	 * Disposes all <code>Color</code> objects.

+	 */

+	public void dispose(){

+		disposeColors();

+		store.removePropertyChangeListener(listener);

+	}

+	

+}

diff --git a/net.sf.clickide/src/net/sf/clickide/preferences/ClickPreferenceInitializer.java b/net.sf.clickide/src/net/sf/clickide/preferences/ClickPreferenceInitializer.java
index 1da70e1..0193188 100644
--- a/net.sf.clickide/src/net/sf/clickide/preferences/ClickPreferenceInitializer.java
+++ b/net.sf.clickide/src/net/sf/clickide/preferences/ClickPreferenceInitializer.java
@@ -7,6 +7,8 @@
 

 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;

 import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.jface.resource.StringConverter;

+import org.eclipse.swt.graphics.RGB;

 

 /**

  * Initializes the preference store.

@@ -19,6 +21,9 @@
 		IPreferenceStore store = ClickPlugin.getDefault().getPreferenceStore();

 		try {

 			store.setDefault(ClickPlugin.PREF_TEMPLATES, getResourceAsText("default_templates.xml"));

+			store.setDefault(ClickPlugin.PREF_COLOR_VAR, StringConverter.asString(new RGB(128,0,0)));

+			store.setDefault(ClickPlugin.PREF_COLOR_DIR, StringConverter.asString(new RGB(0,0,128)));

+			store.setDefault(ClickPlugin.PREF_COLOR_CMT, StringConverter.asString(new RGB(0,128,0)));

 		} catch(Exception ex){

 			ClickPlugin.log(ex);

 		}

diff --git a/net.sf.clickide/src/net/sf/clickide/preferences/TemplateEditorPreferencePage.java b/net.sf.clickide/src/net/sf/clickide/preferences/TemplateEditorPreferencePage.java
new file mode 100644
index 0000000..d0d5497
--- /dev/null
+++ b/net.sf.clickide/src/net/sf/clickide/preferences/TemplateEditorPreferencePage.java
@@ -0,0 +1,41 @@
+package net.sf.clickide.preferences;

+

+import net.sf.clickide.ClickPlugin;

+

+import org.eclipse.jface.preference.ColorFieldEditor;

+import org.eclipse.jface.preference.FieldEditorPreferencePage;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.ui.IWorkbench;

+import org.eclipse.ui.IWorkbenchPreferencePage;

+

+public class TemplateEditorPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

+	

+	public TemplateEditorPreferencePage(){

+		super(GRID);

+		setPreferenceStore(ClickPlugin.getDefault().getPreferenceStore());

+	}

+	

+	protected void createFieldEditors() {

+		setTitle(ClickPlugin.getString("preferences.templateEditor"));

+		Composite parent = getFieldEditorParent();

+		

+		ColorFieldEditor variable = new ColorFieldEditor(

+				ClickPlugin.PREF_COLOR_VAR, 

+				ClickPlugin.getString("preferences.templateEditor.colorVariable"), parent);

+		addField(variable);

+		

+		ColorFieldEditor directive = new ColorFieldEditor(

+				ClickPlugin.PREF_COLOR_DIR,

+				ClickPlugin.getString("preferences.templateEditor.colorDirective"), parent);

+		addField(directive);

+		

+		ColorFieldEditor comment = new ColorFieldEditor(

+				ClickPlugin.PREF_COLOR_CMT, 

+				ClickPlugin.getString("preferences.templateEditor.colorComment"), parent);

+		addField(comment);

+	}

+

+	public void init(IWorkbench workbench) {

+	}

+

+}

diff --git a/net.sf.clickide/src/net/sf/clickide/ui/editor/LineStyleProviderForVelocity.java b/net.sf.clickide/src/net/sf/clickide/ui/editor/LineStyleProviderForVelocity.java
index 0ceb36f..609aea6 100644
--- a/net.sf.clickide/src/net/sf/clickide/ui/editor/LineStyleProviderForVelocity.java
+++ b/net.sf.clickide/src/net/sf/clickide/ui/editor/LineStyleProviderForVelocity.java
@@ -4,11 +4,11 @@
 import java.util.regex.Matcher;

 import java.util.regex.Pattern;

 

+import net.sf.clickide.ClickPlugin;

+

 import org.eclipse.jface.text.ITypedRegion;

-import org.eclipse.swt.SWT;

 import org.eclipse.swt.custom.StyleRange;

 import org.eclipse.swt.graphics.Color;

-import org.eclipse.swt.widgets.Display;

 import org.eclipse.wst.html.ui.internal.style.LineStyleProviderForHTML;

 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;

@@ -32,9 +32,9 @@
 	public boolean prepareRegions(ITypedRegion currentRegion, int start, int length, Collection styleRanges) {

         boolean result = super.prepareRegions(currentRegion, start, length, styleRanges);

         

-		Color var = Display.getDefault().getSystemColor(SWT.COLOR_DARK_RED);

-		Color dir = Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE);

-		Color comment = Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN);

+    	Color colorVariable = ClickPlugin.getDefault().getColorManager().get(ClickPlugin.PREF_COLOR_VAR);

+    	Color colorDirective = ClickPlugin.getDefault().getColorManager().get(ClickPlugin.PREF_COLOR_DIR);

+    	Color colorComment = ClickPlugin.getDefault().getColorManager().get(ClickPlugin.PREF_COLOR_CMT);

         Object sr[] = styleRanges.toArray();

 		

         for(int i = 0; i < sr.length; i++)

@@ -60,12 +60,12 @@
                 text = (new StringBuilder(String.valueOf(text))).append(chkRegion.getText()).toString();

             }

 

-            Pattern p = Pattern.compile("#.*|\\$((\\{.*?\\})|([a-zA-Z0-9\\-_]*))");

+            Pattern p = Pattern.compile("##.*|#[a-z]+|\\$((\\{.*?\\})|([a-zA-Z0-9\\-_]*))");

             Matcher m = p.matcher(text);

             int pos = 0;

             while(m.find()) {

-            	Color color = m.group().startsWith("##") ? comment : 

-            		          m.group().startsWith("#") ? dir : var;

+            	Color color = m.group().startsWith("##") ? colorComment : 

+            		          m.group().startsWith("#") ? colorDirective : colorVariable;

             	

                 if(m.start() < mStart){

                     if(m.end() < mStart){