]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/actions/ActionContribution.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.browsing.ui.model / src / org / simantics / browsing / ui / model / actions / ActionContribution.java
1 /*******************************************************************************
2  * Copyright (c) 2010, 2011 Association for Decentralized Information Management in
3  * Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.browsing.ui.model.actions;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16
17 import org.eclipse.jface.action.Action;
18 import org.eclipse.jface.resource.ImageDescriptor;
19 import org.simantics.browsing.ui.BuiltinKeys;
20 import org.simantics.browsing.ui.NodeContext;
21 import org.simantics.browsing.ui.model.nodetypes.NodeType;
22 import org.simantics.browsing.ui.model.nodetypes.NodeTypeMultiMap;
23 import org.simantics.browsing.ui.model.tests.Test;
24 import org.simantics.db.ReadGraph;
25 import org.simantics.db.Resource;
26 import org.simantics.db.common.utils.Logger;
27 import org.simantics.db.common.utils.NameUtils;
28 import org.simantics.db.exception.DatabaseException;
29 import org.simantics.db.layer0.adapter.ActionFactory;
30 import org.simantics.db.layer0.adapter.ActionFactory2;
31 import org.simantics.viewpoint.ontology.ViewpointResource;
32
33 public class ActionContribution {
34         
35         Resource rule;
36     NodeType nodeType;
37     Test isVisible;
38     Test isEnabled;
39     String label;
40     ActionFactory actionFactory;
41     IActionCategory category;
42     ImageDescriptor image;
43     
44     public ActionContribution(Resource rule, NodeType nodeType, Test isVisible,
45             Test isEnabled, String label,
46             ActionFactory actionFactory, IActionCategory category,
47             ImageDescriptor image) {
48         this.rule = rule;
49         this.nodeType = nodeType;
50         this.isVisible = isVisible;
51         this.isEnabled = isEnabled;
52         this.label = label;
53         this.actionFactory = actionFactory;
54         this.category = category;
55         this.image = image;
56     }
57     
58     public static void load(ReadGraph g, Resource r, NodeTypeMultiMap<ActionContribution> contributions) throws DatabaseException {
59         ViewpointResource vr = ViewpointResource.getInstance(g);
60         
61         Resource isVisibleResource = g.getPossibleObject(r, vr.ActionContribution_IsVisibleIf);
62         Test isVisible = isVisibleResource == null ? null : g.adapt(isVisibleResource, Test.class);
63
64         Resource isEnabledResource = g.getPossibleObject(r, vr.ActionContribution_IsEnabledIf);
65         Test isEnabled = isEnabledResource == null ? null : g.adapt(isEnabledResource, Test.class);
66         
67         String label = NameUtils.getSafeLabel(g, r);
68         
69         ActionFactory actionFactory = g.adapt(g.getSingleObject(r, vr.ActionContribution_HasAction), ActionFactory.class);
70         
71         Resource categoryResource = g.getPossibleObject(r, vr.ActionContribution_HasCategory);
72         IActionCategory category = categoryResource == null ? null : g.adapt(categoryResource, IActionCategory.class);
73                  
74         Resource imageResource = g.getPossibleObject(r, vr.ActionContribution_HasImage);
75         ImageDescriptor image = imageResource == null ? null : g.adapt(imageResource, ImageDescriptor.class);
76
77         for(Resource nodeTypeResource : g.getObjects(r, vr.ActionContribution_HasNodeType)) {
78             NodeType nodeType = g.adapt(nodeTypeResource, NodeType.class);
79             
80             ActionContribution contribution = 
81                 new ActionContribution(r, nodeType, isVisible, isEnabled, label, actionFactory, category, image);
82             contributions.put(nodeType, contribution);    
83         }        
84     }
85     
86     public static class ActionContributionAction extends Action {
87         
88         public Resource contribution;
89         public Runnable runnable;
90         
91         public ActionContributionAction(String label, Resource rule, Runnable runnable) {
92                 super(label);
93                 this.contribution = rule;
94                 this.runnable = runnable;
95         }
96         
97         @Override
98         public void run() {
99             runnable.run();
100         }
101         
102     }
103
104     public CategorizedAction getAction(ReadGraph graph, NodeContext context, Collection<NodeContext> all) {
105         Object content = context.getConstant(BuiltinKeys.INPUT);
106         try {
107             if(isVisible == null || isVisible.test(graph, content)) {
108                 Collection<Object> allContents = new ArrayList<Object>();
109                 for(NodeContext ctx : all) allContents.add(ctx.getConstant(BuiltinKeys.INPUT));
110                 final Runnable runnable = (actionFactory instanceof ActionFactory2) ? 
111                                 ((ActionFactory2)actionFactory).create(allContents) : actionFactory.create(content);
112                 if(runnable == null) return null;
113                 Action action = new ActionContributionAction(label, rule, runnable);
114                 action.setId(runnable.getClass().getName());
115                 action.setEnabled(isEnabled == null || isEnabled.test(graph, content));
116                 if(image != null)
117                     action.setImageDescriptor(image);
118                 return new CategorizedAction(action, category);
119             }
120             else
121                 return null;
122         } catch(DatabaseException e) {
123                 Logger.defaultLogError(e);
124             return null;
125         }
126     }
127 }