]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/templates/DocumentStructureWriter.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / templates / DocumentStructureWriter.java
1 package org.simantics.document.linking.report.templates;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.Comparator;\r
5 import java.util.List;\r
6 import java.util.Map;\r
7 \r
8 import org.simantics.db.ReadGraph;\r
9 import org.simantics.db.Resource;\r
10 import org.simantics.db.common.utils.NameUtils;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.document.linking.ontology.DocumentLink;\r
13 import org.simantics.document.linking.report.Document;\r
14 import org.simantics.document.linking.report.Document.TextSize;\r
15 import org.simantics.document.linking.report.DocumentTitlePage;\r
16 import org.simantics.document.linking.report.RowContentProvider;\r
17 import org.simantics.document.linking.report.Table;\r
18 import org.simantics.document.linking.report.TableOfContents;\r
19 import org.simantics.document.linking.report.TextItem;\r
20 import org.simantics.document.linking.utils.SourceLinkUtil;\r
21 \r
22 /**\r
23  * Model information\r
24  * ? Document 1 rev1\r
25  *    \95 Link1: Diagram, module, attribute information\r
26  *    \95 Link2: Diagram, module, attribute information\r
27  * ? Document 1 rev2\r
28  *    \95 Link3: Diagram, module, attribute information\r
29  * ? Document 1 rev3\r
30  *    \95 Link4: Diagram, module, attribute information\r
31  * ? Document 2\r
32  *    \95 Link5: Diagram, module, attribute information\r
33  *   \r
34  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
35  *\r
36  */\r
37 public class DocumentStructureWriter extends IndexQueryReport {\r
38         ReadGraph graph;\r
39         Resource model;\r
40         Map<Object, Object> context;\r
41         DocumentLink sl;\r
42         Comparator<Resource> referenceComparator;\r
43         Comparator<Resource> parentComparator;\r
44         SourceParentDiagramComparator diagramComparator;\r
45         @Override\r
46         public void sort(List<Resource> list) throws DatabaseException{\r
47                 NestedComparator<Resource> comp = new NestedComparator<Resource>();\r
48                 comp.addComparator(referenceComparator);\r
49                 comp.addComparator(parentComparator);\r
50                 Collections.sort(list, comp);\r
51         }\r
52         \r
53         @Override\r
54         public String getName() {\r
55                 return "Document Structure";\r
56         }\r
57         \r
58         @Override\r
59         public void start(ReadGraph graph, Resource model,Document writer, Map<Object, Object> context) throws Exception{\r
60                 super.start(graph, model, writer, context);\r
61                 this.context = context;\r
62                 DocumentTitlePage titlePage = writer.newElement(DocumentTitlePage.class);\r
63                 titlePage.writeTitle(graph, context);\r
64                 writer.newElement(TableOfContents.class);\r
65                 Table table = writer.newElement(Table.class,Document.TOC);\r
66                 table.addColumn("Name", 0.2);\r
67                 table.addColumn("Attribute", 0.35);\r
68                 table.addColumn("Value", 0.15);\r
69                 table.addColumn("Comment", 0.3);\r
70                 \r
71                 //lineWriter.nextPage();\r
72                 this.graph = graph;\r
73                 this.sl = DocumentLink.getInstance(graph);\r
74                 this.model = model;\r
75                 referenceComparator = new SourceReferenceComparator(graph,model);\r
76                 parentComparator = new SourceParentHierarchyComparator(graph,model);\r
77                 diagramComparator = new SourceParentDiagramComparator(graph, model);\r
78                 clearProviders();\r
79                 LinkContentProvider linkContentProvider = new LinkContentProvider();\r
80                 HierarchyContentProvider hierarchyContentProvider = new HierarchyContentProvider(linkContentProvider);\r
81                 addLineProvider(hierarchyContentProvider);\r
82                 addCellProvider(linkContentProvider);\r
83         }\r
84 \r
85         private class HierarchyContentProvider implements RowContentProvider<Resource> {\r
86                 \r
87                 private LinkContentProvider linkContentProvider;\r
88                 \r
89                 \r
90                 \r
91                 public HierarchyContentProvider(LinkContentProvider linkContentProvider) {\r
92                         super();\r
93                         this.linkContentProvider = linkContentProvider;\r
94                 }\r
95 \r
96 \r
97 \r
98                 @Override\r
99                 public void setText(Document writer, Resource previous,\r
100                                         Resource current, Resource next, TextItem[] row) throws Exception {\r
101                         boolean writeDoc = false;\r
102                         boolean writeDiag = false;\r
103                         boolean writeToc = false;\r
104                         Table table = writer.getCurrentElement(Table.class);\r
105                         if (previous == null) {\r
106                                 writeDoc = true;\r
107                                 writeDiag = true;\r
108                                 writeToc = true;\r
109                         } else if (writer.getCurrentLine() == 1) {\r
110                                 writeDoc = true;\r
111                                 writeDiag = true;\r
112                                 writeToc = referenceComparator.compare(previous, current) != 0;\r
113                         } else  {\r
114                                 if (referenceComparator.compare(previous, current) != 0) {\r
115                                         writeDoc = true;\r
116                                         writeDiag = true;\r
117                                         writeToc = true;\r
118                                         linkContentProvider.forceLabel = true;\r
119                                 } else {\r
120                                         if (diagramComparator.compare(previous, current) != 0) {\r
121                                                 writeDiag = true;\r
122                                                 linkContentProvider.forceLabel = true;\r
123                                         }\r
124                                 }\r
125                         }\r
126                         \r
127                         \r
128                         if (writeDoc) {\r
129                                 if (writer.getAvailableLines() < 8) {\r
130                                         writer.nextPage();\r
131                                         table = writer.nextElement(Table.class,Document.TOC);\r
132                                 }\r
133                                 else if (writer.getCurrentLine() > 2)\r
134                                         table = writer.nextElement(Table.class,Document.TOC);\r
135                                 \r
136                                 \r
137                                 Resource doc2 = SourceLinkUtil.getReferredDocument(graph, current);\r
138 //                              TextSize size = table.getTextSize();\r
139 //                              table.setTextSize(TextSize.MEDIUM);\r
140                                 TextItem label = null;\r
141                                 if (doc2 != null) {\r
142                                         label = getDocumentItem(doc2);\r
143                                 } else {\r
144                                         label = getNonExistingDocumentItem();\r
145                                 }\r
146                                 if (writeToc) {\r
147                                         TableOfContents toc = writer.getCurrentElement(TableOfContents.class);\r
148                                         toc.addTocElement(label.getText(), table);\r
149                                 }\r
150                                 //table.writeRow(label);\r
151                                 table.setTitle(label);\r
152 //                              table.setTextSize(size);\r
153                         }\r
154                         if (writeDiag) {\r
155                                 if (writer.getAvailableLines() < 3)\r
156                                         writer.nextPage();\r
157                                 Resource parent = graph.getSingleObject(current, sl.hasSource_Inverse);\r
158                                 List<Resource> path = SourceLinkUtil.getDiagramPath(graph, model, parent);\r
159                                 if (path != null) {\r
160                                         TextSize size = table.getTextSize();\r
161                                         table.setTextSize(TextSize.MEDIUM);\r
162                                         table.writeRow("  " + diagramComparator.getText(path.get(path.size()-1)));\r
163                                         table.setTextSize(size);\r
164                                 }\r
165                         }\r
166                                 \r
167                 }\r
168         }\r
169         \r
170         \r
171         private class LinkContentProvider implements RowContentProvider<Resource> {\r
172                 \r
173                 private boolean forceLabel = false;\r
174                 \r
175                 @Override\r
176                 public void setText(Document writer, Resource previous,\r
177                                 Resource source, Resource next, TextItem[] text) throws Exception {\r
178                         Resource holder = graph.getSingleObject(source, sl.hasSource_Inverse);\r
179                         if (forceLabel || previous == null || !graph.getSingleObject(previous, sl.hasSource_Inverse).equals(graph.getSingleObject(source, sl.hasSource_Inverse))) {\r
180                                 String holderName = NameUtils.getSafeLabel(graph, holder);\r
181                                 if (holderName.length() == 0)\r
182                                         holderName = NameUtils.getSafeName(graph, holder);\r
183                                 text[0] = writer.newItem(TextItem.class);\r
184                                 text[0].setText(holderName);\r
185                                 forceLabel = false;\r
186                         }\r
187                         if (graph.isInstanceOf(source, sl.FunctionalSource)) {\r
188                                 Resource relation = graph.getPossibleObject(source, sl.consernsRelation);\r
189                                 text[1] = writer.newItem(TextItem.class);\r
190                                 if (relation != null) {\r
191                                         String relationName = NameUtils.getSafeLabel(graph, relation);\r
192                                         if (relationName.length() == 0)\r
193                                                 relationName = NameUtils.getSafeName(graph, relation);\r
194                                         Object value = graph.getPossibleRelatedValue(holder, relation);\r
195                                         text[1].setText(relationName);\r
196                                         if (value != null) {\r
197                                                 text[2] = writer.newItem(TextItem.class);\r
198                                                 text[2].setText(SourceLinkUtil.getValueString(value));\r
199                                         }\r
200                                 } else {\r
201                                         text[1].setText("Error in property reference ");\r
202                                 }\r
203                         }\r
204                         \r
205                         String comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment);\r
206                         if (comment != null) {\r
207                                 text[3] = writer.newItem(TextItem.class);\r
208                                 text[3].setText(comment);\r
209                         }\r
210                         \r
211                 }\r
212                 \r
213         }\r
214 }