0

Для Tl; др см Резюме в нижней части.
Моя цель в значительной степени сведена в названии вопроса:Как передать параметр строки из затмения cheet листа в какой-то код Java и возвращать значение типа String в шпаргалку

Я хочу передать в качестве параметра строки из шпаргалки затмения, используйте параметр для управления поведением коды, а затем возвращает строку от кода, чтобы он мог отображаться пользователю в обмане.

Возможное решение 1: с помощью действия ...

У меня есть пакет, который содержит несколько затмений шпаргалок. Большинство интерактивных рекомендаций, которые я нашел, говорят об использовании элемента <action> для вызова кода eclipse и вместе с ICheatSheetAction, это позволяет использовать удобный синтаксис xxml.

Используя действия, мне удалось получить код Eclipse для получения параметров из листа чит-листа и управлять поведением кода с помощью параметров, но метод run() для IAction возвращает void, поэтому я могу 't верните строку. Существует notifyResult(), но это имеет значение boolean.

Резюмируя:
работы:

  • Вызов кода из шпаргалку
  • Используя переданные параметры в коде Java

Проблема:

  • Не удается вернуть значение строки, которое будет отображаться на обложке.

Возможное решение 2: с помощью команд ...

Листа XML-мошенника также позволяет <command> элемента. Это немного менее удобно использовать, потому что команде требуется «сериализация», но имеет то преимущество, что метод execute() может возвращать любой Java-объект, включая строку, которую я хочу вернуть.

Используя команды, мне также удалось вызвать мой код затмения из листа чит-листа, и я могу вернуть строку обратно на страницу обмана и отобразить ее там, НО я не могу получить доступ к параметрам, которые я пытаюсь передать в метод execute().

В итоге:
работ:

  • Calling код из шпаргалки
  • возвращающей строку в шпаргалке

Проблема:

  • Невозможно получить доступ к параметрам, переданным с чит-листа.

Следующие шаги:

Если кто-нибудь может предложить способ вернуть строку из запустить действие в() метод, я не думаю, что я могу использовать действия, чтобы достичь того, чего я хочу.

Я думаю, что моя лучшая ставка с помощью команд, и на основе первого этапа шпаргалку ниже, должен, конечно возможно. documentation говорит, что я должен предоставить «сериализованный ParameterizedCommand». Я думаю, проблема в том, что я не понимаю, как работает ParameterizedCommand, и я нахожу документацию совершенно непрозрачной.

Я мог бы реализовать команду для каждого возможного поведения каждого шага каждого чит-листа, но я думаю, что это быстро перерастет в ужасающее дублирование кода.

Моя шпаргалка довольно просто:

<?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> 

Я пытаю параметры доступа, используя примеры кода, которые я нашел в Интернете.
Мой обработчик выглядит следующим образом:

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 всегда нуль.

Я настроил свою команду в мой плагин, как показано ниже:

<?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> 

Я подозреваю, еще какой-то код или настройку требуется - возможно, что-то делать с ParameterizedCommand с, как this, но у меня есть не знаю, где такой код должен быть добавлен.

Т.Л., др Резюме:

Как я могу:

  1. Возвращает строку из действия на шпаргалку или
  2. Adjust мои настройки кода/плагин так Я могу получить доступ к параметрам, переданным в обработчик моей команды

Все рекомендации/указатели/конструктивные комментарии оценены.

+0

Ваш идентификатор командыParameter является 'SimpleSerializedCommand.firstParameter', но вы используете' firstParameter' везде. Измените идентификаторы для соответствия. –

+0

@ greg-449: довольно смущающе, это действительно было так просто. Вы хотите опубликовать его как ответ, который я могу принять? –

ответ

0

Ваш commandParameter id: SimpleSerializedCommand.firstParameter, но вы используете firstParameter всюду. Измените идентификаторы для соответствия везде.

Обратите внимание, что атрибут name должен быть «понятным для человека» именем, которое использует пользовательский интерфейс, если ему нужно отобразить информацию об этом.

+0

, так что если мой параметрID был 'com.example.long.some.lengthy.fully.qualified.parameter.parameterName', тогда мне просто нужно ссылаться на него как таковое в коде? Я могу работать с этим, но это не блестяще читаемо. –

+0

Да, да. Но в большинстве случаев код Eclipse использует короткий идентификатор для параметров команды, поскольку они относятся к одной команде. –

+0

Я признаю, что я никогда не был уверен, насколько квалифицировать свои идентификаторы, поскольку я не уверен, что такое «домен/пространство имен» и т. Д. они находятся внутри, и с чем они могут столкнуться. Например, я не хотел, чтобы моя категория чит-листа имела то же имя, что и моя категория команд, если они столкнулись. Остальная часть кода, с которым я работаю, похоже, включает полное имя пакета в каждом идентификаторе. Например, что, если у другой команды был параметр «firstParameter»? –