Добавление рисунков с помощью контекстного меню - Eclipse GEF
-
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):
Пожалуйста, спросите, могу ли я помочь вам еще чем-нибудь.Я знаю, что это выглядит немного сложнее, но это значительно упрощает вашу собственную жизнь, и после того, как вы это сделаете, вы действительно достаточно хорошо понимаете шаблон Команда-запрос, и его можно повторно использовать во многих разных местах.