use of org.osate.ge.internal.services.ProjectProvider in project osate2 by osate.
the class GefDiagramExportService method loadDiagram.
private GefAgeDiagram loadDiagram(final IFile diagramFile) {
final URI uri = URI.createPlatformResourceURI(diagramFile.getFullPath().toString(), true);
final IProject project = ProjectUtil.getProjectOrNull(uri);
final org.osate.ge.diagram.Diagram mmDiagram = DiagramSerialization.readMetaModelDiagram(uri);
final IEclipseContext eclipseContext = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(GefDiagramExportService.class).getBundleContext());
final ExtensionRegistryService extensionRegistry = Objects.requireNonNull(eclipseContext.get(ExtensionRegistryService.class), "Unable to retrieve extension registry");
final ReferenceService referenceService = Objects.requireNonNull(eclipseContext.get(ReferenceService.class), "unable to retrieve reference service");
final ActionService actionService = Objects.requireNonNull(eclipseContext.get(ActionService.class), "unable to retrieve action service");
final AgeDiagram diagram = DiagramSerialization.createAgeDiagram(project, mmDiagram, extensionRegistry);
// Update the diagram
final QueryService queryService = new DefaultQueryService(referenceService);
final ProjectProvider projectProvider = diagramFile::getProject;
final ProjectReferenceService projectReferenceService = new ProjectReferenceServiceProxy(referenceService, projectProvider);
final BusinessObjectNodeFactory nodeFactory = new BusinessObjectNodeFactory(projectReferenceService);
final DefaultBusinessObjectTreeUpdater boTreeUpdater = new DefaultBusinessObjectTreeUpdater(projectProvider, extensionRegistry, projectReferenceService, queryService, nodeFactory);
final DefaultDiagramElementGraphicalConfigurationProvider deInfoProvider = new DefaultDiagramElementGraphicalConfigurationProvider(queryService, () -> diagram, extensionRegistry);
final DiagramUpdater diagramUpdater = new DiagramUpdater(boTreeUpdater, deInfoProvider, actionService, projectReferenceService, projectReferenceService);
diagramUpdater.updateDiagram(diagram);
// Create the GEF Diagram
final GefAgeDiagram gefDiagram = new GefAgeDiagram(diagram, new DefaultColoringService(new org.osate.ge.internal.services.impl.DefaultColoringService.StyleRefresher() {
@Override
public void refreshDiagramColoring() {
// No-op. Handling coloring service refresh requests is not required.
}
@Override
public void refreshColoring(final Collection<DiagramElement> diagramElements) {
// No-op. Handling coloring service refresh requests is not required.
}
}));
// Add to scene. This is required for text rendering
new Scene(gefDiagram.getSceneNode());
// Update the diagram to reflect the scene graph and perform incremental layout
gefDiagram.updateDiagramFromSceneGraph(false);
diagram.modify("Incremental Layout", m -> DiagramElementLayoutUtil.layoutIncrementally(diagram, m, gefDiagram));
return gefDiagram;
}
use of org.osate.ge.internal.services.ProjectProvider 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;
}
use of org.osate.ge.internal.services.ProjectProvider in project osate2 by osate.
the class RestoreMissingDiagramElementsHandler 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 editor and various services
final InternalDiagramEditor diagramEditor = (InternalDiagramEditor) activeEditor;
final ProjectProvider projectProvider = (ProjectProvider) Objects.requireNonNull(diagramEditor.getAdapter(ProjectProvider.class), "Unable to retrieve project provider");
final DiagramUpdater diagramUpdater = Objects.requireNonNull(diagramEditor.getDiagramUpdater(), "Unable to retrieve diagram updater");
final ExtensionRegistryService extService = (ExtensionRegistryService) Objects.requireNonNull(diagramEditor.getAdapter(ExtensionRegistryService.class), "Unable to retrieve extension service");
final AgeDiagram diagram = diagramEditor.getDiagram();
final IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext());
final ReferenceService referenceService = Objects.requireNonNull(serviceContext.get(ReferenceService.class), "Unable to retrieve reference service");
final LayoutInfoProvider layoutInfoProvider = Objects.requireNonNull(Adapters.adapt(diagramEditor, LayoutInfoProvider.class), "Unable to retrieve layout info provider");
// Stores child business object contexts which are applicable for a given parent node
final Multimap<DiagramNode, BusinessObjectContext> diagramNodeToAvailableBusinessObjectContextsMap = ArrayListMultimap.create();
// Build a list of ghosts that will be presented to the user to modify
final List<DiagramUpdater.GhostedElement> ghostsToModify = new ArrayList<>();
final BusinessObjectProviderHelper bopHelper = new BusinessObjectProviderHelper(extService);
// Walk all nodes and look for ghosts
diagram.getAllDiagramNodes().forEachOrdered(parent -> {
final Collection<DiagramUpdater.GhostedElement> ghosts = diagramUpdater.getGhosts(parent);
if (!ghosts.isEmpty()) {
final BusinessObjectContext parentToUse;
if (diagram.getConfiguration().getContextBoReference() == null && parent.getParent() == null) {
parentToUse = getRootContextForProject(projectProvider);
} else {
parentToUse = parent;
}
// Create a mapping between relative reference and available child business objects
final Map<RelativeBusinessObjectReference, Object> relRefToBusinessObjectMap = bopHelper.getChildBusinessObjects(parentToUse).stream().collect(HashMap::new, (map, bo) -> {
final RelativeBusinessObjectReference relRef = referenceService.getRelativeReference(bo);
if (relRef != null) {
map.put(relRef, bo);
}
}, Map::putAll);
// Remove any entries based on existing node relative references.
parent.getChildren().forEach(de -> relRefToBusinessObjectMap.remove(de.getRelativeReference()));
// Don't show ghosts if there aren't any unused business objects
if (!relRefToBusinessObjectMap.isEmpty()) {
// Store the ghosts and the available business objects
relRefToBusinessObjectMap.values().stream().map(bo -> new BusinessObjectContext() {
@Override
public Collection<? extends BusinessObjectContext> getChildren() {
return Collections.emptyList();
}
@Override
public BusinessObjectContext getParent() {
return parent;
}
@Override
public Object getBusinessObject() {
return bo;
}
}).forEachOrdered(// see https://github.com/osate/osate2/issues/976
boc -> diagramNodeToAvailableBusinessObjectContextsMap.put(parent, (BusinessObjectContext) boc));
ghostsToModify.addAll(ghosts);
}
}
});
// Show the dialog
final RestoreMissingDiagramElementsDialog.Result<DiagramUpdater.GhostedElement, BusinessObjectContext> result = RestoreMissingDiagramElementsDialog.show(null, new RestoreMissingDiagramElementsDialog.Model<DiagramUpdater.GhostedElement, BusinessObjectContext>() {
@Override
public Collection<DiagramUpdater.GhostedElement> getElements() {
return ghostsToModify;
}
@Override
public String getParentLabel(final DiagramUpdater.GhostedElement element) {
return UiUtil.getPathLabel(element.getParent());
}
@Override
public String getMissingReferenceLabel(final DiagramUpdater.GhostedElement element) {
return referenceService.getLabel(element.getRelativeReference());
}
@Override
public Collection<BusinessObjectContext> getAvailableBusinessObjects(final DiagramUpdater.GhostedElement element) {
return diagramNodeToAvailableBusinessObjectContextsMap.get(element.getParent());
}
@Override
public String getBusinessObjectLabel(final BusinessObjectContext boc) {
return UiUtil.getDescription(boc, extService);
}
});
if (result != null) {
diagramEditor.getActionExecutor().execute("Restore Missing Diagram Elements", ExecutionMode.NORMAL, () -> {
// Update the ghosts and the diagram
diagram.modify("Restore Missing Diagram Elements", m -> {
result.getObjectToNewBoMap().forEach((ghost, newBoc) -> {
final Object newBo = newBoc.getBusinessObject();
ghost.updateBusinessObject(m, newBo, referenceService.getRelativeReference(newBo));
});
// Update the diagram
diagramUpdater.updateDiagram(diagram);
});
diagram.modify("Layout", m -> DiagramElementLayoutUtil.layoutIncrementally(diagram, m, layoutInfoProvider));
return null;
});
}
return null;
}
use of org.osate.ge.internal.services.ProjectProvider in project osate2 by osate.
the class EditorRenameUtil method rename.
public static void rename(final DiagramElement de, final String value, final InternalDiagramEditor editor) {
final ReferenceBuilderService referenceBuilder = Objects.requireNonNull(editor.getAdapter(ReferenceBuilderService.class), "Unable to retrieve reference builder service");
final DiagramService diagramService = Objects.requireNonNull(editor.getAdapter(DiagramService.class), "Unable to retrieve diagram service");
final AadlModificationService aadlModService = Objects.requireNonNull(editor.getAdapter(AadlModificationService.class), "Unable to retrieve AADL modification service");
final ProjectProvider projectProvider = Objects.requireNonNull(editor.getAdapter(ProjectProvider.class), "Unable to retrieve project provider");
final ActionExecutor actionExecutor = editor.getActionExecutor();
final ModelChangeNotifier modelChangeNotifier = Objects.requireNonNull(editor.getAdapter(ModelChangeNotifier.class), "Unable to retrieve model change notifier");
final EObject bo = (EObject) de.getBusinessObject();
final BusinessObjectHandler handler = de.getBusinessObjectHandler();
final String initialValue = getCurrentName(de);
// If the business object handler provides a Rename method, then use it to rename the element instead of using LTK refactoring.
if (RenameUtil.supportsNonLtkRename(handler)) {
final CanonicalBusinessObjectReference canonicalRef = referenceBuilder.getCanonicalReference(bo);
final IProject project = ProjectUtil.getProjectOrNull(EcoreUtil.getURI(bo));
final ReferenceCollection references;
if (canonicalRef == null || project == null) {
references = null;
} else {
final Set<IProject> relevantProjects = ProjectUtil.getAffectedProjects(project, new HashSet<>());
references = diagramService.getReferences(relevantProjects, Collections.singleton(canonicalRef));
}
aadlModService.modify(bo, (boToModify) -> {
RenameUtil.performNonLtkRename(boToModify, handler, value);
// Update diagram references. This is done in the modify block because the project is build and the diagram is updated before the modify()
// function returns.
final CanonicalBusinessObjectReference newCanonicalRef = referenceBuilder.getCanonicalReference(boToModify);
final RelativeBusinessObjectReference newRelRef = referenceBuilder.getRelativeReference(boToModify);
if (newCanonicalRef != null && newRelRef != null) {
references.update(new UpdatedReferenceValueProvider() {
@Override
public CanonicalBusinessObjectReference getNewCanonicalReference(final CanonicalBusinessObjectReference originalCanonicalReference) {
if (originalCanonicalReference.equals(canonicalRef)) {
return newCanonicalRef;
}
return null;
}
@Override
public RelativeBusinessObjectReference getNewRelativeReference(final CanonicalBusinessObjectReference originalCanonicalReference) {
if (originalCanonicalReference.equals(canonicalRef)) {
return newRelRef;
}
return null;
}
});
}
});
} else {
// Rename using LTK
actionExecutor.execute("Rename Element " + initialValue + " to " + value, ActionExecutor.ExecutionMode.NORMAL, new LtkRenameAction(projectProvider, modelChangeNotifier, new BoSupplier(de), value, initialValue));
}
}
Aggregations