I know this is old, but maybe someone else is searching for it and would like to have an answer..
This is quite simply solved by adding the wanted template pages to the plugin.xml at the <extension point="org.eclipse.ui.preferencePages">
<page
category="org.xtext.example.mydsl.MyDsl.templates"
class="org.xtext.example.mydsl.ui.MyDslExecutableExtensionFactory:org.xtext.example.mydsl.ui.preferencePages.GreetingTemplatePreferencePage"
id="org.xtext.example.mydsl.MyDSL.templates.greeting"
name="Greeting Templates">
<keywordReference
id="org.xtext.example.mydsl.ui.keyword_MyDsl">
</keywordReference>
</page>
<page
category="org.xtext.example.mydsl.MyDsl.templates"
class="org.xtext.example.mydsl.ui.MyDslExecutableExtensionFactory:org.xtext.example.mydsl.ui.preferencePages.NameTemplatePreferencePage"
id="org.xtext.example.mydsl.MyDSL.templates.name"
name="Name Templates">
<keywordReference
id="org.xtext.example.mydsl.ui.keyword_MyDsl">
</keywordReference>
</page>
With category="org.xtext.example.mydsl.MyDsl.templates" those two pages above will be subpages of the XtextTemplatePreferencePage and displayed as shown in your result picture. They look like:
public class GreetingTemplatePreferencePage extends XtextTemplatePreferencePage {
@Inject
public GreetingTemplatePreferencePage(IPreferenceStore preferenceStore, ContextTypeRegistry registry,
TemplateStore templateStore) {
super(preferenceStore, registry, templateStore);
}
@Override
protected Control createContents(Composite ancestor) {
Control result = super.createContents(ancestor);
ancestor.layout();
super.getTableViewer().setContentProvider(new MyTemplateContentProvider("org.xtext.example.mydsl.MyDsl.Greeting"));
return result;
}
}
For NameTemplatePreferencePage replace "Greeting" with "Name". The content provider:
class MyTemplateContentProvider implements IStructuredContentProvider {
/** The template store. */
private TemplateStore fStore;
private String contextID;
public MyTemplateContentProvider(String contextID) {
this.contextID = contextID;
}
@Override
public Object[] getElements(Object input) {
TemplatePersistenceData[] templateData = fStore.getTemplateData(false);
List<TemplatePersistenceData> onlyContextTemplateData = new ArrayList<TemplatePersistenceData>();
for (int i = 0; i < templateData.length; i++) {
if (templateData[i].getTemplate().getContextTypeId().equalsIgnoreCase(this.contextID)) {
onlyContextTemplateData.add(templateData[i]);
}
}
return onlyContextTemplateData.toArray();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
fStore= (TemplateStore) newInput;
}
@Override
public void dispose() {
fStore= null;
}
}
There probably is another way using TableViewer.addFilter(ViewerFilter filter), but since I'm not very familiar with jface this was the quickest and easiest solution.