]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/provisional/GraphPropertyNode.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / provisional / GraphPropertyNode.java
1 /*******************************************************************************\r
2  * Copyright (c) 2010 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.scenegraph.g2d.nodes.provisional;\r
13 \r
14 import java.awt.geom.Rectangle2D;\r
15 import java.beans.PropertyChangeEvent;\r
16 import java.beans.PropertyChangeListener;\r
17 import java.lang.reflect.Field;\r
18 import java.lang.reflect.Modifier;\r
19 import java.util.HashMap;\r
20 import java.util.Map;\r
21 import java.util.concurrent.ConcurrentHashMap;\r
22 \r
23 import org.simantics.scenegraph.g2d.G2DNode;\r
24 \r
25 /**\r
26  * @author Antti Villberg\r
27  */\r
28 public abstract class GraphPropertyNode extends G2DNode {\r
29 \r
30     private static final long serialVersionUID = 245761992671850588L;\r
31 \r
32     private static Map<Class<? extends GraphPropertyNode>, Map<String, Field>> fieldCache       = new ConcurrentHashMap<Class<? extends GraphPropertyNode>, Map<String, Field>>();\r
33 \r
34     protected transient final Map<String, Field> fields;\r
35 \r
36     private PropertyChangeListener               fieldListener = null;\r
37 \r
38     protected GraphPropertyNode() {\r
39         this.fields = getFields(getClass());\r
40     }\r
41 \r
42     @Override\r
43     public void init() {\r
44         super.init();\r
45         addEventHandler(this);\r
46     }\r
47 \r
48     @Override\r
49     public void cleanup() {\r
50         removeEventHandler(this);\r
51         super.cleanup();\r
52     }\r
53 \r
54     public void setFieldListener(PropertyChangeListener listener) {\r
55         this.fieldListener = listener;\r
56     }\r
57 \r
58     public void propertyChange(String field, Object value) {\r
59     }\r
60 \r
61     public void setProperty(String field, Object value) {\r
62         Field f = fields.get(field);\r
63         if (f == null) {\r
64             System.err.println("GraphPropertyNode tried to set undefined property '" + field + "'");\r
65             return;\r
66         }\r
67         try {\r
68             //System.out.println("setting field '" + field + "'");\r
69             f.set(this, value);\r
70             propertyChange(field, value);\r
71         } catch (IllegalArgumentException e) {\r
72             e.printStackTrace();\r
73         } catch (IllegalAccessException e) {\r
74             e.printStackTrace();\r
75         }\r
76     }\r
77 \r
78     public void commitProperty(String field, Object value) {\r
79         if (fieldListener != null) {\r
80             fieldListener.propertyChange(new PropertyChangeEvent(this, field, null, value));\r
81         }\r
82     }\r
83 \r
84     public boolean hitTest(double x, double y, double tolerance) {\r
85         return false;\r
86     }\r
87 \r
88     @Override\r
89     public Rectangle2D getBoundsInLocal() {\r
90         return null;\r
91     }\r
92 \r
93     private static Map<String, Field> getFields(Class<? extends GraphPropertyNode> clazz) {\r
94         Map<String, Field> fields = fieldCache.get(clazz);\r
95         if (fields != null)\r
96             return fields;\r
97         fields = calculateFields(clazz);\r
98         fieldCache.put(clazz, fields);\r
99         return fields;\r
100     }\r
101 \r
102     private static Map<String, Field> calculateFields(Class<? extends GraphPropertyNode> clazz) {\r
103         Map<String, Field> result = new HashMap<String, Field>();\r
104         for (Class<?> cls = clazz; cls != null && !GraphPropertyNode.class.equals(cls); cls = clazz.getSuperclass()) {\r
105             for (Field f : cls.getFields()) {\r
106                 int mod = f.getModifiers();\r
107                 if (Modifier.isStatic(mod))\r
108                     continue;\r
109                 if (Modifier.isTransient(mod))\r
110                     continue;\r
111                 if (Modifier.isFinal(mod))\r
112                     continue;\r
113                 if (!result.containsKey(f.getName()))\r
114                     result.put(f.getName(), f);\r
115             }\r
116         }\r
117         return result;\r
118     }\r
119 \r
120 }\r