--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.modeling.template2d.ui.diagram.adapter;\r
+\r
+\r
+import java.awt.BasicStroke;\r
+import java.awt.Color;\r
+import java.awt.geom.Line2D;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.annotations.Optional;\r
+import org.simantics.databoard.util.Bean;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.diagram.G2DUtils;\r
+import org.simantics.diagram.function.All;\r
+import org.simantics.diagram.profile.StyleBase;\r
+import org.simantics.diagram.stubs.G2DResource;\r
+import org.simantics.g2d.scenegraph.SceneGraphConstants;\r
+import org.simantics.modeling.template2d.ontology.Template2dResource;\r
+import org.simantics.scenegraph.g2d.G2DParentNode;\r
+import org.simantics.scenegraph.g2d.G2DSceneGraph;\r
+import org.simantics.scenegraph.g2d.nodes.ShapeNode;\r
+import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;\r
+import org.simantics.scenegraph.profile.DataNodeMap;\r
+import org.simantics.scenegraph.profile.EvaluationContext;\r
+import org.simantics.scenegraph.profile.common.ProfileVariables;\r
+import org.simantics.utils.page.PageOrientation;\r
+\r
+public class DrawingBorderStyle extends StyleBase<DrawingBorderStyle.StyleInfo> {\r
+ private static final String BORDER_NODE = "template>border";\r
+ \r
+ private static int TOP_INDEX = 0;\r
+ private static int RIGHT_INDEX = 1;\r
+ private static int BOTTOM_INDEX = 2;\r
+ private static int LEFT_INDEX = 3;\r
+\r
+ private static int HEIGHT_INDEX = 1;\r
+ private static int WIDTH_INDEX = 0;\r
+\r
+ public static class StyleInfo extends Bean {\r
+ @Optional\r
+ public float[] pageSize = null;\r
+ @Optional\r
+ public float[] margin = null;\r
+ @Optional\r
+ public float[] borderSize = null;\r
+ @Optional\r
+ public float[] padding = null;\r
+ @Optional\r
+ public PageOrientation orientation=null;\r
+ @Optional\r
+ public float rgba[] = null;\r
+ @Optional\r
+ public Resource template = null;\r
+ };\r
+\r
+\r
+ @Override\r
+ public StyleInfo calculateStyle(ReadGraph graph, Resource runtimeDiagram,\r
+ Resource entry, Resource groupItem, Variable activeComposite)\r
+ throws DatabaseException {\r
+// DiagramResource DIA = DiagramResource.getInstance(graph);\r
+// ModelingResources MOD = ModelingResources.getInstance(graph);\r
+// StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+ Template2dResource TEMPLATE2D = Template2dResource.getInstance(graph);\r
+\r
+// Layer0 L0 = Layer0.getInstance(graph);\r
+ G2DResource G2D = G2DResource.getInstance(graph);\r
+ \r
+ StyleInfo info = new StyleInfo();\r
+ info.template = All.getTemplate(graph, runtimeDiagram);\r
+ \r
+ //info.init();\r
+ \r
+ if (info.template == null)\r
+ return null;\r
+ \r
+ info.margin = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasMargin, Bindings.FLOAT_ARRAY);\r
+ if (info.margin == null)\r
+ return null;\r
+ \r
+ info.padding = graph.getPossibleRelatedValue(info.template, TEMPLATE2D.HasPadding, Bindings.FLOAT_ARRAY);\r
+\r
+ Resource orientation = graph.getPossibleObject(info.template, TEMPLATE2D.HasPageOrientation);\r
+ info.orientation = PageOrientation.Portrait;\r
+ if (orientation != null && orientation.equals(TEMPLATE2D.PageOrientation_Landscape))\r
+ info.orientation = PageOrientation.Landscape;\r
+ \r
+ Resource page = graph.getPossibleObject(info.template, TEMPLATE2D.HasPage);\r
+ if (page == null)\r
+ return null;\r
+ \r
+ Resource border = graph.getPossibleObject(info.template, TEMPLATE2D.HasBorder);\r
+ if (border == null)\r
+ return null;\r
+\r
+ info.pageSize = graph.getPossibleRelatedValue(page, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);\r
+ if (info.pageSize == null)\r
+ return null;\r
+ \r
+ Resource rColor = graph.getPossibleObject(border, G2D.HasColor);\r
+ Color color = null; \r
+ if (rColor != null)\r
+ color = (Color) G2DUtils.getObject(graph, rColor);\r
+ if (color == null)\r
+ color = new Color(0, 0, 0);\r
+ \r
+ info.rgba = new float[4];\r
+ color.getRGBComponents(info.rgba);\r
+ \r
+ info.borderSize = graph.getPossibleRelatedValue(border, TEMPLATE2D.HasSize, Bindings.FLOAT_ARRAY);\r
+ if (info.borderSize == null)\r
+ return null;\r
+ \r
+ return info;\r
+ }\r
+ \r
+ @Override\r
+ public void applyStyleForItem(EvaluationContext evaluationContext, DataNodeMap map, Object item, StyleInfo info) {\r
+ //super.applyStyleForItem(evaluationContext, map, item, value);\r
+// final INode node = map.getNode(item);\r
+// if (node == null) {\r
+// evaluationContext.update();\r
+// // TODO: continue or return?\r
+// return;\r
+// }\r
+ if (info == null)\r
+ return;\r
+ \r
+ float[] pageSize = info.pageSize;\r
+ float[] margin = extract(info.margin);\r
+ float[] borderSize = extract(info.borderSize);\r
+ //float[] padding = extract(info.padding);\r
+ \r
+ if(pageSize == null || pageSize.length != 2 || margin == null || borderSize == null)\r
+ return;\r
+ \r
+ if (info.orientation == PageOrientation.Portrait && pageSize[WIDTH_INDEX] > pageSize[HEIGHT_INDEX]){\r
+ float tmp = pageSize[HEIGHT_INDEX];\r
+ pageSize[HEIGHT_INDEX] = pageSize[WIDTH_INDEX];\r
+ pageSize[WIDTH_INDEX] = tmp;\r
+ }\r
+ if (info.orientation == PageOrientation.Landscape && pageSize[WIDTH_INDEX] < pageSize[HEIGHT_INDEX]){\r
+ float tmp = pageSize[HEIGHT_INDEX];\r
+ pageSize[HEIGHT_INDEX] = pageSize[WIDTH_INDEX];\r
+ pageSize[WIDTH_INDEX] = tmp;\r
+ }\r
+\r
+ Line2D[] borders = new Line2D[4];\r
+ 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
+ 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
+ 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
+ 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
+ \r
+\r
+ G2DSceneGraph sg = evaluationContext.getSceneGraph();\r
+ if (sg == null)\r
+ return;\r
+ //NodeUtil.printSceneGraph(sg);\r
+ G2DParentNode nav = (G2DParentNode) sg.getNode(SceneGraphConstants.NAVIGATION_NODE_NAME);\r
+ //NodeUtil.lookup(sg, SceneGraphConstants.NAVIGATION_NODE_NAME, G2DParentNode.class);\r
+ if (nav == null)\r
+ return;\r
+\r
+ cleanupStyleForItem(evaluationContext, map, item);\r
+\r
+ RTreeNode pageTemplate = ProfileVariables.claimChild(evaluationContext.getSceneGraph(),\r
+ SceneGraphConstants.NAVIGATION_NODE_NAME, BORDER_NODE, RTreeNode.class, //SingleElementNode.class,\r
+ evaluationContext);\r
+ if (pageTemplate == null)\r
+ return;\r
+\r
+ pageTemplate.setZIndex(1);\r
+ // pageTemplate.setVisible(true);\r
+\r
+// Path2D path = new Path2D.Float();\r
+// \r
+// path.append(line, false);\r
+ \r
+// BasicStroke[] strokes = new BasicStroke[4];\r
+ //GeneralPath p = new GeneralPath();\r
+ \r
+ for (int i=0;i<4;i++){\r
+// if (i==1 || i == 3)\r
+// continue;\r
+ Line2D line = borders[i];\r
+ //Rectangle2D rect = new Rectangle2D.Float(0,0,100,100);\r
+ if (borderSize[i] < 0)\r
+ continue;\r
+ BasicStroke stroke = new BasicStroke(borderSize[i], BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);\r
+ ShapeNode shape = pageTemplate.addNode("border_" + i, ShapeNode.class); // SingleElementNode\r
+ shape.setShape(line);\r
+ shape.setScaleStroke(false);\r
+ shape.setStroke(stroke);\r
+ shape.setFill(false);\r
+ shape.setColor(new Color(info.rgba[0], info.rgba[1], info.rgba[2], info.rgba[3]));\r
+ if (i == TOP_INDEX || i == BOTTOM_INDEX)\r
+ shape.setZIndex(10);\r
+\r
+// System.err.println(borderSize[i]);\r
+// System.err.print(borders[i].getX1());\r
+// System.err.print("," + borders[i].getY1());\r
+// System.err.print("," + borders[i].getX2());\r
+// System.err.println("," + borders[i].getY2());\r
+// if (i == 2){\r
+// BasicStroke stroke2 = new BasicStroke(0.1f);\r
+// ShapeNode shape2 = pageTemplate.addNode("border_" + 4, ShapeNode.class); // SingleElementNode\r
+// shape2.setShape(line);\r
+// shape2.setScaleStroke(true);\r
+// shape2.setStroke(stroke2);\r
+// shape2.setFill(false);\r
+// shape2.setZIndex(10);\r
+// shape2.setColor(new Color(0, 0, 0));\r
+// }\r
+ }\r
+ \r
+// if (DebugPolicy.DEBUG_PROFILE_STYLE_APPLICATION)\r
+// System.out.println(StyleBase.this + ": applying style for item " + item + " and element " + node + " with result " + value);\r
+ }\r
+\r
+ protected void cleanupStyleForItem(EvaluationContext evaluationContext, DataNodeMap map, Object item) {\r
+ ProfileVariables.denyChild(evaluationContext.getSceneGraph(), SceneGraphConstants.NAVIGATION_NODE_NAME,\r
+ BORDER_NODE);\r
+ // System.err.println("template/border removed");\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return "Border style";\r
+ }\r
+\r
+ private float[] extract(float[] settings){\r
+ float[] ret = new float[]{0.0f,0.0f,0.0f,0.0f};\r
+ if (settings == null || settings.length == 0 || settings.length > 4){\r
+ return null;\r
+ }\r
+ if (settings.length == 1){\r
+ ret[TOP_INDEX] = settings[0];\r
+ ret[BOTTOM_INDEX] = settings[0];\r
+ ret[LEFT_INDEX] = settings[0];\r
+ ret[RIGHT_INDEX] = settings[0];\r
+ }\r
+ if (settings.length == 2){\r
+ ret[TOP_INDEX] = settings[0];\r
+ ret[BOTTOM_INDEX] = settings[0];\r
+ ret[LEFT_INDEX] = settings[1];\r
+ ret[RIGHT_INDEX] = settings[1];\r
+ }\r
+ if (settings.length == 3){\r
+ ret[TOP_INDEX] = settings[0];\r
+ ret[BOTTOM_INDEX] = settings[2];\r
+ ret[LEFT_INDEX] = settings[1];\r
+ ret[RIGHT_INDEX] = settings[1];\r
+ }\r
+ if (settings.length == 4){\r
+ ret[TOP_INDEX] = settings[0];\r
+ ret[RIGHT_INDEX] = settings[1];\r
+ ret[BOTTOM_INDEX] = settings[2];\r
+ ret[LEFT_INDEX] = settings[3];\r
+ }\r
+ return ret;\r
+ }\r
+}\r