package com.baselet.element.facet.specific;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
import com.baselet.control.basics.XValues;
import com.baselet.control.enums.AlignHorizontal;
import com.baselet.control.enums.AlignVertical;
import com.baselet.diagram.draw.DrawHandler;
import com.baselet.diagram.draw.helper.ColorOwn;
import com.baselet.element.facet.Alignment;
import com.baselet.element.facet.Facet;
import com.baselet.element.facet.PropertiesParserState;
import com.baselet.gui.AutocompletionText;
public class InnerClassFacet extends Facet {
public static final InnerClassFacet INSTANCE = new InnerClassFacet();
private InnerClassFacet() {}
private static final int BUFFER_PIXEL_PER_INNER = 5;
private static final int H_SPACE = 4;
private static final String START = "{innerclass";
private static final String END = "innerclass}";
@Override
public boolean checkStart(String line, PropertiesParserState state) {
return line.equals(START) || line.equals(END);
}
@Override
public void handleLine(String line, PropertiesParserState state) {
Stack<ClassSettings> innerClassStartPoints = getOrInit(state);
DrawHandler drawer = state.getDrawer();
if (line.equals(START)) {
ClassSettings settings = new ClassSettings(state.getAlignment().getHorizontal(), state.getAlignment().getVertical(), getDividerPos(drawer, state));
innerClassStartPoints.add(settings);
state.getBuffer().addToLeftAndRight(BUFFER_PIXEL_PER_INNER);
state.increaseTextPrintPosition(H_SPACE);
state.getAlignment().reset();
}
else if (line.equals(END)) {
ClassSettings previousClassSettings = innerClassStartPoints.pop();
double start = previousClassSettings.start;
double height = getDividerPos(drawer, state) - start;
XValues xLimit = state.getXLimits(height);
ColorOwn oldColor = drawer.getBackgroundColor();
drawer.setBackgroundColor(ColorOwn.TRANSPARENT);
drawer.drawRectangle(xLimit.getLeft(), start, xLimit.getSpace(), height);
drawer.setBackgroundColor(oldColor);
state.increaseTextPrintPosition(H_SPACE);
state.getBuffer().addToLeftAndRight(-BUFFER_PIXEL_PER_INNER);
Alignment alignment = state.getAlignment();
alignment.setHorizontal(false, previousClassSettings.hAlign);
alignment.setVertical(false, previousClassSettings.vAlign);
}
}
private double getDividerPos(DrawHandler drawer, PropertiesParserState state) {
return state.getTextPrintPosition() - drawer.textHeightMax();
}
private Stack<ClassSettings> getOrInit(PropertiesParserState state) {
return state.getOrInitFacetResponse(InnerClassFacet.class, new Stack<ClassSettings>());
}
private static class ClassSettings {
private final AlignHorizontal hAlign;
private final AlignVertical vAlign;
private final double start;
public ClassSettings(AlignHorizontal hAlign, AlignVertical vAlign, double startpoint) {
super();
this.hAlign = hAlign;
this.vAlign = vAlign;
start = startpoint;
}
}
@Override
public List<AutocompletionText> getAutocompletionStrings() {
return Arrays.asList(new AutocompletionText(START, "begin inner class"), new AutocompletionText(END, "end inner class"));
}
}