--- /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.function;\r
+\r
+import java.awt.geom.AffineTransform;\r
+import java.util.Collection;\r
+import java.util.List;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.datatypes.literal.Font;\r
+import org.simantics.datatypes.literal.RGB;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ResourceRead;\r
+import org.simantics.db.common.utils.ListUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.template2d.ontology.Template2dResource;\r
+import org.simantics.scenegraph.ontology.ScenegraphResources;\r
+\r
+public class DrawingTemplateInfo extends ResourceRead<TreeMap<String, FlagTableInfo>> {\r
+ public static final Integer ALIGN_LEFT = 0;\r
+ public static final Integer ALIGN_RIGHT = 1;\r
+ public static final float BASELINE_VERTICAL_OFFSET = 0.8F; // percent of line height\r
+// private String digest = "";\r
+//\r
+//Column\r
+// public String getDigest() {\r
+// return digest;\r
+// }\r
+\r
+ public DrawingTemplateInfo(Resource template) {\r
+ super(template);\r
+ }\r
+\r
+ /**\r
+ * The byte[] returned by MessageDigest does not have a nice\r
+ * textual representation, so some form of encoding is usually performed.\r
+ *\r
+ * This implementation follows the example of David Flanagan's book\r
+ * "Java In A Nutshell", and converts a byte array into a String\r
+ * of hex characters.\r
+ *\r
+ * Another popular alternative is to use a "Base64" encoding.\r
+ */\r
+// static private String hexEncode( byte[] aInput){\r
+// StringBuilder result = new StringBuilder();\r
+// char[] digits = {'0', '1', '2', '3', '4','5','6','7','8','9','a','b','c','d','e','f'};\r
+// for ( int idx = 0; idx < aInput.length; ++idx) {\r
+// byte b = aInput[idx];\r
+// result.append( digits[ (b&0xf0) >> 4 ] );\r
+// result.append( digits[ b&0x0f] );\r
+// }\r
+// return result.toString();\r
+// }\r
+\r
+ @Override\r
+ public TreeMap<String, FlagTableInfo> perform(ReadGraph g) throws DatabaseException {\r
+ TreeMap<String,FlagTableInfo> entries = new TreeMap<String,FlagTableInfo>();\r
+ try {\r
+ Layer0 L0 = Layer0.getInstance(g);\r
+ Template2dResource TEMPLATE2D = Template2dResource.getInstance(g);\r
+ DiagramResource DIA = DiagramResource.getInstance(g);\r
+ ScenegraphResources SG = ScenegraphResources.getInstance(g);\r
+ //DatatypeResource DTR = DatatypeResource.getInstance(g);\r
+\r
+// MessageDigest sha;\r
+// sha = MessageDigest.getInstance("SHA-1");\r
+// byte[] result = sha.digest(info.serialize());\r
+// System.err.println(hexEncode(result));\r
+\r
+\r
+ Collection<Resource> slotTables = g.getObjects(resource, L0.ConsistsOf);\r
+ for (Resource slotTable:slotTables){\r
+ if (!g.isInstanceOf(slotTable, TEMPLATE2D.FlagTable))\r
+ continue;\r
+ \r
+ String name = g.getPossibleRelatedValue(slotTable, L0.HasName, Bindings.STRING);\r
+ double[] transform = g.getPossibleRelatedValue2(slotTable, DIA.Scenegraph_Composite_transform, Bindings.getBindingUnchecked(double[].class));\r
+ Resource align = g.getPossibleObject(slotTable, TEMPLATE2D.FlagTable_HasAlignment);\r
+ Float width = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasWidth, Bindings.FLOAT);\r
+ Float rowHeight = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasRowHeigth, Bindings.FLOAT);\r
+ Integer rowCount = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasRowCount, Bindings.INTEGER);\r
+ if (name == null || width == null || rowCount == null)\r
+ continue;\r
+\r
+ FlagTableInfo table = new FlagTableInfo();\r
+ table.setWidth(width);\r
+ table.setRowCount(rowCount);\r
+ table.setRowHeight(rowHeight);\r
+ table.setTransform(transform);\r
+ table.affineTransform = (transform != null) ? new AffineTransform(transform) : new AffineTransform();\r
+ if (align != null) {\r
+ if (align.equals(TEMPLATE2D.FlagTable_Alignment_Left))\r
+ table.setAlignment(ALIGN_LEFT);\r
+ if (align.equals(TEMPLATE2D.FlagTable_Alignment_Right))\r
+ table.setAlignment(ALIGN_RIGHT);\r
+ }\r
+ entries.put(name, table);\r
+\r
+ // Columns information\r
+ Resource res = g.getPossibleObject(slotTable, SG.Node_children);\r
+ if(res == null || !g.isInstanceOf(res, L0.List))\r
+ continue;\r
+ List<Resource> columns = ListUtils.toList(g, res);\r
+\r
+ Float weightTotal = 0.0F;\r
+ for (Resource column:columns){\r
+ if (!(g.isInstanceOf(column, TEMPLATE2D.FlagTable_Column) || g.isInstanceOf(column, TEMPLATE2D.FlagTable_RowNumberColumn)))\r
+ continue;\r
+\r
+ Float weight = g.getPossibleRelatedValue(column, TEMPLATE2D.FlagTable_Column_HasWeight, Bindings.FLOAT);\r
+ if (weight == null)\r
+ continue;\r
+ \r
+ FlagTableColumnInfo col = new FlagTableColumnInfo(weight);\r
+ table.addColumn(col);\r
+ if (g.isInstanceOf(column, TEMPLATE2D.FlagTable_RowNumberColumn)) {\r
+ col.setType(FlagTableColumnInfo.TYPE_ROW_NUMBERING);\r
+\r
+ Integer start = g.getPossibleRelatedValue(column, TEMPLATE2D.FlagTable_RowNumberColumn_start, Bindings.INTEGER);\r
+ col.setStartOffset(start);\r
+ }\r
+ \r
+ weightTotal = weightTotal + weight; \r
+ //sha.update(weight.toString().getBytes());\r
+ \r
+ // Header and Data information\r
+ Resource res2 = g.getPossibleObject(column, SG.Node_children);\r
+ if(res2 == null || !g.isInstanceOf(res2, L0.List))\r
+ continue;\r
+ List<Resource> columnDatas = ListUtils.toList(g, res2);\r
+ for (Resource columnData:columnDatas){\r
+ if (g.isInstanceOf(columnData, TEMPLATE2D.FlagTable_Column_Data)){\r
+ MonitorInfo monitorInfo = new MonitorInfo();\r
+ Font font = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_font, Bindings.getBindingUnchecked(Font.class));\r
+ if (font != null){\r
+ monitorInfo.setFont(font);\r
+ //sha.update(font.serialize());\r
+ }\r
+\r
+ RGB.Integer color = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_color, RGB.Integer.BINDING/*Bindings.getBindingUnchecked(RGB.Integer.class)*/);\r
+ if (color != null){\r
+ monitorInfo.setColor(color);\r
+ //sha.update(color.serialize());\r
+ }\r
+\r
+ String path = g.getRelatedValue(columnData, DIA.Scenegraph_Monitor_reference, Bindings.STRING);\r
+ if (path != null && path.length() > 0){\r
+ monitorInfo.setText(path);\r
+ //sha.update(path.getBytes());\r
+ }\r
+ \r
+ double[] dataTransform = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_transform, Bindings.getBindingUnchecked(double[].class));\r
+ if (dataTransform != null){\r
+ monitorInfo.setTransform(dataTransform);\r
+ //sha.update(path.getBytes());\r
+ }\r
+\r
+ monitorInfo.setResource(columnData);\r
+ //col.setColumnData(monitorInfo);\r
+ col.addColumnData(monitorInfo);\r
+ }\r
+ if (g.isInstanceOf(columnData, TEMPLATE2D.FlagTable_Column_Header)){\r
+ MonitorInfo monitorInfo = new MonitorInfo();\r
+ Font font = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_font, Bindings.getBindingUnchecked(Font.class));\r
+ if (font != null){\r
+ monitorInfo.setFont(font);\r
+ //sha.update(font.serialize());\r
+ }\r
+\r
+ RGB.Integer color = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_color, RGB.Integer.BINDING/*Bindings.getBindingUnchecked(RGB.Integer.class)*/);\r
+ if (color != null){\r
+ monitorInfo.setColor(color);\r
+ //sha.update(color.serialize());\r
+ }\r
+\r
+ String path = g.getRelatedValue(columnData, DIA.Scenegraph_Monitor_reference, Bindings.STRING);\r
+ if (path != null && path.length() > 0){\r
+ monitorInfo.setText(path);\r
+ //sha.update(path.getBytes());\r
+ }\r
+ \r
+ double[] dataTransform = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_transform, Bindings.getBindingUnchecked(double[].class));\r
+ if (dataTransform != null){\r
+ monitorInfo.setTransform(dataTransform);\r
+ //sha.update(path.getBytes());\r
+ }\r
+\r
+ monitorInfo.setResource(columnData);\r
+ //col.setColumnHeader(monitorInfo);\r
+ col.addColumnHeader(monitorInfo);\r
+ }\r
+ }\r
+ }\r
+ table.setWeightTotal(weightTotal);\r
+ }\r
+ //digest = hexEncode(sha.digest());\r
+ } catch (Throwable e){\r
+ e.printStackTrace(System.err);\r
+ }\r
+ return entries;\r
+ }\r
+}\r