package klik.client.mvp.unitelement; import klik.client.MyCallback; import klik.client.dispatch.CachingDispatchAsync; import klik.shared.constants.X10; import klik.shared.constants.X10.State; import klik.shared.constants.X10.Type; import klik.shared.event.AddEditEvent; import klik.shared.event.UnitStatusChangeEvent; import klik.shared.event.UnitStatusChangeEvent.UnitStatusChangeHandler; import klik.shared.model.UnitEventDto; import klik.shared.model.UnitStatusDto; import klik.shared.rpc.UnitEventAction; import klik.shared.rpc.UnitEventResult; import com.google.gwt.core.client.GWT; import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; import com.gwtplatform.mvp.client.HasUiHandlers; import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; public class UnitElementPresenter extends PresenterWidget<UnitElementPresenter.MyView> implements UnitElementUiHandlers { public interface MyView extends View, HasUiHandlers<UnitElementUiHandlers> { void set(String address, String name, boolean isOn, boolean isDimmable); void setOn(boolean isOn); } private final CachingDispatchAsync dispatcher; private UnitStatusDto status; private String address; private int id; @Inject public UnitElementPresenter(final EventBus eventBus, final MyView view, CachingDispatchAsync dispatcher, UnitStatusDto status) { super(eventBus, view); this.dispatcher = dispatcher; getView().setUiHandlers(this); } @Override protected void onBind() { super.onBind(); addRegisteredHandler(UnitStatusChangeEvent.getType(), new UnitStatusChangeHandler() { @Override public void onUnitStatusChange(UnitStatusChangeEvent event) { if (id == event.getStatus().getId()) { setStatus(event.getStatus()); } } }); } public void setStatus(UnitStatusDto status) { if (id == 0 || !this.status.equals(status)) { this.address = status.getAddress(); this.status = status; this.id = status.getId(); getView().set(address, status.getName(), !status.getState().equals(State.OFF), status.getType().equals(Type.DIMMABLE_LIGHT)); } } @Override public void extend() { // TODO Auto-generated method stub } @Override public void setOn(boolean isOn) { if (isOn) { dispatch(X10.Function.ON, 100); } else { dispatch(X10.Function.OFF, 0); } } @Override public void bright() { dispatch(X10.Function.BRIGHT, 10); } @Override public void dim() { dispatch(X10.Function.DIM, -10); } private void dispatch(X10.Function function, int value) { GWT.log("SEND:"+function+" level:"+value); dispatcher.execute(new UnitEventAction(new UnitEventDto(address, function, value)), new MyCallback<UnitEventResult>(this) { @Override public void onSuccesss(UnitEventResult result) { for (UnitStatusDto status : result.getStatusList()) { GWT.log(" receive:"+status.getState()+" level:"+status.getValue()); fireEvent(new UnitStatusChangeEvent(address, status)); } } }); } @Override public void edit() { fireEvent(new AddEditEvent(status)); } }