package org.reldb.dbrowser.ui.content.rev;
import org.reldb.dbrowser.ui.content.rev.Parameter;
import org.reldb.dbrowser.ui.content.rev.graphics.Arrow;
import org.reldb.dbrowser.ui.content.rev.graphics.LineHorizontal;
import org.reldb.dbrowser.ui.content.rev.graphics.LineVertical;
public class Argument {
private final static int lineWidth = 1;
private final static int arrowSize = 5;
private final static boolean arrowIntoVisualiser = false;
private LineHorizontal parameterExtension;
private LineVertical visualiserExtension;
private LineVertical verticalLink;
private LineHorizontal visualiserLink;
private Arrow visualiserArrow;
private Arrow parameterArrow;
private Parameter parameter;
private Visualiser operand;
public Argument(Parameter parameter) {
this.parameter = parameter;
initComponents();
parameter.setArgument(this);
setOperand(null);
}
public void setOperand(Visualiser visualiser) {
if (operand != null)
operand.removeArgumentReference(this);
if (operand instanceof Connector)
operand.dispose();
operand = visualiser;
if (operand == null)
operand = new Connector(parameter);
operand.addArgumentReference(this);
redraw();
Operator operator = parameter.getOperator();
operator.visualiserMoved();
operand.visualiserMoved();
operator.verify();
operand.verify();
}
public Visualiser getOperand() {
return operand;
}
public Operator getOperator() {
return parameter.getOperator();
}
void redraw() {
// Set up connection visualisation.
int vx2 = operand.getArgumentX(this);
int cextlen = parameter.getExtensionLength();
int pcx = parameter.getParameterX();
int pcy = parameter.getParameterY();
int vx1 = pcx + ((parameter.getLayoutDirection() == Parameter.EASTTOWEST) ? -cextlen : cextlen);
int vextlen = operand.getExtensionLength(this);
int vayt = operand.getArgumentY(this);
int vy2 = vayt + ((operand.isConnectionAtBottom(this)) ? vextlen : -vextlen);
int x1 = pcx;
int x2 = vx1 + ((parameter.getLayoutDirection() != Parameter.EASTTOWEST) ? lineWidth : 0);
int y = pcy;
parameterExtension.setLine(x1, x2, y, lineWidth);
x1 = vx2;
x2 = operand.getArgumentY(this);
y = vy2;
visualiserExtension.setLine(x1, x2, y, lineWidth);
x1 = vx1;
x2 = parameter.getParameterY();
y = vy2;
verticalLink.setLine(x1, x2, y, lineWidth);
x1 = vx2 + ((vx2 > vx1 && operand.isConnectionAtBottom(this)) ? lineWidth : 0);
x2 = vx1 + ((vy2 > pcy && vx2 < vx1) ? lineWidth : 0);
y = vy2;
visualiserLink.setLine(x1, x2, y, lineWidth);
setVisualiserArrow(arrowIntoVisualiser, arrowSize);
setConnectorArrow(!arrowIntoVisualiser, arrowSize);
}
// Set connector arrow to given arrow type.
private void setConnectorArrow(boolean in, int arrowSize) {
if (parameter.getLayoutDirection() == Parameter.EASTTOWEST) {
parameterArrow.setArrow((in) ? Arrow.DIRECTION_RIGHT : Arrow.DIRECTION_LEFT, arrowSize);
parameterArrow.setLocation(parameter.getParameterX() - arrowSize - 2, lineWidth - 1 + parameter.getParameterY() - arrowSize / 2);
} else {
parameterArrow.setArrow((in) ? Arrow.DIRECTION_LEFT : Arrow.DIRECTION_RIGHT, arrowSize);
parameterArrow.setLocation(parameter.getParameterX() + 2, lineWidth - 1 + parameter.getParameterY() - arrowSize / 2);
}
}
// Set visualiser arrow to given arrow type.
private void setVisualiserArrow(boolean in, int arrowSize) {
if (operand.isConnectionAtBottom(this)) {
visualiserArrow.setArrow((!in) ? Arrow.DIRECTION_DOWN : Arrow.DIRECTION_UP, arrowSize);
visualiserArrow.setLocation(lineWidth - 1 + operand.getArgumentX(this) - arrowSize / 2, operand.getArgumentY(this) + arrowSize - 4);
} else {
visualiserArrow.setArrow((in) ? Arrow.DIRECTION_DOWN : Arrow.DIRECTION_UP, arrowSize);
visualiserArrow.setLocation(lineWidth - 1 + operand.getArgumentX(this) - arrowSize / 2, operand.getArgumentY(this) - arrowSize - 2);
}
}
public String toString() {
return "[argument]";
}
private void initComponents() {
Model model = parameter.getOperator().getModel();
parameterExtension = new LineHorizontal(model);
visualiserExtension = new LineVertical(model);
verticalLink = new LineVertical(model);
visualiserLink = new LineHorizontal(model);
visualiserArrow = new Arrow(model);
parameterArrow = new Arrow(model);
}
public void bringToFront() {
visualiserArrow.moveAbove(null);
parameterArrow.moveAbove(null);
parameterExtension.moveAbove(null);
visualiserExtension.moveAbove(null);
verticalLink.moveAbove(null);
visualiserLink.moveAbove(null);
}
public void dispose() {
if (operand instanceof Connector)
operand.dispose();
visualiserArrow.dispose();
parameterArrow.dispose();
parameterExtension.dispose();
visualiserExtension.dispose();
verticalLink.dispose();
visualiserLink.dispose();
}
public void setVisible(boolean b) {
if (operand instanceof Connector)
operand.setVisible(b);
visualiserArrow.setVisible(b);
parameterArrow.setVisible(b);
parameterExtension.setVisible(b);
visualiserExtension.setVisible(b);
verticalLink.setVisible(b);
visualiserLink.setVisible(b);
parameter.getOperator().verify();
}
public boolean isVisible() {
return visualiserArrow.getVisible();
}
}