blob: bf065f93b75aadd5a71ae5bc0bc535afcbc6cde1 [file] [log] [blame]
chapter:Eclipse4[Eclipse 4.x]
Instead of using the Extension Point mechanism, EMF Parsley leverages from DSL and Google Guice Injection.
Because of this, it is very easy to use it with Eclipse 4.x (e4).
section:GetFirstExample[First Example Setup]
If you followed the steps described in section ref:FirstExample[First Example] you will have already
what we need to begin. Otherwise the following wizard will bring you to that point.
ol[
item[File -> New... -> Example...]
item[from Category "Emf Parsley Examples", select "Emf Parsley First Example"]
item[press Next and Finish]
]
You will end up with three plug-ins:
ul[
item[org.eclipse.emf.parsley.examples.firstexample (the EMF Parsley example plug-in)]
item[org.eclipse.emf.examples.library (the model plug-in)]
item[org.eclipse.emf.examples.library.edit (the model.edit plug-in)]
]
As a reminder, in section ref:FirstExample[First Example] we reached the point where we launched a second Eclipse
instance (but, of course, just defining a product you could have a standalone 3.x application) with a
view (called "My Library Tree Form") that allowed to manage the model.
section:PrepareForEclipse4Application[Preparing for a pure e4 Application]
What we will do now is starting from the previous step and create an e4 Application (on top of
the previous plug-ins) that gets to the same result, but now with a pure e4 Part.
In order to do this we need to export the e["org.eclipse.emf.parsley.examples.firstexample"] package from the first plug-in.
section:CreateEclipse4Application[Create an e4 Application]
Now let's create a new, empty, e4 application, e.g. e["org.eclipse.emf.parsley.examples.firstexample.application"]
(you can find details on how to create e4 applications in link[http://www.rcp-vision.com/?p=4694&lang=en][our
tutorials]).
Create a Part and ensure that the application starts.
section:Eclipse4ApplicationAndEMFParsley[Using a TreeComposite into an e4 Part]
In the just created plug-in we need dependencies from the previous plug-ins: so open the e[org.eclipse.emf.parsley.examples.firstexample.application/MANIFEST.MF] file, go to e[Dependencies]
tab and add the three previous plug-ins. Add also e["org.eclipse.emf.parsley"] plug-in.
Don't forget to add the previous, and the required plug-ins, also to the Product.
Open the Part java class and make the following changes:
code[Java][
// Use these imports during Organizing Imports operation
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.swt.widgets.Composite;
// The part implements IMenuListener for context menu handling
public class MyEclipse4Part {
//the EMF Parley composite for showing a tree and a detail form
private TreeFormComposite treeFormComposite;
//the EMF Resource
private Resource resource;
//URI for EMF Resource
private URI uri = URI.createFileURI(System.getProperty("user.home")
+ "/MyLibrary.library");
// Guice injector
private Injector injector = FirstexampleActivator.getDefault().getInjector();
]
Modify the e[@PostConstruct] method with this code:
code[Java][
@PostConstruct
public void postConstruct(Composite parent) {
AdapterFactoryEditingDomain editingDomain = injector.getInstance(AdapterFactoryEditingDomain.class);
ResourceLoader resourceLoader = injector.getInstance(ResourceLoader.class);
//load the resource
resource = resourceLoader.getResource(editingDomain, uri).getResource();
TreeFormFactory treeFormFactory = injector.getInstance(TreeFormFactory.class);
//create the tree-form composite
treeFormComposite = treeFormFactory.createTreeFormComposite(parent, SWT.BORDER);
// Guice injected viewer context menu helper
ViewerContextMenuHelper contextMenuHelper = injector.getInstance(ViewerContextMenuHelper.class);
// Guice injected viewer drag and drop helper
ViewerDragAndDropHelper dragAndDropHelper = injector.getInstance(ViewerDragAndDropHelper.class);
// set context menu and drag and drop
contextMenuHelper.addViewerContextMenu(treeFormComposite.getViewer(), editingDomain);
dragAndDropHelper.addDragAndDrop(treeFormComposite.getViewer(), editingDomain);
//update the composite
treeFormComposite.update(resource);
}
]
If you now run the application you will be able to manage the model:
img[images/07-eclipse4-part.png][][ ][]
but you will notice that it is not possible to persist the changes to the model.
section:Eclipse4Save[Adding the dirty state and Save command]
In order to allow persisting the model changes we have to add the dirty state handling to the part and
the Save command to the application.
Let's start with adding the following attribute to the part
code[Java][
@Inject
MDirtyable dirty;
]
add to e[@PostConstruct] method the following code in order to update the dirty state
code[Java][
editingDomain.getCommandStack().addCommandStackListener(
new CommandStackListener() {
public void commandStackChanged(EventObject event) {
if (dirty != null)
dirty.setDirty(true);
}
});
]
and add the e[@Persist] method, which will be called when the part is saved
code[Java][
@Persist
public void save(MDirtyable dirty) throws IOException {
resource.save(null);
if (dirty != null) {
dirty.setDirty(false);
}
}
]
and, in the end, add the e[Save] handler along with the correspondent e[Command] and e[Menu]
(you can find how to create handlers, commands and menus in an e4 applications in link[http://www.rcp-vision.com/?p=4972&lang=en][our
tutorials])
code[Java][
import javax.inject.Named;
public class SaveHandler {
@Execute
void execute(EPartService partService, @Named(IServiceConstants.ACTIVE_PART) MPart part) {
partService.savePart(part, false);
}
}
]