1 /*******************************************************************************
\r
2 * Copyright (c) 2012 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.template2d.ui.function;
\r
14 import java.awt.geom.AffineTransform;
\r
15 import java.util.Collection;
\r
16 import java.util.List;
\r
17 import java.util.TreeMap;
\r
19 import org.simantics.databoard.Bindings;
\r
20 import org.simantics.datatypes.literal.Font;
\r
21 import org.simantics.datatypes.literal.RGB;
\r
22 import org.simantics.db.ReadGraph;
\r
23 import org.simantics.db.Resource;
\r
24 import org.simantics.db.common.request.ResourceRead;
\r
25 import org.simantics.db.common.utils.ListUtils;
\r
26 import org.simantics.db.exception.DatabaseException;
\r
27 import org.simantics.diagram.stubs.DiagramResource;
\r
28 import org.simantics.layer0.Layer0;
\r
29 import org.simantics.modeling.template2d.ontology.Template2dResource;
\r
30 import org.simantics.scenegraph.ontology.ScenegraphResources;
\r
32 public class DrawingTemplateInfo extends ResourceRead<TreeMap<String, FlagTableInfo>> {
\r
33 public static final Integer ALIGN_LEFT = 0;
\r
34 public static final Integer ALIGN_RIGHT = 1;
\r
35 public static final float BASELINE_VERTICAL_OFFSET = 0.8F; // percent of line height
\r
36 // private String digest = "";
\r
39 // public String getDigest() {
\r
43 public DrawingTemplateInfo(Resource template) {
\r
48 * The byte[] returned by MessageDigest does not have a nice
\r
49 * textual representation, so some form of encoding is usually performed.
\r
51 * This implementation follows the example of David Flanagan's book
\r
52 * "Java In A Nutshell", and converts a byte array into a String
\r
53 * of hex characters.
\r
55 * Another popular alternative is to use a "Base64" encoding.
\r
57 // static private String hexEncode( byte[] aInput){
\r
58 // StringBuilder result = new StringBuilder();
\r
59 // char[] digits = {'0', '1', '2', '3', '4','5','6','7','8','9','a','b','c','d','e','f'};
\r
60 // for ( int idx = 0; idx < aInput.length; ++idx) {
\r
61 // byte b = aInput[idx];
\r
62 // result.append( digits[ (b&0xf0) >> 4 ] );
\r
63 // result.append( digits[ b&0x0f] );
\r
65 // return result.toString();
\r
69 public TreeMap<String, FlagTableInfo> perform(ReadGraph g) throws DatabaseException {
\r
70 TreeMap<String,FlagTableInfo> entries = new TreeMap<String,FlagTableInfo>();
\r
72 Layer0 L0 = Layer0.getInstance(g);
\r
73 Template2dResource TEMPLATE2D = Template2dResource.getInstance(g);
\r
74 DiagramResource DIA = DiagramResource.getInstance(g);
\r
75 ScenegraphResources SG = ScenegraphResources.getInstance(g);
\r
76 //DatatypeResource DTR = DatatypeResource.getInstance(g);
\r
78 // MessageDigest sha;
\r
79 // sha = MessageDigest.getInstance("SHA-1");
\r
80 // byte[] result = sha.digest(info.serialize());
\r
81 // System.err.println(hexEncode(result));
\r
84 Collection<Resource> slotTables = g.getObjects(resource, L0.ConsistsOf);
\r
85 for (Resource slotTable:slotTables){
\r
86 if (!g.isInstanceOf(slotTable, TEMPLATE2D.FlagTable))
\r
89 String name = g.getPossibleRelatedValue(slotTable, L0.HasName, Bindings.STRING);
\r
90 double[] transform = g.getPossibleRelatedValue2(slotTable, DIA.Scenegraph_Composite_transform, Bindings.getBindingUnchecked(double[].class));
\r
91 Resource align = g.getPossibleObject(slotTable, TEMPLATE2D.FlagTable_HasAlignment);
\r
92 Float width = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasWidth, Bindings.FLOAT);
\r
93 Float rowHeight = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasRowHeigth, Bindings.FLOAT);
\r
94 Integer rowCount = g.getPossibleRelatedValue(slotTable, TEMPLATE2D.FlagTable_HasRowCount, Bindings.INTEGER);
\r
95 if (name == null || width == null || rowCount == null)
\r
98 FlagTableInfo table = new FlagTableInfo();
\r
99 table.setWidth(width);
\r
100 table.setRowCount(rowCount);
\r
101 table.setRowHeight(rowHeight);
\r
102 table.setTransform(transform);
\r
103 table.affineTransform = (transform != null) ? new AffineTransform(transform) : new AffineTransform();
\r
104 if (align != null) {
\r
105 if (align.equals(TEMPLATE2D.FlagTable_Alignment_Left))
\r
106 table.setAlignment(ALIGN_LEFT);
\r
107 if (align.equals(TEMPLATE2D.FlagTable_Alignment_Right))
\r
108 table.setAlignment(ALIGN_RIGHT);
\r
110 entries.put(name, table);
\r
112 // Columns information
\r
113 Resource res = g.getPossibleObject(slotTable, SG.Node_children);
\r
114 if(res == null || !g.isInstanceOf(res, L0.List))
\r
116 List<Resource> columns = ListUtils.toList(g, res);
\r
118 Float weightTotal = 0.0F;
\r
119 for (Resource column:columns){
\r
120 if (!(g.isInstanceOf(column, TEMPLATE2D.FlagTable_Column) || g.isInstanceOf(column, TEMPLATE2D.FlagTable_RowNumberColumn)))
\r
123 Float weight = g.getPossibleRelatedValue(column, TEMPLATE2D.FlagTable_Column_HasWeight, Bindings.FLOAT);
\r
124 if (weight == null)
\r
127 FlagTableColumnInfo col = new FlagTableColumnInfo(weight);
\r
128 table.addColumn(col);
\r
129 if (g.isInstanceOf(column, TEMPLATE2D.FlagTable_RowNumberColumn)) {
\r
130 col.setType(FlagTableColumnInfo.TYPE_ROW_NUMBERING);
\r
132 Integer start = g.getPossibleRelatedValue(column, TEMPLATE2D.FlagTable_RowNumberColumn_start, Bindings.INTEGER);
\r
133 col.setStartOffset(start);
\r
136 weightTotal = weightTotal + weight;
\r
137 //sha.update(weight.toString().getBytes());
\r
139 // Header and Data information
\r
140 Resource res2 = g.getPossibleObject(column, SG.Node_children);
\r
141 if(res2 == null || !g.isInstanceOf(res2, L0.List))
\r
143 List<Resource> columnDatas = ListUtils.toList(g, res2);
\r
144 for (Resource columnData:columnDatas){
\r
145 if (g.isInstanceOf(columnData, TEMPLATE2D.FlagTable_Column_Data)){
\r
146 MonitorInfo monitorInfo = new MonitorInfo();
\r
147 Font font = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_font, Bindings.getBindingUnchecked(Font.class));
\r
149 monitorInfo.setFont(font);
\r
150 //sha.update(font.serialize());
\r
153 RGB.Integer color = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_color, RGB.Integer.BINDING/*Bindings.getBindingUnchecked(RGB.Integer.class)*/);
\r
154 if (color != null){
\r
155 monitorInfo.setColor(color);
\r
156 //sha.update(color.serialize());
\r
159 String path = g.getRelatedValue(columnData, DIA.Scenegraph_Monitor_reference, Bindings.STRING);
\r
160 if (path != null && path.length() > 0){
\r
161 monitorInfo.setText(path);
\r
162 //sha.update(path.getBytes());
\r
165 double[] dataTransform = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_transform, Bindings.getBindingUnchecked(double[].class));
\r
166 if (dataTransform != null){
\r
167 monitorInfo.setTransform(dataTransform);
\r
168 //sha.update(path.getBytes());
\r
171 monitorInfo.setResource(columnData);
\r
172 //col.setColumnData(monitorInfo);
\r
173 col.addColumnData(monitorInfo);
\r
175 if (g.isInstanceOf(columnData, TEMPLATE2D.FlagTable_Column_Header)){
\r
176 MonitorInfo monitorInfo = new MonitorInfo();
\r
177 Font font = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_font, Bindings.getBindingUnchecked(Font.class));
\r
179 monitorInfo.setFont(font);
\r
180 //sha.update(font.serialize());
\r
183 RGB.Integer color = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_color, RGB.Integer.BINDING/*Bindings.getBindingUnchecked(RGB.Integer.class)*/);
\r
184 if (color != null){
\r
185 monitorInfo.setColor(color);
\r
186 //sha.update(color.serialize());
\r
189 String path = g.getRelatedValue(columnData, DIA.Scenegraph_Monitor_reference, Bindings.STRING);
\r
190 if (path != null && path.length() > 0){
\r
191 monitorInfo.setText(path);
\r
192 //sha.update(path.getBytes());
\r
195 double[] dataTransform = g.getPossibleRelatedValue2(columnData, DIA.Scenegraph_AbstractText_transform, Bindings.getBindingUnchecked(double[].class));
\r
196 if (dataTransform != null){
\r
197 monitorInfo.setTransform(dataTransform);
\r
198 //sha.update(path.getBytes());
\r
201 monitorInfo.setResource(columnData);
\r
202 //col.setColumnHeader(monitorInfo);
\r
203 col.addColumnHeader(monitorInfo);
\r
207 table.setWeightTotal(weightTotal);
\r
209 //digest = hexEncode(sha.digest());
\r
210 } catch (Throwable e){
\r
211 e.printStackTrace(System.err);
\r