1 /*******************************************************************************
\r
2 * Copyright (c) 2012 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.template2d.ui.diagram.adapter;
\r
15 import java.awt.BasicStroke;
\r
16 import java.awt.Color;
\r
17 import java.awt.geom.Line2D;
\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
41 public class DrawingBorderStyle extends StyleBase<DrawingBorderStyle.StyleInfo> {
\r
42 private static final String BORDER_NODE = "template>border";
\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
49 private static int HEIGHT_INDEX = 1;
\r
50 private static int WIDTH_INDEX = 0;
\r
52 public static class StyleInfo extends Bean {
\r
54 public float[] pageSize = null;
\r
56 public float[] margin = null;
\r
58 public float[] borderSize = null;
\r
60 public float[] padding = null;
\r
62 public PageOrientation orientation=null;
\r
64 public float rgba[] = null;
\r
66 public Resource template = null;
\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
79 // Layer0 L0 = Layer0.getInstance(graph);
\r
80 G2DResource G2D = G2DResource.getInstance(graph);
\r
82 StyleInfo info = new StyleInfo();
\r
83 info.template = All.getTemplate(graph, runtimeDiagram);
\r
87 if (info.template == null)
\r
90 info.margin = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasMargin, Bindings.FLOAT_ARRAY);
\r
91 if (info.margin == null)
\r
94 info.padding = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasPadding, Bindings.FLOAT_ARRAY);
\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
101 Resource page = graph.getPossibleObject(info.template, TEMPLATE2D.HasPage);
\r
105 Resource border = graph.getPossibleObject(info.template, TEMPLATE2D.HasBorder);
\r
106 if (border == null)
\r
109 info.pageSize = graph.getPossibleRelatedValue(page, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);
\r
110 if (info.pageSize == null)
\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
118 color = new Color(0, 0, 0);
\r
120 info.rgba = new float[4];
\r
121 color.getRGBComponents(info.rgba);
\r
123 info.borderSize = graph.getPossibleRelatedValue(border, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);
\r
124 if (info.borderSize == null)
\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
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
147 if(pageSize == null || pageSize.length != 2 || margin == null || borderSize == null)
\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
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
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
168 G2DSceneGraph sg = evaluationContext.getSceneGraph();
\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
177 cleanupStyleForItem(evaluationContext, map, item);
\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
185 pageTemplate.setZIndex(1);
\r
186 // pageTemplate.setVisible(true);
\r
188 // Path2D path = new Path2D.Float();
\r
190 // path.append(line, false);
\r
192 // BasicStroke[] strokes = new BasicStroke[4];
\r
193 //GeneralPath p = new GeneralPath();
\r
195 for (int i=0;i<4;i++){
\r
196 // if (i==1 || i == 3)
\r
198 Line2D line = borders[i];
\r
199 //Rectangle2D rect = new Rectangle2D.Float(0,0,100,100);
\r
200 if (borderSize[i] < 0)
\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
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
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
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
233 protected void cleanupStyleForItem(EvaluationContext evaluationContext, DataNodeMap map, Object item) {
\r
234 ProfileVariables.denyChild(evaluationContext.getSceneGraph(), SceneGraphConstants.NAVIGATION_NODE_NAME,
\r
236 // System.err.println("template/border removed");
\r
240 public String toString() {
\r
241 return "Border style";
\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
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
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
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
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