This example covers:
- A custom renderer for the package. The package without inner elements is filled with a green color.
- A custom renderer for the slot. The slot values are rounded.
- A custom renderer for the dependency link. The dependency link is a blue thicker line with custom line ends.
This example shows, how to create custom renderers for the preceding pointed symbols.
The custom package renderer. The empty package (that is without inner elements) is filled with green color:
class PackageRenderer extends ShapeRenderer { public Color getColor(PresentationElement presentationElement, PresentationElementColorEnum colorEnum) { if (PresentationElementColorEnum.FILL.equals(colorEnum)) { // the color to fill Element element = presentationElement.getElement(); if (element instanceof com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package && !((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package) element).hasOwnedElement()) { // the package has no elements, use the green color to fill return Color.GREEN; } } return super.getColor(presentationElement, colorEnum); } }
The custom slot renderer (used in the instance specification symbol). The slot values are rounded:
class SlotRenderer extends ShapeRenderer { public String getText(PresentationElement presentationElement, PresentationElementTextEnum textEnum) { if (PresentationElementTextEnum.NAME.equals(textEnum)) { // the slot text is shown as a name Element element = presentationElement.getElement(); if (element instanceof Slot) { Slot slot = (Slot) element; if (slot.hasValue()) { String string = ""; List<ValueSpecification> values = slot.getValue(); for (ValueSpecification value : values) { if (value instanceof LiteralString) { LiteralString literalString = (LiteralString) value; if (string.length() > 0) { string += "; "; } String literalValue = literalString.getValue(); try { // round a value double doubleValue = Double.parseDouble(literalValue); double rounded = Math.round(doubleValue * 100) / 100; literalValue = Double.toString(rounded); } catch (NumberFormatException e) { } string += literalValue; } } return slot.getDefiningFeature().getName() + "=" + string; } } } return super.getText(presentationElement, textEnum); } }
The custom dependency link renderer. The dependency link is a blue thicker line with custom line ends:
class DependencyRenderer extends PathRenderer { private PathEndRenderer mClientEndRenderer; DependencyRenderer() { // a custom client end renderer, use a filled circle at the end mClientEndRenderer = new PathEndRenderer(PathEndAdornment.CIRCLE, PathEndAdornmentModifier.FILLED); } public Color getColor(PresentationElement presentationElement, PresentationElementColorEnum colorEnum) { if (PresentationElementColorEnum.LINE.equals(colorEnum)) { // use a blue color for a line return Color.BLUE; } return super.getColor(presentationElement, colorEnum); } protected PathEndRenderer getClientEndRenderer(PathElement pathElement) { // use a custom end renderer return mClientEndRenderer; } public int getLineWidth(PresentationElement presentationElement) { // a line width is 2 return 2; } protected void drawPathAdornment(Graphics g, PathElement pathElement) { super.drawPathAdornment(g, pathElement); // draw a circle at the middle of the dependency line Color background = Color.WHITE; Property property = pathElement.getDiagramPresentationElement().getProperty(PropertyID.DIAGRAM_BACKGROUND_COLOR); if (property != null) { Object value = property.getValue(); if (value instanceof Color) { background = (Color) value; } } Point middlePoint = pathElement.getMiddlePoint(); int diameter = 10; int radius = diameter / 2; int x = middlePoint.x - radius; int y = middlePoint.y - radius; Color color = g.getColor(); g.setColor(background); g.fillOval(x, y, diameter, diameter); g.setColor(color); g.drawOval(x, y, diameter, diameter); } }