import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
import org.eclipse.ui.PlatformUI;
import org.simantics.Simantics;
import org.simantics.g2d.diagram.DiagramHints;
import org.simantics.layer0.Layer0;
import org.simantics.modeling.ComponentUtils;
+import org.simantics.modeling.ModelingResources;
import org.simantics.modeling.actions.NavigateToTarget;
import org.simantics.modeling.ui.Activator;
import org.simantics.structural.stubs.StructuralResource2;
*/
public class OpenDiagramFromConfigurationAdapter extends AbstractResourceEditorAdapter {
- private static final String EDITOR_ID = "org.simantics.modeling.ui.diagramEditor";
+ private static final String EDITOR_ID = "org.simantics.modeling.ui.diagramEditor"; //$NON-NLS-1$
public OpenDiagramFromConfigurationAdapter() {
- super("Diagram Editor", Activator.COMPOSITE_ICON);
+ super(Messages.OpenDiagramFromConfigurationAdapter_DiagramEditor, Activator.COMPOSITE_ICON);
}
- protected String getEditorId() {
- return EDITOR_ID;
+ protected String getEditorId(ReadGraph g, Resource composite) throws DatabaseException {
+ ModelingResources MOD = ModelingResources.getInstance(g);
+ String preferredEditorId = g.getPossibleRelatedValue(composite, MOD.PreferredDiagramEditorID);
+ if(preferredEditorId != null)
+ return preferredEditorId;
+ else
+ return EDITOR_ID;
}
@Override
Simantics.getSession().asyncRequest(new ReadRequest() {
@Override
public void run(ReadGraph g) throws DatabaseException {
- openEditor(g, r, getEditorId());
+ openEditor(g, r, getEditorId(g, r));
}
});
}
Resource diagram = ComponentUtils.getPossibleCompositeDiagram(graph, r);
if(diagram != null) return diagram;
- if(selectedObjects.size() == 1) {
- Object o = selectedObjects.iterator().next();
- if(o instanceof Resource) {
- Resource res = (Resource)o;
- if(graph.isInstanceOf(res, DIA.Element)) {
- return graph.getPossibleObject(res, L0.PartOf);
- }
- }
+ // TODO: what if the selected objects are from different diagrams?
+ if (selectedObjects.size() > 0) {
+ Set<Resource> diagrams = new HashSet<>();
+ for (Object o : selectedObjects) {
+ if (o instanceof Resource) {
+ Resource res = (Resource)o;
+ if (graph.isInstanceOf(res, DIA.Element)) {
+ diagrams.add(graph.getPossibleObject(res, L0.PartOf));
+ }
+ }
+ }
+ if (diagrams.size() == 1) {
+ return diagrams.iterator().next();
+ }
}
-
return null;
}
* @param selectedObjects
* @throws DatabaseException
*/
- public static boolean openEditor(ReadGraph g, Resource r, final String editorId, final Collection<Object> selectedObjects) throws DatabaseException {
-
- final Resource diagram = getDiagram(g, r, selectedObjects);
- if (diagram == null)
- return false;
-
- final Resource configurationComposite = ComponentUtils.getPossibleDiagramComposite(g, diagram);
- if (configurationComposite == null)
- return false;
-
- Pair<Resource, RVI> modelAndRVI = getModelAndRVI(g, configurationComposite);
+ public static boolean openEditor(ReadGraph g, Resource r, String editorId, Collection<Object> selectedObjects) throws DatabaseException {
+ Resource diagram = getDiagram(g, r, selectedObjects);
+ Resource configurationComposite = diagram != null ? ComponentUtils.getPossibleDiagramComposite(g, diagram) : null;
+ Pair<Resource, RVI> modelAndRVI = configurationComposite != null ? getModelAndRVI(g, configurationComposite) : null;
//System.out.println("modelAndRVI: " + modelAndRVI);
if (modelAndRVI == null)
return false;
+ scheduleOpenEditor(editorId, diagram, modelAndRVI.first, modelAndRVI.second, selectedObjects);
+ return true;
+ }
- final Runnable editorActivator = NavigateToTarget.editorActivator(editorId, diagram, modelAndRVI.first, modelAndRVI.second, part -> {
+ /**
+ * @param g
+ * @param configurationComposite
+ * @param editorId
+ * @param selectedObjects
+ * @throws DatabaseException
+ */
+ public static boolean openEditor(ReadGraph g, Resource r, String editorId, Collection<Object> selectedObjects, Resource model, RVI rvi) throws DatabaseException {
+ Resource diagram = getDiagram(g, r, selectedObjects);
+ if (diagram == null)
+ return false;
+ scheduleOpenEditor(editorId, diagram, model, rvi, selectedObjects);
+ return true;
+ }
+
+ /**
+ * @param g
+ * @param configurationComposite
+ * @param editorId
+ * @param selectedObjects
+ * @throws DatabaseException
+ */
+ private static void scheduleOpenEditor(String editorId, Resource diagram, Resource model, RVI rvi, Collection<Object> selectedObjects) throws DatabaseException {
+ Runnable editorActivator = NavigateToTarget.editorActivator(editorId, diagram, model, rvi, part -> {
if (selectedObjects.isEmpty())
return;
-
- final ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);
+ ICanvasContext openedCanvas = (ICanvasContext) part.getAdapter(ICanvasContext.class);
assert openedCanvas != null;
// CanvasContext-wide denial of initial zoom-to-fit on diagram open.
openedCanvas.getDefaultHintContext().setHint(DiagramHints.KEY_INITIAL_ZOOM_TO_FIT, Boolean.FALSE);
- //System.out.println("ASDF: " + element);
ThreadUtils.asyncExec(openedCanvas.getThreadAccess(),
NavigateToTarget.elementSelectorZoomer(openedCanvas, selectedObjects, false));
});
-
- PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
- @Override
- public void run() {
- editorActivator.run();
- }
- });
-
- return true;
+ PlatformUI.getWorkbench().getDisplay().asyncExec(editorActivator);
}
}