package org.mt4jx.components.visibleComponents.widgets;
import org.mt4j.components.css.style.CSSStyle;
import org.mt4j.components.visibleComponents.shapes.MTEllipse;
import org.mt4j.input.inputProcessors.componentProcessors.dragProcessor.DragProcessor;
import org.mt4j.input.inputProcessors.componentProcessors.rotateProcessor.RotateProcessor;
import org.mt4j.input.inputProcessors.componentProcessors.scaleProcessor.ScaleProcessor;
import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapProcessor;
import org.mt4j.input.inputProcessors.componentProcessors.zoomProcessor.ZoomProcessor;
import org.mt4j.util.MTColor;
import org.mt4j.util.math.Vector3D;
import processing.core.PApplet;
/**
* The Class MTOptionBox.
*/
public class MTOptionBox extends MTForm implements BooleanForm {
/** The boolean value. */
private boolean booleanValue = false;
// /** The background color. */
// private MTColor backgroundColor;
//
// /** The stroke color. */
// private MTColor strokeColor;
/** The option box. */
private MTEllipse optionBox;
/** The group. */
private OptionGroup group;
/**
* Instantiates a new MTOptionBox
* @param app the PApplet
* @param size the size of the ellipse
* @param group the OptionGroup
*/
public MTOptionBox(PApplet app,
float size, OptionGroup group) {
super(app, 0, 0, size, size, MTForm.BOOLEAN);
group.addOptionBox(this);
this.setCssForceDisable(true);
this.setNoStroke(true);
this.setNoFill(true);
this.group = group;
optionBox = new MTEllipse(app, new Vector3D(size/2f,size/2f), size/2f, size/2f);
optionBox.setCssForceDisable(true);
this.addChild(optionBox);
this.style();
optionBox.setPickable(false);
optionBox.setNoFill(true);
this.setGestureAllowance(TapProcessor.class, true);
this.registerInputProcessor(new TapProcessor(app));
this.addGestureListener(TapProcessor.class, new BooleanTapListener());
this.setGestureAllowance(DragProcessor.class, false);
this.setGestureAllowance(ScaleProcessor.class, false);
this.setGestureAllowance(ZoomProcessor.class, false);
this.setGestureAllowance(RotateProcessor.class, false);
}
private void style() {
//Check if it's CSS styled
if (this.isCSSStyled() && optionBox != null && this.getCssHelper() != null) {
CSSStyle vss = this.getCssHelper().getVirtualStyleSheet();
this.setStrokeWeight(vss.getBorderWidth());
this.setLineStipple(vss.getBorderStylePattern());
if (vss.isModifiedBorderColor()) optionBox.setStrokeColor(vss.getBorderColor());
else optionBox.setStrokeColor(MTColor.WHITE);
if (vss.isModifiedBackgroundColor() && brightEnough(vss.getBackgroundColor())) {
if (vss.getBackgroundColor().getAlpha() < 220) {
MTColor color = vss.getBackgroundColor().getCopy();
color.setAlpha(220);
optionBox.setFillColor(color);
} else optionBox.setFillColor(vss.getBackgroundColor());
}
else optionBox.setFillColor(MTColor.YELLOW);
if (vss.isModifiedBorderWidth()) optionBox.setStrokeWeight(vss.getBorderWidth());
else optionBox.setStrokeWeight(2f);
} else if (optionBox != null){
//Else set default values
optionBox.setStrokeColor(MTColor.WHITE);
optionBox.setFillColor(MTColor.YELLOW);
optionBox.setStrokeWeight(2f);
}
}
private boolean brightEnough(MTColor color) {
return color.getR() + color.getG() + color.getB() > 200 && color.getAlpha() > 200;
}
@Override
public void applyStyleSheet() {
super.applyStyleSheet();
System.out.println("Styling now. CSSID: " + this.getCSSID());
style();
}
/* (non-Javadoc)
* @see org.mt4jx.components.generic.MTForm#getBooleanValue()
*/
@Override
public boolean getBooleanValue() {
return booleanValue;
}
/* (non-Javadoc)
* @see org.mt4jx.components.generic.MTForm#getStringValue()
*/
@Override
public String getStringValue() {
return String.valueOf(this.getBooleanValue());
}
/* (non-Javadoc)
* @see org.mt4jx.components.generic.MTForm#getNumericValue()
*/
@Override
public float getNumericValue() {
if (this.getBooleanValue() == true) return 1;
else return 0;
}
/* (non-Javadoc)
* @see org.mt4jx.components.generic.MTForm#setBooleanValue(boolean)
*/
@Override
public void setBooleanValue(boolean value) {
this.booleanValue = value;
if (this.booleanValue == true) {
optionBox.setNoFill(false);
if (group != null)
group.setEnabled(this);
} else {
optionBox.setNoFill(true);
}
}
/**
* Disable.
*/
public void disable() {
this.booleanValue = false;
optionBox.setNoFill(true);
}
}