/******************************************************************************* * 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.Date; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.SimpleEventBus; import com.google.gwt.user.client.Window; import com.delect.motiver.client.AppController; import com.delect.motiver.client.Motiver; import com.delect.motiver.client.MyAsyncCallback; import com.delect.motiver.client.event.RoutineCreatedEvent; import com.delect.motiver.client.event.RoutineRemovedEvent; import com.delect.motiver.client.event.RoutineSelectCancelledEvent; import com.delect.motiver.client.event.RoutineSelectedEvent; import com.delect.motiver.client.event.RoutineShowEvent; import com.delect.motiver.client.event.UserSelectedEvent; import com.delect.motiver.client.event.handler.RoutineCreatedEventHandler; import com.delect.motiver.client.event.handler.RoutineRemovedEventHandler; import com.delect.motiver.client.event.handler.RoutineSelectedEventHandler; import com.delect.motiver.client.event.handler.RoutineShowEventHandler; import com.delect.motiver.client.event.handler.UserSelectedEventHandler; import com.delect.motiver.client.presenter.Presenter; import com.delect.motiver.client.presenter.training.RoutinePresenter.RoutineDisplay; import com.delect.motiver.client.presenter.training.RoutinesListSearchPresenter.RoutinesListSearchDisplay; import com.delect.motiver.client.presenter.training.RoutinesListSubPresenter.RoutinesListSubDisplay; import com.delect.motiver.client.service.MyServiceAsync; import com.delect.motiver.client.view.Display; import com.delect.motiver.client.view.training.RoutineView; import com.delect.motiver.client.view.training.RoutinesListSearchView; import com.delect.motiver.client.view.training.RoutinesListSubView; import com.delect.motiver.shared.RoutineModel; import com.delect.motiver.shared.util.CommonUtils; import com.extjs.gxt.ui.client.widget.LayoutContainer; /** * 3 "pages": (with search box on top) * <br>- main page (shows user's routines, most popular) * <br>- search results * <br>- single routine (when individual routine is selected) * <br>- Fires routine created event when routine is selected and stops itself * @author Antti * */ public class RoutinesListPresenter extends Presenter { /** * Abstract class for view to extend */ public abstract static class RoutinesListDisplay extends Display { public abstract LayoutContainer getDataContainer(); public abstract void setBackButtonVisible(boolean b); public abstract void setCancelButtonVisible(boolean b); public abstract void setCopyButtonVisible(boolean b); public abstract void setHandler(RoutinesListHandler routinesListHandler); public abstract void setMoveToDateButtonVisible(boolean b, Date date); public abstract void setQuickSelectionButtonVisible(boolean b, Date date); } public interface RoutinesListHandler { void onBackButtonClicked(); void onCancelButtonClicked(); void onCopyButtonClicked(); void onMoveToDateButtonClicked(); void onQuickSelectionButtonClicked(); void search(String query); } private Date date; private RoutinesListDisplay display; private String lastQuery = ""; private int lastView = 0; private List<RoutineModel> quickSelectionRoutines = new ArrayList<RoutineModel>(); //meals which are selected private long routineId = 0; private RoutinesListSearchPresenter routinesListSearchPresenter; //child presenters private RoutinesListSubPresenter routinesListSubPresenter; private RoutinePresenter singleRoutinePresenter; /** * * @param rpcService * @param eventBus * @param display * @param date * @param routineId : if some routine is open as default */ public RoutinesListPresenter(MyServiceAsync rpcService, SimpleEventBus eventBus, RoutinesListDisplay display, Date date, long routineId) { super(rpcService, eventBus); this.display = display; this.date = date; this.routineId = routineId; boolean quickSelectionEnabled = (date != null); routinesListSubPresenter = new RoutinesListSubPresenter(rpcService, eventBus, (RoutinesListSubDisplay)GWT.create(RoutinesListSubView.class), quickSelectionEnabled); } @Override public Display getView() { return display; } @Override public void onBind() { display.setHandler(new RoutinesListHandler() { @Override public void onBackButtonClicked() { //coming back from search results if(singleRoutinePresenter == null) { showMainView(); } //if coming back from single exercise else { //unbind routine singleRoutinePresenter.stop(); singleRoutinePresenter = null; //last view was search results if(lastView == 1) { loadSearch(lastQuery); } //last view was main menu else { showMainView(); } } } @Override public void onCancelButtonClicked() { //unbind this stop(); //fire cancel event eventBus.fireEvent(new RoutineSelectCancelledEvent(date)); } @Override public void onCopyButtonClicked() { copyRoutine(); } @Override public void onMoveToDateButtonClicked() { //get meal from single presenter List<RoutineModel> routines = new ArrayList<RoutineModel>(); routines.add(singleRoutinePresenter.routine); moveRoutineToDate(routines); } @Override public void onQuickSelectionButtonClicked() { //get meals from quick selection moveRoutineToDate(quickSelectionRoutines); quickSelectionRoutines.clear(); } @Override public void search(String query) { loadSearch(query); } }); //EVENT: routine created -> open routine addEventHandler(RoutineCreatedEvent.TYPE, new RoutineCreatedEventHandler() { @Override public void onRoutineCreated(RoutineCreatedEvent event) { //if no date if(event.getRoutine() != null) { if(event.getRoutine().getDate() == null) { showSingleRoutine(event.getRoutine()); } } } }); //EVENT: routine removed -> show main view addEventHandler(RoutineRemovedEvent.TYPE, new RoutineRemovedEventHandler() { @Override public void onRoutineRemoved(RoutineRemovedEvent event) { //if routine in list if(event.getRoutine() != null) { showMainView(); } } }); //EVENT: show routine addEventHandler(RoutineShowEvent.TYPE, new RoutineShowEventHandler() { @Override public void selectRoutine(RoutineShowEvent event) { showSingleRoutine(event.getRoutine()); } }); //EVENT: routine selected (quick select) addEventHandler(RoutineSelectedEvent.TYPE, new RoutineSelectedEventHandler() { @Override public void routineSelected(RoutineSelectedEvent event) { setQuickSelection(event.getRoutine(), event.isSelected()); } }); //EVENT: user selected -> show blog addEventHandler(UserSelectedEvent.TYPE, new UserSelectedEventHandler() { @Override public void userSelected(UserSelectedEvent event) { //open blog in new window Window.open(event.getUser().getBlogUrl(), "_blank", "status=1,toolbar=1,location=1,menubar=1,directories=1,resizable=1,scrollbars=1"); } }); //if date -> show inner title if(date != null) { //info text display.setTitle(AppController.Lang.SelectRoutine()); display.setCancelButtonVisible(true); } } @Override public void onRefresh() { super.onRefresh(); //highlight and scroll highlight(); } @Override public void onRun() { //show single routine if(routineId != 0) { rpcService.getRoutine(routineId, new MyAsyncCallback<RoutineModel>() { @Override public void onSuccess(RoutineModel result) { showSingleRoutine(result); } }); } else { showMainView(); } //highlight and scroll highlight(); } @Override public void onStop() { if(routinesListSubPresenter != null) { routinesListSubPresenter.stop(); } if(singleRoutinePresenter != null) { singleRoutinePresenter.stop(); } if(routinesListSearchPresenter != null) { routinesListSearchPresenter.stop(); } } /** * Copies routine ro routine or to our routines */ protected void copyRoutine() { try { display.setContentEnabled(false); //get routine from single presenter RoutineModel model = singleRoutinePresenter.routine; //reset date model.setDate(null); //add routine rpcService.addRoutine(model, new MyAsyncCallback<RoutineModel>() { @Override public void onSuccess(RoutineModel result) { display.setContentEnabled(true); //fire event eventBus.fireEvent(new RoutineCreatedEvent(result)); } }); } catch (Exception e) { Motiver.showException(e); } } /** * Moves routine to date */ protected void moveRoutineToDate(List<RoutineModel> routines) { try { display.setContentEnabled(false); //set date for(RoutineModel model : routines) model.setDate(CommonUtils.trimDateToDatabase(date, true)); //add routine rpcService.addRoutines(routines, new MyAsyncCallback<List<RoutineModel>>() { @Override public void onSuccess(List<RoutineModel> result) { display.setContentEnabled(true); stop(); List<RoutineModel> routines = result; //only single event for now //TODO kaipaa korjausta if(routines.size() > 0) { RoutineModel routine = routines.get(0); routine.setDate(CommonUtils.trimDateToDatabase(date, true)); //fire event eventBus.fireEvent(new RoutineCreatedEvent(routine)); } } }); } catch (Exception e) { Motiver.showException(e); } } /** * Called when routines is selected (or selection is set off) * <br>Shows button to quick select routines * @param routine * @param selected */ protected void setQuickSelection(RoutineModel routine, boolean selected) { //if new routine if(selected) { quickSelectionRoutines.add(routine); } else { quickSelectionRoutines.remove(routine); } //only if models selected and date not null display.setQuickSelectionButtonVisible(quickSelectionRoutines.size() > 0 && date != null, date); } /** * Shows main view * - my routines * - most popular */ protected void showMainView() { lastView = 0; //show/hide buttons display.setBackButtonVisible(false); display.setCopyButtonVisible(false); display.setMoveToDateButtonVisible(false, null); display.setQuickSelectionButtonVisible(false, null); if(singleRoutinePresenter != null) { singleRoutinePresenter.stop(); } singleRoutinePresenter = null; if(routinesListSearchPresenter != null) { routinesListSearchPresenter.hide(); } //run main view routinesListSubPresenter.run(display.getDataContainer()); } /* * VIEW 3 (single routine */ protected void showSingleRoutine(RoutineModel m) { try { if(singleRoutinePresenter != null) { singleRoutinePresenter.stop(); } //hide main page if(routinesListSubPresenter != null) { routinesListSubPresenter.hide(); } if(routinesListSearchPresenter != null) { routinesListSearchPresenter.hide(); } //show single routine singleRoutinePresenter = new RoutinePresenter(rpcService, eventBus, (RoutineDisplay)GWT.create(RoutineView.class), m); singleRoutinePresenter.run(display.getDataContainer()); //buttons display.setBackButtonVisible(true); display.setCopyButtonVisible(false); display.setMoveToDateButtonVisible(false, null); display.setQuickSelectionButtonVisible(false, null); //show buttons only if routine's id set if(m.getId() > 0) { //if date set if(date != null) { display.setMoveToDateButtonVisible(true, date); } else { //copy to our routines if(!m.getUser().equals(AppController.User)) { display.setCopyButtonVisible(true); } } } } catch (Exception e) { Motiver.showException(e); } } /** * Loads routines */ void loadSearch(final String query) { lastView = 1; //show/hide buttons display.setBackButtonVisible(true); display.setCopyButtonVisible(false); display.setMoveToDateButtonVisible(false, null); display.setQuickSelectionButtonVisible(false, null); if(singleRoutinePresenter != null) { singleRoutinePresenter.stop(); } singleRoutinePresenter = null; if(routinesListSubPresenter != null) { routinesListSubPresenter.hide(); } //if not already loaded if(routinesListSearchPresenter == null || !query.equals(lastQuery)) { lastQuery = query; if(routinesListSearchPresenter != null) { routinesListSearchPresenter.stop(); } boolean quickSelectionEnabled = (date != null); routinesListSearchPresenter = new RoutinesListSearchPresenter(rpcService, eventBus, (RoutinesListSearchDisplay)GWT.create(RoutinesListSearchView.class), query, quickSelectionEnabled); routinesListSearchPresenter.run(display.getDataContainer()); } else { routinesListSearchPresenter.run(display.getDataContainer()); } } }