001/* 002 * #%L 003 * GwtMaterial 004 * %% 005 * Copyright (C) 2015 - 2017 GwtMaterialDesign 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package gwt.material.design.client.base; 021 022import com.google.gwt.dom.client.Document; 023import com.google.gwt.text.shared.Parser; 024import com.google.gwt.text.shared.Renderer; 025import com.google.gwt.user.client.ui.ValueBox; 026import gwt.material.design.client.ui.MaterialNumberBox; 027 028import java.io.IOException; 029import java.text.ParseException; 030 031/** 032 * Base class to handle number values on {@code <input type="number">} elements. 033 * <p> 034 * The parsing and formatting is done by the browser, using the user specific i18n settings. 035 * 036 * @author gilberto-torrezan 037 * @see MaterialNumberBox 038 */ 039@SuppressWarnings({"rawtypes", "unchecked"}) 040public class NumberBox<T> extends ValueBox<T> { 041 042 public NumberBox(NumberHandler handler) { 043 // currently there's no way to create a <input type="number"> directly 044 super(Document.get().createTextInputElement(), handler, handler); 045 } 046 047 public static class NumberHandler<T> implements Renderer<T>, Parser<T> { 048 049 MaterialNumberBox<T> numberBox; 050 051 public NumberHandler(MaterialNumberBox<T> numberBox) { 052 this.numberBox = numberBox; 053 } 054 055 /* 056 * Note: This assumes that getValue() from the custom MaterialNumberBox was overridden to avoid using the parser. 057 */ 058 @Override 059 public T parse(CharSequence text) throws ParseException { 060 return numberBox.getValue(); 061 } 062 063 @Override 064 public String render(T object) { 065 if (object == null) { 066 return ""; 067 } 068 return object.toString(); 069 } 070 071 @Override 072 public void render(T object, Appendable appendable) throws IOException { 073 appendable.append(render(object)); 074 } 075 } 076 077}