Tutorial: Model Development
In this part of the tutorial we will focus on implementing the basic functionality for the following parts of the UI:
- Model Browser for modelling movie production cases
- Basic context menu actions for the browser
- Add > Movie Project
- Add > Role
- Basic context menu actions for the browser
- Property View for editing properties of model entities
- Movie Database Library for searching available movies, actors, directors, etc.
Contents
Step 1: Model Browser
Dependencies
To get the model browser working, UI plugin needs some more plug-ins, add dependencies.
- Open com.acme.movie.ui / META-INF/MANIFEST.MF >> Dependencies
- In the Required Plug-ins section, add dependencies on
- org.simantics.ui
- org.simantics.browsing.ui.platform
- org.simantics.layer0
- com.acme.movie.ontology
Enable Browser Contributions
At this point, the browser is empty since there is neither data to be shown nor the contributions for producing the data to show.
Before going into the contributions themselves, we need to make our Productions browser capable of receiving contributions. This can be achieved by adding a browseContext argument for the view extension. A browseContext is simply any unique string identifier to which contributions are bound. The set of browseContexts used by the browser view will therefore define which contributions are used.
- Open com.acme.movie.ui / META-INF/MANIFEST.MF >> Extensions
- Find the Productions view extension: org.eclipse.ui.views >> Productions (view)
- Append the following to the class attribute value:
- :browseContext=http://com.acme/Movie-1.0/Productions
Getting data to show - Adding new movies
In order to be able to see our contributions working we need to be able to create data in the browser. For this reason we take a little step to the side to add a context menu action for creating new movie projects into the active project.
Workbench context menus are contribution-based. Each context menu is given a unique ID and popup contributions are then bound to that ID. For the Productions view, we will select #ProductionsPopup as the menu ID.
First the context menu for the Productions browser needs to be registered with this ID. This can be achieved by once again modifying the class attribute of our view extension.
- Find our production view extension: org.eclipse.ui.views >> Productions (view)
- Append a new argument to the class attribute: ;contextMenuId=#ProductionsPopup
Now your browser should have a context menu registered with the specified ID. You can check this by launching the movie product, activating the Productions view and pressing Control+Shift+F1. A Plug-in Spy window should pop up and give information on the view. It should say:
The active menu contribution identifiers: #ProductionsPopup
Add command extensions
The next thing to do is to add org.eclipse.ui.command extensions for each separate action to be performed.
- Open the Extensions tab of our plug-in's plugin.xml editor. Add org.eclipse.ui.command extension plug-in: Add... >> org.eclipse.ui.command
- Right-click org.eclipse.ui.command in the the extension tree, select New >> command, set attribute values:
- id = com.acme.movie.ui.addMovie
- name = Add Movie
- defaultHandler="com.acme.movie.ui.browser.handlers.AddMovie"
- Add another command with the attributes:
- id = com.acme.movie.ui.addRole
- name = Add Role
- defaultHandler="com.acme.movie.ui.browser.handlers.AddRole"
This should give you the following things in the plugin.xml file whose contents can be seen from the plugin.xml tab of the editor.
<syntaxhighlight lang="java">
<extension point="org.eclipse.ui.commands"> <command defaultHandler="com.acme.movie.ui.browser.handlers.AddMovie" id="com.acme.movie.ui.addMovie" name="Add Movie"> </command> <command defaultHandler="com.acme.movie.ui.browser.handlers.AddRole" id="com.acme.movie.ui.addRole" name="Add Role"> </command> </extension>
</syntaxhighlight>
Add handler stub code
In the Extensions tab of the editor select the addMovie command extension. On the right panel, press defaultHandler label link to create the AddMovie class. In the New Java Class wizard that is presented, set Superclass to org.eclipse.core.commands.AbstractHandler and press Finish.
Do the same for the Add Role command.
The next thing to do is to add an org.eclipse.ui.menus extension to populate our #ProductionsPopup context menu.
- Open the Extensions tab of our plug-in's plugin.xml editor. Add org.eclipse.ui.menus extension plug-in: Add... >> org.eclipse.ui.menus
- Right-click org.eclipse.ui.menus in the the extension tree, select New >> menuContribution, set locationURI = popup:#ProductionsPopup
Next comes the actual menu population:
- Right-click the newly created menuContribution, select New >> command, set id = com.acme.movie.ui.addMovie
- Repeat the same for the com.acme.movie.ui.addRole command
Add code to create new movies
Open the handler classes previously created, AddMovie and AddRole.
To create a new movie we need to:
- Create a new movie instance and add it to the project.
- Set a fresh name for the new movie, in this case automatically without asking the user.
Download the handler code to do this (AddMovie.java) and replace the stub AddMovie class with it.
Check your work
So far we should have the same empty browser UI, except now you should be able to open a context menu from it that contains two actions: Add Movie and Add Role as shown in the figure
Selecting the "Add Movie" action at this point will not produce visible results since we have not added any browser contributions to actually show the data. We'll go into this next.
Showing the data - Add browsing contributions
Now let's focus on adding some basic contributions for making data visible to the user.
There are several kinds of contributions that can to be added to make data visible in the browser. The most important contributions are viewpoints, i.e. the contributions that produce the contents for the browser tree. Take another look at the previous tutorial's UI sketch. We will need contributions for doing the following things in the browser:
- Content production (∼ViewpointContribution):
- Show all movie productions in the active project
- Show a Casting node for a movie
- Show all roles cast for a movie under the Casting node
- Content labeling (∼LabelerContribution):
- Movie: show name
- Casting: show fixed name Casting
- Role: show
- role name - no actor if no actor is specified for role
- role name - actor name if an actor has been specified for role
- Giving images for contents (∼ImagerContribution)
Start by creating a new java package for the contributions:
- Select File >> New >> Package
- Specify package com.acme.movie.ui.browser.contributions
The com.acme.movie.ui.browser.contributions.Movies contribution takes care of contributing all movie resources when given a Project resource as input. Download the source and put it into the contributions package.
One more thing needs to be done in order to put the Movies contribution to use: define an extension for binding it to the browsing context of the Productions browser.
- Open com.acme.movie.ui / META-INF/MANIFEST.MF >> Extensions
- Add a new extension, org.simantics.browsing.ui.common.viewpointContributionBinding
- A node will appear, select it and set browseContext=http://com.acme/Movie-1.0/Productions
- Select http://com.acme/Movie-1.0/Productions >> right click New >> implementation. Select it and set the attributes:
- class = com.acme.movie.ui.browser.contributions.Movies
- preference = 1
Create another package com.acme.movie.ui.browser.nodes as before and download these files into that package: Casting node class, Cast Role class
Do the same, i.e. download and add extensions for the remaining two viewpoint contributors:
TODO: screenshot of what we have so far.
Step 2: Add Property View for Model Browser
The Productions browser is responsible for contributing its own property page. To do this, two things must be done:
- An implementation of IPropertyPage must be created
- Once again, the class attribute of our Productions view extensions must be modified to offer our IPropertyPage implementation.
Here's the IPropertyPage implementation we will be using:
<syntaxhighlight lang="java"> package com.acme.movie.ui;
import java.util.Collections; import java.util.Set;
import org.eclipse.ui.IWorkbenchPartSite; import org.simantics.browsing.ui.swt.StandardPropertyPage;
public class ProductionsPropertyPage extends StandardPropertyPage {
public ProductionsPropertyPage(IWorkbenchPartSite site) { super(site); }
@Override protected Set<String> getContexts() { return Collections.singleton("http://com.acme/Movie-1.0/Productions/Properties"); }
} </syntaxhighlight>
Now we modify the view extension to use this implementation.
- Find the production view extension: org.eclipse.ui.views >> Productions (view)
- Append a new argument to the class attribute: ;propertyPageClass=com.acme.movie.ui.ProductionsPropertyPage
Technical Details
The property view is a generic view. It's contents follow the active workbench part, i.e. the active view or editor. When a view or editor is activated, the property view will see this and request for the activated part to provide an IPropertyPage implementation through the platform's IAdaptable interface.
Step 3: Add Content for Movie Database Library
Things TODO:
- Implement the fixed set of ISymbolGroups for movies, actors and characters.
- Add code to the project feature that contributes a fixed set of ISymbolGroups into the ISymbolManager.KEY_SYMBOL_GROUPS hint of IProject
- Add new symbol group interface for adding a filtered version of the symbol group getItems() method. This is needed for making the view such results are only shown if a search criterion is specified.
Step 4: Final Tweaking
Last we remove the comparator and viewpoint selector combo boxes and the filter area from the Productions browser since they are not needed for this tutorial. Once again the removal happens by adding the following arguments to the Productions view extension:
- hideComparatorSelector
- hideViewpointSelector
- hideFilter
Arguments can be specified to extensions, such as views, through the class attribute of the extension. The general format of the class attribute is <class name>:<arguments>
The arguments part of the attribute value is specified similarly to URI scheme query strings. Individual arguments are separated by semicolons (;) and specified either as plain strings or as key=value pairs.
The arguments supported by org.simantics.browsing.ui.swt.GraphExplorerView are:
- browseContext=ID
- For specifying browse contexts for the view. This will determine which contributions the view will use. 0 to many browse contexts may be defined. Not defining browse contexts will always result in zero contributions.
- uiContext=ID
- For specifying ID's of org.eclipse.ui.context extensions to be activated for the view. 0 to many UI contexts may be defined.
- contextMenuId=ID
- Specifies the ID of the context menu to register for this browser view. Only one ID can be specified, the last one specified is used.
- hideComparatorSelector
- Hides the comparator selector combo box from the UI.
- hideViewpointSelector
- Hides the viewpoint selector combo box from the UI.
- hideFilter
- Hides the filter control from the UI.
- propertyPageClass=class-name
- Defines the property page that will be created by the view when requested for it. The class-name must point to an IPropertyPage implementation.
In the next part you will be developing a diagram editor.
Tutorial 4: Diagram Development