/*******************************************************************************
* 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.blog;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.delect.motiver.client.AppController;
import com.delect.motiver.client.event.BlogShowEvent;
import com.delect.motiver.client.event.ConnectionErrorEvent;
import com.delect.motiver.client.event.InfoMessageEvent;
import com.delect.motiver.client.event.LoadingEvent;
import com.delect.motiver.client.event.TabEvent;
import com.delect.motiver.client.event.handler.BlogShowEventHandler;
import com.delect.motiver.client.event.handler.ConnectionErrorEventHandler;
import com.delect.motiver.client.event.handler.LoadingEventHandler;
import com.delect.motiver.client.event.handler.TabEventHandler;
import com.delect.motiver.client.presenter.BrowserCheckPresenter;
import com.delect.motiver.client.presenter.BrowserCheckPresenter.BrowserCheckDisplay;
import com.delect.motiver.client.presenter.HeaderPresenter;
import com.delect.motiver.client.presenter.HeaderPresenter.HeaderDisplay;
import com.delect.motiver.client.presenter.HeaderPresenter.HeaderTarget;
import com.delect.motiver.client.presenter.InfoMessagePresenter.MessageColor;
import com.delect.motiver.client.presenter.LoadingPresenter;
import com.delect.motiver.client.presenter.LoadingPresenter.LoadingDisplay;
import com.delect.motiver.client.presenter.Presenter;
import com.delect.motiver.client.presenter.blog.SingleBlogPagePresenter.SingleBlogPageDisplay;
import com.delect.motiver.client.service.MyServiceAsync;
import com.delect.motiver.client.view.BrowserCheckView;
import com.delect.motiver.client.view.Display;
import com.delect.motiver.client.view.HeaderView;
import com.delect.motiver.client.view.LoadingView;
import com.delect.motiver.client.view.blog.SingleBlogPageView;
import com.delect.motiver.shared.Constants;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
/**
* Shows single blog
* @author Antti
*
*/
public class BlogIndexPresenter extends Presenter implements ValueChangeHandler<String> {
/**
* Abstract class for view to extend
*/
public abstract static class BlogIndexDisplay extends Display {
/**
* Returns container for body.
* @return LayoutContainer
*/
public abstract LayoutContainer getBodyContainer();
/**
* Returns container for footer.
* @return LayoutContainer
*/
public abstract LayoutContainer getFooterContainer();
/**
* Returns container for header.
* @return LayoutContainer
*/
public abstract LayoutContainer getHeaderContainer();
/**
* Returns container for messages.
* @return LayoutContainer
*/
public abstract LayoutContainer getMessageContainer();
}
private BrowserCheckPresenter browserCheckPresenter;
private BlogIndexDisplay display;
private HeaderPresenter headerUserPresenter;
private LoadingPresenter loadingPresenter;
private Presenter pagePresenter;
private int tabIndex = 0;
private String uid = null;
/**
* Constructor for BlogIndexPresenter.
* @param rpcService MyServiceAsync
* @param eventBus SimpleEventBus
* @param display BlogIndexDisplay
*/
public BlogIndexPresenter(MyServiceAsync rpcService, SimpleEventBus eventBus, BlogIndexDisplay display, String uid) {
super(rpcService, eventBus);
this.display = display;
this.uid = uid;
//containers
headerUserPresenter = new HeaderPresenter(rpcService, eventBus, (HeaderDisplay)GWT.create(HeaderView.class), HeaderTarget.BLOG, 0);
browserCheckPresenter = new BrowserCheckPresenter(rpcService, eventBus, (BrowserCheckDisplay)GWT.create(BrowserCheckView.class));
}
@Override
public Display getView() {
return display;
}
@Override
public void onBind() {
History.addValueChangeHandler(this);
//tab change handler
addEventHandler(TabEvent.TYPE, new TabEventHandler() {
@Override
public void onTabChanged(TabEvent event) {
switch(tabIndex) {
case 1:
//out blog
History.newItem(String.valueOf(AppController.User.getUid()));
break;
//our friends
default:
Window.Location.assign(Constants.URL_APP);
break;
}
}
});
//EVENT: blog show
addEventHandler(BlogShowEvent.TYPE, new BlogShowEventHandler() {
@Override
public void onBlogShow(BlogShowEvent event) {
Window.Location.replace(event.getUser().getBlogUrl());
}
});
//EVENT: connection error
addEventHandler(ConnectionErrorEvent.TYPE, new ConnectionErrorEventHandler() {
@Override
public void onError(ConnectionErrorEvent event) {
//show error message
eventBus.fireEvent(new InfoMessageEvent(MessageColor.COLOR_RED, AppController.Lang.NetworkError()));
//refresh blog
History.newItem(String.valueOf(AppController.User.getUid()));
}
});
//EVENT: loading text
addEventHandler(LoadingEvent.TYPE, new LoadingEventHandler() {
@Override
public void onLoading(LoadingEvent event) {
if(loadingPresenter != null) {
loadingPresenter.stop();
}
//show loading text
if(event.getMessage() != null) {
loadingPresenter = new LoadingPresenter(rpcService, eventBus, (LoadingDisplay)GWT.create(LoadingView.class), event.getMessage());
loadingPresenter.run(display.getBaseContainer());
}
}
});
}
@Override
public void onRun() {
headerUserPresenter.run(display.getHeaderContainer());
browserCheckPresenter.run(display.getMessageContainer());
History.fireCurrentHistoryState();
}
@Override
public void onStop() {
if(loadingPresenter != null) {
loadingPresenter.stop();
}
if(headerUserPresenter != null) {
headerUserPresenter.stop();
}
if(pagePresenter != null) {
pagePresenter.stop();
}
}
/**
* Called when url token changes.
* @param event ValueChangeEvent<String>
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(ValueChangeEvent<String>)
*/
@Override
public void onValueChange(ValueChangeEvent<String> event) {
String token = event.getValue();
if (token != null) {
//reset old view
if(pagePresenter != null) {
pagePresenter.stop();
}
//just show single blog
tabIndex = -1;
pagePresenter = new SingleBlogPagePresenter(rpcService, eventBus, (SingleBlogPageDisplay)GWT.create(SingleBlogPageView.class), uid);
pagePresenter.run(display.getBodyContainer());
}
}
}