]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/modelBrowser2/contributions/SetSubscriptionEnabledContribution.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / modelBrowser2 / contributions / SetSubscriptionEnabledContribution.java
1 package org.simantics.modeling.ui.modelBrowser2.contributions;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.Collection;\r
5 import java.util.HashSet;\r
6 import java.util.Map;\r
7 import java.util.Set;\r
8 \r
9 import org.eclipse.core.runtime.CoreException;\r
10 import org.eclipse.core.runtime.IConfigurationElement;\r
11 import org.eclipse.core.runtime.IExecutableExtension;\r
12 import org.eclipse.jface.action.Action;\r
13 import org.eclipse.jface.action.ActionContributionItem;\r
14 import org.eclipse.jface.action.IContributionItem;\r
15 import org.eclipse.jface.resource.ImageDescriptor;\r
16 import org.simantics.db.ReadGraph;\r
17 import org.simantics.db.Resource;\r
18 import org.simantics.db.Session;\r
19 import org.simantics.db.WriteGraph;\r
20 import org.simantics.db.common.request.WriteRequest;\r
21 import org.simantics.db.exception.DatabaseException;\r
22 import org.simantics.modeling.ModelingResources;\r
23 import org.simantics.modeling.requests.SetSubscriptionEnabled;\r
24 import org.simantics.modeling.ui.Activator;\r
25 import org.simantics.ui.SimanticsUI;\r
26 import org.simantics.ui.contribution.DynamicMenuContribution;\r
27 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
28 \r
29 /**\r
30  * @author Tuukka Lehtonen\r
31  */\r
32 public class SetSubscriptionEnabledContribution extends DynamicMenuContribution implements IExecutableExtension {\r
33 \r
34     String          name    = "";\r
35     ImageDescriptor image   = null;\r
36     boolean         include = true;\r
37 \r
38     @Override\r
39     public void setInitializationData(IConfigurationElement config, String propertyName, Object data)\r
40     throws CoreException {\r
41         if (data instanceof Map<?,?>) {\r
42             @SuppressWarnings("unchecked")\r
43             Map<String, String> args = (Map<String, String>) data;\r
44             name = args.get("name");\r
45             String imageId = args.get("image");\r
46             image = Activator.getDefault().getImageRegistry().getDescriptor(imageId);\r
47             include = Boolean.parseBoolean(args.get("include"));\r
48         }\r
49     }\r
50 \r
51     private Collection<Resource> toSubscriptions(ReadGraph graph, Collection<Resource> resources) throws DatabaseException {\r
52         ModelingResources mod = ModelingResources.getInstance(graph);\r
53 \r
54         Set<Resource> result = new HashSet<Resource>(resources.size());\r
55         for (Resource o : resources) {\r
56             if (graph.isInstanceOf(o, mod.Subscription))\r
57                 result.add(o);\r
58         }\r
59 \r
60         return result;\r
61     }\r
62 \r
63     @Override\r
64     protected Object[] getSelectedObjects() {\r
65         return ResourceAdaptionUtils.toResources(getSelection());\r
66     }\r
67 \r
68     @Override\r
69     protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] elements) throws DatabaseException {\r
70         final Resource[] resources = (Resource[]) elements;\r
71         if (resources.length == 0)\r
72             return new IContributionItem[0];\r
73 \r
74         // Are there any components in the selection whose inclusion state\r
75         // is different from the argument 'included'?\r
76         final Collection<Resource> subscriptions = toSubscriptions(graph, Arrays.asList(resources));\r
77         if (subscriptions.isEmpty())\r
78             return new IContributionItem[0];\r
79 \r
80         ModelingResources mod = ModelingResources.getInstance(graph);\r
81 \r
82         boolean foundNonMatchingEnableStates = false;\r
83         for (Resource subscription : subscriptions) {\r
84             Boolean isIncluded = graph.getPossibleRelatedValue(subscription, mod.Subscription_Enabled);\r
85             if (isIncluded == null)\r
86                 isIncluded = Boolean.TRUE;\r
87             if (isIncluded != include)\r
88                 foundNonMatchingEnableStates = true;\r
89         }\r
90         if (!foundNonMatchingEnableStates)\r
91             return new IContributionItem[0];\r
92 \r
93         return new IContributionItem[] {\r
94                 new ActionContributionItem(new Action(name, image) {\r
95                     @Override\r
96                     public void run() {\r
97                         Session session = SimanticsUI.peekSession();\r
98                         if (session == null)\r
99                             return;\r
100 \r
101                         SimanticsUI.getSession().asyncRequest(new WriteRequest() {\r
102                             @Override\r
103                             public void perform(WriteGraph graph) throws DatabaseException {\r
104                                 new SetSubscriptionEnabled(subscriptions, include).perform(graph);\r
105                             }\r
106                         });\r
107                     }\r
108                 })\r
109         };\r
110     }\r
111 \r
112 }\r