package com.iambookmaster.client.quick; import java.util.ArrayList; import java.util.HashMap; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.iambookmaster.client.beans.AbstractParameter; import com.iambookmaster.client.beans.NPC; import com.iambookmaster.client.beans.Parameter; import com.iambookmaster.client.common.NumberTextBox; import com.iambookmaster.client.model.Model; public class QuickNPCEditor extends QuickAbstractParameterEditor { private NPC npc; private FlexTable parametersPanel; private HashMap<Parameter,Integer> widgets; private TextBox genitiveName; public QuickNPCEditor(Model mod) { super(mod); } @Override protected int getGridWidgetsCount() { return 1; } @Override public String getEditorName() { return appConstants.quickNPCTitle(); } @Override public Widget getTail() { ChangeHandler changeHandler = new ChangeHandler() { public void onChange(ChangeEvent event) { npc.setGenitiveName(genitiveName.getText()); updateParameter(event.getSource()); } }; genitiveName = new TextBox(); genitiveName.setWidth("100%"); genitiveName.addChangeHandler(changeHandler); genitiveName.setTitle(appConstants.quickNPCGenativeNameTitle()); addWidgetToGrid(genitiveName, appConstants.quickNPCGenativeName()); parametersPanel = new FlexTable(); parametersPanel.setSize("100%", "100%"); parametersPanel.getColumnFormatter().setWidth(0, "99%"); parametersPanel.getColumnFormatter().setWidth(1, "1%"); return parametersPanel; } public void open(AbstractParameter object) { super.open(object); npc = (NPC) object; genitiveName.setText(npc.getGenitiveName()==null ? "" : npc.getGenitiveName()); while (parametersPanel.getRowCount()>0) { parametersPanel.removeRow(0); } if (widgets==null) { widgets = new HashMap<Parameter,Integer>(); } widgets.clear(); for (Parameter parameter : npc.getValues().keySet()) { Integer val = npc.getValues().get(parameter); updateParameterWidget(parameter,val); } ArrayList<AbstractParameter> params = model.getParameters(); for (AbstractParameter abstractParameter : params) { if (abstractParameter instanceof Parameter) { Parameter parameter = (Parameter) abstractParameter; if (parameter.isHeroOnly()) { continue; } if (widgets.containsKey(parameter)==false) { updateParameterWidget(parameter,0); } } } } private void updateParameterWidget(Parameter parameter, Integer val) { ParameterWidger widget; if (widgets.containsKey(parameter)) { int row = widgets.get(parameter); widget = (ParameterWidger)parametersPanel.getWidget(row, 1); widget.update(parameter); } else { //add new Widget widget = new ParameterWidger(parameter); int row = parametersPanel.getRowCount(); if (row > 0) { row--; } row = parametersPanel.insertRow(row); widgets.put(parameter,row); parametersPanel.addCell(row); parametersPanel.addCell(row); parametersPanel.setWidget(row,0,widget.name); parametersPanel.setWidget(row,1,widget); } if (val != null) { widget.update(val); } } @Override protected void parameterWasAdded(AbstractParameter parameter) { if (parameter instanceof Parameter) { Parameter param = (Parameter) parameter; if (param.isHeroOnly()==false) { updateParameterWidget(param,null); } } } @Override protected void parameterWasRemoved(AbstractParameter parameter) { if (widgets.containsKey(parameter)) { parametersPanel.removeRow(widgets.get(parameter)); } } @Override protected void parameterWasUpdated(AbstractParameter parameter) { if (parameter instanceof Parameter) { Parameter param = (Parameter) parameter; if (param.isHeroOnly()) { //became "not for NPC" parametersPanel.removeRow(widgets.get(parameter)); } else if (widgets.containsKey(parameter)) { updateParameterWidget(param,null); } } } public class ParameterWidger extends NumberTextBox implements ChangeHandler{ private Label name; private Parameter parameter; public ParameterWidger(Parameter parameter) { name = new Label(); setMaxLength(3); setVisibleLength(4); addChangeHandler(this); update(parameter); } public void update(Parameter parameter) { this.parameter = parameter; name.setText(parameter.getName()); setTitle(parameter.getDescription()); } public void update(Integer value) { setValue(value); } public void onChange(ChangeEvent event) { if (getIntegerValue()==0) { //remove npc.getValues().remove(parameter); } else { //save npc.getValues().put(parameter, getIntegerValue()); } updateParameter(null); } } }