From e1559239456cfd3d9ad925cd3bbd4b04a41e71d6 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Mon, 8 Apr 2019 19:42:10 +0300 Subject: [PATCH] Initial version of dh element cut/paste (copy still WIP) gitlab #43 APROS-15307 Change-Id: Ie1652086c689416e052aed38f5e523ab16ce7b2e --- .../fragment.e4xmi | 11 ++ .../CopyDistrictVertexHandler.java | 60 +++++++ .../PasteDistrictVertexHandler.java | 158 ++++++++++++++++++ 3 files changed, 229 insertions(+) create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java diff --git a/org.simantics.district.network.ui/fragment.e4xmi b/org.simantics.district.network.ui/fragment.e4xmi index fb9bde4c..93ff59c6 100644 --- a/org.simantics.district.network.ui/fragment.e4xmi +++ b/org.simantics.district.network.ui/fragment.e4xmi @@ -9,6 +9,10 @@ + + + + @@ -19,6 +23,11 @@ + + + + + @@ -29,5 +38,7 @@ + + diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java new file mode 100644 index 00000000..3f99f60b --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java @@ -0,0 +1,60 @@ +package org.simantics.district.network.ui.contributions; + +import java.util.List; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.jface.viewers.ISelection; +import org.simantics.Simantics; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.SelectionHints; +import org.simantics.db.request.Read; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.utils.ui.ISelectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CopyDistrictVertexHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyDistrictVertexHandler.class); + static List elements; + static boolean cut = true; + + @CanExecute + public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION) ISelection selection) { + List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); + if (elements.size() != 1) + return false; + try { + return Simantics.getSession().syncRequest(new Read() { + + @Override + public Boolean perform(ReadGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + for (Resource selection : elements) { + if (!graph.isInstanceOf(selection, DN.Element)) { + return false; + } + } + return true; + } + }); + } catch (DatabaseException e) { + LOGGER.error("Could not evaluate if mapping can be changed for selection {}", elements, e); + return false; + } + } + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) { + final List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); + // we store these to a static variable for pasting.. maybe not the best solution + CopyDistrictVertexHandler.elements = elements; + //CopyDistrictVertexHandler.cut = cut != null && !cut.isEmpty(); + } +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java new file mode 100644 index 00000000..b9aedefe --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java @@ -0,0 +1,158 @@ +package org.simantics.district.network.ui.contributions; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.TimeUnit; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.jface.viewers.ISelection; +import org.simantics.Simantics; +import org.simantics.databoard.Bindings; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.SelectionHints; +import org.simantics.db.layer0.util.RemoverUtil; +import org.simantics.db.request.Read; +import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.utils.threads.ThreadUtils; +import org.simantics.utils.ui.ISelectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PasteDistrictVertexHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(PasteDistrictVertexHandler.class); + + @CanExecute + public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION) ISelection selection) { + List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); + if (elements.size() < 1) + return false; + try { + return Simantics.getSession().syncRequest(new Read() { + + @Override + public Boolean perform(ReadGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + for (Resource selection : elements) { + if (!graph.isInstanceOf(selection, DN.Element)) { + return false; + } + } + return true; + } + }); + } catch (DatabaseException e) { + LOGGER.error("Could not evaluate if mapping can be changed for selection {}", elements, e); + return false; + } + } + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) { + final List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); + final List copiedElements = CopyDistrictVertexHandler.elements; // TODO: this could be implemented more nicely with clipboard ? + boolean cut = CopyDistrictVertexHandler.cut; + + Resource targetElement = elements.get(0); + Resource sourceElement = copiedElements.get(0); + + try { + Simantics.getSession().syncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Resource sourceMappedElement = graph.getPossibleObject(sourceElement, DN.MappedComponent); + Resource targetMappedElement = graph.getPossibleObject(targetElement, DN.MappedComponent); + if (sourceMappedElement != null) + RemoverUtil.remove(graph, sourceMappedElement); + if (targetMappedElement != null) + RemoverUtil.remove(graph, targetMappedElement); + ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> { + Simantics.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + //copyMapping(graph, DN, sourceElement, targetElement); + copyLocation(graph, DN, sourceElement, targetElement, cut); + copyVertexInverses(graph, DN, sourceElement, targetElement, cut); + copyElevation(graph, DN, sourceElement, targetElement, cut); + } + }); + }, 200, TimeUnit.MILLISECONDS); + } + + private void copyMapping(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement) throws DatabaseException { + Resource sourceMapping = graph.getSingleObject(sourceElement, DN.Mapping); + Resource targetMapping = graph.getSingleObject(targetElement, DN.Mapping); + if (cut) { + graph.deny(sourceElement, DN.Mapping); + graph.claim(sourceElement, DN.Mapping, targetMapping); + } + graph.deny(targetElement, DN.Mapping); + graph.claim(targetElement, DN.Mapping, sourceMapping); + } + + private void copyElevation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { + double sourceElevation = graph.getRelatedValue(sourceElement, DN.Vertex_HasElevation, Bindings.DOUBLE); + double targetElevation = graph.getRelatedValue(targetElement, DN.Vertex_HasElevation, Bindings.DOUBLE); + if (cut) { + graph.deny(sourceElement, DN.Vertex_HasElevation); + graph.claimLiteral(sourceElement, DN.Vertex_HasElevation, targetElevation, Bindings.DOUBLE); + } + graph.deny(targetElement, DN.Vertex_HasElevation); + graph.claimLiteral(targetElement, DN.Vertex_HasElevation, sourceElevation, Bindings.DOUBLE); + } + + private void copyLocation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { + DiagramResource DIA = DiagramResource.getInstance(graph); + double[] sourceLocation = graph.getRelatedValue(sourceElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); + double[] targetLocation = graph.getRelatedValue(targetElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); + if (cut) { + graph.deny(sourceElement, DIA.HasLocation); + graph.claimLiteral(sourceElement, DIA.HasLocation, targetLocation, Bindings.DOUBLE_ARRAY); + } + graph.deny(targetElement, DIA.HasLocation); + graph.claimLiteral(targetElement, DIA.HasLocation, sourceLocation, Bindings.DOUBLE_ARRAY); + } + + private void copyVertexInverses(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { + Collection sourceStartVertex_inverse = graph.getObjects(sourceElement, DN.HasStartVertex_Inverse); + Collection sourceEndVertex_inverse = graph.getObjects(sourceElement, DN.HasEndVertex_Inverse); + Collection targetStartVertex_inverse = graph.getObjects(targetElement, DN.HasStartVertex_Inverse); + Collection targetEndVertex_inverse = graph.getObjects(targetElement, DN.HasEndVertex_Inverse); + graph.deny(sourceElement, DN.HasStartVertex_Inverse); + graph.deny(sourceElement, DN.HasEndVertex_Inverse); + graph.deny(targetElement, DN.HasStartVertex_Inverse); + graph.deny(targetElement, DN.HasEndVertex_Inverse); + for (Resource startVertexInverse : sourceStartVertex_inverse) { + graph.claim(targetElement, DN.HasStartVertex_Inverse, startVertexInverse); + } + for (Resource targetVertexInverse : targetStartVertex_inverse) { + graph.claim(sourceElement, DN.HasStartVertex_Inverse, targetVertexInverse); + } + for (Resource endVertexInverse : sourceEndVertex_inverse) { + graph.claim(targetElement, DN.HasEndVertex_Inverse, endVertexInverse); + } + for (Resource targetVertexInverse : targetEndVertex_inverse) { + graph.claim(sourceElement, DN.HasEndVertex_Inverse, targetVertexInverse); + } + } + }); + } catch (DatabaseException e) { + e.printStackTrace(); + } + + } +} -- 2.47.1