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