X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=inline;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Finternal%2FActivator.java;h=72d7cf80a350fb5ae606c909745e598a2b029cab;hb=512d4afc5d802131da8ea9d5d2f393b760240ec9;hp=1e7a4d512fae8ba7216410f91c6adec6578416f9;hpb=a2e0d3dfba1245a13dcc8aa23c0188926e2a03c5;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 1e7a4d51..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,18 +1,148 @@ -package org.simantics.district.network.ui.internal; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -public class Activator implements BundleActivator { - - @Override - public void start(BundleContext context) throws Exception { - - } - - @Override - public void stop(BundleContext context) throws Exception { - - } - -} +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 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); + } + } + } + } + + // 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 { + Activator.instance = this; + Activator.context = context; + + 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; + } + + public static Activator getInstance() { + return instance; + } + + public static BundleContext getContext() { + return context; + } + + public SubgraphProvider[] getSubgraphProviders() { + 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); + } + } +}