2009-01-14 8 views
4

Disons que j'ai un modèle d'éditeur (qui insère un extrait arbitraire de code) défini dans mes préférences d'édition.Eclipse: Accéder à un modèle d'éditeur à partir du code du plugin

Je souhaite accéder à ce modèle par programmation. Comment est-ce que je fais ceci?

Je sais que les classes TemplateStore, TemplatePreferencesPage et TemplatePersistentData existent, mais je n'ai pas été capable de les mettre ensemble.

Existe-t-il un exemple de code qui me permettrait d'accéder à mon modèle d'éditeur via le code Java?

Répondre

7

Cela peut être JavaPlugin class (dans les limites de org.eclipse.jdt.internal.ui paquet d'eclipse) peut vous donner une première chance à suivre.

/** 
    * 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; 
} 

À partir de là, vous pouvez trouver une classe en utilisant cette fonction:

NewASInterfaceWizard semble avoir besoin d'accéder à ces modèles de code:

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 ""; 

} 

Utilisé comme ça:

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

Eh bien voici comment je l'ai fait.

/** 
* 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; 
} 

La méthode ci-dessus renvoie le TemplateStore. Vous utilisez le magasin pour ajouter, supprimer, rechercher des modèles.

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); 
    } 
} 

Voici comment effectuer des opérations sur le TemplateStore. Si vous voulez trouver le modèle, le nom, la description d'un modèle, vous pouvez obtenir cela en obtenant un objet Template à partir du TemplateStore. Si vous souhaitez trouver l'ID d'un modèle, vous pouvez l'obtenir à partir de l'objet TemplatePersistantData.

Questions connexes