[SCM] Lisaac eclipse plugin branch, master, updated. 35c1aa11404b2bac880aa3434ddb3b194cd5adbc

Damien Bouvarel dams.bouvarel at wanadoo.fr
Tue Apr 14 16:26:54 UTC 2009


The following commit has been merged in the master branch:
commit 91fe3d54f2d35a87c61db288829a1d9ecb20f6e9
Author: Damien Bouvarel <dams.bouvarel at wanadoo.fr>
Date:   Tue Apr 7 21:36:05 2009 +0200

    add templates in Lisaac editor & preferences

diff --git a/plugin.xml b/plugin.xml
index 856c0e6..6818baa 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -18,7 +18,7 @@
       <editor
             name="Lisaac Editor"
             extensions="li"
-            icon="icons/sample.gif"
+            icon="icons/prototype.gif"
             contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
             class="org.eclipse.lisaac.editors.LisaacEditor"
             id="org.eclipse.lisaac.editors.LisaacEditor">
@@ -66,6 +66,12 @@
             class="org.eclipse.lisaac.preferences.LisaacPreferencePage"
             id="org.eclipse.lisaac.preferences.LisaacPreferencePage">
       </page>
+      <page
+            category="org.eclipse.lisaac.preferences.LisaacPreferencePage"
+            class="org.eclipse.lisaac.preferences.LisaacTemplatePage"
+            id="org.eclipse.lisaac.templatepreferences"
+            name="Lisaac Templates">
+      </page>
    </extension>
    <extension
          point="org.eclipse.core.runtime.preferences">
@@ -106,16 +112,19 @@
             icon="icons/sample.gif"
             id="org.eclipse.lisaac.wizard"
             name="Lisaac Project"
+            preferredPerspectives="org.eclipse.lisaac.perspectives.LisaacPerspective"
             project="true">
       </wizard>
       <wizard
             canFinishEarly="false"
             category="Lisaac"
             class="org.eclipse.lisaac.wizards.NewPrototypeWizard"
+            finalPerspective="org.eclipse.lisaac.perspectives.LisaacPerspective"
             hasPages="true"
-            icon="icons/lisaac-file.png"
+            icon="icons/prototype.gif"
             id="org.eclipse.lisaac.prototype"
             name="Lisaac Prototype"
+            preferredPerspectives="org.eclipse.lisaac.perspectives.LisaacPerspective"
             project="false">
       </wizard>
    </extension>
@@ -191,6 +200,27 @@
                label="Correct Indentation"
                menubarPath="org.eclipse.lisaac.sourcemenu/indent">
          </action>
+         <action
+               class="org.eclipse.lisaac.actions.GenerateConstructor"
+               definitionId="org.eclipse.lisaac.cmd2"
+               id="org.eclipse.lisaac.generateconstructor"
+               label="Generate Constructor"
+               menubarPath="org.eclipse.lisaac.sourcemenu/indent">
+         </action>
+         <menu
+               id="org.eclipse.lisaac.toolbar"
+               label="New Prototype">
+         </menu>
+         <action
+               class="org.eclipse.lisaac.actions.CreatePrototype"
+               definitionId="org.eclipse.lisaac.cmd3"
+               icon="icons/prototype.gif"
+               id="org.eclipse.lisaac.toolbar_action1"
+               label="New Prototype"
+               style="push"
+               toolbarPath="org.eclipse.lisaac.toolbar"
+               tooltip="Create new prototype">
+         </action>
       </actionSet>
    </extension>
    <extension
@@ -204,6 +234,16 @@
             id="org.eclipse.lisaac.commands"
             name="Lisaac Command">
       </category>
+      <command
+            categoryId="org.eclipse.lisaac.commands"
+            id="org.eclipse.lisaac.cmd2"
+            name="Generate Constructor">
+      </command>
+      <command
+            categoryId="org.eclipse.lisaac.commands"
+            id="org.eclipse.lisaac.cmd3"
+            name="New Prototype">
+      </command>
    </extension>
    <extension
          point="org.eclipse.ui.bindings">
@@ -231,5 +271,97 @@
          </description>
       </cheatsheet>
    </extension>
