package com.akjava.gwt.three.client.gwt.ui; import java.util.HashMap; import java.util.Map; import com.akjava.gwt.html5.client.input.Range; import com.akjava.gwt.lib.client.JavaScriptUtils; import com.akjava.gwt.lib.client.LogUtils; import com.akjava.gwt.lib.client.widget.EnterKeySupportTextBox; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; public class LabeledInputRangeWidget2 extends HorizontalPanel{ private Range range; private TextBox textBox; public TextBox getTextBox() { return textBox; } private Map<ValueChangeHandler<Number>,HandlerRegistration> registMap=new HashMap<ValueChangeHandler<Number>, HandlerRegistration>(); private Label label; private Button minusBt; private Button plusBt; public Label getLabel() { return label; } public LabeledInputRangeWidget2(String name,final Number min,final Number max,final Number step){ this.setVerticalAlignment(ALIGN_MIDDLE); label = new Label(name); label.setAutoHorizontalAlignment(ALIGN_CENTER); label.setWidth("120px"); add(label); range = new Range(name,min,max,step); range.setWidth("140px"); add(range); textBox = new EnterKeySupportTextBox() { @Override public void onEnterKeyDown() { double value=Double.valueOf(textBox.getValue()); range.setValue(value,true); } }; //textBox.setEnabled(true); textBox.setWidth("40px"); add(textBox); textBox.setValue(String.valueOf(range.getValue())); range.addValueChangeHandler(new ValueChangeHandler<Number>() { @Override public void onValueChange(ValueChangeEvent<Number> event) { setTextBoxText(String.valueOf(JavaScriptUtils.fixNumber(5, event.getValue().doubleValue()))); } }); minusBt = new Button("-"); minusBt.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { double value=range.getValue().doubleValue()-step.doubleValue(); if(value<min.doubleValue()){ value=min.doubleValue(); } range.setValue(value,true); } }); minusBt.setVisible(false); add(minusBt); plusBt = new Button("+"); plusBt.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { double value=range.getValue().doubleValue()+step.doubleValue(); if(value>max.doubleValue()){ value=max.doubleValue(); } range.setValue(value,true); } }); plusBt.setVisible(false); add(plusBt); } private boolean buttonVisible; public void setButtonVisible(boolean visible){ plusBt.setVisible(visible); minusBt.setVisible(visible); buttonVisible=visible; plusBt.setEnabled(range.isEnabled()); minusBt.setEnabled(range.isEnabled()); } public Range getRange() { return range; } public void setTextBoxText(String value){ int min=5; if(value.startsWith("-")){ min=6; } value=value.substring(0, Math.min(min, value.length()));//limit text textBox.setValue(value); } public void setValue(double value){ String text=String.valueOf(JavaScriptUtils.fixNumber(5, value)); setTextBoxText(text); range.setValue(value); } public void setValue(double value,boolean fire){ setTextBoxText(String.valueOf(JavaScriptUtils.fixNumber(5, value))); range.setValue(value,fire); } public double getValue(){ return (Double) range.getValue(); } public void addtRangeListener(ValueChangeHandler<Number> handler){ HandlerRegistration regist=range.addValueChangeHandler(handler); registMap.put(handler,regist); } public void removeRangeListener(ValueChangeHandler<Number> handler){ if(registMap.get(handler)!=null){ registMap.get(handler).removeHandler(); } } //TODO make style public void setEnabled(boolean enabled) { this.range.setEnabled(enabled); if(enabled){ label.getElement().getStyle().setColor("#000"); }else{ label.getElement().getStyle().setColor("#888"); } textBox.setReadOnly(!enabled); if(buttonVisible){ plusBt.setEnabled(enabled); minusBt.setEnabled(enabled); } } /*now range set .point value. public int parseDivided(Number value){ if(value instanceof Integer){ return 1; }else{ String v=String.valueOf(value); int s=v.indexOf("."); if(s==-1){ return 1; } return (int)Math.pow(10, v.length()-s); } }*/ }