1 package org.simantics.modeling.ui.modelBrowser2.contributions;
3 import java.util.Arrays;
4 import java.util.Collection;
5 import java.util.HashSet;
9 import org.eclipse.core.runtime.CoreException;
10 import org.eclipse.core.runtime.IConfigurationElement;
11 import org.eclipse.core.runtime.IExecutableExtension;
12 import org.eclipse.jface.action.Action;
13 import org.eclipse.jface.action.ActionContributionItem;
14 import org.eclipse.jface.action.IContributionItem;
15 import org.eclipse.jface.resource.ImageDescriptor;
16 import org.simantics.Simantics;
17 import org.simantics.db.ReadGraph;
18 import org.simantics.db.Resource;
19 import org.simantics.db.Session;
20 import org.simantics.db.WriteGraph;
21 import org.simantics.db.common.request.WriteRequest;
22 import org.simantics.db.exception.DatabaseException;
23 import org.simantics.modeling.ModelingResources;
24 import org.simantics.modeling.requests.SetSubscriptionEnabled;
25 import org.simantics.modeling.ui.Activator;
26 import org.simantics.ui.SimanticsUI;
27 import org.simantics.ui.contribution.DynamicMenuContribution;
28 import org.simantics.ui.utils.ResourceAdaptionUtils;
31 * @author Tuukka Lehtonen
33 public class SetSubscriptionEnabledContribution extends DynamicMenuContribution implements IExecutableExtension {
36 ImageDescriptor image = null;
37 boolean include = true;
40 public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
41 throws CoreException {
42 if (data instanceof Map<?,?>) {
43 @SuppressWarnings("unchecked")
44 Map<String, String> args = (Map<String, String>) data;
45 name = args.get("name");
46 String imageId = args.get("image");
47 image = Activator.getDefault().getImageRegistry().getDescriptor(imageId);
48 include = Boolean.parseBoolean(args.get("include"));
52 private Collection<Resource> toSubscriptions(ReadGraph graph, Collection<Resource> resources) throws DatabaseException {
53 ModelingResources mod = ModelingResources.getInstance(graph);
55 Set<Resource> result = new HashSet<Resource>(resources.size());
56 for (Resource o : resources) {
57 if (graph.isInstanceOf(o, mod.Subscription))
65 protected Object[] getSelectedObjects() {
66 return ResourceAdaptionUtils.toResources(getSelection());
70 protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] elements) throws DatabaseException {
71 final Resource[] resources = (Resource[]) elements;
72 if (resources.length == 0)
73 return new IContributionItem[0];
75 // Are there any components in the selection whose inclusion state
76 // is different from the argument 'included'?
77 final Collection<Resource> subscriptions = toSubscriptions(graph, Arrays.asList(resources));
78 if (subscriptions.isEmpty())
79 return new IContributionItem[0];
81 ModelingResources mod = ModelingResources.getInstance(graph);
83 boolean foundNonMatchingEnableStates = false;
84 for (Resource subscription : subscriptions) {
85 Boolean isIncluded = graph.getPossibleRelatedValue(subscription, mod.Subscription_Enabled);
86 if (isIncluded == null)
87 isIncluded = Boolean.TRUE;
88 if (isIncluded != include)
89 foundNonMatchingEnableStates = true;
91 if (!foundNonMatchingEnableStates)
92 return new IContributionItem[0];
94 return new IContributionItem[] {
95 new ActionContributionItem(new Action(name, image) {
98 Session session = Simantics.peekSession();
102 Simantics.getSession().asyncRequest(new WriteRequest() {
104 public void perform(WriteGraph graph) throws DatabaseException {
105 new SetSubscriptionEnabled(subscriptions, include).perform(graph);