]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/SetInitialState.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / SetInitialState.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.actions;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collections;\r
16 import java.util.List;\r
17 import java.util.concurrent.atomic.AtomicReference;\r
18 \r
19 import org.eclipse.jface.action.Action;\r
20 import org.eclipse.jface.action.ContributionItem;\r
21 import org.eclipse.jface.action.IContributionItem;\r
22 import org.eclipse.jface.resource.ImageDescriptor;\r
23 import org.eclipse.jface.resource.JFaceResources;\r
24 import org.eclipse.jface.resource.LocalResourceManager;\r
25 import org.eclipse.jface.resource.ResourceManager;\r
26 import org.eclipse.swt.SWT;\r
27 import org.eclipse.swt.events.SelectionEvent;\r
28 import org.eclipse.swt.events.SelectionListener;\r
29 import org.eclipse.swt.widgets.Menu;\r
30 import org.eclipse.swt.widgets.MenuItem;\r
31 import org.simantics.Simantics;\r
32 import org.simantics.db.ReadGraph;\r
33 import org.simantics.db.Resource;\r
34 import org.simantics.db.WriteGraph;\r
35 import org.simantics.db.common.NamedResource;\r
36 import org.simantics.db.common.request.ObjectsWithType;\r
37 import org.simantics.db.common.request.WriteRequest;\r
38 import org.simantics.db.exception.DatabaseException;\r
39 import org.simantics.layer0.Layer0;\r
40 import org.simantics.project.IProject;\r
41 import org.simantics.simulation.experiment.IExperiment;\r
42 import org.simantics.simulation.ontology.SimulationResource;\r
43 import org.simantics.simulation.project.IExperimentManager;\r
44 import org.simantics.ui.contribution.DynamicMenuContribution;\r
45 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
46 \r
47 /**\r
48  * @author Tuukka Lehtonen\r
49  */\r
50 public class SetInitialState extends DynamicMenuContribution {\r
51 \r
52     private ResourceManager resourceManager;\r
53 \r
54     public SetInitialState() {\r
55         resourceManager = new LocalResourceManager(JFaceResources.getResources());\r
56     }\r
57 \r
58     @Override\r
59     public void dispose() {\r
60         if (resourceManager != null) {\r
61             resourceManager.dispose();\r
62             resourceManager = null;\r
63         }\r
64         super.dispose();\r
65     }\r
66 \r
67     @Override\r
68     protected boolean preAcceptSelection(Object[] selection) {\r
69         return selection != null && selection.length == 1;\r
70     }\r
71 \r
72     @Override\r
73     protected IContributionItem[] getContributionItems(ReadGraph graph, Object[] selection) throws DatabaseException {\r
74         if (selection.length != 1)\r
75             return NONE;\r
76 \r
77         final Resource experiment = ResourceAdaptionUtils.adaptToResource(selection[0]);\r
78         if (experiment == null)\r
79             return NONE;\r
80 \r
81         Layer0 L0 = Layer0.getInstance(graph);\r
82         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
83         if (!graph.isInstanceOf(experiment, SIMU.Experiment))\r
84             return NONE;\r
85 \r
86         // Check that the experiment is not currently active.\r
87         IProject project = Simantics.peekProject();\r
88         if (project != null) {\r
89             IExperimentManager expMan = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
90             if (expMan != null) {\r
91                 for (IExperiment exp : new IExperiment[] { expMan.getActiveExperiment() }) {\r
92                     if (exp != null && experiment.equals(exp.getResource()))\r
93                         return NONE;\r
94                 }\r
95             }\r
96         }\r
97 \r
98         final List<NamedResource> states = new ArrayList<NamedResource>();\r
99         Resource model = graph.getSingleObject(experiment, L0.PartOf);\r
100         for (Resource obj : graph.syncRequest(new ObjectsWithType(model, L0.ConsistsOf, SIMU.State))) {\r
101             String name = graph.adapt(obj, String.class);\r
102             states.add(new NamedResource(name, obj));\r
103         }\r
104 \r
105         final AtomicReference<NamedResource> currentInitialState = new AtomicReference<NamedResource>();\r
106         Resource currentState = graph.getPossibleObject(experiment, SIMU.HasInitialState);\r
107         if (currentState != null) {\r
108             for (NamedResource state : states) {\r
109                 if (state.getResource().equals(currentState))\r
110                     currentInitialState.set(state);\r
111             }\r
112         }\r
113 \r
114         // Sort the open with actions in ascending lexicographical order.\r
115         Collections.sort(states);\r
116         if (states.isEmpty())\r
117             return NONE;\r
118 \r
119         return new IContributionItem[] {\r
120                 new ContributionItem() {\r
121                     @Override\r
122                     public void fill(Menu menu, int index) {\r
123                         MenuItem setInitialState = new MenuItem(menu, SWT.CASCADE, index);\r
124                         setInitialState.setText("Set Initial State");\r
125                         Menu subMenu = new Menu(menu);\r
126                         setInitialState.setMenu(subMenu);\r
127 \r
128                         for (NamedResource state : states) {\r
129                             addMenuItem(subMenu, new Adapter(experiment, state), state.equals(currentInitialState.get()));\r
130                         }\r
131                     }\r
132                 }\r
133         };\r
134     }\r
135 \r
136     private void addMenuItem(Menu subMenu, Adapter adapter, boolean selected) {\r
137         MenuItem item = new MenuItem(subMenu, SWT.CHECK);\r
138         item.setText(adapter.getText());\r
139         item.setSelection(selected);\r
140         ImageDescriptor imgDesc = adapter.getImageDescriptor();\r
141         if (imgDesc != null)\r
142             item.setImage(resourceManager.createImage(imgDesc));\r
143         item.addSelectionListener(adapter);\r
144     }\r
145 \r
146     static class Adapter extends Action implements SelectionListener {\r
147         private final Resource experiment;\r
148         private final NamedResource state;\r
149 \r
150         public Adapter(Resource experiment, NamedResource state) {\r
151             super(state.getName());\r
152             this.experiment = experiment;\r
153             this.state = state;\r
154         }\r
155 \r
156         @Override\r
157         public void widgetDefaultSelected(SelectionEvent e) {\r
158             widgetSelected(e);\r
159         }\r
160 \r
161         @Override\r
162         public void widgetSelected(SelectionEvent e) {\r
163             run();\r
164         }\r
165 \r
166         @Override\r
167         public void run() {\r
168             Simantics.getSession().asyncRequest(new WriteRequest() {\r
169                 @Override\r
170                 public void perform(WriteGraph wg) throws DatabaseException {\r
171                     SimulationResource SIMU = SimulationResource.getInstance(wg);\r
172                     wg.deny(experiment, SIMU.HasInitialState);\r
173                     wg.claim(experiment, SIMU.HasInitialState, state.getResource());\r
174                 }\r
175             });\r
176         }\r
177     }\r
178 \r
179 }\r