+   <extension
+         point="org.eclipse.ui.editors.templates">
+      <contextType
+            class="org.eclipse.lisaac.templates.LisaacContextType"
+            id="org.eclipse.lisaac.contexttype"
+            name="Lisaac context type">
+      </contextType>
+      <resolver
+            class="org.eclipse.lisaac.templates.LisaacVariableResolver"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            name="Lisaac resolver"
+            type="lisaac">
+      </resolver>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="While loop"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_whiledo"
+            name="while_do">
+         <pattern>
+            while_do {
+  ${cursor}
+};
+         </pattern>
+      </template>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="Until Loop"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_untildo"
+            name="until_do">
+         <pattern>
+            until_do {
+  ${cursor}
+};
+         </pattern>
+      </template>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="If statement"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_if"
+            name="if">
+         <pattern>
+            if {
+  ${cursor}
+};
+         </pattern>
+      </template>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="If Else statement"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_ifelse"
+            name="if__else">
+         <pattern>
+            if {
+  ${cursor}
+} else {
+};
+         </pattern>
+      </template>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="If false statement"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_iffalse"
+            name="if_false">
+         <pattern>
+            if_false {
+  ${cursor}
+};
+         </pattern>
+      </template>
+      <template
+            autoinsert="true"
+            contextTypeId="org.eclipse.lisaac.contexttype"
+            description="For loop"
+            icon="icons/template.gif"
+            id="org.eclipse.lisaac.template_for"
+            name="to__do">
+         <pattern>
+            to ${cursor} do { i:INTEGER;
+};
+         </pattern>
+      </template>
+   </extension>
 
 </plugin>
diff --git a/src/org/eclipse/lisaac/LisaacPlugin.java b/src/org/eclipse/lisaac/LisaacPlugin.java
index 94e1fa6..8f292c2 100644
--- a/src/org/eclipse/lisaac/LisaacPlugin.java
+++ b/src/org/eclipse/lisaac/LisaacPlugin.java
@@ -1,10 +1,18 @@
 package org.eclipse.lisaac;
 
+import java.io.IOException;
+
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
 import org.eclipse.lisaac.model.LisaacModel;
