package com.baselet.element.facet; import java.util.HashMap; import java.util.Map; import com.baselet.control.basics.XValues; import com.baselet.control.basics.geom.Dimension; import com.baselet.control.enums.ElementStyle; import com.baselet.diagram.draw.DrawHandler; import com.baselet.element.sticking.polygon.SimpleStickingPolygonGenerator; import com.baselet.element.sticking.polygon.StickingPolygonGenerator; /** * The PropertiesParserState contains the mutable state of the parser which changes constantly while parsing * the properties printing related facets have explicit fields (for better usabilty), for any other Facet, the generic facetResponse map should be used for communication between facets and/or the gridelement * */ public class PropertiesParserState { private final Settings settings; private final DrawHandler drawer; private Alignment alignment; private double textPrintPosition; // the current y position for drawing text, separator-lines and other properties-text-related stuff private double minimumWidth; private Buffer buffer; private Dimension gridElementSize; private ElementStyle elementStyle; private StickingPolygonGenerator stickingPolygonGenerator = SimpleStickingPolygonGenerator.INSTANCE; private double totalTextBlockHeight; private final Map<Class<? extends Facet>, Object> facetResponse = new HashMap<Class<? extends Facet>, Object>(); public PropertiesParserState(Settings settings, DrawHandler drawer) { this.settings = settings; this.drawer = drawer; } public void resetValues(Dimension gridElementSize, double totalTextBlockHeight, boolean enableDrawing) { alignment = new Alignment(settings); textPrintPosition = 0; minimumWidth = 0; buffer = new Buffer(); this.gridElementSize = gridElementSize; elementStyle = settings.getElementStyle(); stickingPolygonGenerator = SimpleStickingPolygonGenerator.INSTANCE; this.totalTextBlockHeight = totalTextBlockHeight; facetResponse.clear(); drawer.setEnableDrawing(enableDrawing); } public Alignment getAlignment() { return alignment; } /** * returns the current text print position including the top buffer */ public double getTextPrintPosition() { return textPrintPosition + buffer.getTop(); } /** * use whenever the text print position should be increased (e.g. if -- draws a horizontal line, some vertical space should be added, or everytime TextPrintFacet prints a line) */ public void increaseTextPrintPosition(double inc) { textPrintPosition += inc; } public Buffer getBuffer() { return buffer; } public Dimension getGridElementSize() { return gridElementSize; } public XValues getXLimits(double linePos) { XValues xLimits = settings.getXValues(linePos, getGridElementSize().height, getGridElementSize().width); xLimits.addLeft(buffer.getLeft()); xLimits.subRight(buffer.getRight()); return xLimits; } public XValues getXLimitsForArea(double bottomYPos, double areaHeight, boolean nanPriority) { XValues xLimitsTop = getXLimits(bottomYPos - areaHeight); XValues xLimitsBottom = getXLimits(bottomYPos); XValues xLimits = xLimitsTop.intersect(xLimitsBottom, nanPriority); return xLimits; } public void updateMinimumWidth(double width) { minimumWidth = Math.max(minimumWidth, width); } public void updateMinimumSize(double width, double height) { updateMinimumWidth(width); getBuffer().setTopMin(height); } public double getMinimumWidth() { return minimumWidth; } public ElementStyle getElementStyle() { return elementStyle; } public void setElementStyle(ElementStyle elementStyle) { this.elementStyle = elementStyle; } public Settings getSettings() { return settings; } public DrawHandler getDrawer() { return drawer; } @SuppressWarnings("unchecked") public <T> T getFacetResponse(Class<? extends Facet> facetClass, T defaultValue) { T mapValue = (T) facetResponse.get(facetClass); if (mapValue == null) { return defaultValue; } return mapValue; } public <T> T getOrInitFacetResponse(Class<? extends Facet> facetClass, T defaultValue) { T mapValue = getFacetResponse(facetClass, defaultValue); setFacetResponse(facetClass, mapValue); return mapValue; } public void setFacetResponse(Class<? extends Facet> facetClass, Object value) { facetResponse.put(facetClass, value); } public StickingPolygonGenerator getStickingPolygonGenerator() { return stickingPolygonGenerator; } public void setStickingPolygonGenerator(StickingPolygonGenerator stickingPolygonGenerator) { this.stickingPolygonGenerator = stickingPolygonGenerator; } public double getTotalTextBlockHeight() { return totalTextBlockHeight; } }