package com.delect.motiver.client.presenter.guide; import java.util.List; import com.delect.motiver.client.AppController; import com.delect.motiver.client.event.ExerciseUpdatedEvent; import com.delect.motiver.client.event.WorkoutCreatedEvent; import com.delect.motiver.client.event.handler.ExerciseUpdatedEventHandler; import com.delect.motiver.client.event.handler.WorkoutCreatedEventHandler; import com.delect.motiver.client.presenter.guide.BeginnersGuidePresenter.BeginnersGuideDisplay; import com.delect.motiver.client.presenter.guide.BeginnersGuidePresenter.PointDirection; import com.delect.motiver.client.view.widget.MyButton; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.SimpleEventBus; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.delect.motiver.client.lang.LangTutorial; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.widget.ComponentManager; public abstract class GuideSteps { public abstract static class GuideStep { /** * Checks if everything is ready to do (=init) this step * @return true if ready */ public boolean isReady() { return true; } /** * Called when step is active * @param eventBus * @return false if step should be skipped */ public abstract boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display); /** * Called on constants basis to check if this step should be skipped * @return true if ready */ public boolean skip() { return false; } } public enum Guides { MAIN, WORKOUT_CREATE, NUTRITION } private static LangTutorial Lang = GWT.create(LangTutorial.class); private static String[] textsMain = new String[] { Lang.Main1(), Lang.Main2(), Lang.Main3(), Lang.Main4(), Lang.Main5(), Lang.Main6() }; /** * Adds steps to list * @param steps */ public static void addSteps(Guides target, List<GuideStep> steps) { //main if(target == Guides.MAIN) { GuideStep step0 = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { Window.scrollTo(0, 0); display.showTitle(AppController.Lang.FirstTimeTutorial()); display.showText(Lang.Main0()); return true; } }; steps.add(step0); //short description of main sections for(int i=1; i<=6; i++) { final int j = i; GuideStep step = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { Window.scrollTo(0, 0); display.showArrow("header-link-"+j, PointDirection.UP); display.showTitle(AppController.Lang.FirstTimeTutorial()); display.showText(textsMain[j-1]); return true; } }; steps.add(step); } } //creating workouts else if(target == Guides.WORKOUT_CREATE) { //go to workout page GuideStep step = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showArrow("header-link-2", PointDirection.UP); display.showTitle(AppController.Lang.TrainingSection()); display.showText(Lang.WorkoutCreate1()); return true; } @Override public boolean skip() { return History.getToken().contains("user/training"); } }; steps.add(step); //calendar view GuideStep step2 = new GuideStep() { @Override public boolean isReady() { return History.getToken().contains("user/training"); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate2()); display.showArrow("panel-note1", PointDirection.DOWN); display.showTitle(AppController.Lang.TrainingSection()); return true; } }; steps.add(step2); //user workouts GuideStep step3 = new GuideStep() { @Override public boolean isReady() { return History.getToken().contains("user/training"); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate3()); display.showArrow("panel-note2", PointDirection.DOWN); return true; } @Override public boolean skip() { return (DOM.getElementById("btn-add-workout") != null); } }; steps.add(step3); //create new workout GuideStep step4 = new GuideStep() { @Override public boolean isReady() { return (DOM.getElementById("btn-add-workout") != null); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate4()); display.showArrow("btn-add-workout", PointDirection.RIGHT); return true; } @Override public boolean skip() { return (DOM.getElementById("ni-btn-add") != null); } }; steps.add(step4); //enter workout's name GuideStep step5 = new GuideStep() { boolean skip = false; HandlerRegistration ret = null; @Override public boolean isReady() { return (DOM.getElementById("ni-btn-add") != null); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate5()); display.showArrow("ni-btn-add", PointDirection.UP); //listen for workout created event ret = eventBus.addHandler(WorkoutCreatedEvent.TYPE, new WorkoutCreatedEventHandler() { @Override public void onWorkoutCreated(WorkoutCreatedEvent event) { if(event.getWorkout() != null && event.getWorkout().getDate() == null) { skip = true; if(ret != null) ret.removeHandler(); } } }); return true; } @Override public boolean skip() { //if button clicked and workout element found return skip; } }; steps.add(step5); //workout created GuideStep step6 = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate6()); return true; } @Override public boolean skip() { return false; } }; steps.add(step6); //add exercise GuideStep step7 = new GuideStep() { boolean skip = false; private HandlerRegistration ret; @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate7()); //listen for workout created event ret = eventBus.addHandler(ExerciseUpdatedEvent.TYPE, new ExerciseUpdatedEventHandler() { @Override public void onExerciseUpdated(ExerciseUpdatedEvent event) { if(event.getExercise() != null && event.getExercise().getName() != null) { skip = true; if(ret != null) ret.removeHandler(); } } }); return true; } @Override public boolean skip() { return skip; } }; steps.add(step7); //edit exercise GuideStep step8 = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate8()); return true; } }; steps.add(step8); //move workout to date GuideStep step9 = new GuideStep() { private MyButton btnAdd; boolean skip = false; Listener<BaseEvent> listener; @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate9()); display.showArrow("panel-note1-btn1", PointDirection.DOWN); btnAdd = (MyButton)ComponentManager.get().get("panel-note1-btn1"); listener = new Listener<BaseEvent>() { @Override public void handleEvent(BaseEvent be) { skip = true; btnAdd.removeListener(Events.OnClick, listener); } }; btnAdd.addListener(Events.OnClick, listener); return true; } @Override public boolean skip() { return skip; } }; steps.add(step9); //select workout GuideStep step10 = new GuideStep() { @Override public boolean isReady() { return (DOM.getElementById("btn-add-workout") != null); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate10()); return true; } @Override public boolean skip() { return (DOM.getElementById("btn-move-to-date") != null || DOM.getElementById("btn-quick-select") != null); } }; steps.add(step10); //move workout GuideStep step11 = new GuideStep() { private boolean skip = false; private HandlerRegistration ret; @Override public boolean isReady() { return (DOM.getElementById("btn-move-to-date") != null || DOM.getElementById("btn-quick-select") != null); } @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate11()); display.showArrow( (DOM.getElementById("btn-move-to-date") != null)? "btn-move-to-date" : "btn-quick-select", PointDirection.LEFT); //listen for workout created event ret = eventBus.addHandler(WorkoutCreatedEvent.TYPE, new WorkoutCreatedEventHandler() { @Override public void onWorkoutCreated(WorkoutCreatedEvent event) { if(event.getWorkout() != null && event.getWorkout().getDate() != null) { skip = true; if(ret != null) ret.removeHandler(); } } }); return true; } @Override public boolean skip() { return skip; } }; steps.add(step11); //DONE! GuideStep step12 = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate12()); return true; } @Override public boolean skip() { return (DOM.getElementById("btn-move-to-date") != null || DOM.getElementById("btn-quick-select") != null); } }; steps.add(step12); //DONE! GuideStep step13 = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showText(Lang.WorkoutCreate13()); return true; } @Override public boolean skip() { return (DOM.getElementById("btn-move-to-date") != null || DOM.getElementById("btn-quick-select") != null); } }; steps.add(step13); } //nutrition else if(target == Guides.NUTRITION) { //coming soon GuideStep step = new GuideStep() { @Override public boolean init(SimpleEventBus eventBus, BeginnersGuideDisplay display) { display.showTitle(AppController.Lang.NutritionSection()); display.showText(Lang.Nutrition1()); return true; } }; steps.add(step); } } }