package com.iambookmaster.client.player;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MouseListener;
import com.google.gwt.user.client.ui.SourcesMouseEvents;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.beans.Battle;
import com.iambookmaster.client.beans.Modificator;
import com.iambookmaster.client.beans.NPC;
import com.iambookmaster.client.beans.ObjectBean;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.common.AnimationTimer;
import com.iambookmaster.client.common.ColorProvider;
import com.iambookmaster.client.common.SpanLabel;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.model.Model;
public class PlayerList extends VerticalPanel {
private PlayerState playerState;
private PlayerStateListener playerStateListener;
private FlowPanel bag;
private FlowPanel parameters;
private FlowPanel modificators;
private Model model;
private AnimationTimer animationTimer;
private Label bagLabel;
public PlayerList(Model model,PlayerState ps) {
this.model = model;
animationTimer = new AnimationTimer();
setSize("100%", "100%");
setStyleName(PlayerStyles.BAG_STYLE);
if (model.getSettings().getBagColor() != 0) {
DOM.setStyleAttribute(getBody(), "backgroundColor", ColorProvider.getColorName(model.getSettings().getBagColor()));
}
this.playerState = ps;
playerStateListener = new PlayerStateListener() {
public void addObject(ObjectBean object) {
addObjectToBag(object);
}
public void lostObject(ObjectBean object) {
removeObjectFromBag(object);
}
public void removeObject(ObjectBean object) {
removeObjectFromBag(object);
}
public void useObject(ObjectBean object,boolean success) {
//not for us
}
public void reset() {
update();
}
public void finish() {
int l = bag.getWidgetCount();
for (int i = 0; i < l; i++) {
Widget widget = bag.getWidget(i);
if (widget instanceof ItemWidget) {
ItemWidget itemWidget = (ItemWidget) widget;
itemWidget.finish();
}
}
}
public void changeParameter(Parameter parameter, int value) {
int l = parameters.getWidgetCount();
for (int i = 0; i < l; i++) {
ParameterWidget widget = (ParameterWidget)parameters.getWidget(i);
if (widget.parameter==parameter || widget.parameter.getLimit()==parameter) {
if (widget.parameter==parameter && value==0) {
parameters.remove(i);
} else {
widget.apply(parameter, playerState.getParameters(),true);
}
return;
}
}
if (parameter.isInvisible()) {
//do not show
return;
}
//not found, add
if (l==0) {
parameters.addStyleName(PlayerStyles.PARAMETERS_PANEL);
}
ParameterWidget widget = new ParameterWidget(parameter);
parameters.add(widget);
widget.apply(parameter, playerState.getParameters(),true);
}
public void battle(Battle parameter, boolean start) {
}
public void changeModificator(Modificator modificator, boolean add) {
if (modificators != null) {
int l = modificators.getWidgetCount();
for (int i = 1; i < l; i++) {
ModificatorWidget widget = (ModificatorWidget)modificators.getWidget(i);
if (widget.modificator==modificator) {
//exists
if (add==false) {
if (l==1) {
modificators.removeStyleName(PlayerStyles.MODIFICATORS_PANEL);
}
modificators.remove(i);
}
return;
}
}
if (add) {
//not exist - add
if (l==0) {
modificators.addStyleName(PlayerStyles.MODIFICATORS_PANEL);
}
modificators.add(new ModificatorWidget(modificator));
}
}
}
public void enemy(NPC npc, boolean add) {
}
public void disableConnection(ParagraphConnection connection) {
}
public void enableConnection(ParagraphConnection connection) {
}
};
playerState.addPlayerStateListener(playerStateListener);
Label label = new Label(AppLocale.getAppConstants().playerPlayerList());
label.setStyleName(PlayerStyles.BAG_TITLE);
add(label);
setCellHorizontalAlignment(label,HasHorizontalAlignment.ALIGN_CENTER);
setCellHeight(label,"1%");
setCellWidth(label,"100%");
parameters = new FlowPanel();
parameters.setSize("100%", "100%");
if (model.getSettings().getTextColor() != 0) {
DOM.setStyleAttribute(parameters.getElement(), "color", ColorProvider.getColorName(model.getSettings().getTextColor()));
}
add(parameters);
setCellHeight(parameters,"1%");
setCellWidth(parameters,"100%");
bag = new FlowPanel();
bag.setStyleName(PlayerStyles.BAG);
if (model.getSettings().getTextColor() != 0) {
DOM.setStyleAttribute(bag.getElement(), "color", ColorProvider.getColorName(model.getSettings().getTextColor()));
}
// bag.setSize("100%", "100%");
add(bag);
if (model.getSettings().isShowModificators()) {
setCellHeight(bag,"1%");
} else {
setCellHeight(bag,"99%");
}
setCellWidth(bag,"100%");
if (model.getSettings().isShowModificators()) {
modificators = new FlowPanel();
modificators.setStyleName(PlayerStyles.MODIFICATORS_PANEL);
if (model.getSettings().getTextColor() != 0) {
DOM.setStyleAttribute(modificators.getElement(), "color", ColorProvider.getColorName(model.getSettings().getTextColor()));
}
modificators.setSize("100%", "100%");
add(modificators);
HTML html = new HTML(" ");
html.setStyleName(PlayerStyles.FILLER);
add(html);
setCellHeight(html,"99%");
setCellWidth(html,"100%");
}
update();
}
public void setWidth(String width) {
super.setWidth(width);
if (bag != null) {
bag.setWidth(width);
}
if (parameters != null) {
parameters.setWidth(width);
}
if (modificators != null) {
modificators.setWidth(width);
}
}
private void update() {
parameters.clear();
if (bagLabel != null) {
remove(bagLabel);
}
bag.clear();
if (playerState.isBagEmpty()==false) {
Iterator<ObjectBean> iter = playerState.getObjectIterator();
while (iter.hasNext()) {
ObjectBean object = (ObjectBean) iter.next();
addObjectToBag(object);
}
}
LinkedHashMap<Parameter, Integer> params = playerState.getParameters();
if (params.size()>0) {
HashSet<Parameter> used = new HashSet<Parameter>(params.size());
for (Parameter parameter : params.keySet()) {
if (parameter.isInvisible()) {
continue;
}
if (used.contains(parameter)) {
//already used
continue;
}
//add parameter to the list
ParameterWidget widget = new ParameterWidget(parameter);
parameters.add(widget);
widget.apply(parameter, params,false);
if (parameter.getLimit() != null) {
used.add(parameter.getLimit());
}
}
parameters.addStyleName(PlayerStyles.PARAMETERS_PANEL);
} else {
parameters.removeStyleName(PlayerStyles.PARAMETERS_PANEL);
}
if (modificators != null) {
modificators.clear();
if (playerState.getModificators().size()>0) {
modificators.addStyleName(PlayerStyles.MODIFICATORS_PANEL);
} else {
modificators.removeStyleName(PlayerStyles.MODIFICATORS_PANEL);
}
if (playerState.getModificators() != null && playerState.getModificators().size()>0) {
for (Modificator modificator : playerState.getModificators()) {
modificators.add(new ModificatorWidget(modificator));
}
}
}
}
private void addObjectToBag(ObjectBean object) {
if (bag.getWidgetCount()==0) {
bagLabel = object.getIcon() == null ? new SpanLabel() : new Label();
if (model.getSettings().isHiddenUsingObjects()) {
bagLabel.setText(AppLocale.getAppConstants().playerListObjects());
} else {
bagLabel.setText(AppLocale.getAppConstants().playerListObjectsNoUse());
}
if (model.getSettings().getTextColor() != 0) {
DOM.setStyleAttribute(bagLabel.getElement(), "color", ColorProvider.getColorName(model.getSettings().getTextColor()));
}
bagLabel.setStyleName(PlayerStyles.BOLD);
insert(bagLabel,getWidgetIndex(bag));
}
ItemWidget widget = new ItemWidget(object);
bag.add(widget);
}
private void removeObjectFromBag(ObjectBean object) {
if (bag.getWidgetCount()>0) {
// bag.add(new SpanLabel(", "));
for (int i = 0; i < bag.getWidgetCount(); i++) {
Widget widget = bag.getWidget(i);
if (widget instanceof ItemWidget) {
ItemWidget itemWidget = (ItemWidget) widget;
if (itemWidget.object==object) {
bag.remove(widget);
break;
}
}
}
}
}
private void objectSelected(ObjectBean object) {
playerState.selectObject(object);
}
public class PlayerListWidget extends Label {
public PlayerListWidget() {
super(model.getSettings().isVerticalObjects() ? DOM.createDiv() : DOM.createSpan());
}
}
public class ModificatorWidget extends PlayerListWidget {
private Modificator modificator;
public ModificatorWidget(Modificator modificator) {
if (model.getSettings().isVerticalObjects()) {
setText(modificator.getName());
} else {
setText(modificator.getName()+",");
}
setWordWrap(false);
setStyleName(PlayerStyles.MODIFICATOR);
if (modificators.getWidgetCount()==0) {
SpanLabel label = new SpanLabel(AppLocale.getAppConstants().playerListModificators());
label.setStyleName(PlayerStyles.BOLD);
modificators.add(label);
}
this.modificator = modificator;
}
}
public class ParameterWidget extends PlayerListWidget {
private Parameter parameter;
public ParameterWidget(Parameter parameter) {
this.parameter = parameter;
setStyleName(PlayerStyles.HERO_LIST_PARAMETER);
if (model.getSettings().isVerticalObjects()) {
setWordWrap(false);
}
}
public void apply(Parameter param, Map<Parameter, Integer> params,boolean animate) {
int value = params.get(parameter);
if (parameter.getLimit()==null) {
if (parameter.isSuppressOneValue() && value==1) {
//show name only
setText(AppLocale.getAppMessages().playerParameterOneValue(parameter.getName()));
} else {
//no limit
setText(AppLocale.getAppMessages().playerParameterValue(parameter.getName(),value));
}
} else {
Integer limit = params.get(parameter.getLimit());
if (limit==null || parameter.getLimit().isInvisible()) {
//no limit
setText(AppLocale.getAppMessages().playerParameterValue(parameter.getName(),value));
} else {
//update value/limit
setText(AppLocale.getAppMessages().playerParameterValueLimit(parameter.getName(),value, params.get(parameter.getLimit())));
}
}
if (animate) {
animationTimer.add(this);
}
}
}
public class ItemWidget extends FlowPanel implements MouseListener,LoadHandler{
private ObjectBean object;
private Label text;
private boolean big;
private Image image;
public ItemWidget(ObjectBean object) {
setStyleName(PlayerStyles.OBJECT_IN_BAG);
this.object = object;
SourcesMouseEvents widget;
if (object.getIcon()==null) {
getElement().getStyle().setDisplay(model.getSettings().isVerticalObjects() ? Display.BLOCK : Display.INLINE_BLOCK);
setTitle(AppLocale.getAppConstants().playerClickToUse());
text = new Label();
if (model.getSettings().isVerticalObjects()) {
text.setText(object.getName());
text.setWordWrap(false);
} else {
text.setText(object.getName()+",");
}
widget = text;
add(text);
} else {
getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
setTitle(object.getName());
image = new Image();
image.addLoadHandler(this);
if (object.getIcon().getBigUrl()==null) {
image.setUrl(object.getIcon().getUrl() );
} else {
big = true;
image.setUrl(object.getIcon().getBigUrl());
}
add(image);
widget = image;
}
if (model.getSettings().isHiddenUsingObjects()) {
addStyleName(PlayerStyles.CLICKABLE);
widget.addMouseListener(this);
}
animationTimer.add(this);
}
public void finish() {
setTitle(null);
removeStyleName(PlayerStyles.CLICKABLE);
}
public void onMouseDown(Widget sender, int x, int y) {
objectSelected(object);
}
public void onMouseEnter(Widget sender) {
if (text==null) {
} else {
addStyleName(PlayerStyles.BAG_SELECTED);
}
}
public void onMouseLeave(Widget sender) {
if (text==null) {
} else {
removeStyleName(PlayerStyles.BAG_SELECTED);
}
}
public void onMouseMove(Widget sender, int x, int y) {
}
public void onMouseUp(Widget sender, int x, int y) {
}
public void onLoad(LoadEvent event) {
if (big) {
object.getIcon().setBigWidht(image.getWidth());
object.getIcon().setBigHeight(image.getHeight());
} else {
object.getIcon().setWidht(image.getWidth());
object.getIcon().setHeight(image.getHeight());
}
}
}
@Override
protected void onDetach() {
super.onDetach();
animationTimer.cancel();
}
}