]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectionTools.java
Send event for performed queries + some refactoring
[simantics/district.git] / org.simantics.district.selection.ui / src / org / simantics / district / selection / ui / ElementSelectionTools.java
1 package org.simantics.district.selection.ui;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.List;
7
8 import org.simantics.Simantics;
9 import org.simantics.browsing.ui.common.AdaptableHintContext;
10 import org.simantics.db.ReadGraph;
11 import org.simantics.db.Resource;
12 import org.simantics.db.common.request.ResourceRead;
13 import org.simantics.db.exception.DatabaseException;
14 import org.simantics.db.layer0.QueryIndexUtils;
15 import org.simantics.db.layer0.SelectionHints;
16 import org.simantics.db.layer0.request.ActiveModels;
17 import org.simantics.db.layer0.variable.Variable;
18 import org.simantics.db.request.Read;
19 import org.simantics.district.selection.ElementSelectionResource;
20 import org.simantics.district.selection.ElementSelector;
21 import org.simantics.layer0.Layer0;
22 import org.simantics.ui.selection.AnyResource;
23 import org.simantics.ui.selection.AnyVariable;
24 import org.simantics.ui.selection.WorkbenchSelectionContentType;
25
26 public class ElementSelectionTools {
27
28         public static final class SelectionElement extends AdaptableHintContext {
29                 public SelectionElement(Key[] keys) {
30                         super(keys);
31                 }
32
33                 @SuppressWarnings("unchecked")
34                 public <T> T getContent(WorkbenchSelectionContentType<T> contentType) {
35                         Resource element = getHint(SelectionHints.KEY_MAIN);
36                         if (contentType instanceof AnyResource) {
37                                 return (T)element;
38                         }
39                         else if (contentType instanceof AnyVariable) {
40                                 try {
41                                         return (T) Simantics.getSession().syncRequest(new ResourceRead<Variable>(element) {
42                                                 public Variable perform(ReadGraph graph) throws DatabaseException {
43                                                         return ElementSelector.getVariableForElement(graph, resource);
44                                                 }
45                                         });
46                                 } catch (DatabaseException e) {
47                                         return null;
48                                 }
49                         }
50                         
51                         return null;
52                 }
53         }
54
55         public static final class SelectionsRequest implements Read<Collection<ElementSelector>> {
56                 @Override
57                 public Collection<ElementSelector> perform(ReadGraph graph) throws DatabaseException {
58                         Layer0 L0 = Layer0.getInstance(graph);
59                         ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
60                         
61                         Resource model = ActiveModels.getPossibleActiveModel(graph, Simantics.getProjectResource());
62                         if (model == null) {
63                                 return Collections.emptyList();
64                         }
65                         
66                         List<Resource> libs = QueryIndexUtils.searchByType(graph, model, ES.SelectionLibrary);
67                         if (libs.isEmpty())
68                                 return Collections.emptyList();
69                         
70                         Resource lib = libs.get(0);
71                         
72                         List<ElementSelector> result = new ArrayList<>();
73                         for (Resource selection : graph.getObjects(lib, L0.ConsistsOf)) {
74                                 if (!graph.isInstanceOf(selection, ES.Selection))
75                                         continue;
76                                 
77                                 result.add(ElementSelector.getSelector(graph, selection));
78                         }
79                         
80                         return result;
81                 }
82         }
83
84 }