package com.redspr.redquerybuilder.core.client.expression;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.redspr.redquerybuilder.core.client.HasMessages;
import com.redspr.redquerybuilder.core.client.Message;
import com.redspr.redquerybuilder.core.client.engine.Session;
import com.redspr.redquerybuilder.core.shared.meta.Column;
import com.redspr.redquerybuilder.core.shared.meta.HasValue2;
/**
* A parameter of a prepared statement.
*/
public class Parameter extends Expression implements HasMessages {
private Object value;
private Column lastColumn;
private Object lastEditorKey;
private final SimplePanel lb = new SimplePanel();
public Parameter(Session session) {
super(session);
initWidget(lb);
value = session.getValueRegistry().getY().getValue();
}
public Parameter(Session session, int index) {
super(session);
initWidget(lb);
value = session.getValueRegistry().getY(index).getValue();
}
public Parameter(Session session, Collection<Expression> children) {
super(session);
initWidget(lb); // XXX three times now
List<Object> value2 = new ArrayList<Object>();
for (Expression child : children) {
if (child instanceof Null) {
continue;
}
value2.add(((Parameter) child).value);
}
value = value2;
}
@Override
public String getSQL(List<Object> args) {
if (value instanceof Collection) {
StringBuilder sb = new StringBuilder();
Collection<Object> a = (Collection<Object>) value;
if (a.isEmpty()) {
sb.append("(NULL)");
} else {
for (Object o : a) {
if (sb.length() == 0) {
sb.append("(?");
} else {
sb.append(", ?");
}
args.add(o);
}
sb.append(')');
}
return sb.toString();
} else {
args.add(value);
return "?";
}
}
@Override
public void onDirty() {
Comparison parent = (Comparison) this.getParentExpression();
ExpressionColumn otherSide = (ExpressionColumn) parent.getOther(this);
Column col = otherSide.getColumn();
Object newEditorKey = EditorWidgetFactory.createKey(col,
parent.getOperator());
if (lastColumn != col || !newEditorKey.equals(lastEditorKey)) {
final Widget w = EditorWidgetFactory.create(newEditorKey, getSession(),
col);
lb.setWidget(w);
final HasValue<Object> hv = (HasValue<Object>) w;
hv.addValueChangeHandler(new ValueChangeHandler<Object>() {
@Override
public void onValueChange(ValueChangeEvent<Object> event) {
value = hv.getValue();
if (value instanceof HasValue2) {
value = ((HasValue2) value).getValue();
}
fireDirty();
}
});
if (lastEditorKey != null || value == null) {
value = col.getEditor().getDefault();
}
hv.setValue(value, false);
lastColumn = col;
lastEditorKey = newEditorKey;
String style = col.getStyleName();
if (style != null) {
w.addStyleName(style);
}
}
}
public Widget getEditorWidget() {
return lb.getWidget();
}
@Override
public void showMessage(Message message) {
if (message != null) {
lb.setTitle(message.getText());
}
}
}