]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/TypeIndexViewpointFactory.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / TypeIndexViewpointFactory.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.browsing.ui.graph.impl;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.HashMap;\r
17 import java.util.Map;\r
18 import java.util.function.Consumer;\r
19 \r
20 import org.simantics.browsing.ui.BuiltinKeys;\r
21 import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;\r
22 import org.simantics.browsing.ui.DataSource;\r
23 import org.simantics.browsing.ui.NodeContext;\r
24 import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
25 import org.simantics.browsing.ui.common.NodeContextBuilder;\r
26 import org.simantics.browsing.ui.common.viewpoints.LazyContainerViewpoint;\r
27 import org.simantics.browsing.ui.content.Viewpoint;\r
28 import org.simantics.browsing.ui.content.ViewpointFactory;\r
29 import org.simantics.db.ReadGraph;\r
30 import org.simantics.db.Resource;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.layer0.Layer0;\r
33 \r
34 public class TypeIndexViewpointFactory implements ViewpointFactory {\r
35 \r
36     @Override\r
37     public Viewpoint create(final PrimitiveQueryUpdater provider, final NodeContext context, final ViewpointKey key) {\r
38         assert(provider != null);\r
39         assert(context != null);\r
40         \r
41         final LazyContainerViewpoint result = new LazyContainerViewpoint();\r
42         \r
43         DataSource<ReadGraph> source = provider.getDataSource(ReadGraph.class);\r
44         if (source == null)\r
45             return result;\r
46         \r
47         final Resource inputResource = (Resource) context.getConstant(BuiltinKeys.INPUT);\r
48         assert(inputResource != null);\r
49         \r
50         source.schedule(new Consumer<ReadGraph>() {\r
51 \r
52             @Override\r
53             public void accept(ReadGraph source) {\r
54 \r
55                 try {\r
56                 \r
57                         HashMap<Resource, Collection<Resource>> index = new HashMap<Resource, Collection<Resource>>(); \r
58                         \r
59                         Layer0 L0 = Layer0.getInstance(source);\r
60                         for(Resource child : source.getObjects(inputResource, L0.ConsistsOf)) {\r
61                             \r
62                             for(Resource type : source.getObjects(child, L0.InstanceOf)) {\r
63                                 Collection<Resource> coll = index.get(type);\r
64                                 if(coll == null) {\r
65                                     coll = new ArrayList<Resource>();\r
66                                     index.put(type, coll);\r
67                                 }\r
68                                 coll.add(child);\r
69                             }\r
70                             \r
71                         }\r
72         \r
73                         NodeContext[] resultContexts = new NodeContext[index.size()];\r
74                         int index2 = 0;\r
75                         for(Map.Entry<Resource, Collection<Resource>> e : index.entrySet()) {\r
76                             Resource type = e.getKey();\r
77                             String rep = source.adapt(type, String.class);\r
78                             resultContexts[index2++] = NodeContextBuilder.buildWithInput(new TypeIndex(type, e.getValue(), rep));\r
79                         }\r
80                         result.setChildren(provider, resultContexts);\r
81                         result.setHasChildren(resultContexts.length > 0);\r
82         \r
83                         provider.scheduleReplace(context, key, result);\r
84 \r
85                 } catch (DatabaseException e) {\r
86                         e.printStackTrace();\r
87                 }\r
88                         \r
89             }\r
90             \r
91         });\r
92         \r
93         return result;\r
94     }\r
95     \r
96     @Override\r
97     public String toString() {\r
98         return "Structure by types";\r
99     }\r
100     \r
101 }\r