/*******************************************************************************
* Copyright 2011 Antti Havanko
*
* This file is part of Motiver.fi.
* Motiver.fi is licensed under one open source license and one commercial license.
*
* Commercial license: This is the appropriate option if you want to use Motiver.fi in
* commercial purposes. Contact license@motiver.fi for licensing options.
*
* Open source license: This is the appropriate option if you are creating an open source
* application with a license compatible with the GNU GPL license v3. Although the GPLv3 has
* many terms, the most important is that you must provide the source code of your application
* to your users so they can be free to modify your application for their own needs.
******************************************************************************/
package com.delect.motiver.client.presenter.training;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.SimpleEventBus;
import com.delect.motiver.client.AppController;
import com.delect.motiver.client.Motiver;
import com.delect.motiver.client.event.WorkoutCreatedEvent;
import com.delect.motiver.client.event.WorkoutRemovedEvent;
import com.delect.motiver.client.event.WorkoutSelectCancelledEvent;
import com.delect.motiver.client.event.handler.WorkoutCreatedEventHandler;
import com.delect.motiver.client.event.handler.WorkoutRemovedEventHandler;
import com.delect.motiver.client.event.handler.WorkoutSelectCancelledEventHandler;
import com.delect.motiver.client.presenter.EmptyPresenter;
import com.delect.motiver.client.presenter.EmptyPresenter.EmptyDisplay;
import com.delect.motiver.client.presenter.Presenter;
import com.delect.motiver.client.presenter.training.WorkoutPresenter.WorkoutDisplay;
import com.delect.motiver.client.presenter.training.WorkoutsListPresenter.WorkoutsListDisplay;
import com.delect.motiver.client.service.MyServiceAsync;
import com.delect.motiver.client.view.Display;
import com.delect.motiver.client.view.EmptyView;
import com.delect.motiver.client.view.training.WorkoutView;
import com.delect.motiver.client.view.training.WorkoutsListView;
import com.delect.motiver.shared.RoutineModel;
import com.delect.motiver.shared.WorkoutModel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
/**
* Shows single day in routine
* @author Antti
*
*/
public class RoutineDayPresenter extends Presenter {
/**
* Abstract class for view to extend
*/
public abstract static class RoutineDayDisplay extends Display {
public abstract LayoutContainer getBodyContainer();
public abstract void setDay(int day);
public abstract void setHandler(RoutineDayHandler routineDayHandler);
public abstract void setModel(RoutineModel routine);
}
public interface RoutineDayHandler {
void newWorkout();
}
private int day;
private RoutineDayDisplay display;
private EmptyPresenter emptyPresenter;
private RoutineModel routine;
public List<WorkoutPresenter> workoutPresenters = new ArrayList<WorkoutPresenter>();
private List<WorkoutModel> workouts;
//child presenters
private WorkoutsListPresenter workoutsListPresenter;
/**
*
* @param rpcService
* @param eventBus
* @param display
* @param routine : which routine this belong
* @param day : 1-x
* @param workouts : workouts in this day
*/
public RoutineDayPresenter(MyServiceAsync rpcService, SimpleEventBus eventBus, RoutineDayDisplay display, RoutineModel routine, int day, List<WorkoutModel> workouts) {
super(rpcService, eventBus);
this.display = display;
this.routine = routine;
this.day = day;
this.workouts = workouts;
}
@Override
public Display getView() {
return display;
}
@Override
public void onBind() {
display.setModel(routine);
display.setDay(day);
display.setHandler(new RoutineDayHandler() {
@Override
public void newWorkout() {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
if(workoutsListPresenter != null) {
workoutsListPresenter.stop();
}
workoutsListPresenter = new WorkoutsListPresenter(rpcService, eventBus, (WorkoutsListDisplay)GWT.create(WorkoutsListView.class), routine, day);
workoutsListPresenter.run(display.getBodyContainer());
}
});
//EVENT: new workout created. If added to this routine -> refresh
addEventHandler(WorkoutCreatedEvent.TYPE, new WorkoutCreatedEventHandler() {
@Override
public void onWorkoutCreated(WorkoutCreatedEvent event) {
//if correct day add new presenter
if(event.getWorkout().getDayInRoutine() == day) {
if(workoutsListPresenter != null) {
workoutsListPresenter.stop();
}
addNewPresenter(event.getWorkout());
}
}
});
//EVENT: workout removed
addEventHandler(WorkoutRemovedEvent.TYPE, new WorkoutRemovedEventHandler() {
@Override
public void onWorkoutRemoved(WorkoutRemovedEvent event) {
if(workoutPresenters.size() == 0) {
return;
}
//if correct day add new presenter
if(event.getWorkout().getDayInRoutine() == day) {
for(WorkoutPresenter wp : workoutPresenters) {
if(wp.workout.getId() == event.getWorkout().getId()) {
wp.stop();
workoutPresenters.remove(wp);
}
break;
}
//if no workouts
if(workoutPresenters.size() == 0) {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
emptyPresenter = new EmptyPresenter(rpcService, eventBus, (EmptyDisplay)GWT.create(EmptyView.class), AppController.Lang.NoWorkouts(), EmptyPresenter.EMPTY_LOADING_SMALL);
emptyPresenter.run(display.getBodyContainer());
}
}
}
});
//EVENT: workout selection cancelled -> show empty presenter if no workouts
addEventHandler(WorkoutSelectCancelledEvent.TYPE, new WorkoutSelectCancelledEventHandler() {
@Override
public void onCancel(WorkoutSelectCancelledEvent event) {
//if no workouts
if(workoutPresenters.size() == 0 && event.getSource().equals(workoutsListPresenter)) {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
emptyPresenter = new EmptyPresenter(rpcService, eventBus, (EmptyDisplay)GWT.create(EmptyView.class), AppController.Lang.NoWorkouts(), EmptyPresenter.EMPTY_LOADING_SMALL);
emptyPresenter.run(display.getBodyContainer());
}
}
});
}
@Override
public void onRun() {
showWorkouts();
}
@Override
public void onStop() {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
if(workoutsListPresenter != null) {
workoutsListPresenter.stop();
}
if(workoutPresenters != null) {
for(int i=0; i < workoutPresenters.size(); i++) {
final Presenter presenter = workoutPresenters.get(i);
if(presenter != null) {
presenter.stop();
}
}
workoutPresenters.clear();
}
}
/**
* Shows workouts
* @param index
*/
private void showWorkouts() {
//no workouts
if(workouts.size() == 0) {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
emptyPresenter = new EmptyPresenter(rpcService, eventBus, (EmptyDisplay)GWT.create(EmptyView.class), AppController.Lang.NoWorkouts(), EmptyPresenter.EMPTY_LOADING_SMALL);
emptyPresenter.run(display.getBodyContainer());
}
else {
for(WorkoutModel m : workouts) {
addNewPresenter(m);
}
}
}
/**
* Adds new presenter to view
* @param day in routine
* @param presenter
*/
protected void addNewPresenter(WorkoutModel workout) {
try {
if(emptyPresenter != null) {
emptyPresenter.stop();
}
WorkoutPresenter presenter = new WorkoutPresenter(rpcService, eventBus, (WorkoutDisplay)GWT.create(WorkoutView.class), workout);
workoutPresenters.add(presenter);
presenter.run(display.getBodyContainer());
} catch (Exception e) {
Motiver.showException(e);
}
}
}