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=79d536e75d5de53a2054fc4ff0dcae858602542c;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;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 new file mode 100644 index 000000000..79d536e75 --- /dev/null +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeImage.java @@ -0,0 +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); +// } +// } + +}