package org.aplikator.client.local.widgets;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.logging.Logger;
import org.aplikator.client.local.Aplikator;
import org.aplikator.client.shared.descriptor.PropertyDTO;
import org.gwtbootstrap3.client.ui.TextBox;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Command;
public class TextFieldWidget<T extends Serializable> extends DataFieldBase implements DataField<T> {
private static Logger LOG = Logger.getLogger(TextFieldWidget.class.getName());
private TextBox box = new TextBox();
private String format = null;
String oldValue = "";
public TextFieldWidget(String caption, PropertyDTO property, int size, String format) {
super(caption, property);
controlHolder.add(box);
//box.addStyleName(PaneWidgetResources.INSTANCE.css().formData());
box.addValueChangeHandler(new ValueChangeHandler<String>() {
public void onValueChange(ValueChangeEvent<String> event) {
//event.getValue()
setDirty(true);
}
});
box.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
if (!oldValue.equals(box.getValue())) {
oldValue = box.getValue();
ValueChangeEvent.fire(box, box.getValue());
}
}
});
if (property.getRefferedThrough() != null) {
this.setEnabled(false);
}
this.setGridSize(size);
this.format = format;
}
@SuppressWarnings({"unchecked", "deprecation"})
public T getValue() {
String strVal = box.getValue();
//LOG.fine("TextField getValue:"+strVal);
if (strVal == null || "".equals(strVal.trim()))
return null;
String type = getProperty().getType();
if ("java.lang.String".equals(type)) {
return (T) strVal;
} else if ("java.lang.Integer".equals(type)) {
try {
return (T) Integer.decode(strVal);
} catch (NumberFormatException ex) {
Messages.error(Aplikator.application.getConfigString("aplikator.field.invalidValue") + " " + label.getText() + " - " + strVal);
throw ex;
}
} else if ("java.math.BigDecimal".equals(type)) {
try {
BigDecimal rv = new BigDecimal(strVal);
//LOG.fine("TextField getValue return:"+rv);
return (T) rv;
} catch (NumberFormatException ex) {
Messages.error(Aplikator.application.getConfigString("aplikator.field.invalidValue") + " " + label.getText() + " - " + strVal);
throw ex;
}
} else if ("java.util.Date".equals(type)) {
try {
return (T) new Date(strVal);
} catch (IllegalArgumentException ex) {
Messages.error(Aplikator.application.getConfigString("aplikator.field.invalidValue") + " " + label.getText() + " - " + strVal);
throw ex;
}
} else {
throw new IllegalStateException("TextFieldWidget does not support the data type " + type);
}
}
public void setValue(T value) {
if (format == null) {
box.setValue(value != null ? value.toString() : null);
oldValue = value != null ? value.toString() : "";
} else {
if (value == null) {
box.setValue(null);
oldValue = "";
} else {
String formattedValue = value.toString();
String type = getProperty().getType();
if ("java.math.BigDecimal".equals(type)) {
formattedValue = NumberFormat.getFormat(format).format((BigDecimal) value);
}
box.setValue(formattedValue);
oldValue = formattedValue;
}
}
}
@SuppressWarnings({"unchecked", "rawtypes"})
public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) {
return box.addValueChangeHandler(handler);
}
public void setEnabled(boolean enabled) {
if (property.getRefferedThrough() != null) {
enabled = false;
}
box.setEnabled(enabled);
}
@Override
public void grabFocus() {
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
box.setFocus(true);
}
});
}
@Override
public void addEnterHandler(final Command command) {
box.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
event.stopPropagation();
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
command.execute();
}
}
});
}
}