package com.iambookmaster.client.iphone;
import java.util.ArrayList;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Battle;
import com.iambookmaster.client.beans.ObjectBean;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.beans.ParagraphConnection;
import com.iambookmaster.client.common.SpanHTML;
import com.iambookmaster.client.common.SpanLabel;
import com.iambookmaster.client.iphone.images.IPhoneImages;
import com.iambookmaster.client.iphone.images.IPhoneStyles;
import com.iambookmaster.client.model.ParagraphParsingHandler;
import com.iambookmaster.client.player.PlayerState;
public abstract class IPhoneParagraphTextGenerator implements ParagraphParsingHandler {
private static final IPhoneStyles css = IPhoneImages.INSTANCE.css();
protected ArrayList<Link> links = new ArrayList<Link>();
protected ArrayList<Widget> widgets = new ArrayList<Widget>();
protected StringBuilder builder=new StringBuilder();
private int counter;
protected boolean mustGo;
private Paragraph next;
private final PlayerState playerState;
public IPhoneParagraphTextGenerator(PlayerState playerState) {
this.playerState = playerState;
}
public void addBattle(Battle battle, Paragraph paragraph) {
}
public void clear(Paragraph currentLocation) {
builder.setLength(0);
links.clear();
counter = 1;
widgets.clear();
mustGo = false;
next = currentLocation;
}
protected int getNextCounter() {
return counter++;
}
public Paragraph getNext() {
return next;
}
public boolean isMustGo() {
return mustGo;
}
public void addLinkTo(Paragraph current, final Paragraph next, ParagraphConnection connection) {
if (mustGo) {
//no condition check anymore
return;
}
boolean meet = playerState.meetsCondition(connection);
if (meet || playerState.alwaysVisible(connection)) {
if (meet && connection.getStrictness()==ParagraphConnection.STRICTNESS_MUST) {
mustGo = true;
//disable all previous links
for (Link link : links) {
link.setEnabled(false);
}
}
this.next = next;
Link link = createTextLink(next,connection,meet);
widgets.add(link);
links.add(link);
}
}
protected abstract Link createTextLink(Paragraph next2, ParagraphConnection connection, boolean hasBattle);
public void addObject(Paragraph current,ObjectBean objectBean,String key) {
}
public void addAlchemyFromValue(Paragraph paragraph, String value) {
builder.append(' ');
builder.append(value);
builder.append(' ');
SpanLabel label = new SpanLabel(value);
label.setStyleName(css.alchemyFromValue());
widgets.add(label);
}
public void addText(Paragraph current,String text) {
builder.append(text);
int i = text.indexOf('\n');
if (i<0) {
SpanLabel label = new SpanLabel(text.replace('\r',' '));
widgets.add(label);
} else {
int pos = 0;
while (i>=0) {
if (pos<i) {
//add text
SpanLabel label = new SpanLabel(text.substring(pos,i).replace('\r',' '));
widgets.add(label);
pos = i+1;
} else {
pos++;
}
HTML html = new HTML("<br/>");
html.getElement().getStyle().setDisplay(Display.INLINE);
widgets.add(html);
if (pos<text.length() && text.charAt(pos)=='\r') {
pos++;
}
i = text.indexOf('\n',pos);
}
SpanLabel label = new SpanLabel(text.substring(pos).replace('\r',' '));
widgets.add(label);
}
}
public void addAlchemy(Paragraph paragraph, String value,Alchemy alchemy) {
if (playerState.getModel().getSettings().isAddAlchemyToText()) {
builder.append(' ');
builder.append(value);
builder.append(' ');
SpanLabel label = new SpanLabel(value);
label.setStyleName(css.alchemyFromValue());
widgets.add(label);
}
}
public String getCurrentText() {
return builder.toString();
}
public static abstract class Link extends SpanHTML implements ClickHandler {
// public abstract void setEnabled(boolean enabled);
public void addBigWidget() {
}
public abstract void setEnabled(boolean enabled);
public String getNextName() {
return null;
}
public ParagraphConnection getConnection() {
return null;
}
}
}