]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/diagram/adapter/DrawingBorderStyle.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.template2d.ui / src / org / simantics / modeling / template2d / ui / diagram / adapter / DrawingBorderStyle.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012 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.modeling.template2d.ui.diagram.adapter;\r
13 \r
14 \r
15 import java.awt.BasicStroke;\r
16 import java.awt.Color;\r
17 import java.awt.geom.Line2D;\r
18 \r
19 import org.simantics.databoard.Bindings;\r
20 import org.simantics.databoard.annotations.Optional;\r
21 import org.simantics.databoard.util.Bean;\r
22 import org.simantics.db.ReadGraph;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.db.layer0.variable.Variable;\r
26 import org.simantics.diagram.G2DUtils;\r
27 import org.simantics.diagram.function.All;\r
28 import org.simantics.diagram.profile.StyleBase;\r
29 import org.simantics.diagram.stubs.G2DResource;\r
30 import org.simantics.g2d.scenegraph.SceneGraphConstants;\r
31 import org.simantics.modeling.template2d.ontology.Template2dResource;\r
32 import org.simantics.scenegraph.g2d.G2DParentNode;\r
33 import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
34 import org.simantics.scenegraph.g2d.nodes.ShapeNode;\r
35 import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;\r
36 import org.simantics.scenegraph.profile.DataNodeMap;\r
37 import org.simantics.scenegraph.profile.EvaluationContext;\r
38 import org.simantics.scenegraph.profile.common.ProfileVariables;\r
39 import org.simantics.utils.page.PageOrientation;\r
40 \r
41 public class DrawingBorderStyle extends StyleBase<DrawingBorderStyle.StyleInfo> {\r
42         private static final String BORDER_NODE = "template>border";\r
43         \r
44         private static int TOP_INDEX = 0;\r
45         private static int RIGHT_INDEX = 1;\r
46         private static int BOTTOM_INDEX = 2;\r
47         private static int LEFT_INDEX = 3;\r
48 \r
49         private static int HEIGHT_INDEX = 1;\r
50         private static int WIDTH_INDEX = 0;\r
51 \r
52         public static class StyleInfo extends Bean {\r
53                 @Optional\r
54                 public float[] pageSize = null;\r
55                 @Optional\r
56                 public float[] margin = null;\r
57                 @Optional\r
58                 public float[] borderSize = null;\r
59                 @Optional\r
60                 public float[] padding = null;\r
61                 @Optional\r
62                 public PageOrientation orientation=null;\r
63                 @Optional\r
64                 public float rgba[] = null;\r
65                 @Optional\r
66                 public Resource template = null;\r
67         };\r
68 \r
69 \r
70         @Override\r
71         public StyleInfo calculateStyle(ReadGraph graph, Resource runtimeDiagram,\r
72                         Resource entry, Resource groupItem, Variable activeComposite)\r
73                         throws DatabaseException {\r
74 //        DiagramResource DIA = DiagramResource.getInstance(graph);\r
75 //        ModelingResources MOD = ModelingResources.getInstance(graph);\r
76 //        StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
77         Template2dResource TEMPLATE2D = Template2dResource.getInstance(graph);\r
78 \r
79 //        Layer0 L0 = Layer0.getInstance(graph);\r
80         G2DResource G2D = G2DResource.getInstance(graph);\r
81         \r
82         StyleInfo info = new StyleInfo();\r
83         info.template = All.getTemplate(graph, runtimeDiagram);\r
84         \r
85         //info.init();\r
86         \r
87         if (info.template == null)\r
88                 return null;\r
89         \r
90         info.margin = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasMargin, Bindings.FLOAT_ARRAY);\r
91         if (info.margin == null)\r
92                 return null;\r
93                 \r
94         info.padding = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasPadding, Bindings.FLOAT_ARRAY);\r
95 \r
96         Resource orientation = graph.getPossibleObject(info.template, TEMPLATE2D.HasPageOrientation);\r
97         info.orientation = PageOrientation.Portrait;\r
98         if (orientation != null && orientation.equals(TEMPLATE2D.PageOrientation_Landscape))\r
99                 info.orientation = PageOrientation.Landscape;\r
100         \r
101         Resource page = graph.getPossibleObject(info.template, TEMPLATE2D.HasPage);\r
102         if (page == null)\r
103                 return null;\r
104         \r
105         Resource border = graph.getPossibleObject(info.template, TEMPLATE2D.HasBorder);\r
106         if (border == null)\r
107                 return null;\r
108 \r
109         info.pageSize = graph.getPossibleRelatedValue(page, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);\r
110         if (info.pageSize == null)\r
111                 return null;\r
112         \r
113         Resource rColor = graph.getPossibleObject(border, G2D.HasColor);\r
114         Color color = null; \r
115         if (rColor != null)\r
116                 color = (Color) G2DUtils.getObject(graph, rColor);\r
117         if (color == null)\r
118                 color = new Color(0, 0, 0);\r
119         \r
120         info.rgba = new float[4];\r
121         color.getRGBComponents(info.rgba);\r
122         \r
123         info.borderSize = graph.getPossibleRelatedValue(border, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);\r
124         if (info.borderSize == null)\r
125                 return null;\r
126         \r
127         return info;\r
128         }\r
129         \r
130         @Override\r
131         public void applyStyleForItem(EvaluationContext evaluationContext, DataNodeMap map, Object item, StyleInfo info) {\r
132                 //super.applyStyleForItem(evaluationContext, map, item, value);\r
133 //              final INode node = map.getNode(item);\r
134 //              if (node == null) {\r
135 //                      evaluationContext.update();\r
136 //                      // TODO: continue or return?\r
137 //                      return;\r
138 //              }\r
139                 if (info == null)\r
140                         return;\r
141                 \r
142                 float[] pageSize = info.pageSize;\r
143                 float[] margin = extract(info.margin);\r
144                 float[] borderSize = extract(info.borderSize);\r
145                 //float[] padding = extract(info.padding);\r
146                 \r
147                 if(pageSize == null || pageSize.length != 2 || margin == null || borderSize == null)\r
148                         return;\r
149                 \r
150             if (info.orientation == PageOrientation.Portrait && pageSize[WIDTH_INDEX] > pageSize[HEIGHT_INDEX]){\r
151                 float tmp = pageSize[HEIGHT_INDEX];\r
152                 pageSize[HEIGHT_INDEX] = pageSize[WIDTH_INDEX];\r
153                 pageSize[WIDTH_INDEX] = tmp;\r
154                 }\r
155             if (info.orientation == PageOrientation.Landscape && pageSize[WIDTH_INDEX] < pageSize[HEIGHT_INDEX]){\r
156                 float tmp = pageSize[HEIGHT_INDEX];\r
157                 pageSize[HEIGHT_INDEX] = pageSize[WIDTH_INDEX];\r
158                 pageSize[WIDTH_INDEX] = tmp;\r
159                 }\r
160 \r
161             Line2D[] borders = new Line2D[4];\r
162                 borders[TOP_INDEX] = new Line2D.Float(margin[LEFT_INDEX], margin[TOP_INDEX]+(borderSize[TOP_INDEX]/2.0f), pageSize[WIDTH_INDEX]-margin[RIGHT_INDEX], margin[TOP_INDEX]+(borderSize[TOP_INDEX]/2.0f));\r
163                 borders[BOTTOM_INDEX] = new Line2D.Float(margin[LEFT_INDEX], pageSize[HEIGHT_INDEX]-margin[BOTTOM_INDEX]-(borderSize[BOTTOM_INDEX]/2.0f), pageSize[WIDTH_INDEX]-margin[RIGHT_INDEX], pageSize[HEIGHT_INDEX]-margin[BOTTOM_INDEX]-(borderSize[BOTTOM_INDEX]/2.0f));\r
164                 borders[LEFT_INDEX] = new Line2D.Float(margin[LEFT_INDEX]+(borderSize[LEFT_INDEX]/2.0f), margin[TOP_INDEX]+(borderSize[TOP_INDEX]/2.0f), margin[LEFT_INDEX]+(borderSize[LEFT_INDEX]/2.0f), pageSize[HEIGHT_INDEX]-margin[BOTTOM_INDEX]-(borderSize[BOTTOM_INDEX]/2.0f));\r
165                 borders[RIGHT_INDEX] = new Line2D.Float(pageSize[WIDTH_INDEX]-margin[RIGHT_INDEX]-(borderSize[RIGHT_INDEX]/2.0f), margin[TOP_INDEX]+(borderSize[TOP_INDEX]/2.0f), pageSize[WIDTH_INDEX]-margin[RIGHT_INDEX]-(borderSize[RIGHT_INDEX]/2.0f), pageSize[HEIGHT_INDEX]-margin[BOTTOM_INDEX]-(borderSize[BOTTOM_INDEX]/2.0f));\r
166                 \r
167 \r
168                 G2DSceneGraph sg = evaluationContext.getSceneGraph();\r
169                 if (sg == null)\r
170                         return;\r
171                 //NodeUtil.printSceneGraph(sg);\r
172                 G2DParentNode nav = (G2DParentNode) sg.getNode(SceneGraphConstants.NAVIGATION_NODE_NAME);\r
173                 //NodeUtil.lookup(sg, SceneGraphConstants.NAVIGATION_NODE_NAME, G2DParentNode.class);\r
174                 if (nav == null)\r
175                         return;\r
176 \r
177             cleanupStyleForItem(evaluationContext, map, item);\r
178 \r
179             RTreeNode pageTemplate = ProfileVariables.claimChild(evaluationContext.getSceneGraph(),\r
180                 SceneGraphConstants.NAVIGATION_NODE_NAME, BORDER_NODE, RTreeNode.class, //SingleElementNode.class,\r
181                 evaluationContext);\r
182         if (pageTemplate == null)\r
183             return;\r
184 \r
185             pageTemplate.setZIndex(1);\r
186            // pageTemplate.setVisible(true);\r
187 \r
188 //          Path2D path = new Path2D.Float();\r
189 //          \r
190 //          path.append(line, false);\r
191             \r
192 //              BasicStroke[] strokes = new BasicStroke[4];\r
193             //GeneralPath p = new GeneralPath();\r
194             \r
195                 for (int i=0;i<4;i++){\r
196 //                      if (i==1 || i == 3)\r
197 //                              continue;\r
198                         Line2D line = borders[i];\r
199                         //Rectangle2D rect = new Rectangle2D.Float(0,0,100,100);\r
200                         if (borderSize[i] < 0)\r
201                                 continue;\r
202                         BasicStroke stroke = new BasicStroke(borderSize[i], BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);\r
203                     ShapeNode shape = pageTemplate.addNode("border_" + i, ShapeNode.class); // SingleElementNode\r
204                 shape.setShape(line);\r
205                 shape.setScaleStroke(false);\r
206                 shape.setStroke(stroke);\r
207                 shape.setFill(false);\r
208                 shape.setColor(new Color(info.rgba[0], info.rgba[1], info.rgba[2], info.rgba[3]));\r
209                 if (i == TOP_INDEX || i == BOTTOM_INDEX)\r
210                         shape.setZIndex(10);\r
211 \r
212 //              System.err.println(borderSize[i]);\r
213 //              System.err.print(borders[i].getX1());\r
214 //              System.err.print("," + borders[i].getY1());\r
215 //              System.err.print("," + borders[i].getX2());\r
216 //              System.err.println("," + borders[i].getY2());\r
217 //              if (i == 2){\r
218 //                              BasicStroke stroke2 = new BasicStroke(0.1f);\r
219 //                          ShapeNode shape2 = pageTemplate.addNode("border_" + 4, ShapeNode.class); // SingleElementNode\r
220 //                      shape2.setShape(line);\r
221 //                      shape2.setScaleStroke(true);\r
222 //                      shape2.setStroke(stroke2);\r
223 //                      shape2.setFill(false);\r
224 //                      shape2.setZIndex(10);\r
225 //                      shape2.setColor(new Color(0, 0, 0));\r
226 //              }\r
227                 }\r
228                 \r
229 //              if (DebugPolicy.DEBUG_PROFILE_STYLE_APPLICATION)\r
230 //                      System.out.println(StyleBase.this + ": applying style for item " + item + " and element " + node + " with result " + value);\r
231         }\r
232 \r
233     protected void cleanupStyleForItem(EvaluationContext evaluationContext, DataNodeMap map, Object item) {\r
234         ProfileVariables.denyChild(evaluationContext.getSceneGraph(), SceneGraphConstants.NAVIGATION_NODE_NAME,\r
235                 BORDER_NODE);\r
236        // System.err.println("template/border removed");\r
237     }\r
238 \r
239     @Override\r
240     public String toString() {\r
241         return "Border style";\r
242     }\r
243 \r
244     private float[] extract(float[] settings){\r
245         float[] ret = new float[]{0.0f,0.0f,0.0f,0.0f};\r
246                 if (settings == null || settings.length == 0 || settings.length > 4){\r
247                         return null;\r
248                 }\r
249                 if (settings.length == 1){\r
250                         ret[TOP_INDEX] = settings[0];\r
251                         ret[BOTTOM_INDEX] = settings[0];\r
252                         ret[LEFT_INDEX] = settings[0];\r
253                         ret[RIGHT_INDEX] = settings[0];\r
254                 }\r
255                 if (settings.length == 2){\r
256                         ret[TOP_INDEX] = settings[0];\r
257                         ret[BOTTOM_INDEX] = settings[0];\r
258                         ret[LEFT_INDEX] = settings[1];\r
259                         ret[RIGHT_INDEX] = settings[1];\r
260                 }\r
261                 if (settings.length == 3){\r
262                         ret[TOP_INDEX] = settings[0];\r
263                         ret[BOTTOM_INDEX] = settings[2];\r
264                         ret[LEFT_INDEX] = settings[1];\r
265                         ret[RIGHT_INDEX] = settings[1];\r
266                 }\r
267                 if (settings.length == 4){\r
268                         ret[TOP_INDEX] = settings[0];\r
269                         ret[RIGHT_INDEX] = settings[1];\r
270                         ret[BOTTOM_INDEX] = settings[2];\r
271                         ret[LEFT_INDEX] = settings[3];\r
272                 }\r
273         return ret;\r
274     }\r
275 }\r