]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/diagram/adapter/DrawingBorderStyle.java b/bundles/org.simantics.modeling.template2d.ui/src/org/simantics/modeling/template2d/ui/diagram/adapter/DrawingBorderStyle.java
new file mode 100644 (file)
index 0000000..c5783e7
--- /dev/null
@@ -0,0 +1,275 @@
+/*******************************************************************************\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