package com.iambookmaster.client.editor;
import java.util.ArrayList;
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.user.client.Window;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.Images;
import com.iambookmaster.client.Styles;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.beans.ParametersCalculation;
import com.iambookmaster.client.common.SpanLabel;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.model.Model;
public class ParametersCalculationWidget extends VerticalPanel {
private AppConstants appConstants = AppLocale.getAppConstants();
private Model model;
private String name;
private DiceValueWidget constant;
private SimpleParameterListBox parameterSelection;
private ParametersCalculation calculation;
private Image addParameter;
private ArrayList<ChangeHandler> handlers = new ArrayList<ChangeHandler>();
private FlowPanel flowPanel;
private FlowPanel addPanel;
private CheckBox overflowControl;
private Image minusParameter;
public ParametersCalculationWidget(String title, Model mod,boolean npcOnly,boolean overflowControlControl) {
setSize("100%", "100%");
flowPanel = new FlowPanel();
add(flowPanel);
setCellHeight(flowPanel, "99%");
addPanel = new FlowPanel();
add(addPanel);
model = mod;
name = title;
//tail
ClickHandler handler = new ClickHandler(){
public void onClick(ClickEvent event) {
if (parameterSelection.isEnabled()==false) {
return;
}
if (event.getSource()==overflowControl) {
calculation.setOverflowControl(overflowControl.getValue());
return;
}
Parameter parameter = parameterSelection.getSelectedParameter();
if (parameter==null) {
return;
}
if (calculation.getParameters().containsKey(parameter)) {
Window.alert(appConstants.battleParameterAlreadyAdded());
return;
}
if (event.getSource()==addParameter) {
calculation.getParameters().put(parameter, 1);
} else if (event.getSource()==minusParameter) {
calculation.getParameters().put(parameter, -1);
}
addParameterToPanel(parameter);
for (ChangeHandler handler : handlers) {
handler.onChange(null);
}
}
};
if (overflowControlControl) {
overflowControl = new CheckBox();
overflowControl.addClickHandler(handler);
if (model.getSettings().isOverflowControl()) {
overflowControl.setTitle(appConstants.calculationNoOverflowControl());
} else {
overflowControl.setTitle(appConstants.calculationOverflowControl());
}
addPanel.add(overflowControl);
}
addParameter = new Image(Images.ADD_CONNECTION);
addParameter.setStyleName(Styles.CLICKABLE);
addParameter.addClickHandler(handler);
addParameter.setTitle(appConstants.battlePlusParameter());
addPanel.add(addParameter);
minusParameter = new Image(Images.MINUS);
minusParameter.setStyleName(Styles.CLICKABLE);
minusParameter.addClickHandler(handler);
minusParameter.setTitle(appConstants.battleMinusParameter());
addPanel.add(minusParameter);
parameterSelection = new SimpleParameterListBox(model,npcOnly);
addPanel.add(parameterSelection);
}
public void apply(ParametersCalculation calc) {
flowPanel.clear();
this.calculation = calc;
SpanLabel label = new SpanLabel(name+" = ");
label.setStyleName(Styles.BOLD);
flowPanel.add(label);
constant = new DiceValueWidget(flowPanel);
constant.apply(calculation.getConstant());
constant.addChangeHandler(new ChangeHandler(){
public void onChange(ChangeEvent event) {
for (ChangeHandler handler : handlers) {
handler.onChange(null);
}
}
});
if (overflowControl != null) {
overflowControl.setValue(calc.isOverflowControl());
}
// add(constant);
//parameters
for (Parameter parameter : calculation.getParameters().keySet()) {
addParameterToPanel(parameter);
}
}
private void addParameterToPanel(final Parameter parameter) {
Integer value = calculation.getParameters().get(parameter);
ParameterWidget parameterWidget = new ParameterWidget(parameter,value);
parameterWidget.addTo(flowPanel);
}
private void removeParamer(Parameter parameter, ParameterWidget remove) {
remove.removeFrom(flowPanel);
calculation.getParameters().remove(parameter);
for (ChangeHandler handler : handlers) {
handler.onChange(null);
}
}
public void addChangeHandler(ChangeHandler changeHandler) {
if (handlers.contains(changeHandler)==false) {
handlers.add(changeHandler);
}
}
public void removeChangeHandler(ChangeHandler changeHandler) {
handlers.remove(changeHandler);
}
public void setEnabled(boolean enabled) {
constant.setEnabled(enabled);
parameterSelection.setEnabled(enabled);
for (int i = 0; i < getWidgetCount(); i++) {
Widget widget = getWidget(i);
if (widget instanceof Image) {
Image image = (Image) widget;
if (enabled) {
image.addStyleName(Styles.CLICKABLE);
} else {
image.removeStyleName(Styles.CLICKABLE);
}
}
}
}
public class ParameterWidget extends SpanLabel implements ClickHandler{
// ,ChangeHandler{
private Parameter parameter;
private SpanLabel name;
// private NumberTextBox value;
private Image remove;
public void onClick(ClickEvent event) {
if (parameterSelection.isEnabled()==false) {
return;
}
removeParamer(parameter,this);
}
public void addTo(FlowPanel flowPanel) {
flowPanel.add(this);
// flowPanel.add(value);
flowPanel.add(name);
flowPanel.add(remove);
}
public void removeFrom(FlowPanel flowPanel) {
flowPanel.remove(this);
// flowPanel.remove(value);
flowPanel.remove(name);
flowPanel.remove(remove);
}
public ParameterWidget(Parameter parameter, Integer val) {
remove = new Image(Images.CLOSE_PANEL);
remove.setTitle(appConstants.calculationRemoveParameter());
remove.setStyleName(Styles.CLICKABLE);
remove.addStyleName(Styles.ALIGN_TOP);
remove.addClickHandler(this);
name = new SpanLabel();
// value = new NumberTextBox();
// value.setStyleName(Styles.SMALL_TEXT);
// value.setMaxLength(2);
// value.setWidth("27px");
// value.setVisibleLength(2);
// value.addChangeHandler(this);
// value.setTitle(appConstants.calculationValueParameter());
apply(parameter);
apply(val);
}
private void apply(Integer val) {
setText(val>0 ? "+":"-");
// value.setValue(val);
}
private void apply(Parameter parameter) {
this.parameter = parameter;
name.setText(parameter.getName());
}
// public void onChange(ChangeEvent event) {
// Integer val = value.getIntegerValue();
// calculation.getParameters().put(parameter, val);
// apply(val);
// }
}
}