package net.thesocialos.client.presenter; import net.thesocialos.client.event.RPCInEvent; import net.thesocialos.client.event.RPCInEventHandler; import net.thesocialos.client.event.RPCOutEvent; import net.thesocialos.client.event.RPCOutEventHandler; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.SimpleEventBus; public class BusyIndicatorPresenter implements Presenter { public interface Display { Widget asWidget(); void hide(); void show(); } int outCount = 0; // # of RPC calls sent by the app. If > 0 we'll show a 'loading' indicator. private final SimpleEventBus eventBus; private Display display; public BusyIndicatorPresenter(SimpleEventBus eventBus, Display view) { this.eventBus = eventBus; this.display = view; bind(); } public void bind() { eventBus.addHandler(RPCInEvent.TYPE, new RPCInEventHandler() { @Override public void onRPCIn(RPCInEvent event) { outCount = outCount > 0 ? --outCount : 0; // if outCount > 0 reduce 1 else put it to 0. if (outCount <= 0) { display.hide(); // When outCount is 0 hide the loading indicator } } }); eventBus.addHandler(RPCOutEvent.TYPE, new RPCOutEventHandler() { @Override public void onRPCOut(RPCOutEvent event) { outCount++; display.show(); } }); } @Override public void go(HasWidgets container) { // nothing to do } }