]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.region.ui/src/org/simantics/district/region/ui/handlers/ZoomToRegionHandler.java
Add initial version of regions to source control
[simantics/district.git] / org.simantics.district.region.ui / src / org / simantics / district / region / ui / handlers / ZoomToRegionHandler.java
diff --git a/org.simantics.district.region.ui/src/org/simantics/district/region/ui/handlers/ZoomToRegionHandler.java b/org.simantics.district.region.ui/src/org/simantics/district/region/ui/handlers/ZoomToRegionHandler.java
new file mode 100644 (file)
index 0000000..47290bd
--- /dev/null
@@ -0,0 +1,124 @@
+package org.simantics.district.region.ui.handlers;
+
+import java.awt.Shape;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.inject.Named;
+
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.simantics.Simantics;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.common.request.UniqueRead;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.district.region.DiagramRegions;
+import org.simantics.district.region.DiagramRegions.DiagramRegion;
+import org.simantics.g2d.canvas.ICanvasContext;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.diagram.handler.PickRequest;
+import org.simantics.g2d.diagram.handler.impl.PickContextImpl;
+import org.simantics.g2d.element.ElementHints;
+import org.simantics.g2d.element.IElement;
+import org.simantics.modeling.actions.NavigateToTarget;
+import org.simantics.ui.workbench.action.DefaultActions;
+import org.simantics.utils.threads.ThreadUtils;
+import org.simantics.utils.ui.ISelectionUtils;
+import org.simantics.utils.ui.workbench.WorkbenchUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ZoomToRegionHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ZoomToRegionHandler.class);
+    public static final String COMMAND_ID = "org.simantics.district.region.ui.commands.zoomToRegion";
+    public static final String LABEL = "Zoom To Region";
+    
+    @CanExecute
+    public boolean canExecute() {
+        return true;
+    }
+    
+    @Execute
+    public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell activeShell,
+            @Named(IServiceConstants.ACTIVE_PART) MPart part,
+            @Named(IServiceConstants.ACTIVE_SELECTION) ISelection selection) {
+        DiagramRegion region = ISelectionUtils.filterSingleSelection(selection, DiagramRegion.class);
+        zoomTo(part, activeShell.getDisplay(), region.getResource());
+    }
+
+    public static void zoomTo(MPart part, Display display, Resource region) {
+        Resource dia;
+        try {
+            dia = Simantics.getSession().syncRequest(new UniqueRead<Resource>() {
+                
+                @Override
+                public Resource perform(ReadGraph graph) throws DatabaseException {
+                    return DiagramRegions.getDiagramForRegion(graph, region);
+                }
+            });
+            
+            // get currentyl active workbench part
+            IWorkbenchPart beforePerformingDefaultAction = WorkbenchUtils.getActiveWorkbenchPart();
+            IEditorPart activeEditor = WorkbenchUtils.getActiveEditor();
+            LOGGER.info("activeWorkbenchPart {}", beforePerformingDefaultAction);
+            LOGGER.info("activeEditor {}", activeEditor);
+            DefaultActions.performDefaultAction((Control)part.getWidget(), dia);
+            Simantics.getSession().asyncRequest(new ReadRequest() {
+                
+                @Override
+                public void run(ReadGraph graph) throws DatabaseException {
+                    Shape shp = DiagramRegions.coordinatesToShape(graph, region);
+                    display.asyncExec(() -> {
+                        IWorkbenchPart afterPerformingDefaultAction = WorkbenchUtils.getActiveWorkbenchPart();
+                        LOGGER.info("afterActiveWorkbenchPart {}", afterPerformingDefaultAction);
+                        int tries = 0;
+                        while (Objects.equals(beforePerformingDefaultAction, afterPerformingDefaultAction) && tries <= 10) {
+                            try {
+                                Thread.sleep(150);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            afterPerformingDefaultAction = WorkbenchUtils.getActiveEditor();
+                            LOGGER.info("afterActiveWorkbenchPart {}", afterPerformingDefaultAction);
+                            tries++;
+                        }
+                        LOGGER.info("afterActiveWorkbenchPart {}", afterPerformingDefaultAction);
+                        if (beforePerformingDefaultAction.equals(afterPerformingDefaultAction)) {
+                            LOGGER.warn("No can do");
+                        } else if (afterPerformingDefaultAction != null) {
+                            // Okay, get the IDiagram now
+                            IDiagram diagram = afterPerformingDefaultAction.getAdapter(IDiagram.class);
+                            if (diagram == null)
+                                LOGGER.warn("No can do - no IDiagram available");
+                            else {
+                                Set<IElement> elems = new HashSet<>();
+                                PickContextImpl.INSTANCE.pick(diagram, new PickRequest(shp), elems);
+                                ICanvasContext context = afterPerformingDefaultAction.getAdapter(ICanvasContext.class);
+                                List<Object> collect = elems.stream().map(el -> el.getHint(ElementHints.KEY_OBJECT)).collect(Collectors.toList());
+                                ThreadUtils.asyncExec(context.getThreadAccess(), NavigateToTarget.elementSelectorZoomer(context, collect, false));
+                            }
+                        } else {
+                            LOGGER.info("afterPerforming is null");
+                        }
+                    });
+                }
+            });
+        } catch (DatabaseException e) {
+            e.printStackTrace();
+        }
+    }
+}