]> gerrit.simantics Code Review - simantics/district.git/commitdiff
Add property table highlight listener to open DN diagram
authorjsimomaa <jani.simomaa@gmail.com>
Tue, 4 Jun 2019 16:53:41 +0000 (19:53 +0300)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Sat, 31 Aug 2019 20:08:42 +0000 (23:08 +0300)
gitlab #50
APROS-15223

Change-Id: I60e2569263604288ad3d1b23f5c8204103b0b0d0

org.simantics.district.network.ui/src/org/simantics/district/network/ui/internal/Activator.java

index 9c56d543578213feaaf8b0e4160a804a295045db..72d7cf80a350fb5ae606c909745e598a2b029cab 100644 (file)
@@ -1,13 +1,80 @@
 package org.simantics.district.network.ui.internal;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.ui.internal.workbench.E4Workbench;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
 import org.osgi.util.tracker.ServiceTracker;
+import org.simantics.Simantics;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.request.UniqueRead;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.district.network.ontology.DistrictNetworkResource;
+import org.simantics.district.network.ui.DistrictNetworkUIUtil;
 import org.simantics.district.network.ui.breakdown.SubgraphProvider;
 import org.simantics.district.route.RouteService;
+import org.simantics.modeling.ModelingResources;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class Activator extends AbstractUIPlugin {
 
+       private static final class HighlightSelectionEventHandler implements EventHandler {
+               @Override
+               public void handleEvent(Event event) {
+                       Object data = event.getProperty("org.eclipse.e4.data");
+                       if (data instanceof Variable[]) {
+                               Variable[] propertyTableComponents = (Variable[]) data;
+                               try {
+                                       // convert components to dh components
+                                       List<Resource> dnElements = Simantics.getSession().syncRequest(new UniqueRead<List<Resource>>() {
+                                               
+                                               @Override
+                                               public List<Resource> perform(ReadGraph graph) throws DatabaseException {
+                                                       DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
+                                                       ModelingResources MOD = ModelingResources.getInstance(graph);
+                                                       return Arrays.asList(propertyTableComponents).stream().map(var -> {
+                                                               try {
+                                                                       Resource res = var.getRepresents(graph);
+                                                                       Resource element = graph.getSingleObject(res, MOD.ComponentToElement);
+                                                                       return graph.getSingleObject(element, DN.MappedFromElement);
+                                                               } catch (Exception e) {
+                                                                       String varURI = var.toString();
+                                                                       try {
+                                                                               varURI = var.getURI(graph);
+                                                                       } catch (DatabaseException ex) {
+                                                                               LOGGER.error("Unable to resole uri for {}", var, ex);
+                                                                       }
+                                                                       LOGGER.error("Could not get dn element for {}", varURI, e);
+                                                                       return null;
+                                                               }
+                                                       }).collect(Collectors.toList());
+                                               }
+                                       });
+                                       DistrictNetworkUIUtil.openDNDiagramWithSelection(Display.getDefault(), dnElements);
+                               } catch (DatabaseException e) {
+                                       LOGGER.error("Could not convert variables to dn elements", propertyTableComponents, e);
+                               }
+                       }
+               }
+       }
+
+       // This is hard coded for now.. the same value is used for multipropertytable to
+       // send the events we are here listening and interested in
+       private static final String PROPERTY_TABLE_HIGHLIGHT = "PROPERTY_TABLE_HIGHLIGHT";
+
+       private static final Logger LOGGER = LoggerFactory.getLogger(Activator.class);
+
     public static final String PLUGIN_ID = "org.simantics.district.network.ui";
 
     private static Activator instance;
@@ -16,6 +83,8 @@ public class Activator extends AbstractUIPlugin {
     private ServiceTracker<SubgraphProvider, SubgraphProvider> subgraphProviderTracker;
     private ServiceTracker<RouteService, RouteService> routeServiceTracker;
 
+       private HighlightSelectionEventHandler eventHandler;
+
     @Override
     public void start(BundleContext context) throws Exception {
         Activator.instance = this;
@@ -25,13 +94,15 @@ public class Activator extends AbstractUIPlugin {
         subgraphProviderTracker.open();
         routeServiceTracker = new ServiceTracker<>(context, RouteService.class.getName(), null);
         routeServiceTracker.open();
+        
+        initializeEventListener();
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
         subgraphProviderTracker.close();
         routeServiceTracker.close();
-
+        deinitializeEventListener();
         Activator.instance = null;
         Activator.context = null;
     }
@@ -52,4 +123,26 @@ public class Activator extends AbstractUIPlugin {
         return routeServiceTracker.getService();
     }
 
+       private void initializeEventListener() {
+               @SuppressWarnings("restriction")
+               IEclipseContext contxt = E4Workbench.getServiceContext();
+               IEventBroker broker = contxt.get(IEventBroker.class);
+               eventHandler = new HighlightSelectionEventHandler();
+               if (broker != null) {
+                       broker.subscribe(PROPERTY_TABLE_HIGHLIGHT, eventHandler);
+               } else {
+                       LOGGER.info("EventBroker is somehow null for {}", this);
+               }
+       }
+
+       private void deinitializeEventListener() {
+               @SuppressWarnings("restriction")
+               IEclipseContext contxt = E4Workbench.getServiceContext();
+               IEventBroker broker = contxt.get(IEventBroker.class);
+               if (broker != null) {
+                       broker.unsubscribe(eventHandler);
+               } else {
+                       LOGGER.info("EventBroker is somehow null for {}", this);
+               }
+       }
 }