use of org.osate.ge.internal.ui.dialogs.DefaultDiagramConfigurationDialogModel in project osate2 by osate.
the class ConfigureDiagramHandler method execute.
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
final IEditorPart activeEditor = HandlerUtil.getActiveEditor(event);
if (!(activeEditor instanceof InternalDiagramEditor)) {
throw new RuntimeException("Unexpected editor: " + activeEditor);
}
// Get diagram and selected elements
final InternalDiagramEditor diagramEditor = (InternalDiagramEditor) activeEditor;
final List<DiagramElement> selectedDiagramElements = AgeHandlerUtil.getSelectedDiagramElements();
final AgeDiagram diagram = diagramEditor.getDiagram();
if (diagram == null) {
throw new RuntimeException("Unable to get diagram");
}
// Get services
final BusinessObjectTreeUpdater boTreeUpdater = diagramEditor.getBoTreeUpdater();
final DiagramUpdater diagramUpdater = diagramEditor.getDiagramUpdater();
final ProjectProvider projectProvider = Objects.requireNonNull(Adapters.adapt(diagramEditor, ProjectProvider.class), "Unable to retrieve project provider");
final LayoutInfoProvider layoutInfoProvider = Objects.requireNonNull(Adapters.adapt(diagramEditor, LayoutInfoProvider.class), "Unable to retrieve layout information provider");
final ExtensionRegistryService extService = Objects.requireNonNull(Adapters.adapt(diagramEditor, ExtensionRegistryService.class), "Unable to retrieve extension service");
final ProjectReferenceService referenceService = Objects.requireNonNull(Adapters.adapt(diagramEditor, ProjectReferenceService.class), "Unable to retrieve reference service");
BusinessObjectNode boTree = DiagramToBusinessObjectTreeConverter.createBusinessObjectNode(diagram);
// Update the tree so that it's business objects are refreshed
boTree = boTreeUpdater.updateTree(diagram.getConfiguration(), boTree);
final DefaultDiagramConfigurationDialogModel model = new DefaultDiagramConfigurationDialogModel(referenceService, extService, projectProvider, diagram.getConfiguration().getDiagramType());
// Create a BO path for the initial selection. The initial selection will be the first diagram element which will be included in the BO tree.
Object[] initialSelectionBoPath = null;
for (final DiagramElement selectedDiagramElement : selectedDiagramElements) {
if (model.shouldShowBusinessObject(selectedDiagramElement.getBusinessObject())) {
// Only build a selection path if the BO will be shown
DiagramNode tmp = selectedDiagramElement;
final LinkedList<Object> boList = new LinkedList<>();
while (tmp instanceof DiagramElement) {
boList.addFirst(tmp.getBusinessObject());
tmp = tmp.getParent();
}
initialSelectionBoPath = boList.toArray();
break;
}
}
// Show the dialog
final DiagramConfigurationDialog.Result result = DiagramConfigurationDialog.show(null, model, diagram.getConfiguration(), boTree, initialSelectionBoPath);
if (result != null) {
// Update the diagram
diagramEditor.getActionExecutor().execute("Set Diagram Configuration", ExecutionMode.NORMAL, () -> {
diagram.modify("Set Diagram Configuration", m -> {
m.setDiagramConfiguration(result.getDiagramConfiguration());
diagramUpdater.updateDiagram(diagram, result.getBusinessObjectTree());
});
// Clear ghosts triggered by this update to prevent them from being unghosted during the next update.
diagramUpdater.clearGhosts();
diagram.modify("Layout", m -> DiagramElementLayoutUtil.layoutIncrementally(diagram, m, layoutInfoProvider));
return null;
});
}
return null;
}
Aggregations