]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/CompositeClassFactory.java
Logger fixes after merge commit:fdbe8762
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / CompositeClassFactory.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.adapter;\r
13 \r
14 import gnu.trove.map.hash.TObjectIntHashMap;\r
15 \r
16 import java.util.ArrayList;\r
17 import java.util.Collections;\r
18 import java.util.Comparator;\r
19 import java.util.List;\r
20 import java.util.concurrent.atomic.AtomicInteger;\r
21 \r
22 import org.simantics.db.AsyncReadGraph;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;\r
25 import org.simantics.db.common.procedure.guarded.GuardedAsyncProcedureWrapper;\r
26 import org.simantics.db.procedure.AsyncMultiProcedure;\r
27 import org.simantics.db.procedure.AsyncProcedure;\r
28 import org.simantics.diagram.synchronization.SynchronizationHints;\r
29 import org.simantics.diagram.synchronization.graph.TransformSynchronizer;\r
30 import org.simantics.g2d.canvas.ICanvasContext;\r
31 import org.simantics.g2d.diagram.IDiagram;\r
32 import org.simantics.g2d.element.ElementClass;\r
33 import org.simantics.g2d.element.ElementHints;\r
34 import org.simantics.g2d.element.IElement;\r
35 import org.simantics.g2d.element.handler.impl.DefaultTransform;\r
36 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;\r
37 import org.simantics.g2d.element.handler.impl.StaticSymbolImageInitializer;\r
38 import org.simantics.g2d.element.handler.impl.StaticSymbolImpl;\r
39 import org.simantics.g2d.element.handler.impl.TextImpl;\r
40 import org.simantics.g2d.elementclass.ImageClass;\r
41 import org.simantics.g2d.image.DefaultImages;\r
42 import org.simantics.g2d.image.Image;\r
43 \r
44 public class CompositeClassFactory extends ElementFactoryAdapter {\r
45 \r
46     private static final StaticSymbolImpl STATIC_SYMBOL = new StaticSymbolImpl(DefaultImages.COMPOSITION.get());\r
47 \r
48     private static ElementClass build(Resource elementType) {\r
49         String id = "Composite: " + elementType.getResourceId();\r
50         return ElementClass.compile(\r
51                 TextImpl.INSTANCE,\r
52                 new StaticObjectAdapter(elementType),\r
53                 DefaultTransform.INSTANCE,\r
54                 StaticSymbolImageInitializer.INSTANCE,\r
55                 STATIC_SYMBOL,\r
56                 ImageClass.ImageElementHandler.INSTANCE)\r
57                 .setId(id);\r
58     }\r
59 \r
60     @Override\r
61     public void create(AsyncReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource elementType,\r
62             AsyncProcedure<ElementClass> procedure) {\r
63         procedure.execute(graph, build(elementType));\r
64     }\r
65 \r
66     @Override\r
67     public void load(AsyncReadGraph graph, final ICanvasContext canvas, final IDiagram diagram, final Resource element, final IElement e, AsyncProcedure<IElement> procedure) {\r
68         final GuardedAsyncProcedureWrapper<IElement> guard = new GuardedAsyncProcedureWrapper<IElement>(procedure, 1);\r
69 \r
70         e.setHint(SynchronizationHints.HINT_SYNCHRONIZER, TransformSynchronizer.INSTANCE);\r
71 \r
72         final List<IElement> elements = new ArrayList<IElement>();\r
73         final TObjectIntHashMap<IElement> elementOrderMap = new TObjectIntHashMap<IElement>();\r
74 \r
75         final AtomicInteger ready = new AtomicInteger(1);\r
76         final AtomicInteger indexCounter = new AtomicInteger(0);\r
77 \r
78         graph.forOrderedSet(element, new AsyncMultiProcedure<Resource>() {\r
79 \r
80             @Override\r
81             public void exception(AsyncReadGraph graph, Throwable throwable) {\r
82                 guard.exception(graph, throwable);\r
83             }\r
84 \r
85             @Override\r
86             public void execute(AsyncReadGraph graph, Resource r) {\r
87 \r
88                 ready.incrementAndGet();\r
89                 final int childIndex = indexCounter.getAndIncrement();\r
90 \r
91                 graph.asyncRequest(new NodeRequest(canvas, diagram, r, null), new TransientCacheAsyncListener<IElement>() {\r
92 \r
93                     @Override\r
94                     public void exception(AsyncReadGraph graph, Throwable throwable) {\r
95                         guard.exception(graph, throwable);\r
96                     }\r
97 \r
98                     @Override\r
99                     public void execute(AsyncReadGraph graph, IElement child) {\r
100                         elementReady(graph, child, childIndex);\r
101                     }\r
102                 });\r
103 \r
104             }\r
105 \r
106             @Override\r
107             public void finished(AsyncReadGraph graph) {\r
108                 elementReady(graph, null, -1);\r
109             }\r
110 \r
111             void elementReady(AsyncReadGraph graph, IElement child, int index) {\r
112                 if (child != null) {\r
113                     synchronized (elements) {\r
114                         elements.add(child);\r
115                         elementOrderMap.put(child, index);\r
116                     }\r
117                 }\r
118                 if (ready.decrementAndGet() == 0) {\r
119                     // Children ready, sort them and go!\r
120                     Collections.sort(elements, new Comparator<IElement>() {\r
121                         @Override\r
122                         public int compare(IElement o1, IElement o2) {\r
123                             int thisVal = elementOrderMap.get(o1);\r
124                             int anotherVal = elementOrderMap.get(o2);\r
125                             return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));\r
126                         }\r
127                     });\r
128 \r
129                     Image img = new CompositeImage(elements);\r
130                     e.setHint(ElementHints.KEY_IMAGE, img);\r
131 \r
132                     guard.execute(graph, e);\r
133                 }\r
134             }\r
135         });\r
136 \r
137     }\r
138 \r
139 }