package ql.gui.segment;
import javafx.geometry.Insets;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import ql.ast.expression.Expr;
import ql.gui.Refreshable;
import ql.gui.input.Input;
import ql.gui.label.Label;
import ql.semantics.ExprEvaluator;
import ql.semantics.ValueTable;
import ql.semantics.values.BoolValue;
import ql.semantics.values.Value;
/**
* Created by Nik on 3-3-15.
*/
public class Row extends Segment<Pane> implements Refreshable
{
private final Expr condition;
private final VBox inputBox;
private final Label label;
private final Input input;
private Insets insets;
public Row(Expr condition, Label label, Input input)
{
super(new HBox());
this.input = input;
this.label = label;
this.condition = condition;
this.insets = new Insets(0, 0, 15, 0);
this.inputBox = new VBox();
this.initializeInputBox();
this.container.getChildren().add(this.inputBox);
}
public void initializeInputBox()
{
this.inputBox.getChildren().add(this.label.getTextNode());
this.inputBox.getChildren().add(this.input.getInputNode());
this.inputBox.setFillWidth(true);
this.inputBox.setPrefWidth(400);
this.inputBox.setPadding(this.insets);
}
public Label getLabel()
{
return label;
}
public Input getInput()
{
return input;
}
@Override
public <V> V accept(SegmentVisitor<V> visitor)
{
return visitor.visit(this);
}
@Override
public void refreshElement(ValueTable valueTable)
{
Boolean visible = false;
Value val = ExprEvaluator.evaluate(condition, valueTable);
if (!val.isUndefined())
{
visible = ((BoolValue)val).getValue();
}
this.setVisible(visible);
}
@Override
public Value evaluate(ValueTable valueTable)
{
return ExprEvaluator.evaluate(condition, valueTable);
}
public void applyStyle(RowStyle style)
{
if (style.isWidgetSet())
{
this.input.switchControl(style.getWidget());
}
this.applyWidth(style.getWidth());
this.applyFont(style.getFont());
this.applyForeColor(style.getForeColor());
this.applyBackColor(style.getBackColor());
}
private void applyWidth(Integer width)
{
this.inputBox.setPrefWidth(width.doubleValue());
}
private void applyForeColor(Paint color)
{
this.label.applyColor(color);
}
private void applyBackColor(Paint color)
{
this.inputBox.setBackground(new Background(new BackgroundFill(color, null, this.insets)));
}
private void applyFont(Font font)
{
this.label.applyFont(font);
}
}