X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fadapter%2FCompositeImage.java;fp=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fadapter%2FCompositeImage.java;h=93957f0698fc0643691d0676039ce676e78f4b3c;hb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;hp=79d536e75d5de53a2054fc4ff0dcae858602542c;hpb=24e2b34260f219f0d1644ca7a138894980e25b14;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeImage.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeImage.java index 79d536e75..93957f069 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeImage.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeImage.java @@ -1,187 +1,187 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.diagram.adapter; - -import java.awt.Shape; -import java.awt.geom.Rectangle2D; -import java.util.Collection; -import java.util.EnumSet; -import java.util.List; - -import org.simantics.g2d.element.ElementClass; -import org.simantics.g2d.element.ElementUtils; -import org.simantics.g2d.element.IElement; -import org.simantics.g2d.element.SceneGraphNodeKey; -import org.simantics.g2d.element.handler.SceneGraph; -import org.simantics.g2d.image.Image; -import org.simantics.scenegraph.Node; -import org.simantics.scenegraph.g2d.G2DParentNode; -import org.simantics.scenegraph.g2d.nodes.SingleElementNode; -import org.simantics.utils.datastructures.hints.IHintContext.Key; - -/** - * Element Composition -> Image - * - * @author Toni Kalajainen - */ -public class CompositeImage implements Image { - - Collection elements; - private Shape shape; - private Rectangle2D bounds; - //IHintContext parentHints; - static EnumSet feats = VOLATILE_VECTOR; - - public static final Key KEY_SG_NODE = new SceneGraphNodeKey(Node.class, "COMPOSITE_IMAGE_SG_NODE"); - - public CompositeImage(Collection elements) - { - //this.nodeIdentifier = nodeIdentifier; - this.elements = elements; -// ITask task = ThreadLogger.getInstance().begin("getElementShapesOnDiagram"); - // getElementShapesOnDiagram is ridiculously slow with some input data.. - // With Balas it took almost 2sec to calculate one Area.add() for the last terminal element. - //shape = ElementUtils.getElementShapesOnDiagram(elements); -// shape = ElementUtils.getElementBoundsOnDiagram(elements); - // task.finish(); -// bounds = shape.getBounds2D(); - } - - @Override - public Rectangle2D getBounds() { - if(bounds == null) { - Shape shape = getShape(); - // Shape may be null. - if (shape == null) - return new Rectangle2D.Double(); - bounds = shape.getBounds2D(); - } - return bounds; - } - - @Override - public EnumSet getFeatures() { - return feats; - } - - private final Shape getShape() { - if(shape == null) { - shape = ElementUtils.getElementBoundsOnDiagram(elements); - } - return shape; - } - - @Override - public Shape getOutline() { - return getShape(); - } - - public Collection getElements() { - return elements; - } - - @Override - public void addImageListener(ImageListener listener) { - } - - @Override - public void removeImageListener(ImageListener listener) { - } - -// public void setParentHints(IHintContext hints) { -// this.parentHints = hints; -// } - - // Rendering is single-threaded, this is used while rendering. - Rectangle2D tempBounds = new Rectangle2D.Double(0, 0, 0, 0); - - @Override - public Node init(G2DParentNode parent) { - if (elements.size() < 2) { - // Optimization for 0..1 element composites - for (IElement e : elements) { - ElementClass ec = e.getElementClass(); - G2DParentNode node = parent.getOrCreateNode("composite_image_"+this.hashCode(), G2DParentNode.class); - List nodeHandlers = ec.getItemsByClass(SceneGraph.class); - for (SceneGraph n : nodeHandlers) { -// n.init(e, parent); - n.init(e, node); - } - return node; // Valid node must be returned because transform is set afterwards - } - } - - // For N element composites - - // Removed this grouping node as unnecessary, just use the given parent node - G2DParentNode node = parent.getOrCreateNode("composite_image_"+this.hashCode(), G2DParentNode.class); - -// Rectangle2D bounds = tempBounds; - - int zIndex = 0; - for (IElement e : elements) { - ElementClass ec = e.getElementClass(); -// InternalSize size = ec.getSingleItem(InternalSize.class); -// size.getBounds(e, bounds); - -// Transform transform = e.getElementClass().getSingleItem(Transform.class); -// AffineTransform at2 = transform.getTransform(e); -// if (at2 == null) -// continue; - SingleElementNode holder = node.getOrCreateNode(ElementUtils.generateNodeId(e), SingleElementNode.class); - //SingleElementNode holder = parent.getOrCreateNode(ElementUtils.generateNodeId(e), SingleElementNode.class); - holder.setZIndex(++zIndex); - - List nodeHandlers = ec.getItemsByClass(SceneGraph.class); - for(SceneGraph n : nodeHandlers) { - n.init(e, holder); - } - } - - return node; // Valid node must be returned because transform is set afterwards - } - -// public static class TypeProxyElement extends ProxyElement { -// IHintContext instanceHints; -// public TypeProxyElement(IElement orig, IHintContext instanceHints) { -// super(orig); -// this.instanceHints = instanceHints; -// } -// @Override -// public E getHint(Key key) { -// // TODO: need some mechanism to tell whether it is allowed to look for this key in the instance hints or not -// // This version is broken because some hints MUST come from the original element. -// E e = null; -// if (instanceHints != null) -// e = instanceHints.getHint(key); -// if (e == null) -// e = orig.getHint(key); -// return e; -// } -// @Override -// public Map getHints() { -// throw new UnsupportedOperationException(); -// } -// @Override -// public Map getHintsOfClass(Class clazz) { -// throw new UnsupportedOperationException(); -// } -// @Override -// public void setHint(Key key, Object value) { -// if (instanceHints != null) -// instanceHints.setHint(key, value); -// else -// orig.setHint(key, value); -// } -// } - -} +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.diagram.adapter; + +import java.awt.Shape; +import java.awt.geom.Rectangle2D; +import java.util.Collection; +import java.util.EnumSet; +import java.util.List; + +import org.simantics.g2d.element.ElementClass; +import org.simantics.g2d.element.ElementUtils; +import org.simantics.g2d.element.IElement; +import org.simantics.g2d.element.SceneGraphNodeKey; +import org.simantics.g2d.element.handler.SceneGraph; +import org.simantics.g2d.image.Image; +import org.simantics.scenegraph.Node; +import org.simantics.scenegraph.g2d.G2DParentNode; +import org.simantics.scenegraph.g2d.nodes.SingleElementNode; +import org.simantics.utils.datastructures.hints.IHintContext.Key; + +/** + * Element Composition -> Image + * + * @author Toni Kalajainen + */ +public class CompositeImage implements Image { + + Collection elements; + private Shape shape; + private Rectangle2D bounds; + //IHintContext parentHints; + static EnumSet feats = VOLATILE_VECTOR; + + public static final Key KEY_SG_NODE = new SceneGraphNodeKey(Node.class, "COMPOSITE_IMAGE_SG_NODE"); + + public CompositeImage(Collection elements) + { + //this.nodeIdentifier = nodeIdentifier; + this.elements = elements; +// ITask task = ThreadLogger.getInstance().begin("getElementShapesOnDiagram"); + // getElementShapesOnDiagram is ridiculously slow with some input data.. + // With Balas it took almost 2sec to calculate one Area.add() for the last terminal element. + //shape = ElementUtils.getElementShapesOnDiagram(elements); +// shape = ElementUtils.getElementBoundsOnDiagram(elements); + // task.finish(); +// bounds = shape.getBounds2D(); + } + + @Override + public Rectangle2D getBounds() { + if(bounds == null) { + Shape shape = getShape(); + // Shape may be null. + if (shape == null) + return new Rectangle2D.Double(); + bounds = shape.getBounds2D(); + } + return bounds; + } + + @Override + public EnumSet getFeatures() { + return feats; + } + + private final Shape getShape() { + if(shape == null) { + shape = ElementUtils.getElementBoundsOnDiagram(elements); + } + return shape; + } + + @Override + public Shape getOutline() { + return getShape(); + } + + public Collection getElements() { + return elements; + } + + @Override + public void addImageListener(ImageListener listener) { + } + + @Override + public void removeImageListener(ImageListener listener) { + } + +// public void setParentHints(IHintContext hints) { +// this.parentHints = hints; +// } + + // Rendering is single-threaded, this is used while rendering. + Rectangle2D tempBounds = new Rectangle2D.Double(0, 0, 0, 0); + + @Override + public Node init(G2DParentNode parent) { + if (elements.size() < 2) { + // Optimization for 0..1 element composites + for (IElement e : elements) { + ElementClass ec = e.getElementClass(); + G2DParentNode node = parent.getOrCreateNode("composite_image_"+this.hashCode(), G2DParentNode.class); + List nodeHandlers = ec.getItemsByClass(SceneGraph.class); + for (SceneGraph n : nodeHandlers) { +// n.init(e, parent); + n.init(e, node); + } + return node; // Valid node must be returned because transform is set afterwards + } + } + + // For N element composites + + // Removed this grouping node as unnecessary, just use the given parent node + G2DParentNode node = parent.getOrCreateNode("composite_image_"+this.hashCode(), G2DParentNode.class); + +// Rectangle2D bounds = tempBounds; + + int zIndex = 0; + for (IElement e : elements) { + ElementClass ec = e.getElementClass(); +// InternalSize size = ec.getSingleItem(InternalSize.class); +// size.getBounds(e, bounds); + +// Transform transform = e.getElementClass().getSingleItem(Transform.class); +// AffineTransform at2 = transform.getTransform(e); +// if (at2 == null) +// continue; + SingleElementNode holder = node.getOrCreateNode(ElementUtils.generateNodeId(e), SingleElementNode.class); + //SingleElementNode holder = parent.getOrCreateNode(ElementUtils.generateNodeId(e), SingleElementNode.class); + holder.setZIndex(++zIndex); + + List nodeHandlers = ec.getItemsByClass(SceneGraph.class); + for(SceneGraph n : nodeHandlers) { + n.init(e, holder); + } + } + + return node; // Valid node must be returned because transform is set afterwards + } + +// public static class TypeProxyElement extends ProxyElement { +// IHintContext instanceHints; +// public TypeProxyElement(IElement orig, IHintContext instanceHints) { +// super(orig); +// this.instanceHints = instanceHints; +// } +// @Override +// public E getHint(Key key) { +// // TODO: need some mechanism to tell whether it is allowed to look for this key in the instance hints or not +// // This version is broken because some hints MUST come from the original element. +// E e = null; +// if (instanceHints != null) +// e = instanceHints.getHint(key); +// if (e == null) +// e = orig.getHint(key); +// return e; +// } +// @Override +// public Map getHints() { +// throw new UnsupportedOperationException(); +// } +// @Override +// public Map getHintsOfClass(Class clazz) { +// throw new UnsupportedOperationException(); +// } +// @Override +// public void setHint(Key key, Object value) { +// if (instanceHints != null) +// instanceHints.setHint(key, value); +// else +// orig.setHint(key, value); +// } +// } + +}