package ilarkesto.gwt.client.editor;
import ilarkesto.core.base.Str;
import ilarkesto.gwt.client.AViewEditWidget;
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 TextEditorWidget extends AViewEditWidget {
private Label viewer;
private TextBox editor;
private ATextEditorModel model;
public TextEditorWidget(ATextEditorModel model) {
super();
this.model = model;
}
@Override
protected final Widget onViewerInitialization() {
viewer = new Label();
return viewer;
}
@Override
protected final Widget onEditorInitialization() {
editor = new TextBox();
editor.setMaxLength(model.getMaxLenght());
editor.setWidth("97%");
editor.addFocusListener(new EditorFocusListener());
editor.addKeyPressHandler(new EditorKeyboardListener());
return editor;
}
@Override
protected void onViewerUpdate() {
setViewerText(model.getValue());
}
@Override
protected void onEditorUpdate() {
setEditorText(model.getValue());
}
@Override
protected void onEditorSubmit() {
String value = getEditorText();
// TODO check lenght
// TODO check format/syntax
model.changeValue(value);
// TODO catch exceptions
}
public final void setViewerText(String text) {
if (Str.isBlank(text)) text = ".";
viewer.setText(text);
}
public final void setEditorText(String text) {
editor.setText(text);
focusEditor();
editor.setSelectionRange(0, editor.getText().length());
}
@Override
public boolean isEditable() {
return model.isEditable();
}
@Override
protected void focusEditor() {
editor.setFocus(true);
}
public final String getEditorText() {
return editor.getText();
}
protected Label getViewer() {
return viewer;
}
public TextEditorWidget switchToEditModeIfNull() {
if (isEditable() && Str.isBlank(model.getValue())) switchToEditMode();
return this;
}
@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();
}
}
}