package com.delect.motiver.client.presenter.guide;
import java.util.ArrayList;
import com.delect.motiver.client.presenter.Presenter;
import com.delect.motiver.client.presenter.guide.GuideSteps.GuideStep;
import com.delect.motiver.client.presenter.guide.GuideSteps.Guides;
import com.delect.motiver.client.service.MyServiceAsync;
import com.delect.motiver.client.view.Display;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.Timer;
public class BeginnersGuidePresenter extends Presenter {
/**
* Abstract class for view to extend
*/
public abstract static class BeginnersGuideDisplay extends Display {
public abstract void showTitle(String title);
public abstract void showText(String text);
public abstract void setHandler(BeginnersGuideHandler handler);
public abstract void setButtonEnabled(Button button, boolean enabled);
public abstract void showArrow(String id, PointDirection direction);
}
public interface BeginnersGuideHandler {
public void onButtonClicked(Button btn);
}
public enum Button {
PREVIOUS,
NEXT,
CLOSE
}
public enum PointDirection {
UP,
DOWN,
LEFT,
RIGHT
}
protected static final int LEVEL_WORKOUT_CREATE = 8;
private BeginnersGuideDisplay display = null;
private Timer t;
private int level = 0;
private int levelPrev = -1;
private ArrayList<GuideStep> steps;
public BeginnersGuidePresenter(MyServiceAsync rpcService, SimpleEventBus eventBus, BeginnersGuideDisplay display) {
super(rpcService, eventBus);
this.display = display;
}
@Override
public Display getView() {
return display;
}
@Override
public void onBind() {
display.setHandler(new BeginnersGuideHandler() {
@Override
public void onButtonClicked(Button btn) {
switch(btn) {
case NEXT:
level++;
break;
case PREVIOUS:
level--;
break;
case CLOSE:
stop();
break;
}
if(level < 1) {
level = 1;
}
}
});
}
@Override
public void onRun() {
steps = new ArrayList<GuideStep>();
GuideSteps.addSteps(Guides.MAIN, steps);
GuideSteps.addSteps(Guides.WORKOUT_CREATE, steps);
GuideSteps.addSteps(Guides.NUTRITION, steps);
threadRun();
highlight();
//start timer
t = new Timer() {
@Override
public void run() {
threadRun();
}
};
t.scheduleRepeating(500);
}
protected void threadRun() {
try {
display.setButtonEnabled(Button.PREVIOUS, (level != 0));
GuideStep step = steps.get(level);
//check if next step is ready
if(steps.size() > level+1) {
boolean isReady = steps.get(level+1).isReady();
display.setButtonEnabled(Button.NEXT, isReady);
//check if current step should be skipped
if(isReady && step.skip()) {
level++;
highlight();
return;
}
}
else
display.setButtonEnabled(Button.NEXT, false);
if(level != levelPrev) {
display.showArrow(null, PointDirection.UP);
step.init(eventBus, display);
levelPrev = level;
}
} catch (Exception e) {
}
}
@Override
public void onStop() {
if(t != null)
t.cancel();
}
}