Control Shape Caption Placement using Open API
When creating diagrams sometimes you might want to have the caption not showing in the default location, i.e. to have better layout for the containing elements while not having the name being covered. In this case you may adjust the caption position to reserve space for the child elements. To do this you can specify the caption placement of the individual element via the user interface. But instead of manually specify the caption placement shape by shape, you can also do this via the Open API. In this article we will use Component as sample to demonstrate how to control its caption position with Visual Paradigm’s Open API.
Look up the Component Diagram or create one
We first have to lookup the component diagram in our project. In case the diagram we looking for does not exist we then create one. We create a method to lookup the diagram in our project:
private IComponentUIModel getComponentFromDiagram() {
// obtain the project and loop through the diagrams
IProject project = ApplicationManager.instance().getProjectManager().getProject();// loop through the diagrams to locate
// the one call "Caption Placement Test"
IDiagramUIModel[] diagrams = project.toDiagramArray();
if (diagrams != null) {
for (IDiagramUIModel diagram : diagrams) {
if (diagram instanceof IComponentDiagramUIModel && "Caption Placement Test".equals(diagram.getName())) {
// once the diagram was found, then see does
// it contain a component call "MyComponent"
IDiagramElement[] elements = diagram.toDiagramElementArray();
if (elements != null) {
for (IDiagramElement element : elements) {
// return the diagram if "MyComponent" was found
if (element instanceof IComponentUIModel && "MyComponent".equals(element.getModelElement().getName())) {
return (IComponentUIModel) element;
}
}
}
}
}
}
return createComponent();
}
To create the component diagram with the component we will work on:
public IComponentUIModel createComponent() {
DiagramManager diagramManager = ApplicationManager.instance().getDiagramManager();
// create component diagram
IComponentDiagramUIModel diagram = (IComponentDiagramUIModel) diagramManager.createDiagram(IDiagramTypeConstants.DIAGRAM_TYPE_COMPONENT_DIAGRAM);
diagram.setName("Caption Placement Test");
// create component shape
IComponent componentModel = IModelElementFactory.instance().createComponent();
componentModel.setName("MyComponent");
IComponentUIModel componentShape = (IComponentUIModel) diagramManager.createDiagramElement(diagram, componentModel);
componentShape.setBounds(100, 100, 500, 400);
componentShape.setRequestResetCaption(true); // show up the diagram
diagramManager.openDiagram(diagram);
// return the component shape
return componentShape;
}
Change caption location
If the diagram and the target component was found, then pressing the plugin button will change its caption position. To do this we first obtain all the alignment settings:
// array of possible caption alignment position
private int[] _alignments = {IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_TOP_LEFT,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_TOP_MIDDLE,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_TOP_RIGHT,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_MIDDLE_LEFT,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_MIDDLE,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_MIDDLE_RIGHT,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_BOTTOM_LEFT,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_BOTTOM_MIDDLE,
IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_BOTTOM_RIGHT};
After that we obtain the component and retrieve its current alignment setting and match it with our array. After that we advance the setting by one and set it back to the component.
// try to obtain the component diagram from project, or create one if not found
IComponentUIModel componentShape = getComponentFromDiagram();
if (componentShape != null) {
// obtain the original name alignment value
int alignment = componentShape.getModelElementNameAlignment();
// if alignment is set to follow diagram, then change it as top left
if (alignment == IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_FOLLOW_DIAGRAM) {
alignment = IShapeUIModel.MODEL_ELEMENT_NAME_ALIGNMENT_ALIGN_BOTTOM_RIGHT;
}
// lookup the index of current alignment value
// in _alignments array, and increase index by 1
for (int i = 0; i < _alignments.length; i++) {
if (alignment == _alignments[i]) {
alignment = i+1;
break;
}
}
// if alignment value is bigger then the length of
// _alignments array, then use mod to calculate the
// reminder value as the new index
if (alignment >= _alignments.length) {
alignment = _alignments.length % alignment;
}
// set the new name alignment
componentShape.setModelElementNameAlignment(_alignments[alignment]);
Sample Plugin
The sample plugin attached in this article demonstrate how to change the caption placement using Open API. After you deploy the plugin into Visual Paradigm, you can click the plugin button in application toolbar to create the Component Diagram.
If the Component Diagram already created then press the button again will change the caption placement of the component inside the diagram.
Download Sample Plugin
You can click this link to download the sample plugin.
Related Know-how |
Related Link |




Leave a Reply
Want to join the discussion?Feel free to contribute!