package com.baselet.element.elementnew.plot.drawer;
import com.baselet.control.basics.geom.Dimension;
import com.baselet.control.basics.geom.Rectangle;
import com.baselet.diagram.draw.DrawHandler;
import com.baselet.diagram.draw.helper.ColorOwn;
import com.baselet.diagram.draw.helper.ColorOwn.Transparency;
/**
* <pre>
* | GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
* | G G
* | G OOOOOOOOOOOOOOO G
* | G O O G
* | G O IIIIIIIII O G
* | G O I I O G
* | G O I I O G
* | G O IIIIIIIII O G
* | G O O G
* | G OOOOOOOOOOOOOOO G
* | G G
* | G G
* | G G
* | G G
* | G G
* | G G
* | GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
* </pre>
*/
public class Canvas {
private int borderspace;
private final Rectangle outerBorder; // Nothing is drawn between outerBorder and the GridElement-Border
private final Rectangle innerBorder; // Only axis are drawn between outerBorder and innerBorder; inside the innerBorder the plot is drawn
private final Dimension gridElementSize;
public Canvas(Dimension gridElementSize) {
super();
this.gridElementSize = gridElementSize;
outerBorder = new Rectangle();
innerBorder = new Rectangle();
setBorder(0, 0, 0, 0, 0);
}
public void setBorder(int x, int y, int width, int height, int borderspace) {
this.borderspace = borderspace;
outerBorder.setBounds(x, y, width, height);
updateInnerBorder();
}
public void setBorderX(int x) {
outerBorder.setBounds(x, outerBorder.y, outerBorder.width, outerBorder.height);
updateInnerBorder();
}
public void setBorderY(int y) {
outerBorder.setBounds(outerBorder.x, y, outerBorder.width, outerBorder.height);
updateInnerBorder();
}
public void setBorderWidth(int width) {
outerBorder.setBounds(outerBorder.x, outerBorder.y, width, outerBorder.height);
updateInnerBorder();
}
public void setBorderHeight(int height) {
outerBorder.setBounds(outerBorder.x, outerBorder.y, outerBorder.width, height);
updateInnerBorder();
}
private void updateInnerBorder() {
innerBorder.setBounds(outerBorder.x + borderspace, outerBorder.y + borderspace, outerBorder.width + borderspace, outerBorder.height + borderspace);
}
/**
* <pre>
* {@literal
* | <----->
* | G O I I O G
* }
* </pre>
*/
public int getInnerLeftPos() {
return innerBorder.x;
}
public int getInnerUpPos() {
return innerBorder.y;
}
/**
* <pre>
* {@literal
* | <------------------>
* | G O I I O G
* }
* </pre>
*/
public int getInnerRightBorderWidth() {
return innerBorder.width;
}
public int getInnerDownBorderHeight() {
return innerBorder.height;
}
/**
* <pre>
* {@literal
* | <------------->
* | G O I I O G
* }
* </pre>
*/
public int getInnerRightPos() {
return gridElementSize.width - getInnerRightBorderWidth();
}
public int getInnerDownPos() {
return gridElementSize.height - getInnerDownBorderHeight();
}
/**
* <pre>
* {@literal
* | <-----> <------------------>
* | G O I I O G
* }
* </pre>
*/
public int getInnerHorizontalSum() {
return getInnerLeftPos() + getInnerRightBorderWidth();
}
public int getInnerVerticalSum() {
return getInnerUpPos() + getInnerDownBorderHeight();
}
/**
* <pre>
* {@literal
* | <------->
* | G O I I O G
* }
* </pre>
*/
public int getInnerHorizontalDrawspace() {
return getInnerRightPos() - getInnerLeftPos();
}
public int getInnerVerticalDrawspace() {
return getInnerDownPos() - getInnerUpPos();
}
public int getOuterLeftPos() {
return outerBorder.x;
}
public int getOuterUpPos() {
return outerBorder.y;
}
public int getOuterRightBorderWidth() {
return outerBorder.width;
}
public int getOuterDownBorderHeight() {
return outerBorder.height;
}
public int getOuterRightPos() {
return gridElementSize.width - getOuterRightBorderWidth();
}
public int getOuterDownPos() {
return gridElementSize.height - getOuterDownBorderHeight();
}
public int getOuterHorizontalSum() {
return getOuterLeftPos() + getOuterRightBorderWidth();
}
public int getOuterVerticalSum() {
return getOuterUpPos() + getOuterDownBorderHeight();
}
public boolean hasHorizontalDrawspace() {
return gridElementSize.width > getOuterHorizontalSum();
}
public boolean hasVerticalDrawspace() {
return gridElementSize.width > getOuterHorizontalSum();
}
public void draw(DrawHandler baseDrawHandler) {
baseDrawHandler.setBackgroundColor(ColorOwn.TRANSPARENT);
baseDrawHandler.setForegroundColor(ColorOwn.RED.transparency(Transparency.BACKGROUND));
baseDrawHandler.drawRectangle(getOuterLeftPos(), getOuterUpPos(), getOuterRightPos() - getOuterLeftPos() - 1, getOuterDownPos() - getOuterUpPos());
baseDrawHandler.setForegroundColor(ColorOwn.BLUE);
baseDrawHandler.drawRectangle(getInnerLeftPos(), getInnerUpPos(), getInnerRightPos() - getInnerLeftPos(), getInnerDownPos() - getInnerUpPos());
}
}