X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Finternal%2FActivator.java;h=72d7cf80a350fb5ae606c909745e598a2b029cab;hb=27f0f6dd22d6826ae85ea89b1916d17ca9f83c41;hp=e0e7b47564f917a7ca416eda8286cd0d896e3f44;hpb=37304f4caf1d4252797cbaf7b40a56e212e203b4;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/internal/Activator.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/internal/Activator.java index e0e7b475..72d7cf80 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/internal/Activator.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/internal/Activator.java @@ -1,16 +1,89 @@ package org.simantics.district.network.ui.internal; -import org.osgi.framework.BundleActivator; +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 dnElements = Simantics.getSession().syncRequest(new UniqueRead>() { + + @Override + public List 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); + } + } + } + } -public class Activator implements BundleActivator { + // 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; private static BundleContext context; + private ServiceTracker subgraphProviderTracker; + private ServiceTracker routeServiceTracker; + + private HighlightSelectionEventHandler eventHandler; @Override public void start(BundleContext context) throws Exception { @@ -19,12 +92,17 @@ public class Activator implements BundleActivator { subgraphProviderTracker = new ServiceTracker<>(context, SubgraphProvider.class.getName(), null); 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; } @@ -41,4 +119,30 @@ public class Activator implements BundleActivator { return subgraphProviderTracker.getServices(new SubgraphProvider[0]); } + public RouteService getRouteService() { + 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); + } + } }