package com.baselet.element.elementnew.uml; import java.util.Arrays; import java.util.List; import com.baselet.control.basics.geom.PointDouble; import com.baselet.control.enums.AlignHorizontal; import com.baselet.control.enums.ElementId; import com.baselet.diagram.draw.DrawHandler; import com.baselet.diagram.draw.DrawHandler.Layer; import com.baselet.element.NewGridElement; import com.baselet.element.draw.DrawHelper; import com.baselet.element.facet.Facet; import com.baselet.element.facet.PropertiesParserState; import com.baselet.element.facet.Settings; import com.baselet.element.facet.common.SeparatorLineFacet; import com.baselet.element.facet.common.TextBeforeFirstSeparatorCollectorFacet; import com.baselet.element.facet.common.TextBeforeFirstSeparatorCollectorFacet.TextBeforeFirstSeparatorCollectorFacetResponse; import com.baselet.element.settings.SettingsManualresizeCenter; import com.baselet.element.sticking.polygon.PointDoubleStickingPolygonGenerator; public class Package extends NewGridElement { @Override protected Settings createSettings() { return new SettingsManualresizeCenter() { @Override protected List<Facet> createFacets() { return listOf(super.createFacets(), TextBeforeFirstSeparatorCollectorFacet.INSTANCE, SeparatorLineFacet.INSTANCE); } }; } @Override public ElementId getId() { return ElementId.UMLPackage; } @Override protected void drawCommonContent(PropertiesParserState state) { DrawHandler drawer = state.getDrawer(); List<String> packageTitle = getTitleLines(state); double packageHeight = 0; double packageWidth = getRealSize().getWidth() / 2.5; double txtHeight = drawer.textHeightMaxWithSpace(); for (String line : packageTitle) { packageHeight += txtHeight; packageWidth = Math.max(packageWidth, drawer.textWidth(line) + drawer.getDistanceBorderToText() * 2); drawer.setLayer(Layer.Foreground); // text should be in front of the package-border drawer.print(line, new PointDouble(drawer.getDistanceBorderToText(), packageHeight), AlignHorizontal.LEFT); drawer.setLayer(Layer.Background); } packageHeight += drawer.getDistanceBorderToText(); int height = getRealSize().getHeight(); int width = getRealSize().getWidth(); List<PointDouble> points = DrawHelper.drawPackage(drawer, 0, 0, packageHeight, packageWidth, height, width); state.getBuffer().setTopMin(packageHeight); state.setStickingPolygonGenerator(new PointDoubleStickingPolygonGenerator(points)); } private static List<String> getTitleLines(PropertiesParserState state) { List<String> packageTitle; TextBeforeFirstSeparatorCollectorFacetResponse packageTitleResponse = state.getFacetResponse(TextBeforeFirstSeparatorCollectorFacet.class, null); if (packageTitleResponse != null) { packageTitle = packageTitleResponse.getLines(); } else { packageTitle = Arrays.asList(""); } return packageTitle; } }