package klik.client.mvp;
import klik.client.MyCallback;
import klik.client.dispatch.CachingDispatchAsync;
import klik.client.mvp.addedit.AddEditWidgetPresenter;
import klik.client.mvp.setup.SetupWidgetPresenter;
import klik.shared.event.AddEditEvent;
import klik.shared.event.AlertEvent;
import klik.shared.event.AlertEventHandler;
import klik.shared.event.LoadingEvent;
import klik.shared.event.RefreshEvent;
import klik.shared.event.SetupEvent;
import com.allen_sauer.gwt.log.client.Log;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.event.shared.GwtEvent.Type;
import com.google.gwt.inject.client.AsyncProvider;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.HasUiHandlers;
import com.gwtplatform.mvp.client.Presenter;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.annotations.ContentSlot;
import com.gwtplatform.mvp.client.annotations.ProxyStandard;
import com.gwtplatform.mvp.client.proxy.AsyncCallFailEvent;
import com.gwtplatform.mvp.client.proxy.AsyncCallFailHandler;
import com.gwtplatform.mvp.client.proxy.AsyncCallStartEvent;
import com.gwtplatform.mvp.client.proxy.AsyncCallStartHandler;
import com.gwtplatform.mvp.client.proxy.AsyncCallSucceedEvent;
import com.gwtplatform.mvp.client.proxy.AsyncCallSucceedHandler;
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.client.proxy.RevealContentHandler;
import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent;
import com.gwtplatform.mvp.client.proxy.RevealRootPopupContentEvent;
public class LayoutPresenter extends Presenter<LayoutPresenter.MyView, LayoutPresenter.MyProxy>
implements LayoutUiHandlers {
@ContentSlot
public static final Type<RevealContentHandler<?>> TYPE_SetContent = new Type<RevealContentHandler<?>>();
public interface MyView extends View, HasUiHandlers<LayoutUiHandlers> {
void showLoading(boolean visible);
void clearAlerts();
void showAlert(AlertType type, String message);
}
@ProxyStandard
public interface MyProxy extends Proxy<LayoutPresenter> {
}
private final CachingDispatchAsync dispatcher;
private final AsyncProvider<SetupWidgetPresenter> setupDialogProvider;
private final AsyncProvider<AddEditWidgetPresenter> addEditDialogProvider;
@Inject
public LayoutPresenter(final EventBus eventBus, final MyView view,
final MyProxy proxy, final CachingDispatchAsync dispatcher,
final AsyncProvider<SetupWidgetPresenter> setupDialogProvider,
final AsyncProvider<AddEditWidgetPresenter> addEditDialogProvider) {
super(eventBus, view, proxy);
this.dispatcher = dispatcher;
this.setupDialogProvider = setupDialogProvider;
this.addEditDialogProvider = addEditDialogProvider;
getView().setUiHandlers(this);
}
@Override
protected void revealInParent() {
RevealRootContentEvent.fire(this, this);
}
@SuppressWarnings("unchecked")
@Override
protected void onBind() {
super.onBind();
// displays alerts posted on the EventBus
addRegisteredHandler(AlertEvent.TYPE, new AlertEventHandler() {
@Override
public void onAlert(AlertEvent event) {
getView().clearAlerts();
getView().showAlert(event.getAlertType(), event.getMessage());
}
});
// displays loading message/image while gwtp makes a internal server call
addRegisteredHandler(AsyncCallStartEvent.getType(), new AsyncCallStartHandler() {
@Override
public void onAsyncCallStart(AsyncCallStartEvent asyncCallStartEvent) {
getView().showLoading(true);
Log.debug("AsyncCallStartEvent!");
}
});
// hides loading message/image when gwtp's server call succeeds
addRegisteredHandler(AsyncCallSucceedEvent.getType(), new AsyncCallSucceedHandler() {
@Override
public void onAsyncCallSucceed(AsyncCallSucceedEvent asyncCallSucceedEvent) {
getView().showLoading(false);
Log.debug("AsyncCallSucceedEvent!");
}
});
// hides loading message/image and posts an error alert when gwtp's server call fails
addRegisteredHandler(AsyncCallFailEvent.getType(), new AsyncCallFailHandler() {
@Override
public void onAsyncCallFail(AsyncCallFailEvent asyncCallFailEvent) {
getView().showLoading(false);
fireEvent(new AlertEvent(AlertType.ERROR, "No internet connection or trouble with server!"));
}
});
addRegisteredHandler(LoadingEvent.getType(), new LoadingEvent.LoadingHandler() {
@Override
public void onLoading(LoadingEvent event) {
getView().showLoading(event.isLoading());
}
});
// listens for external setup events
addRegisteredHandler(SetupEvent.getType(), new SetupEvent.SetupHandler() {
@Override
public void onSetup(SetupEvent event) {
if (event.isOpen()) {
LayoutPresenter.this.onSetup();
}
}
});
addRegisteredHandler(AddEditEvent.getType(), new AddEditEvent.AddEditHandler() {
@Override
public void onAddEdit(AddEditEvent event) {
onAddEditEvent(event);
}
});
}
@Override
public void onRefresh() {
fireEvent(new RefreshEvent());
}
@Override
public void onSetup() {
setupDialogProvider.get(new MyCallback<SetupWidgetPresenter>(this) {
@Override
public void onSuccesss(SetupWidgetPresenter result) {
RevealRootPopupContentEvent.fire(LayoutPresenter.this, result);
result.getView().show(); // without this the popup won't open the second time
}
});
}
private void onAddEditEvent(final AddEditEvent event) {
addEditDialogProvider.get(new MyCallback<AddEditWidgetPresenter>(this) {
@Override
public void onSuccesss(AddEditWidgetPresenter result) {
result.setUnit(event.getStatus());
RevealRootPopupContentEvent.fire(LayoutPresenter.this, result);
result.getView().show();
}
});
}
}