+import org.eclipse.lisaac.templates.LisaacContextType;
+import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
+import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
@@ -18,7 +26,49 @@ public class LisaacPlugin extends AbstractUIPlugin {
 
 	// The shared instance
 	private static LisaacPlugin plugin;
-		
+
+
+	/** The template store. */
+	private TemplateStore fStore;
+	/** The context type registry. */
+	private ContextTypeRegistry fRegistry;
+
+
+	private static final String TEMPLATES_KEY = "org.eclipse.lisaac.templatepreferences"; //$NON-NLS-1$
+
+
+	public TemplateStore getTemplateStore() {
+		if (fStore == null) {
+			fStore = new ContributionTemplateStore (
+					getContextTypeRegistry(), LisaacPlugin
+					.getDefault().getPreferenceStore(),
+					TEMPLATES_KEY);
+			try {
+				fStore.load();
+			} catch (IOException e) {
+				LisaacPlugin
+				.getDefault()
+				.getLog()
+				.log(
+						new Status(
+								IStatus.ERROR,
+								"org.eclipse.lisaac", IStatus.OK, "", e)); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return fStore;
+	}
+
+	public ContextTypeRegistry getContextTypeRegistry() {
+		if (fRegistry == null) {
+			// create an configure the contexts available in the template editor
+			ContributionContextTypeRegistry registry= new ContributionContextTypeRegistry();
+			registry.addContextType(LisaacContextType.ID_CONTEXT_TYPE);
+
+			fRegistry= registry;
+		}
+		return fRegistry;
+	}
+
 	/**
 	 * The constructor
 	 */
@@ -32,7 +82,7 @@ public class LisaacPlugin extends AbstractUIPlugin {
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		plugin = this;
-			
+
 		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
 		for (int i=0; i<projects.length; i++) {
 			// create lisaac model
@@ -69,7 +119,7 @@ public class LisaacPlugin extends AbstractUIPlugin {
 	public static ImageDescriptor getImageDescriptor(String path) {
 		return imageDescriptorFromPlugin(PLUGIN_ID, path);
 	}
-	
+
 	/**
 	 * Logs the specified status with this plug-in's log.
 	 *
diff --git a/src/org/eclipse/lisaac/actions/CreatePrototype.java b/src/org/eclipse/lisaac/actions/CreatePrototype.java
new file mode 100644
index 0000000..2fa973b
--- /dev/null
+++ b/src/org/eclipse/lisaac/actions/CreatePrototype.java
@@ -0,0 +1,51 @@
+package org.eclipse.lisaac.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.lisaac.LisaacPlugin;
+import org.eclipse.lisaac.editors.LisaacEditor;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+public class CreatePrototype implements IWorkbenchWindowActionDelegate {
+
+
+	/**
+	 * The action has been activated. The argument of the
+	 * method represents the 'real' action sitting
+	 * in the workbench UI.
+	 * @see IWorkbenchWindowActionDelegate#run
+	 */
+	public void run(IAction action) {
+		// TODO start prototype wizard
+	}
+
+	/**
+	 * Selection in the workbench has been changed. We 
+	 * can change the state of the 'real' action here
+	 * if we want, but this can only happen after 
+	 * the delegate has been created.
+	 * @see IWorkbenchWindowActionDelegate#selectionChanged
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+	
+	/**
+	 * We will cache window object in order to
+	 * be able to provide parent shell for the message dialog.
+	 * @see IWorkbenchWindowActionDelegate#init
+	 */
+	public void init(IWorkbenchWindow window) {
+	}
+	
+	/**
+	 * We can use this method to dispose of any system
+	 * resources we previously allocated.
+	 * @see IWorkbenchWindowActionDelegate#dispose
+	 */
+	public void dispose() {
+	}
+}
diff --git a/src/org/eclipse/lisaac/actions/IndentAction.java b/src/org/eclipse/lisaac/actions/GenerateConstructor.java
similarity index 63%
copy from src/org/eclipse/lisaac/actions/IndentAction.java
copy to src/org/eclipse/lisaac/actions/GenerateConstructor.java
index 73298a8..b19a24b 100644
--- a/src/org/eclipse/lisaac/actions/IndentAction.java
+++ b/src/org/eclipse/lisaac/actions/GenerateConstructor.java
@@ -1,79 +1,80 @@
-package org.eclipse.lisaac.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.lisaac.LisaacPlugin;
-import org.eclipse.lisaac.editors.LisaacAutoEditStrategy;
-import org.eclipse.lisaac.editors.LisaacEditor;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Our sample action implements workbench action delegate.
- * The action proxy will be created by the workbench and
- * shown in the UI. When the user tries to use the action,
- * this delegate will be created and execution will be 
- * delegated to it.
- * @see IWorkbenchWindowActionDelegate
- */
-public class IndentAction implements IWorkbenchWindowActionDelegate {
-	/**
-	 * The constructor.
-	 */
-	public IndentAction() {
-	}
-
-	/**
-	 * The action has been activated. The argument of the
-	 * method represents the 'real' action sitting
-	 * in the workbench UI.
-	 * @see IWorkbenchWindowActionDelegate#run
-	 */
-	public void run(IAction action) {
-		IWorkbenchWindow w = LisaacPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
-
-		IWorkbenchPart part = w.getPartService().getActivePart();
-		if (part instanceof LisaacEditor) {
-			IDocument document = ((LisaacEditor)part).getDocument();
-			//
-			LisaacAutoEditStrategy.fullIndentDocument(document);
-			//
-		}
-	}
-
-	/**
-	 * Selection in the workbench has been changed. We 
-	 * can change the state of the 'real' action here
-	 * if we want, but this can only happen after 
-	 * the delegate has been created.
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		IWorkbenchWindow w = LisaacPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
-
-		IWorkbenchPart part = w.getPartService().getActivePart();
-		if (part instanceof LisaacEditor) {
-			action.setEnabled(true);
-		} else {
-			action.setEnabled(false);
-		}
-	}
-
-	/**
-	 * We can use this method to dispose of any system
-	 * resources we previously allocated.
-	 * @see IWorkbenchWindowActionDelegate#dispose
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * We will cache window object in order to
-	 * be able to provide parent shell for the message dialog.
-	 * @see IWorkbenchWindowActionDelegate#init
-	 */
-	public void init(IWorkbenchWindow window) {
-	}
-}
\ No newline at end of file
+package org.eclipse.lisaac.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.lisaac.LisaacPlugin;
+import org.eclipse.lisaac.editors.LisaacEditor;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+public class GenerateConstructor implements IWorkbenchWindowActionDelegate {
+
+
+	/**
+	 * The action has been activated. The argument of the
+	 * method represents the 'real' action sitting
+	 * in the workbench UI.
+	 * @see IWorkbenchWindowActionDelegate#run
+	 */
+	public void run(IAction action) {
+		IWorkbenchWindow w = LisaacPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+
+		IWorkbenchPart part = w.getPartService().getActivePart();
+		if (part instanceof LisaacEditor) {
+			IDocument document = ((LisaacEditor)part).getDocument();
+			//
+			int caret = ((LisaacEditor)part).getViewer().getTextWidget().getCaretOffset();
+			String constructor = getConstructor();
+			try {
+				document.replace(caret, 0, constructor);
+			} catch (BadLocationException e) {
+			}
+			//
+		}
+	}
+	
+	private String getConstructor() {
+		StringBuffer buffer = new StringBuffer();
+		buffer.append("\n  //\n  // Creation.\n  //\n");
+		buffer.append("\n  - create:SELF <-");
+		buffer.append("\n  ( + result:SELF;");
+		buffer.append("\n    result := clone;");
+		buffer.append("\n    result.make;");
+		buffer.append("\n    result");
+		buffer.append("\n  );");
+		buffer.append("\n");
+		buffer.append("\n  - make <-");
+		buffer.append("\n  (");
+		buffer.append("\n  );");
+		return buffer.toString();
+	}
+
+	/**
+	 * Selection in the workbench has been changed. We 
+	 * can change the state of the 'real' action here
+	 * if we want, but this can only happen after 
+	 * the delegate has been created.
+	 * @see IWorkbenchWindowActionDelegate#selectionChanged
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+	
+	/**
+	 * We will cache window object in order to
+	 * be able to provide parent shell for the message dialog.
+	 * @see IWorkbenchWindowActionDelegate#init
+	 */
+	public void init(IWorkbenchWindow window) {
+	}
+	
+	/**
+	 * We can use this method to dispose of any system
+	 * resources we previously allocated.
+	 * @see IWorkbenchWindowActionDelegate#dispose
+	 */
+	public void dispose() {
+	}
+}
diff --git a/src/org/eclipse/lisaac/editors/AbstractLisaacEditor.java b/src/org/eclipse/lisaac/editors/AbstractLisaacEditor.java
index 282b32a..7ca9e73 100644
--- a/src/org/eclipse/lisaac/editors/AbstractLisaacEditor.java
+++ b/src/org/eclipse/lisaac/editors/AbstractLisaacEditor.java
@@ -6,6 +6,7 @@ import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewerExtension2;
 import org.eclipse.jface.text.source.ISourceViewer;
@@ -15,6 +16,7 @@ import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.editors.text.TextEditor;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.texteditor.ContentAssistAction;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
 import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 
diff --git a/src/org/eclipse/lisaac/editors/LisaacCompletionProcessor.java b/src/org/eclipse/lisaac/editors/LisaacCompletionProcessor.java
index 1c30641..54791da 100644
--- a/src/org/eclipse/lisaac/editors/LisaacCompletionProcessor.java
+++ b/src/org/eclipse/lisaac/editors/LisaacCompletionProcessor.java
@@ -12,6 +12,7 @@ import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
 import org.eclipse.lisaac.model.LisaacCompletionParser;
+import org.eclipse.lisaac.templates.LisaacTemplateProcessor;
 
 
 public class LisaacCompletionProcessor implements IContentAssistProcessor {
@@ -20,15 +21,24 @@ public class LisaacCompletionProcessor implements IContentAssistProcessor {
 	private final char[] PROPOSAL_ACTIVATION_CHARS = new char[] { '.', '('};
 	private ICompletionProposal[] NO_COMPLETIONS = new ICompletionProposal[0];
 
-
+	private LisaacTemplateProcessor templates;
+	
+	
 	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
 		try {
 			IDocument document = viewer.getDocument();
-			ArrayList<CompletionProposal> result = new ArrayList<CompletionProposal>();
+			ArrayList<ICompletionProposal> result = new ArrayList<ICompletionProposal>();
 
 			//
 			computeLisaacCompletion(document, offset, result);
 			//
+			
+			templates = new LisaacTemplateProcessor();
+			ICompletionProposal[] props = templates.computeCompletionProposals(viewer, offset);
+			for (int t=0; t<props.length; t++) {
+				result.add(props[t]);
+			}
+			
 			String prefix = lastWord(document, offset);
 
 			if (prefix.startsWith("Sec")) {
@@ -44,7 +54,7 @@ public class LisaacCompletionProcessor implements IContentAssistProcessor {
 	}
 
 	private void computeLisaacCompletion(IDocument document, int baseOffset, 
-			ArrayList<CompletionProposal> proposals) {
+			ArrayList<ICompletionProposal> proposals) {
 		int bracketLevel=0;
 		//
 		// Rewind to '('  ';' '['
diff --git a/src/org/eclipse/lisaac/editors/LisaacConfiguration.java b/src/org/eclipse/lisaac/editors/LisaacConfiguration.java
index 8dced78..61372eb 100644
--- a/src/org/eclipse/lisaac/editors/LisaacConfiguration.java
+++ b/src/org/eclipse/lisaac/editors/LisaacConfiguration.java
@@ -18,6 +18,7 @@ import org.eclipse.jface.text.rules.Token;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.jface.text.source.SourceViewerConfiguration;
 import org.eclipse.lisaac.model.LisaacModel;
+import org.eclipse.lisaac.templates.LisaacTemplateProcessor;
 
 /**
  * Manage the configuration of syntax coloration for lisaac documents.
diff --git a/src/org/eclipse/lisaac/editors/LisaacPartitionScanner.java b/src/org/eclipse/lisaac/editors/LisaacPartitionScanner.java
index 8cbca3a..5f541c3 100644
--- a/src/org/eclipse/lisaac/editors/LisaacPartitionScanner.java
+++ b/src/org/eclipse/lisaac/editors/LisaacPartitionScanner.java
@@ -22,7 +22,7 @@ public class LisaacPartitionScanner extends RuleBasedPartitionScanner {
 		rules[1] = new EndOfLineRule("//", comment);
 
 		// avoid processing comment inside lisaac strings
-		rules[2] = new SingleLineRule("\"", "\"", Token.UNDEFINED, '\0', true);
+		rules[2] = new MultiLineRule("\"", "\"", Token.UNDEFINED, '\0', true);
 		rules[3] = new SingleLineRule("`", "`", Token.UNDEFINED, '\0', true);
 		
 		setPredicateRules(rules);
diff --git a/src/org/eclipse/lisaac/editors/LisaacScanner.java b/src/org/eclipse/lisaac/editors/LisaacScanner.java
index 70127a6..bbc622b 100644
--- a/src/org/eclipse/lisaac/editors/LisaacScanner.java
+++ b/src/org/eclipse/lisaac/editors/LisaacScanner.java
@@ -119,7 +119,7 @@ public class LisaacScanner extends RuleBasedScanner {
 		IRule[] rules = new IRule[8];
 
 		// Add rule for processing strings
-		rules[0] = new SingleLineRule("\"", "\"", stringToken, '\0', true);// double
+		rules[0] = new MultiLineRule("\"", "\"", stringToken, '\0', true);// double
 		// quotes
 		rules[1] = new SingleLineRule("'", "'", characterToken, '\0', true);// simple
 		// quotes
diff --git a/src/org/eclipse/lisaac/model/LisaacCompletionParser.java b/src/org/eclipse/lisaac/model/LisaacCompletionParser.java
index be5343f..a603e63 100644
--- a/src/org/eclipse/lisaac/model/LisaacCompletionParser.java
+++ b/src/org/eclipse/lisaac/model/LisaacCompletionParser.java
@@ -10,6 +10,7 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.lisaac.LisaacPlugin;
 import org.eclipse.lisaac.builder.ILisaacErrorHandler;
 import org.eclipse.lisaac.editors.LisaacEditor;
@@ -38,7 +39,7 @@ public class LisaacCompletionParser extends LisaacParser {
 	 * @param proposals list of proposals to be filled  
 	 * @throws CoreException
 	 */
-	public void parseCompletions(int startOffset, int baseOffset, ArrayList<CompletionProposal> proposals)
+	public void parseCompletions(int startOffset, int baseOffset, ArrayList<ICompletionProposal> proposals)
 	throws CoreException {
 		IType type;
 
diff --git a/src/org/eclipse/lisaac/model/items/Prototype.java b/src/org/eclipse/lisaac/model/items/Prototype.java
index eb35a8d..0f42adf 100644
--- a/src/org/eclipse/lisaac/model/items/Prototype.java
+++ b/src/org/eclipse/lisaac/model/items/Prototype.java
@@ -8,6 +8,7 @@ import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.lisaac.model.ILisaacModel;
 import org.eclipse.lisaac.model.LisaacCompletionParser;
 import org.eclipse.lisaac.model.LisaacParser;
@@ -70,9 +71,9 @@ public class Prototype {
 
 	public void addHeaderData(String slotName, String data) {
 		if (headerData == null) {
-			headerData = data;
+			headerData = "<br>- "+slotName+" := "+data;
 		} else {
-			this.headerData += "- "+slotName+" := "+data;
+			this.headerData += "<br>- "+slotName+" := "+data;
 		}
 	}
 
@@ -192,7 +193,7 @@ public class Prototype {
 		return null;
 	}
 
-	public void lookupSlotMatch(String n, ArrayList<CompletionProposal> matchList, int offset, int length) {
+	public void lookupSlotMatch(String n, ArrayList<ICompletionProposal> matchList, int offset, int length) {
 		//
 		// Search in 'Self'.
 		//
@@ -217,7 +218,7 @@ public class Prototype {
 		}
 	}
 
-	public void getSlotMatch(String n, ArrayList<CompletionProposal> matchList, int offset, int length) {
+	public void getSlotMatch(String n, ArrayList<ICompletionProposal> matchList, int offset, int length) {
 		//
 		// Search in 'Self' only.
 		//
@@ -231,7 +232,7 @@ public class Prototype {
 		}
 	}
 
-	public void getParentSlotMatch(String n, ArrayList<CompletionProposal> matchList, int offset, int length) {
+	public void getParentSlotMatch(String n, ArrayList<ICompletionProposal> matchList, int offset, int length) {
 		// Search in 'Self' parent.
 		Collection<Slot> values = parentList.values();
 		Iterator<Slot> it = values.iterator() ;
@@ -279,7 +280,7 @@ public class Prototype {
 		return result;
 	}
 
-	public void getSlotProposals(ArrayList<CompletionProposal> proposals, 
+	public void getSlotProposals(ArrayList<ICompletionProposal> proposals, 
 			int offset, int length) {
 		Collection<Slot> values = slotList.values() ;
 		Iterator<Slot> it = values.iterator() ;
diff --git a/src/org/eclipse/lisaac/model/items/Slot.java b/src/org/eclipse/lisaac/model/items/Slot.java
index 7afcef6..2cec93f 100644
--- a/src/org/eclipse/lisaac/model/items/Slot.java
+++ b/src/org/eclipse/lisaac/model/items/Slot.java
@@ -5,6 +5,7 @@ import java.util.Collection;
 import java.util.Iterator;
 
 import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.lisaac.model.ILisaacModel;
 import org.eclipse.lisaac.model.Position;
 import org.eclipse.lisaac.model.types.IType;
@@ -178,18 +179,18 @@ public class Slot  {
 		return buffer.toString();
 	}
 
-	public void getSlotProposals(ArrayList<CompletionProposal> proposals, 
+	public void getSlotProposals(ArrayList<ICompletionProposal> proposals, 
 			int offset, int length) {
 
 		Image image = new OutlineSlot(this).getImage();
 		String displayString = getSignature(true);
 
 		proposals.add(new CompletionProposal(displayString,
-				offset, length, displayString.length(), image,
+				offset, length, displayString.length()-1, image,
 				getSignature(false), null, null));
 	}
 	
-	public void getSlotMatchProposals(ArrayList<CompletionProposal> proposals, 
+	public void getSlotMatchProposals(ArrayList<ICompletionProposal> proposals, 
 			int offset, int length, int matchLength) {
 
 		Image image = new OutlineSlot(this).getImage();
diff --git a/src/org/eclipse/lisaac/preferences/LisaacPreferencePage.java b/src/org/eclipse/lisaac/preferences/LisaacPreferencePage.java
index b017432..c12f236 100644
--- a/src/org/eclipse/lisaac/preferences/LisaacPreferencePage.java
+++ b/src/org/eclipse/lisaac/preferences/LisaacPreferencePage.java
@@ -36,6 +36,9 @@ public class LisaacPreferencePage
 	 * restore itself.
 	 */
 	public void createFieldEditors() {
+		addField(new StringFieldEditor(PreferenceConstants.P_LISAAC_USER, 
+					"&Your name :", getFieldEditorParent()));
+		
 		//addField(new DirectoryFieldEditor(PreferenceConstants.P_LISAAC_PATH, 
 			//	"&Lisaac Environment Directory:", getFieldEditorParent()));
 		/*addField(
diff --git a/src/org/eclipse/lisaac/preferences/LisaacTemplatePage.java b/src/org/eclipse/lisaac/preferences/LisaacTemplatePage.java
new file mode 100644
index 0000000..a1b032e
--- /dev/null
+++ b/src/org/eclipse/lisaac/preferences/LisaacTemplatePage.java
@@ -0,0 +1,25 @@
+package org.eclipse.lisaac.preferences;
+
+
+import org.eclipse.lisaac.LisaacPlugin;
+import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
+
+
+public class LisaacTemplatePage extends TemplatePreferencePage {
+  public LisaacTemplatePage() {
+	  setPreferenceStore(LisaacPlugin.getDefault().getPreferenceStore());
+    setTemplateStore(LisaacPlugin.getDefault().getTemplateStore());
+    setContextTypeRegistry(LisaacPlugin.getDefault().getContextTypeRegistry());
+  }
+  
+  protected boolean isShowFormatterSetting() {
+      return true;
+  }
+
+  public boolean performOk() {
+      boolean ok = super.performOk();
+
+      LisaacPlugin.getDefault().savePluginPreferences();
+      return ok;
+  }
+}
diff --git a/src/org/eclipse/lisaac/preferences/PreferenceConstants.java b/src/org/eclipse/lisaac/preferences/PreferenceConstants.java
index 46013e6..86f0eeb 100644
--- a/src/org/eclipse/lisaac/preferences/PreferenceConstants.java
+++ b/src/org/eclipse/lisaac/preferences/PreferenceConstants.java
@@ -6,5 +6,5 @@ package org.eclipse.lisaac.preferences;
 public class PreferenceConstants {
 
 	public static final String P_LISAAC_PATH = "";
-	
+	public static final String P_LISAAC_USER = "";
 }
diff --git a/src/org/eclipse/lisaac/templates/LisaacContextType.java b/src/org/eclipse/lisaac/templates/LisaacContextType.java
new file mode 100644
index 0000000..4bd76f0
--- /dev/null
+++ b/src/org/eclipse/lisaac/templates/LisaacContextType.java
@@ -0,0 +1,28 @@
+package org.eclipse.lisaac.templates;
+
+import org.eclipse.jface.text.templates.GlobalTemplateVariables;
+import org.eclipse.jface.text.templates.TemplateContextType;
+
+public class LisaacContextType extends TemplateContextType {
+	/** This context's id */
+	public static final String ID_CONTEXT_TYPE= "org.eclipse.lisaac.contexttype"; //$NON-NLS-1$
+
+	/**
+	 * Creates a new Lisaac context type.
+	 */
+	public LisaacContextType() {
+		addGlobalResolvers();
+	}
+
+	private void addGlobalResolvers() {
+		addResolver(new GlobalTemplateVariables.Cursor());
+		addResolver(new GlobalTemplateVariables.WordSelection());
+		addResolver(new GlobalTemplateVariables.LineSelection());
+		addResolver(new GlobalTemplateVariables.Dollar());
+		addResolver(new GlobalTemplateVariables.Date());
+		addResolver(new GlobalTemplateVariables.Year());
+		addResolver(new GlobalTemplateVariables.Time());
+		addResolver(new GlobalTemplateVariables.User());
+	}
+
+}
diff --git a/src/org/eclipse/lisaac/templates/LisaacTemplateProcessor.java b/src/org/eclipse/lisaac/templates/LisaacTemplateProcessor.java
new file mode 100644
index 0000000..5bbed9d
--- /dev/null
+++ b/src/org/eclipse/lisaac/templates/LisaacTemplateProcessor.java
@@ -0,0 +1,51 @@
+package org.eclipse.lisaac.templates;
+
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.lisaac.LisaacPlugin;
+import org.eclipse.swt.graphics.Image;
+
+public class LisaacTemplateProcessor extends TemplateCompletionProcessor {
+
+
+	/**
+	 * Simply return all templates.
+	 *
+	 * @param contextTypeId the context type, ignored in this implementation
+	 * @return all templates
+	 */
+	protected Template[] getTemplates(String contextTypeId) {
+		return LisaacPlugin.getDefault().getTemplateStore().getTemplates();
+	}
+
+	/**
+	 * Return the XML context type that is supported by this plug-in.
+	 *
+	 * @param viewer the viewer, ignored in this implementation
+	 * @param region the region, ignored in this implementation
+	 * @return the supported XML context type
+	 */
+	protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
+		return LisaacPlugin.getDefault().getContextTypeRegistry().getContextType(LisaacContextType.ID_CONTEXT_TYPE);
+	}
+
+	/**
+	 * Always return the default image.
+	 *
+	 * @param template the template, ignored in this implementation
+	 * @return the default template image
+	 */
+	protected Image getImage(Template template) {
+		ImageDescriptor descr = LisaacPlugin.getImageDescriptor("icons/template.gif");
+		return descr.createImage();
+	}
+
+}
diff --git a/src/org/eclipse/lisaac/templates/LisaacVariableResolver.java b/src/org/eclipse/lisaac/templates/LisaacVariableResolver.java
new file mode 100644
index 0000000..764edd0
--- /dev/null
+++ b/src/org/eclipse/lisaac/templates/LisaacVariableResolver.java
@@ -0,0 +1,13 @@
+package org.eclipse.lisaac.templates;
+
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateVariableResolver;
+
+public class LisaacVariableResolver extends TemplateVariableResolver {
+	
+	//
+	// add Lisaac variable here
+	//
+	
+	// TODO override resolve() & resolveAll() method
+}
diff --git a/src/org/eclipse/lisaac/wizards/NewPrototypeWizard.java b/src/org/eclipse/lisaac/wizards/NewPrototypeWizard.java
index 34e4191..5e8ebc3 100644
--- a/src/org/eclipse/lisaac/wizards/NewPrototypeWizard.java
+++ b/src/org/eclipse/lisaac/wizards/NewPrototypeWizard.java
@@ -2,7 +2,9 @@ package org.eclipse.lisaac.wizards;
 
 
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.lisaac.LisaacPlugin;
 import org.eclipse.lisaac.model.ILisaacModel;
+import org.eclipse.lisaac.preferences.PreferenceConstants;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -95,6 +97,12 @@ class NewPrototypeWizardPage extends AbstractNewFileWizardPage  {
 		if (descr != null && descr.length() > 0) {
 			contents +=	"  - comment := \""+descr+"\";\n";
 		}
+		
+		String username = LisaacPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.P_LISAAC_USER);
+		if (username != null && username.length() > 0) {
+			contents += "\n  - author := \""+username+"\";\n";
+		}
+		
 		if (! isExpanded) {
 			contents +=	"\nSection Inherit\n\n";
 		} else {

-- 
Lisaac eclipse plugin



More information about the Lisaac-commits mailing list