Text Templates 2
In the previous blog post, I have shown how to use and add templates through the UI. In this post, I’m going to show how to contribute templates and template variables through an extension point.
Add a Set of Templates
Adding a set of templates is easy. Use the org.eclipse.ui.editors.templates extension point. It allows to include an XML file which contains the templates you want to contribute:
<extension point="org.eclipse.ui.editors.templates">
<include
file="swttemplates.xml"
translations="$nl$/templates/swttemplates.properties">
</include>
</extension>
Where swttemplates.xml may contain the description of the grid data template from my previous blog post:
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<template
name="GridData"
description="Set the layout data of a control to grid data"
id="org.eclipse.jdt.ui.text.codetemplates.swt.griddata"
context="swt" enabled="true" autoinsert="false"
>GridData ${dataName:newName}= new GridData(SWT.FILL, SWT.FILL, true, true);
control.setLayoutData(${dataName});</template>
Add a Template Variable
The org.eclipse.ui.editors.templates extension point can also be used to add a new template variable. To do so you need to implement an org.eclipse.jface.text.templates.TemplateVariableResolver. The template variable resolver is asked to resolve its template variable to a string whenever a template is evaluated. Lets say we want to add a variable called UUID which resolves to a random universally unique identifier. First we contribute the variable through the extension point:
<extension point="org.eclipse.ui.editors.templates">
<resolver
class="org.eclipse.templates.example.UUIDResolver"
contextTypeId="java"
description="Resolves to an universally unique identifier"
name="universally unique identifier" type="UUID"/>
</extension>
Then we implement our UUIDResolver:
public class UUIDResolver extends TemplateVariableResolver {
@Override
protected String resolve(TemplateContext context) {
return UUID.randomUUID().toString();
}
}
Once you have added the plug-in defining the new variable to your runtime you can start using the new variable in any Java template. You can for example add a uuid field template:
And this is how the result looks like when you insert the uuid_field template:
Cool isn’t it?
What’s next?
There is more to come in 3.4 concerning templates. There is bug 69581 [templates] Template view tagged for 3.4 M5. One of the problems with templates is that you need to know that they are there. The Templates view will change that. It will show all templates in a view, and will enable users to insert templates into an editor by drag and drop.
I would also like to add more default templates, for example there are no templates for AWT/Swing. I could also imagine to have templates for JFace or for Implementation Patterns. But we need YOU to do that. You can do so by creating a new enhancement request against jdt/text and attach your patch. It would be great if I could provide high quality template sets contributed by you.

December 4th, 2007 at 2:34 pm
What is sad about Eclipse templates is that there is no centralized UI to manage them and each editor have to declare its own prefence page for editing templates. More over, plain text editors still don’t have template support.
Special view for templates is sounds fancy but somehow seem not practical. Practically the same as the Snippets view. Actually maybe it should be merged into the Snippets view instead, so won’t have to create an extra view
Another annoying thing about template support is that there is no quickfix (Ctrl-1) to create a new template from selected text. That would be a real time saver.
December 4th, 2007 at 6:01 pm
agree with Eugene. Create template from selection by Ctrl-1 (or Ctrl-Space) would be awesome, people often don’t realize how much code they repeat and that templates would help them