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