]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/handlers/NewPlantHandler.java
Add "New Plant" as model browser action.
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / handlers / NewPlantHandler.java
1 package org.simantics.plant3d.handlers;
2
3 import org.eclipse.core.commands.AbstractHandler;
4 import org.eclipse.core.commands.ExecutionEvent;
5 import org.eclipse.core.commands.ExecutionException;
6 import org.eclipse.core.runtime.IProgressMonitor;
7 import org.eclipse.core.runtime.IStatus;
8 import org.eclipse.core.runtime.Status;
9 import org.eclipse.core.runtime.jobs.Job;
10 import org.simantics.Simantics;
11 import org.simantics.db.Resource;
12 import org.simantics.db.WriteGraph;
13 import org.simantics.db.common.request.WriteRequest;
14 import org.simantics.db.common.utils.NameUtils;
15 import org.simantics.db.exception.DatabaseException;
16 import org.simantics.db.layer0.adapter.ActionFactory;
17 import org.simantics.layer0.Layer0;
18 import org.simantics.plant3d.Activator;
19 import org.simantics.plant3d.utils.P3DUtil;
20
21 public class NewPlantHandler extends AbstractHandler implements ActionFactory {
22
23         // Action factory method
24         @Override
25         public Runnable create(final Object target) {
26                 if (!(target instanceof Resource))
27                         return null;
28                 
29                 return new Runnable() {
30                         @Override
31                         public void run() {
32                                 createNewPlantJob((Resource) target);
33                         }
34                 };
35         }
36         
37         // Handler method
38         @Override
39         public Object execute(ExecutionEvent event) throws ExecutionException {
40                 final Resource library = Simantics.getProject().get();
41                 
42                 createNewPlantJob(library);
43                 return null;
44         }
45
46         /**
47          * Create a new plant as a user-triggered job.
48          * 
49          * @param library  Parent resource for the new plant.
50          */
51         public static void createNewPlantJob(final Resource library) {
52                 Job job = new Job("Create Plant ") {
53                         @Override
54                         protected IStatus run(IProgressMonitor monitor) {
55                                 monitor.beginTask("Create Plant" , IProgressMonitor.UNKNOWN);
56                                 try {
57                                         Simantics.getSession().syncRequest(new WriteRequest() {
58                                                 
59                                                 @Override
60                                                 public void perform(WriteGraph graph) throws DatabaseException {
61                                                         Layer0 l0 = Layer0.getInstance(graph);
62                                                         String modelName = NameUtils.findFreshName(graph, "Plant", library);
63                                                         Resource model = P3DUtil.createModel(graph, modelName);
64                                                         graph.claim(library, l0.ConsistsOf, model);
65                                                         
66                                                 }
67                                         });
68                                         return Status.OK_STATUS;
69                                 } catch (DatabaseException e) {
70                                         return new Status(IStatus.ERROR, Activator.PLUGIN_ID, getName() + " failed.",e);
71                                 }
72                         }
73                         
74                         
75                 };
76                 job.setUser(true);
77                 job.schedule();
78         }
79 }