Я думаю, вам нужно несколько разных вещей здесь. Помните, что GEF хотел бы, чтобы у вас был правильный шаблон MVC, где у вас есть собственная модель, Figures as View и EditParts в качестве контроллеров.
От макушки головы я бы сказал, что вам нужны хотя бы эти вещи:
- CreateCommand
- содержит все модификации уровня модели, которые вам нужны
выполнить, чтобы добавить новые данные в ваш
модель данных (отменяемая и транзакционная)
- CreateAction
- делает этот экземпляр CreateCommand, инициализирует его текущим выбором и выполняет эту команду в editdomain
- ContextMenuProvider
- Предоставляет CreateAction для контекстного меню
Если вы используете GMF, канонический механизм автоматически сгенерирует части редактирования для вас, когда вы будете вносить изменения в модель внутри команды, но если вы не используете GMF, вы должны убедиться, что ваши собственные модели и части редактирования обрабатывают и обновляя новый элемент, добавляя его правильно.
EDIT:
Хорошо, вот несколько советов по коду для игры с запросами.
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):
Пожалуйста, спросите, могу ли я вам чем-нибудь помочь. Я знаю, что это выглядит немного сложнее, но это делает вашу собственную жизнь намного проще, и после того, как вы это сделаете, вы на самом деле достаточно хорошо понимаете шаблон Command-Request, и его можно использовать во многих местах.