1 package org.simantics.modeling.ui.modelBrowser2.contributions;
\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
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
30 * @author Tuukka Lehtonen
\r
32 public class SetSubscriptionEnabledContribution extends DynamicMenuContribution implements IExecutableExtension {
\r
35 ImageDescriptor image = null;
\r
36 boolean include = true;
\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
51 private Collection<Resource> toSubscriptions(ReadGraph graph, Collection<Resource> resources) throws DatabaseException {
\r
52 ModelingResources mod = ModelingResources.getInstance(graph);
\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
64 protected Object[] getSelectedObjects() {
\r
65 return ResourceAdaptionUtils.toResources(getSelection());
\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
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
80 ModelingResources mod = ModelingResources.getInstance(graph);
\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
90 if (!foundNonMatchingEnableStates)
\r
91 return new IContributionItem[0];
\r
93 return new IContributionItem[] {
\r
94 new ActionContributionItem(new Action(name, image) {
\r
97 Session session = SimanticsUI.peekSession();
\r
98 if (session == null)
\r
101 SimanticsUI.getSession().asyncRequest(new WriteRequest() {
\r
103 public void perform(WriteGraph graph) throws DatabaseException {
\r
104 new SetSubscriptionEnabled(subscriptions, include).perform(graph);
\r