This example covers:
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); } } |