From: jsimomaa Date: Tue, 4 Jun 2019 16:53:41 +0000 (+0300) Subject: Add property table highlight listener to open DN diagram X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fdistrict.git;a=commitdiff_plain;h=5f257f41103ed83e1559e715611b8d4f9cc8fa98 Add property table highlight listener to open DN diagram gitlab #50 APROS-15223 Change-Id: I60e2569263604288ad3d1b23f5c8204103b0b0d0 --- 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 9c56d543..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,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 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; @@ -16,6 +83,8 @@ public class Activator extends AbstractUIPlugin { private ServiceTracker subgraphProviderTracker; private ServiceTracker 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); + } + } }