/******************************************************************************* * Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com). * * This file is part of Dawg6's Demon Hunter DPS Calculator. * * Dawg6's Demon Hunter DPS Calculator is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dawg6's Demon Hunter DPS Calculator is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package com.dawg6.web.dhcalc.client; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.ValueBox; public abstract class BaseSpinner<T> extends Composite { protected final ValueBox<T> box; protected final Button up; protected final Button down; protected T min; protected T max; protected T increment; /** * @wbp.parser.constructor */ protected BaseSpinner(ValueBox<T> box, String text, T min, T max, T increment) { this.box = box; this.min = min; this.max = max; this.increment = increment; box.addKeyUpHandler(new KeyUpHandler(){ @Override public void onKeyUp(KeyUpEvent event) { keyPressed(); }}); box.addFocusHandler(new FocusHandler(){ @Override public void onFocus(FocusEvent event) { normalize(); }}); box.addBlurHandler(new BlurHandler(){ @Override public void onBlur(BlurEvent event) { normalize(); }}); box.addChangeHandler(new ChangeHandler(){ @Override public void onChange(ChangeEvent event) { normalize(); } }); HorizontalPanel horizontalPanel = new HorizontalPanel(); horizontalPanel.setStyleName("spinner"); horizontalPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); initWidget(horizontalPanel); down = new Button(); down.setText("-"); down.setStyleName("spinnerDownButton"); horizontalPanel.add(down); down.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { increment(-1); }}); box.setStyleName("spinnerBox"); box.setText(text); horizontalPanel.add(box); box.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { BaseSpinner.this.box.selectAll(); }}); up = new Button(); up.setText("+"); up.setStyleName("spinnerUpButton"); horizontalPanel.add(up); up.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { increment(1); }}); } protected abstract void keyPressed(); protected void normalize() { setValue(getValue()); } protected abstract void increment(int step); protected abstract T bound(T value); protected abstract T parse(String text); public void setValue(T value) { T a = getValue(); T b = bound(value); if (!isEqual(a, b)) { this.box.setValue(b); DomEvent.fireNativeEvent(Document.get().createChangeEvent(), box); } } public T getValue() { T value = this.box.getValue(); if (value == null) { value = min; this.box.setValue(value); } return value; } public void setVisibleLength(int w) { box.setVisibleLength(w); } public String getText() { return box.getText(); } public void setText(String text) { setValue(parse(text)); } public HandlerRegistration addChangeHandler(ChangeHandler handler) { return box.addChangeHandler(handler); } public T getMin() { return min; } public void setMin(T min) { this.min = min; normalize(); } public T getMax() { return max; } public void setMax(T max) { this.max = max; normalize(); } @Override public void setTitle(String title) { box.setTitle(title); } @Override public String getTitle() { return box.getTitle(); } public T getIncrement() { return this.increment; } public void setIncrement(T i) { this.increment = i; } protected abstract boolean isEqual(T a, T b); }