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