]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/processors/DefaultPrunedChildrenProcessor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.common / src / org / simantics / browsing / ui / common / processors / DefaultPrunedChildrenProcessor.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.common.processors;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.HashSet;\r
17 import java.util.Set;\r
18 \r
19 import org.simantics.browsing.ui.BuiltinKeys;\r
20 import org.simantics.browsing.ui.NodeContext;\r
21 import org.simantics.browsing.ui.NodeQueryManager;\r
22 import org.simantics.browsing.ui.SelectionRequest;\r
23 import org.simantics.browsing.ui.Tester;\r
24 import org.simantics.browsing.ui.NodeContext.QueryKey;\r
25 import org.simantics.browsing.ui.content.PrunedChildrenResult;\r
26 import org.simantics.browsing.ui.content.ViewpointContribution;\r
27 \r
28 public class DefaultPrunedChildrenProcessor extends AbstractNodeQueryProcessor<PrunedChildrenResult> {\r
29 \r
30     @Override\r
31     public QueryKey<PrunedChildrenResult> getIdentifier() {\r
32         return BuiltinKeys.PRUNED_CHILDREN;\r
33     }\r
34 \r
35     @Override\r
36     public PrunedChildrenResult query(NodeQueryManager manager, NodeContext context) {\r
37 \r
38         Collection<ViewpointContribution> contributions = manager.query(context, BuiltinKeys.VIEWPOINT_CONTRIBUTIONS);\r
39         if (contributions == null)\r
40             return PrunedChildrenResult.EMPTY;\r
41 \r
42         Set<NodeContext> childSet = new HashSet<NodeContext>();\r
43         ArrayList<NodeContext> children = new ArrayList<NodeContext>();\r
44 \r
45         // Gather NodeContexts from all viewpoint contributions\r
46         // into the 'children' result list to preserve the order.\r
47         // 'childSet' is used to prevent duplicate contributions.\r
48         for (ViewpointContribution contribution : contributions) {\r
49             Class<?> clazz = contribution.getInputClass();\r
50             if (clazz.isInstance(context.getConstant(BuiltinKeys.INPUT))) {\r
51                 Tester test = contribution.getNodeContextTester();\r
52                 if (test == null || test.test(manager, context)) {\r
53                     Collection<NodeContext> contrib = contribution.getContribution();\r
54                     children.ensureCapacity(children.size() + contrib.size());\r
55                     for (NodeContext nc : contrib)\r
56                         if (childSet.add(nc))\r
57                             children.add(nc);\r
58                 }\r
59             }\r
60         }\r
61 \r
62 //        Viewpoint viewpoint = manager.query(context, BuiltinKeys.SELECTED_VIEWPOINT);\r
63 //        if (viewpoint == null)\r
64 //            return PrunedChildrenResult.EMPTY;\r
65 //\r
66 //        INodeContext[] children = viewpoint.getChildren();\r
67 \r
68         Collection<SelectionRequest> selectionRequests = manager.query(context, BuiltinKeys.SELECTION_REQUESTS);\r
69         if (selectionRequests == null)\r
70             return new PrunedChildrenResult(children.size(), children.toArray(NodeContext.NONE));\r
71 \r
72         SelectionRequest[] reqs = selectionRequests.toArray(new SelectionRequest[selectionRequests.size()]);\r
73 \r
74         ArrayList<NodeContext> pruned = new ArrayList<NodeContext>();\r
75         for (NodeContext ctx : children) {\r
76             boolean add = true;\r
77 \r
78             if (selectionRequests != null) {\r
79                 for(SelectionRequest req : reqs) {\r
80                     if (req.getRequest() == SelectionRequest.Request.FILTER) {\r
81                         if (req.isIncluded(manager, ctx)) {\r
82                             add = false;\r
83                             break;\r
84                         }\r
85                     }\r
86                 }\r
87             }\r
88 \r
89             if (add)\r
90                 pruned.add(ctx);\r
91         }\r
92         return new PrunedChildrenResult(children.size(), pruned.toArray(NodeContext.NONE));\r
93     }\r
94 \r
95     @Override\r
96     public String toString() {\r
97         return "PrunedChildrenProcessor";\r
98     }\r
99 \r
100 }