0

Pour tl; dr, voir le Résumé au fond.
Mon objectif est à peu près résumée dans le titre de la question:Comment passer un paramètre de chaîne à partir d'une éclipse feuille de cheet à un code java et renvoie une valeur de chaîne à la antisèche

Je veux passer un paramètre de chaîne à partir d'une feuille de triche Eclipse, utilisez le paramètre pour contrôler le comportement du code, puis retourner une chaîne à partir du code, de sorte qu'il peut être affiché à l'utilisateur dans la feuille de triche.

Solution possible 1: en utilisant des actions ...

J'ai un paquet qui contient des feuilles de triche Eclipse. La plupart des conseils en ligne que j'ai trouvé parle de l'utilisation de l'élément <action> pour invoquer le code eclipse, et avec ICheatSheetAction, cela permet la syntaxe x123 pratique paramN = value. En utilisant les actions, j'ai réussi à obtenir mon code eclipse pour recevoir les paramètres de la feuille de triche et peut contrôler le comportement du code en utilisant le (s) paramètre (s), mais la méthode run() d'un IAction retourne void, donc je peux ne retourne pas de chaîne. Il y a notifyResult(), mais cela ne prend qu'un booléen.

En résumé:
Travaux:

  • code d'appel de antisèche
  • En utilisant les paramètres passés dans le code Java

Problème:

  • Impossible de renvoyer une valeur de chaîne à afficher dans la feuille de triche.

Solution possible 2: en utilisant des commandes ...

La feuille de triche xml permet également à l'élément <command>. C'est un peu moins pratique à utiliser car la commande nécessite une 'sérialisation', mais elle a l'avantage que la méthode execute() peut retourner n'importe quel objet java, y compris la chaîne que je veux retourner. En utilisant les commandes, j'ai également réussi à invoquer mon code d'éclipse de la feuille de triche et je peux retourner une corde à la feuille de triche et l'afficher là, MAIS je ne peux pas accéder aux paramètres que j'essaye de passer dans la méthode execute().

En résumé:
Travaux:

  • Indicatif téléphonique de antisèche
  • retourne une chaîne à la feuille de triche

Problème:

  • Impossible d'accéder aux paramètres transmis depuis la feuille de triche.

Prochaines étapes:

À moins quelqu'un peut suggérer une façon de renvoyer une chaîne à partir d'une méthode de course d'action(), je ne pense pas que je peux utiliser des actions pour obtenir ce que je veux.

Je pense que mon meilleur pari utilise des commandes, et basées sur la première étape de la feuille de triche ci-dessous, il doit sûrement possible. Le documentation dit que je devrais fournir un "ParameterizedCommand sérialisé". Je pense que le problème est que je ne comprends pas comment un ParameterizedCommand fonctionne, et je trouve la documentation complètement opaque.

Je pourrais mettre en œuvre une commande pour chaque comportement possible de chaque étape de chaque feuille de triche, mais je pense que cela se traduira rapidement par la duplication de code horrible.

Ma feuille de triche est assez simple:

<?xml version="1.0" encoding="UTF-8"?> 
<cheatsheet title="Example Cheat Sheet"> 
    <intro> 
    <description>This Cheat Sheet will invoke some actions and commands.</description> 
    </intro> 
    <item 
     title="Get a Cheat Sheet variable"> 
    <description> 
     Pick foo or bar... 
    </description> 
    <command returns="selection" serialization="org.eclipse.ui.dialogs.openMessageDialog(title=Select One,buttonLabel0=foo,message=Select a button,buttonLabel1=bar)"/> 
    <onCompletion><b>${selection} selected</b></onCompletion> 
    </item> 
    <item 
     title="Invoke an Action"> 
    <description> 
     Click... 
    </description> 
    <action class="com.example.cheatsheets.CheatSheet1.CheatSheet1ActionHandler" pluginId="SimpleSerializedCommand" param1="${selection}"/> 
    </item> 
    <item title="Invoke a Command"> 
    <description>Click...</description> 
    <command returns="result2" serialization="com.example.cheatsheets.CheatSheet1.SimpleSerializedCommand.command1(firstParameter=${selection})" /> 
    <onCompletion><b>${result2}</b></onCompletion> 
    </item> 
</cheatsheet> 

