简体   繁体   中英

Eclipse: Accessing a editor template from plugin code

Let's say I have a editor template (which inserts some arbitrary snippet of code) defined in my editor preferences.

I'd like to access that template programmatically. How do I do this?

I know the classes TemplateStore, TemplatePreferencesPage, and TemplatePersistentData exist, but I haven't been able to put them together into anything working.

Is there any example code that would allow me to access my editor template via Java code?

May be this JavaPlugin class (within org.eclipse.jdt.internal.ui package of eclipse) may provide you with a first lead to follow.

 /**
  * Returns the template store for the code generation templates.
  *
  * @return the template store for the code generation templates
  * @since 3.0
  */
 public TemplateStore getCodeTemplateStore() {
     if (fCodeTemplateStore == null) {
         IPreferenceStore store= getPreferenceStore();
         boolean alreadyMigrated= store.getBoolean(CODE_TEMPLATES_MIGRATION_KEY);
         if (alreadyMigrated)
             fCodeTemplateStore= new ContributionTemplateStore(getCodeTemplateContextRegistry(), store, CODE_TEMPLATES_KEY);
         else {
             fCodeTemplateStore= new CompatibilityTemplateStore(getCodeTemplateContextRegistry(), store, CODE_TEMPLATES_KEY, getOldCodeTemplateStoreInstance());
             store.setValue(CODE_TEMPLATES_MIGRATION_KEY, true);
         }

         try {
             fCodeTemplateStore.load();
         } catch (IOException JavaDoc e) {
             log(e);
         }

         fCodeTemplateStore.startListeningForPreferenceChanges();

         // compatibility / bug fixing code for duplicated templates
         // TODO remove for 3.0
        CompatibilityTemplateStore.pruneDuplicates(fCodeTemplateStore, true);            
     }

     return fCodeTemplateStore;
 }

From there, you could find some class using that function:

NewASInterfaceWizard seems to need to access those code templates:

private String resolveTemplate(String templateName) {

        Template template = ASEditorPlugin.getDefault().getCodeTemplateStore().findTemplate(templateName);
        if (template == null) {
            showErrorBox("Could not resolve template (" + templateName +").");
            return "";
        }

        // Create the template context
        TemplateContext templeteContext = new TemplateContext(new ASContextType()) {

            public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException {
                TemplateTranslator translator = new TemplateTranslator();
                TemplateBuffer buffer = translator.translate(template);
                getContextType().resolve(buffer, this);
                return buffer;
            }

            public boolean canEvaluate(Template template) {
                return true;
            }

        };

        try {
            return templeteContext.evaluate(template).getString();
        } catch (BadLocationException e) {
            logger.error("Couldnt evaluate template",e);
        } catch (TemplateException e) {
            logger.error("Couldnt evaluate template",e);
        }
       return "";

}

Used like that:

        private static final String FILE_HEADER_TEMPLATE = "file_header";
        // Header
        String header = resolveTemplate(FILE_HEADER_TEMPLATE);
        if (header.length() > 0) {
            content.append(header + "\n");
        }

Well this is how I did it.

/**
 * Get the Template Store of the JDT UI.
 * 
 * @return the JDT template store
 */
private TemplateStore getTemplateStore() {
    if (templateStore == null) {
        System.out.println("templateStore is null - Creating a new one");

        final ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry(JavaUI.ID_CU_EDITOR);
        final IPreferenceStore store = PreferenceConstants.getPreferenceStore();

        templateStore = new ContributionTemplateStore(registry, store, TEMPLATES_KEY);

        try {
            templateStore.load();
        } catch (IOException e) {
            WSConsole.e(e);
        }
        templateStore.startListeningForPreferenceChanges();
    }
    return templateStore;
}

The above method returns the TemplateStore. You use the store to add, delete, find templates.

private void filterTemplates() {
    templateStore = getTemplateStore();

    deleteTemplate(templateStore, "org.eclipse.jdt.ui.templates.sysout");

    try {
        templateStore.save();
    } catch (IOException e) {
    }
}

private void deleteTemplate(TemplateStore templateStore, String id) {
    TemplatePersistenceData templateData = templateStore.getTemplateData(id);
    if (templateData != null) {
        templateStore.delete(templateData);
    }
}

This is how to perform operations on the TemplateStore. If you want to find the pattern, name, description of a Template, you can get that by getting a Template object from the TemplateStore. If you want to find the id of a template, you can get that from the TemplatePersistantData object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM