Implementation of the Controller.
In GEF EditParts play the role of the Controllers.
Each model element shown in the editor has a corresponding EditPart.
An EditPart maps a model element to a graphical representation (IFigure from
Draw2D) and provides a number of edit policies, that determine how this model element
can be modified.
The Shapes-Example uses three kinds of EditParts:
- Subclasses of AbstractGraphicalEditPart for regular model elements
(EllipticalShape, RectangularShape, ShapesDiagram).
- A subclass of AbstractConnectionEditPart for the Connection model element.
- Subclasses of AbstractTreeEditPart for the EditParts used in the outline view.
Subclasses of EditPartFactory are responsible for mapping model elements to
EditParts.
How are new model elements created?
To create a new model elements several classes of your application work together:
-
Uppon a mouse-click, the selected tool in the palette
(see ShapesEditorPaletteFactory#createComponentsGroup())
issues a request to the EditPart (for example a CreateRequest) under the
mouse pointer.
-
The EditPart might process the request directly or forward the request to
an EditPolicy. The request is processed and if the preconditions are
met, it is answered by a command (for example a ShapeCreateCommand), otherwise
null is returned (for an example see getCreateCommand(CreateRequest)
in DiagramEditPart.ShapesXYLayoutEditPolicy).
-
If the command can execute (depending on the return value of the canExecute() method),
the execute() method will be called, which is responsible for adding a new model element
instance into the model. As you can observe in ShapeCreateCommand, in our case there is
no need to instantiate a new model element directly. This has already been done by the
Factory associated with selected tool (e.g. the CombinedTemplateSelectionEntry,
see code snippet 1). Therefore we can just retrieve the new instance from the creation request and
put in into the model (see code snippet 2).
- When the Shape is added into the model (redo() method in snippet 2), a
CHILD_ADDED_PROP property change event is fired by the ShapesDiagram
instance (parent field in snippet 2). This property change event, will cause
the DiagramEditPart to refresh its children (see
DiagramEditPart#propertyChange(PropertyChangeEvent)) and thus the new
shape will appear in the editor.
// snippet 1, taken from ShapesEditorPaletteFactory#createToolsGroup()
CombinedTemplateCreationEntry component = new CombinedTemplateCreationEntry(
"Ellipse",
"Create an elliptical shape",
EllipticalShape.class,
new SimpleFactory(EllipticalShape.class), // <-- responsible for creating a new instance
ImageDescriptor.createFromFile(ShapesPlugin.class, "icons/ellipse16.gif"),
ImageDescriptor.createFromFile(ShapesPlugin.class, "icons/ellipse24.gif"));
// snippet 2, taken from ShapeCreateCommand
public void execute() {
newShape = (Shape) request.getNewObject();
newShape.setSize(request.getSize()); // might be null!
newShape.setLocation(request.getLocation());
redo();
}
public void redo() {
childAdded = parent.addChild(newShape);
}
More...
For detailed information on EditParts, EditPolicies, Request and many other classes
mentioned here, please consult the GEF API-Reference.