简体   繁体   English

Eclipse:从插件代码访问编辑器模板

[英]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. 我知道TemplateStore,TemplatePreferencesPage和TemplatePersistentData这两个类存在,但我无法将它们放在一起工作。

Is there any example code that would allow me to access my editor template via Java code? 是否有任何示例代码允许我通过Java代码访问我的编辑器模板?

May be this JavaPlugin class (within org.eclipse.jdt.internal.ui package of eclipse) may provide you with a first lead to follow. 可能是这个JavaPlugin (在eclipse的org.eclipse.jdt.internal.ui包中)可能会为你提供第一个跟随的引导。

 /**
  * 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: NewASInterfaceWizard似乎需要访问这些代码模板:

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. 上面的方法返回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. 这是如何在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. 如果要查找模板的模式,名称,描述,可以通过从TemplateStore获取Template对象来实现。 If you want to find the id of a template, you can get that from the TemplatePersistantData object. 如果要查找模板的ID,可以从TemplatePersistantData对象获取该ID。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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