]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.route.ui/src/org/simantics/district/route/ui/actions/SelectRouteAction.java
Added a browser context for route-related actions.
[simantics/district.git] / org.simantics.district.route.ui / src / org / simantics / district / route / ui / actions / SelectRouteAction.java
diff --git a/org.simantics.district.route.ui/src/org/simantics/district/route/ui/actions/SelectRouteAction.java b/org.simantics.district.route.ui/src/org/simantics/district/route/ui/actions/SelectRouteAction.java
new file mode 100644 (file)
index 0000000..11de4cc
--- /dev/null
@@ -0,0 +1,67 @@
+package org.simantics.district.route.ui.actions;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.swt.widgets.Display;
+import org.simantics.Simantics;
+import org.simantics.db.Resource;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.ActionFactory;
+import org.simantics.district.network.ui.DistrictNetworkUIUtil;
+import org.simantics.district.route.Route;
+import org.simantics.district.route.RouteJob;
+import org.simantics.district.route.RouterConfiguration;
+import org.simantics.district.route.internal.RoutePersistence;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SelectRouteAction implements ActionFactory {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(SelectRouteAction.class);
+
+    @Override
+    public Runnable create(Object target) {
+        if (!(target instanceof Resource))
+            return null;
+
+        return new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Route route = Simantics.getSession().syncRequest(new RoutePersistence.RouteRequest((Resource)target));
+                    if (route == null) {
+                        LOGGER.error("Reading a route object failed"); //$NON-NLS-1$
+                        return;
+                    }
+                    
+                    CompletableFuture<List<Resource>> result = new CompletableFuture<>();
+                    result
+                    .exceptionally(e -> Collections.emptyList())
+                    .thenAccept(dnElements -> {
+                        if (!dnElements.isEmpty()) {
+                            try {
+                                Display display = Display.getDefault();
+                                if (display != null)
+                                    DistrictNetworkUIUtil.openDNDiagramWithSelection(display, dnElements);
+                                else
+                                    LOGGER.error("No display found"); //$NON-NLS-1$
+                            } catch (DatabaseException e) {
+                                LOGGER.error("Failed to open district network diagram with selection " + dnElements, e); //$NON-NLS-1$
+                                
+                            }
+                        }
+                    });
+                    
+                    RouterConfiguration config = new RouterConfiguration();
+                    new RouteJob(config, route, result).schedule();
+                }
+                catch (DatabaseException e) {
+                    LOGGER.error("Error in selecting route " + target, e); //$NON-NLS-1$
+                }
+            }
+        };
+    }
+
+}