package com.iambookmaster.client.iphone;
import java.util.ArrayList;
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.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Modificator;
import com.iambookmaster.client.beans.ObjectBean;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.common.SpanLabel;
import com.iambookmaster.client.iphone.common.IPhoneButton;
import com.iambookmaster.client.iphone.images.IPhoneImages;
import com.iambookmaster.client.iphone.images.IPhoneStyles;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.model.Model;
import com.iambookmaster.client.player.PlayerState;
public class IPhonePlayerList {
private static final AppConstants appConstants = AppLocale.getAppConstants();
private static IPhoneStyles css = IPhoneImages.INSTANCE.css();
private PlayerState playerState;
// private PlayerStateListener playerStateListener;
private Model model;
private IPhoneCanvas canvas;
private IPhoneViewListenerAdapter listener;
private IPhoneViewListener owner;
private ClickHandler close;
private IPhonePlayerListListener menuListener;
public void show(IPhoneViewListener owner,boolean leftToRight) {
this.owner = owner;
canvas.setListener(listener);
draw(true,leftToRight);
}
private void draw(boolean animate,boolean leftToRight) {
if (animate) {
canvas.clearWithAnimation(leftToRight);
} else {
canvas.clear();
}
canvas.setPageOrientation(true);
Label label = new Label(appConstants.playerPlayerList());
label.setStyleName(css.playListTitle());
canvas.add(label);
update();
canvas.add(new HTML("<br/>"));
IPhoneButton button = new IPhoneButton(appConstants.iphoneContinueGame(), close);
// label = new Label(appConstants.iphoneContinueGame());
// label.addClickHandler(close);
// label.setStyleName(css.stateSelection());
canvas.add(button);
canvas.addClickHandler(button, close);
canvas.done();
}
public IPhonePlayerList(Model model,PlayerState ps, IPhoneCanvas cv,IPhonePlayerListListener lst) {
this.model = model;
this.canvas = cv;
this.menuListener = lst;
this.playerState = ps;
listener = new IPhoneViewListenerAdapter() {
@Override
public void redraw(IPhoneCanvas viewer) {
draw(false,false);
}
@Override
public void forward() {
menuListener.forward();
}
@Override
public void back() {
menuListener.back();
}
};
close = new ClickHandler() {
public void onClick(ClickEvent event) {
menuListener.forward();
}
};
}
private void update() {
boolean next=false;
LinkedHashMap<Parameter, Integer> params = playerState.getParameters();
if (params.size()>0) {
HashSet<Parameter> used = new HashSet<Parameter>(params.size());
boolean first=true;
for (Parameter parameter : params.keySet()) {
if (used.contains(parameter) || parameter.isInvisible()) {
//already used or invisible
continue;
}
int vl = params.get(parameter);
if (vl==0) {
//do not show zero value
continue;
}
if (first) {
first = false;
Label label = new Label(appConstants.urlListParameters());
label.setStyleName(css.playListItemsTitle());
next = true;
canvas.add(label);
}
//add parameter to the list
ParameterWidget widget = new ParameterWidget(parameter);
canvas.add(widget);
widget.apply(parameter, params,vl);
if (parameter.getLimit() != null) {
used.add(parameter.getLimit());
}
}
}
if (playerState.isBagEmpty()==false) {
Label label = new Label(appConstants.playerListObjects());
label.setStyleName(css.playListItemsTitle());
canvas.add(label);
next = true;
Iterator<ObjectBean> iter = playerState.getObjectIterator();
FlowPanel panel = new FlowPanel();
panel.getElement().getStyle().setMarginTop(15, Unit.PX);
while (iter.hasNext()) {
ObjectBean object = (ObjectBean) iter.next();
if (object.getIcon()==null) {
ItemWidget widget = new ItemWidget(object);
panel.insert(widget,0);
canvas.addClickHandler(widget, widget);
} else {
ItemWidgetImage widget = new ItemWidgetImage(object);
panel.insert(widget,0);
canvas.addClickHandler(widget, widget);
}
}
canvas.add(panel);
}
//get available everywhere in peaceful time alchemy
ArrayList<Alchemy> list = playerState.getAlchemy(false,false);
if (list != null) {
Label label = new Label(appConstants.iphoneAvailableAlchemy());
label.setStyleName(css.playListItemsTitle());
canvas.add(label);
for (Alchemy alchemy : list) {
AlchemyWidget widget = new AlchemyWidget(alchemy);
canvas.addClickHandler(widget, widget);
canvas.add(widget);
}
}
if (model.getSettings().isShowModificators()) {
if (playerState.getModificators().size()>0) {
Label label = new Label(AppLocale.getAppConstants().playerListModificators());
label.setStyleName(css.playListItemsTitle());
if (next) {
//TODO
}
next = true;
canvas.add(label);
for (Modificator modificator : playerState.getModificators()) {
canvas.add(new ModificatorWidget(modificator));
}
}
}
}
private void objectSelected(ObjectBean object) {
playerState.selectObject(object);
}
public class ModificatorWidget extends Label {
public ModificatorWidget(Modificator modificator) {
if (model.getSettings().isVerticalObjects()) {
setText(modificator.getName());
} else {
setText(modificator.getName()+",");
}
setWordWrap(false);
if (canvas.isVertical()==false) {
getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
}
}
}
public class ParameterWidget extends FlowPanel {
private Parameter parameter;
private Label name;
private Label value;
public ParameterWidget(Parameter parameter) {
this.parameter = parameter;
name = new SpanLabel();
add(name);
value = new SpanLabel();
add(value);
setStyleName(css.playListParameter());
if (canvas.isVertical() || model.getSettings().isVerticalObjects()) {
} else {
getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
}
name.setText(parameter.getName()+":");
value.setStyleName(css.playListParameterValue());
}
public void apply(Parameter param, Map<Parameter, Integer> params, int vl) {
if (parameter.getLimit()==null || parameter.getLimit().isInvisible()) {
//no limit
if (param.isSuppressOneValue() && vl==1) {
value.setVisible(false);
name.setText(parameter.getName());
} else {
if (value.isVisible()==false) {
value.setVisible(true);
name.setText(parameter.getName()+":");
}
value.setText(String.valueOf(vl));
}
} else {
//update value/limit
value.setText(String.valueOf(vl)+"/"+params.get(parameter.getLimit()));
}
}
}
public class AlchemyWidget extends Label implements ClickHandler{
private Alchemy alchemy;
public AlchemyWidget(Alchemy alchemy) {
this.alchemy = alchemy;
setText(alchemy.getName());
setStyleName(css.playListObject());
addClickHandler(this);
if (canvas.isVertical()==false) {
getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
}
}
public void onClick(ClickEvent event) {
if (playerState.apply(alchemy)) {
draw(true,false);
}
}
}
public class ItemWidget extends Label implements ClickHandler{
private ObjectBean object;
public ItemWidget(ObjectBean obj) {
this.object = obj;
setText(object.getName());
if (model.getSettings().isHiddenUsingObjects()) {
setStyleName(css.playListObject());
setTitle(appConstants.playerClickToUse());
} else {
setStyleName(css.playListObjectPassive());
}
addClickHandler(this);
if (canvas.isVertical()==false) {
getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
}
}
public void onClick(ClickEvent event) {
// IPhoneConsole.addMessage("object "+object.getName()+", hidden="+model.getSettings().isHiddenUsingObjects());
if (model.getSettings().isHiddenUsingObjects()) {
objectSelected(object);
}
}
}
public class ItemWidgetImage extends Image implements ClickHandler{
private ObjectBean object;
public ItemWidgetImage(ObjectBean obj) {
this.object = obj;
//TODO big version
setUrl(obj.getIcon().getUrl());
if (model.getSettings().isHiddenUsingObjects()) {
// setStyleName(css.playListObject());
setTitle(appConstants.playerClickToUse());
} else {
// setStyleName(css.playListObjectPassive());
}
addClickHandler(this);
// if (canvas.isVertical()==false) {
// getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
// }
}
public void onClick(ClickEvent event) {
if (model.getSettings().isHiddenUsingObjects()) {
objectSelected(object);
}
}
}
}