Добавление рисунков с помощью контекстного меню - Eclipse GEF

StackOverflow https://stackoverflow.com/questions/4527613

  •  13-10-2019
  •  | 
  •  

Вопрос

Все,

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


Поскольку при разработке плагина Eclipse GEF встречается так мало примеров для рассмотрения, я добавляю свое решение, чтобы другие сочли его полезным.Этот код помогает отобразить узел в редакторе.

Исходный код для класса действий для отображения рисунков в редакторе:

public class AddNodeAction extends EditorPartAction
{
 public static final String ADD_NODE = "ADDNODE";

 public AddNodeAction(IEditorPart editor) {
  super(editor);
            setText("Add a Node");
            setId(ADD_NODE);     // Important to set ID
 }

 public void run()
 {
  <ParentModelClass> parent=  (<ParentModelClass>)getEditorPart().getAdapter(<ParentModelClass>.class);

  if (parent== null)
   return;
  CommandStack command = (CommandStack)getEditorPart().getAdapter(CommandStack.class);

  if (command != null)
  {
   CompoundCommand totalCmd = new CompoundCommand();
   <ChildModelToRenderFigureCommand>cmd = new <ChildModelToRenderFigureCommand>(parent);
   cmd.setParent(parent);
   <ChildModelClass> newNode = new <ChildModelClass>();
   cmd.setNode(newNode);
   cmd.setLocation(getLocation()); // Any location you wish to set to
   totalCmd.add(cmd);
   command.execute(totalCmd);
  }
 }

 @Override
 protected boolean calculateEnabled() 
 {
  return true;
 }
}
Это было полезно?

Решение

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

Исходя из всего вышесказанного, я бы сказал, что вам нужны по крайней мере эти вещи:

  • createCommand Создать команду
    • содержит все изменения на уровне модели, которые вам необходимо выполнить, чтобы добавить ваши новые данные в вашу модель данных (отменяемые и транзакционные)
  • Создать действие
    • создает этот экземпляр createCommand, инициализирует его текущим выбором и выполняет эту команду в editdomain
  • ContextMenuProvider ( Контекстное меню )
    • Обеспечивает, что createAction вызывает контекстное меню

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

Редактировать:Хорошо, вот несколько предложений по коду для игры с запросами.

public void run() {
   // Fetch viewer from editor part (might not work, if not, try some other way)
   EditPartViewer viewer = (EditPartViewer) part.getAdapter(EditPartViewer.class);
   // get Target EditPart that is under the mouse
   EditPart targetEditPart = viewer.findObjectAt(getLocation());
   // If nothing under mouse, set root item as target (just playing safe)
   if(targetEditPart == null)
       targetEditPart = viewer.getContents();

   // Make and initialize create request with proper information
   CreateRequest createReq = new CreateRequest();
   createReq.setLocation(getLocation());
   createReq.setFactory(new OwnFactoryImplementation());

   // Ask from target editpart command for this request
   Command command = targetEditPart.getCommand(createReq);

   // If command is ok, and it can be executed, go and execute it on commandstack
  if(command != null && command.canExecute()) {
      viewer.getEditDomain().getCommandStack().execute(command);
  }
}

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

Итак, чтобы все заработало, вам нужно установить новую EditPolicy в свой EditPart.EditPolicies можно установить с помощью функции EditParts createDefaultEditPolicies().Эта EditPolicy должна реагировать и возвращать команду при выполнении CreateRequest.Таким образом, любой дочерний элемент может предоставить собственную команду для создания дочерних элементов для себя.

Вот хорошее изображение того, как это работает (контроллер - это EditPart):Diagram

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top