package com.iambookmaster.client.editor; import java.util.ArrayList; 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.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.iambookmaster.client.Styles; import com.iambookmaster.client.beans.DiceValue; import com.iambookmaster.client.common.NumberTextBox; import com.iambookmaster.client.common.SpanLabel; public class DiceValueWidget { private static final int DEFAULT_VALUE = 3; private NumberTextBox constant; private NumberTextBox n; private ListBox size; private Label sign; private DiceValue diceValue; private ArrayList<ChangeHandler> handlers = new ArrayList<ChangeHandler>(); public DiceValueWidget(ComplexPanel panel) { ChangeHandler handler = new ChangeHandler() { public void onChange(ChangeEvent event) { if (event.getSource()==constant) { diceValue.setConstant(constant.getIntegerValue()); } else if (event.getSource()==n) { diceValue.setN(n.getIntegerValue()); } else if (event.getSource()==size) { try { diceValue.setSize(Integer.parseInt(size.getValue(size.getSelectedIndex()))); } catch (NumberFormatException e) { } } updateControls(); for (ChangeHandler handler : handlers) { handler.onChange(null); } } }; BlurHandler blurHandler = new BlurHandler() { public void onBlur(BlurEvent event) { if (event.getSource()==constant) { diceValue.setConstant(constant.getIntegerValue()); } else if (event.getSource()==n) { diceValue.setN(n.getIntegerValue()); } updateControls(); for (ChangeHandler handler : handlers) { handler.onChange(null); } } }; constant = new NumberTextBox(); constant.setStyleName(Styles.SMALL_TEXT); constant.setVisibleLength(4); constant.setMaxLength(4); constant.addBlurHandler(blurHandler); constant.setWidth("27px"); panel.add(constant); sign = new SpanLabel("+"); panel.add(sign); n = new NumberTextBox(); n.setVisibleLength(2); n.setMaxLength(2); n.addBlurHandler(blurHandler); n.setStyleName(Styles.SMALL_TEXT); n.setWidth("27px"); panel.add(n); panel.add(new SpanLabel("D")); size = new ListBox(); size.setWidth("40px"); size.setStyleName(Styles.SMALL_TEXT); size.addItem("0"); size.addItem("2"); size.addItem("4"); size.addItem("6"); size.addItem("8"); size.addItem("10"); size.addItem("12"); size.addItem("14"); size.addItem("16"); size.addItem("20"); size.addItem("24"); size.addItem("30"); size.addItem("34"); size.addItem("50"); size.addItem("100"); size.addChangeHandler(handler); size.setSelectedIndex(DEFAULT_VALUE); panel.add(size); } public void setEnabled(boolean enabled) { constant.setEnabled(enabled); n.setEnabled(enabled); size.setEnabled(enabled); } public void apply(DiceValue diceValue) { if (diceValue==null) { diceValue = new DiceValue(); } this.diceValue = diceValue; constant.setValue(diceValue.getConstant()); n.setValue(diceValue.getN()); size.setSelectedIndex(DEFAULT_VALUE); String sz = String.valueOf(diceValue.getSize()); for (int i = 0; i < size.getItemCount(); i++) { if (size.getItemText(i).endsWith(sz)) { size.setSelectedIndex(i); break; } } updateControls(); } private void updateControls() { if (diceValue.getN()<0 && diceValue.getSize()>0) { sign.setText(""); } else { sign.setText("+"); } } public void addChangeHandler(ChangeHandler changeHandler) { if (handlers.contains(changeHandler)==false) { handlers.add(changeHandler); } } public void removeChangeHandler(ChangeHandler changeHandler) { handlers.remove(changeHandler); } public DiceValue getDiceValue() { return diceValue; } }