X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scenegraph%2Fsrc%2Forg%2Fsimantics%2Fscenegraph%2Fg2d%2Fnodes%2FSingleElementNode.java;h=29ef9954eb37a604a1ca593439e9614a1e3d4510;hb=fe29fd8956c3881e261ec4eee1cdd2ac27bc0554;hp=dc40036a7ff794c19dc0a62a34c1cebef715334b;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java index dc40036a7..29ef9954e 100644 --- a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java +++ b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java @@ -1,166 +1,219 @@ -/******************************************************************************* - * 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.scenegraph.g2d.nodes; - -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Graphics2D; - -import org.simantics.scenegraph.g2d.IG2DNode; -import org.simantics.scenegraph.utils.InitValueSupport; - -public class SingleElementNode extends TransformNode implements InitValueSupport { - /** - * - */ - private static final long serialVersionUID = -4982578347433716440L; - - protected Composite composite; - protected Boolean visible = Boolean.TRUE; - protected Boolean hidden = Boolean.FALSE; - - @Override - public boolean validate() { - return visible && !hidden; - } - - @SyncField("composite") - public void setComposite(Composite composite) { - this.composite = composite; - } - - @SyncField("visible") - public void setVisible(Boolean visible) { - this.visible = visible; - } - - public boolean isVisible() { - return visible; - } - - @SyncField("hidden") - public void setHidden(Boolean hidden) { - this.hidden = hidden; - } - - public boolean isHidden() { - return hidden; - } - - @Override - public void render(Graphics2D g) { - if (!visible || hidden) - return; - - Composite oldComposite = null; - if(composite != null) { - oldComposite = g.getComposite(); - g.setComposite(composite); - } - if(alphaComposite != null) { - if (oldComposite == null) - oldComposite = g.getComposite(); - g.setComposite(alphaComposite); - } - - super.render(g); - - if (oldComposite != null) - g.setComposite(oldComposite); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(super.toString()); - sb.append(" ["); - if (composite != null) { - sb.append("composite=("); - AlphaComposite ac = (AlphaComposite) composite; - sb.append(ac.getRule()); - sb.append(", "); - sb.append(ac.getAlpha()); - sb.append("), "); - } - sb.append("visible="); - sb.append(visible); - sb.append("]"); - return sb.toString(); - } - -// private INode findChild(String key) { -// -// INode result = getNode(key); -// if(result != null) return result; -// -// for(Map.Entry entry : children.entrySet()) { -// -// if(!(entry.getValue() instanceof SingleElementNode)) { -// if(entry.getKey().startsWith(key)) return entry.getValue(); -// } -// -// } -// -// for(IG2DNode node : getNodes()) { -// -// if(node instanceof SingleElementNode) { -// -// result = ((SingleElementNode)node).findChild(key); -// if(result != null) return result; -// -// } -// -// } -// -// return null; -// -// } - - protected Composite alphaComposite = null; - - @PropertySetter("alpha") - @SyncField("alphaComposite") - public void setAlphaComposite(Composite alphaComposite) { - this.alphaComposite = alphaComposite; - } - -// public void setValue(String key, Object value) { -// -// if ("alpha".equals(key)) { -// Float val = Float.parseFloat((String)value); -// alphaComposite = AlphaComposite.getInstance(AlphaComposite. SRC_OVER, val); -// } else { -// -// String[] parts = key.split("\\."); -// if(parts.length != 2) return; -// -// INode child = findChild(parts[0]); -// -// if(child == null) return; -// -//// child.setValue(parts[1], value); -// -// } -// -// } - - @Override - public void initValues() { - alphaComposite = null; - for (IG2DNode node : getSortedNodes()) { - if (node instanceof InitValueSupport) { - ((InitValueSupport) node).initValues(); - } - } - } - -} +/******************************************************************************* + * 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.scenegraph.g2d.nodes; + +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.util.Map; + +import org.simantics.scenegraph.INode; +import org.simantics.scenegraph.g2d.G2DRenderingHints; +import org.simantics.scenegraph.g2d.IG2DNode; +import org.simantics.scenegraph.g2d.events.EventTypes; +import org.simantics.scenegraph.g2d.events.MouseEvent; +import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin; +import org.simantics.scenegraph.utils.InitValueSupport; +import org.simantics.scenegraph.utils.NodeUtil; + +public class SingleElementNode extends TransformNode implements InitValueSupport { + + private static final long serialVersionUID = -4982578347433716440L; + + private TransferableProvider transferableProvider; + protected Composite composite; + protected Boolean visible = Boolean.TRUE; + protected Boolean hidden = Boolean.FALSE; + private transient Object key; + private transient String typeClass; + private transient Map parameters; + + public void setKey(Object key) { + this.key = key; + } + + public void setTypeClass(String typeClass) { + this.typeClass = typeClass; + } + + public Object getKey() { + return key; + } + + public String getTypeClass() { + return typeClass; + } + + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + public T getParameter(String key) { + if (parameters != null) { + @SuppressWarnings("unchecked") + T t = (T) parameters.get(key); + if(t != null) return t; + } + INode parent = NodeUtil.getNearestParentOfType(this, SingleElementNode.class); + if (parent instanceof SingleElementNode) { + return ((SingleElementNode)parent).getParameter(key); + } + return null; + } + + public void setTransferableProvider(TransferableProvider transferableProvider) { + if (transferableProvider != this.transferableProvider) { + if (this.transferableProvider != null) + removeEventHandler(this); + if (transferableProvider != null) + addEventHandler(this); + this.transferableProvider = transferableProvider; + } + } + + @Override + public boolean validate() { + return visible && !hidden; + } + + @SyncField("composite") + public void setComposite(Composite composite) { + this.composite = composite; + } + + @SyncField("visible") + public void setVisible(Boolean visible) { + this.visible = visible; + } + + public boolean isVisible() { + return visible; + } + + @SyncField("hidden") + public void setHidden(Boolean hidden) { + this.hidden = hidden; + } + + public boolean isHidden() { + return hidden; + } + + @Override + public void render(Graphics2D g) { + if (!visible || hidden) + return; + + Composite oldComposite = null; + if(composite != null) { + oldComposite = g.getComposite(); + g.setComposite(composite); + } + if(alphaComposite != null) { + if (oldComposite == null) + oldComposite = g.getComposite(); + g.setComposite(alphaComposite); + } + + super.render(g); + + if (oldComposite != null) + g.setComposite(oldComposite); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()); + sb.append(" ["); + if (composite != null) { + sb.append("composite=("); + AlphaComposite ac = (AlphaComposite) composite; + sb.append(ac.getRule()); + sb.append(", "); + sb.append(ac.getAlpha()); + sb.append("), "); + } + sb.append("visible="); + sb.append(visible); + sb.append("]"); + return sb.toString(); + } + + protected Composite alphaComposite = null; + + @PropertySetter("alpha") + @SyncField("alphaComposite") + public void setAlphaComposite(Composite alphaComposite) { + this.alphaComposite = alphaComposite; + } + + @Override + public void initValues() { + alphaComposite = null; + for (IG2DNode node : getSortedNodes()) { + if (node instanceof InitValueSupport) { + ((InitValueSupport) node).initValues(); + } + } + } + + @Override + public void cleanup() { + if (transferableProvider != null) { + removeEventHandler(this); + transferableProvider = null; + } + super.cleanup(); + } + + protected boolean isDragStartEvent(MouseEvent e) { + return e.isControlDown(); + } + + protected boolean hitTest(MouseEvent event) { + Rectangle2D bounds = super.getBoundsInLocal(true); + if (bounds == null) + return false; + Point2D localPos = NodeUtil.worldToLocal(this, event.controlPosition, new Point2D.Double()); + double x = localPos.getX(); + double y = localPos.getY(); + boolean hit = bounds.contains(x, y); + return hit; + } + + @Override + protected boolean mouseDragged(MouseDragBegin e) { + if (transferableProvider == null + || !isDragStartEvent(e) + || !hitTest(e)) + return false; + e.transferable = transferableProvider.create(); + return e.transferable != null; + } + + @Override + public int getEventMask() { + return EventTypes.MouseDragBeginMask; + } + + public void beforeRender(Graphics2D g) { + g.setRenderingHint(G2DRenderingHints.KEY_BEGIN_ELEMENT, "definedElement"); + } + + public void afterRender(Graphics2D g) { + g.setRenderingHint(G2DRenderingHints.KEY_END_ELEMENT, "definedElement"); + } + +}