package ilarkesto.gwt.client;
import ilarkesto.core.base.Str;
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.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public abstract class AIntegerViewEditWidget extends AViewEditWidget {
private Label viewer;
private TextBox editor;
private ButtonWidget minus;
private ButtonWidget plus;
private SimplePanel wrapper;
private HorizontalPanel panel;
protected abstract void onMinusClicked();
protected abstract void onPlusClicked();
protected abstract void onIntegerViewerUpdate();
@Override
protected final Widget onViewerInitialization() {
viewer = new Label();
minus = new ButtonWidget(new MinusAction());
plus = new ButtonWidget(new PlusAction());
wrapper = new SimplePanel();
wrapper.setStyleName("AIntegerViewEditWidget");
return wrapper;
}
@Override
protected final void onViewerUpdate() {
boolean editable = isEditable();
if (panel == null || (editable && panel.getWidgetCount() < 3) || (!editable && panel.getWidgetCount() > 1)) {
panel = new HorizontalPanel();
if (editable) {
panel.add(minus.update());
panel.add(Gwt.createNbsp());
}
panel.add(viewer);
if (editable) {
panel.add(Gwt.createNbsp());
panel.add(plus.update());
}
wrapper.setWidget(panel);
}
onIntegerViewerUpdate();
}
@Override
protected final Widget onEditorInitialization() {
editor = new TextBox();
editor.setMaxLength(10);
editor.setWidth("50px");
editor.addFocusListener(new EditorFocusListener());
editor.addKeyPressHandler(new EditorKeyboardListener());
return editor;
}
public final void setViewerText(String text) {
if (Str.isBlank(text)) text = ".";
viewer.setText(text);
}
public final void setViewerValue(Integer value) {
setViewerValue(value, null);
}
public final void setViewerValue(Integer value, String suffix) {
String text = null;
if (value != null) {
text = value.toString();
if (suffix != null) text += " " + suffix;
}
setViewerText(text);
}
public final void setEditorValue(Integer value) {
editor.setText(value == null ? null : value.toString());
editor.setSelectionRange(0, editor.getText().length());
editor.setFocus(true);
}
public final Integer getEditorValue() {
String text = editor.getText();
if (text == null) {
return null;
} else {
text = text.trim();
if (text.length() == 0) {
return null;
} else {
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return null;
}
}
}
}
public final int getEditorValue(int alternativeValueForNull) {
Integer value = getEditorValue();
return value == null ? alternativeValueForNull : value;
}
private void plus() {
if (!isEditable()) return;
onPlusClicked();
}
private void minus() {
if (!isEditable()) return;
onMinusClicked();
}
private class EditorKeyboardListener implements KeyPressHandler {
@Override
public void onKeyPress(KeyPressEvent event) {
char keyCode = event.getCharCode();
if (isCancelKey(keyCode)) {
editor.cancelKey();
}
if (keyCode == KeyCodes.KEY_ENTER) {
submitEditor();
} else if (keyCode == KeyCodes.KEY_ESCAPE) {
cancelEditor();
}
}
private boolean isCancelKey(char keyCode) {
boolean chancelKey = true;
chancelKey &= Character.isDigit(keyCode) == false;
chancelKey &= keyCode != (char) KeyCodes.KEY_ENTER;
chancelKey &= (keyCode != (char) KeyCodes.KEY_TAB);
chancelKey &= (keyCode != (char) KeyCodes.KEY_BACKSPACE);
chancelKey &= (keyCode != (char) KeyCodes.KEY_DELETE);
chancelKey &= (keyCode != (char) KeyCodes.KEY_ESCAPE);
chancelKey |= (Character.valueOf(keyCode) == 46); // 46 = "."
return chancelKey;
}
}
private class EditorFocusListener implements FocusListener {
@Override
public void onFocus(Widget sender) {}
@Override
public void onLostFocus(Widget sender) {
submitEditor();
}
}
private class MinusAction extends AAction {
@Override
public String getLabel() {
return "-";
}
@Override
protected void onExecute() {
minus();
update();
}
}
private class PlusAction extends AAction {
@Override
public String getLabel() {
return "+";
}
@Override
protected void onExecute() {
plus();
update();
}
}
}