package klik.client.mvp.unitelementlist; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import klik.client.MyCallback; import klik.client.dispatch.CachingDispatchAsync; import klik.client.mvp.unitelement.UnitElementPresenter; import klik.shared.event.RefreshEvent; import klik.shared.event.UnitStatusChangeEvent; import klik.shared.event.UnitStatusChangeEvent.UnitStatusChangeHandler; import klik.shared.model.UnitStatusDto; import klik.shared.rpc.RetrieveUnitStatusesAction; import klik.shared.rpc.RetrieveUnitStatusesResult; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.GwtEvent.Type; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.web.bindery.event.shared.EventBus; import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.RevealContentHandler; public class UnitElementListPresenter extends PresenterWidget<UnitElementListPresenter.MyView> { public static final Type<RevealContentHandler<?>> TYPE_UnitList = new Type<RevealContentHandler<?>>(); public interface MyView extends View { } private final CachingDispatchAsync dispatcher; private final Provider<UnitElementPresenter> unitElementProvider; private Map<String, UnitStatusDto> unitsMap; @Inject public UnitElementListPresenter(final EventBus eventBus, final MyView view, CachingDispatchAsync dispatcher, Provider<UnitElementPresenter> unitElementProvider) { super(eventBus, view); this.dispatcher = dispatcher; this.unitElementProvider = unitElementProvider; unitsMap = new LinkedHashMap<String, UnitStatusDto>(); } @Override protected void onBind() { super.onBind(); // listens to refresh button presses addRegisteredHandler(RefreshEvent.getType(), new RefreshEvent.RefreshHandler() { @Override public void onRefresh(RefreshEvent event) { retrieveAndRefresh(); } }); // listens to units' changes addRegisteredHandler(UnitStatusChangeEvent.getType(), new UnitStatusChangeHandler() { @Override public void onUnitStatusChange(UnitStatusChangeEvent event) { if (unitsMap.containsKey(event.getAddress())) { unitsMap.put(event.getAddress(), event.getStatus()); } else { throw new RuntimeException("This should never happen!"); } } }); } private void retrieveAndRefresh() { dispatcher.execute(new RetrieveUnitStatusesAction(), new MyCallback<RetrieveUnitStatusesResult>(this) { @Override public void onSuccesss(RetrieveUnitStatusesResult result) { refresh(result.getUnitList()); } }); } public void refresh(List<UnitStatusDto> unitList) { for (UnitStatusDto unitStatus : unitList) { String address = unitStatus.getAddress(); if (unitsMap.containsKey(address)) { if (!unitStatus.equals(unitsMap.get(address))) { GWT.log("update "+address); fireEvent(new UnitStatusChangeEvent(address, unitStatus)); unitsMap.put(address, unitStatus); // override with a copy of the new statusLabel } else { GWT.log("same "+address); } } else { UnitElementPresenter unitElement = unitElementProvider.get(); unitElement.setStatus(unitStatus); addToSlot(UnitElementListPresenter.TYPE_UnitList, unitElement); unitsMap.put(address, unitStatus); GWT.log("added "+address); } } } }