package ilarkesto.gwt.client.editor;
import ilarkesto.core.base.Str;
import ilarkesto.core.logging.Log;
import ilarkesto.gwt.client.AViewEditWidget;
import ilarkesto.gwt.client.DateAndTime;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.FocusListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class DateAndTimeEditorWidget extends AViewEditWidget {
private Label viewer;
private TextBox editor;
private ADateAndTimeEditorModel model;
public DateAndTimeEditorWidget(ADateAndTimeEditorModel model) {
super();
assert model != null;
this.model = model;
}
@Override
protected void onViewerUpdate() {
setViewerValue(model.getValue());
}
@Override
protected void onEditorUpdate() {
setEditorValue(model.getValue());
}
@Override
protected void onEditorSubmit() {
model.changeValue(getEditorValue());
}
@Override
protected final Widget onViewerInitialization() {
viewer = new Label();
return viewer;
}
@Override
protected final Widget onEditorInitialization() {
editor = new TextBox();
editor.addFocusListener(new EditorFocusListener());
editor.addKeyPressHandler(new EditorKeyboardListener());
return editor;
}
public final void setViewerValue(DateAndTime value) {
viewer.setText(value == null ? "." : value.toString());
}
public final void setEditorValue(DateAndTime value) {
editor.setText(value == null ? null : value.toString());
editor.setSelectionRange(0, editor.getText().length());
editor.setFocus(true);
}
public final DateAndTime getEditorValue() {
String s = editor.getText();
if (Str.isBlank(s)) return null;
try {
return new DateAndTime(s);
} catch (Exception ex) {
Log.DEBUG("Parsing date and time '" + s + "' failed: ", ex);
return null;
}
}
@Override
public boolean isEditable() {
return model.isEditable();
}
@Override
public String getTooltip() {
return model.getTooltip();
}
@Override
public String getId() {
return model.getId();
}
private class EditorKeyboardListener implements KeyPressHandler {
@Override
public void onKeyPress(KeyPressEvent event) {
char keyCode = event.getCharCode();
if (keyCode == KeyCodes.KEY_ENTER) {
submitEditor();
} else if (keyCode == KeyCodes.KEY_ESCAPE) {
cancelEditor();
}
}
}
private class EditorFocusListener implements FocusListener {
public void onFocus(Widget sender) {}
public void onLostFocus(Widget sender) {
submitEditor();
}
}
}