]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SingleElementNode.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / SingleElementNode.java
index beee2538a534092c9f32c79577d9559b3851e3d9..b45e7493a686fa4ea61286b0e57580d422ea6935 100644 (file)
@@ -16,9 +16,13 @@ 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.color.ColorFilter;
+import org.simantics.scenegraph.g2d.color.Graphics2DWithColorFilter;
 import org.simantics.scenegraph.g2d.events.EventTypes;
 import org.simantics.scenegraph.g2d.events.MouseEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
@@ -31,18 +35,46 @@ public class SingleElementNode extends TransformNode implements InitValueSupport
 
     private TransferableProvider transferableProvider;
     protected Composite composite;
+    private ColorFilter colorFilter;
     protected Boolean visible = Boolean.TRUE;
     protected Boolean hidden = Boolean.FALSE;
     private transient Object key;
+    private transient String typeClass;
+    private transient Map<String, Object> 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<String,Object> parameters) {
+        this.parameters = parameters;
+    }
+
+    public <T> 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)
@@ -62,6 +94,10 @@ public class SingleElementNode extends TransformNode implements InitValueSupport
     public void setComposite(Composite composite) {
         this.composite = composite;
     }
+    
+    public void setColorFilter(ColorFilter colorFilter) {
+        this.colorFilter = colorFilter;
+    }
 
     @SyncField("visible")
     public void setVisible(Boolean visible) {
@@ -82,10 +118,18 @@ public class SingleElementNode extends TransformNode implements InitValueSupport
     }
 
     @Override
-    public void render(Graphics2D g) {
+    public void render(Graphics2D g2d) {
         if (!visible || hidden)
             return;
 
+        Graphics2D g;
+        if (colorFilter != null) {
+            g = new Graphics2DWithColorFilter(g2d, colorFilter);
+            g.setRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER, colorFilter);
+        } else {
+            g = g2d;
+        }
+
         Composite oldComposite = null;
         if(composite != null) {
             oldComposite = g.getComposite();
@@ -101,6 +145,10 @@ public class SingleElementNode extends TransformNode implements InitValueSupport
 
         if (oldComposite != null)
             g.setComposite(oldComposite);
+
+        if (colorFilter != null) {
+            g.setRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER, null);
+        }
     }
 
     @Override