Je tente d'accéder aux paramètres en utilisant des exemples de code I trouvé en ligne.
Mon gestionnaire ressemble à ceci:

public class CheatSheet1CommandHandler extends org.eclipse.core.commands.AbstractHandler { 

    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     String action = event.getParameter("firstParameter"); 
     if (action == null) 
      return "I got NULL!"; 
     else if (action.equals("foo")) 
      return "Hooray!"; 
     else 
      return "Boo!"; 
    } 
} 

action est toujours nulle.

J'ai créé ma commande dans mon plug-in comme ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<?eclipse version="3.4"?> 
<plugin> 
    <extension 
     point="org.eclipse.ui.cheatsheets.cheatSheetContent"> 
     <category 
      id="SimpleSerializedCommand.CSCategory1" 
      name="CSCategory1"> 
     </category> 
     <cheatsheet 
      category="SimpleSerializedCommand.CSCategory1" 
      composite="false" 
      contentFile="CheatSheet1Content.xml" 
      id="SimpleSerializedCommand.cheatsheet1" 
      name="CheatSheet1"> 
     </cheatsheet> 
    </extension> 
    <extension 
     point="org.eclipse.ui.commands"> 
     <category 
      id="SimpleSerializedCommand.CommandCategory1" 
      name="CommandCategory1"> 
     </category> 
     <command 
      categoryId="SimpleSerializedCommand.CommandCategory1" 
      defaultHandler="com.example.cheatsheets.CheatSheet1.SimpleSerializedCommand.command1" 
      id="com.example.cheatsheets.CheatSheet1.SimpleSerializedCommand.command1" 
      name="command1"> 
     <commandParameter 
       id="SimpleSerializedCommand.firstParameter" 
       name="firstParameter" 
       optional="false" 
       typeId="java.lang.String"> 
     </commandParameter> 
     </command> 
    </extension> 
    <extension 
     point="org.eclipse.ui.handlers"> 
     <handler 
      class="com.example.cheatsheets.CheatSheet1.CheatSheet1CommandHandler" 
      commandId="com.example.cheatsheets.CheatSheet1.SimpleSerializedCommand.command1"> 
     </handler> 
    </extension> 

</plugin> 

Je soupçonne un peu plus de code ou set-up est nécessaire - peut-être quelque chose à voir avec ParameterizedCommand s, comme this, mais je aucune idée où un tel code devrait être ajouté.

tl; dr Résumé:

Comment puis-je:

  1. Retour d'une chaîne d'une action à une feuille de triche, ou
  2. Régler ma configuration code/plug-in afin Je peux accéder aux paramètres passés dans le gestionnaire de ma commande

Tous les aide/pointeurs/commentaires constructifs appréciés.

+0

Votre identifiant commandParameter est 'SimpleSerializedCommand.firstParameter' mais vous utilisez' firstParameter' partout ailleurs. Changez les identifiants pour correspondre. –

+0

@ greg-449: assez embarrassant, c'était vraiment aussi simple. Voulez-vous l'afficher comme une réponse que je peux accepter? –

Répondre

0

Votre ID commandParameter est SimpleSerializedCommand.firstParameter mais vous utilisez firstParameter partout ailleurs. Changez les identifiants pour correspondre partout.

Notez que l'attribut name est censé être un nom 'lisible par l'homme' que l'interface utilisateur utilise s'il doit afficher des informations à ce sujet.

+0

donc si mon paramètreID était 'com.example.long.some.lengthy.fully.qualified.parameter.parameterName', alors je dois juste me référer à lui comme tel dans le code? Je peux travailler avec ça, mais ce n'est pas brillamment lisible. –

+0

Oui, vous le faites. Mais la plupart des codes Eclipse utilisent simplement un identifiant court pour les paramètres de commande, car ils sont spécifiques à une seule commande. –

+0

Je dois admettre que je ne suis jamais tout à fait sûr de combien qualifier mes identifiants car je ne suis pas sûr de ce que 'domain/namespace etc' ils sont dedans, et ce qu'ils pourraient entrer en conflit avec. Par exemple, je ne voulais pas donner à ma catégorie de feuille de triche le même nom que ma catégorie de commande au cas où ils se seraient affrontés. Le reste du code avec lequel je travaille semble inclure un nom de package complet dans chaque ID. Par exemple, que se passerait-il si une autre commande avait un paramètre appelé 'firstParameter'? –