/* * Copyright 2013 ArcBees Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.gwtplatform.carstore.client.application.cars.car; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import com.google.gwt.user.client.Window; import com.google.inject.assistedinject.Assisted; import com.google.web.bindery.event.shared.EventBus; import com.gwtplatform.carstore.client.application.cars.car.CarPresenter.MyView; import com.gwtplatform.carstore.client.application.cars.car.navigation.NavigationTab; import com.gwtplatform.carstore.client.application.cars.car.navigation.NavigationTabEvent; import com.gwtplatform.carstore.client.application.cars.event.CarAddedEvent; import com.gwtplatform.carstore.client.application.event.ActionBarEvent; import com.gwtplatform.carstore.client.application.event.ChangeActionBarEvent; import com.gwtplatform.carstore.client.application.event.ChangeActionBarEvent.ActionType; import com.gwtplatform.carstore.client.application.event.DisplayMessageEvent; import com.gwtplatform.carstore.client.application.event.GoBackEvent; import com.gwtplatform.carstore.client.application.widget.message.Message; import com.gwtplatform.carstore.client.application.widget.message.MessageStyle; import com.gwtplatform.carstore.client.place.NameTokens; import com.gwtplatform.carstore.client.resources.CarMessages; import com.gwtplatform.carstore.client.util.AbstractRestCallback; import com.gwtplatform.carstore.client.util.ErrorHandlerAsyncCallback; import com.gwtplatform.carstore.shared.api.CarsResource; import com.gwtplatform.carstore.shared.api.ManufacturersResource; import com.gwtplatform.carstore.shared.dto.CarDto; import com.gwtplatform.carstore.shared.dto.ManufacturerDto; import com.gwtplatform.dispatch.rest.delegates.client.ResourceDelegate; import com.gwtplatform.mvp.client.HasUiHandlers; import com.gwtplatform.mvp.client.Presenter; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.PlaceManager; import com.gwtplatform.mvp.client.proxy.ProxyPlace; import com.gwtplatform.mvp.shared.proxy.PlaceRequest; public class CarPresenter extends Presenter<MyView, CarPresenter.MyProxy> implements CarUiHandlers, NavigationTab, GoBackEvent.GoBackHandler, ActionBarEvent.ActionBarHandler { public interface MyView extends View, HasUiHandlers<CarUiHandlers> { void edit(CarDto carDto); void setAllowedManufacturers(List<ManufacturerDto> manufacturerDtos); void resetFields(CarDto carDto); void getCar(); } public interface MyProxy extends ProxyPlace<CarPresenter> { } private final ResourceDelegate<CarsResource> carsDelegate; private final ResourceDelegate<ManufacturersResource> manufacturersDelegate; private final CarMessages messages; private final PlaceManager placeManager; private final CarProxyFactory carProxyFactory; private CarDto carDto; @Inject CarPresenter( EventBus eventBus, MyView view, ResourceDelegate<CarsResource> carsDelegate, ResourceDelegate<ManufacturersResource> manufacturersDelegate, PlaceManager placeManager, CarProxyFactory carProxyFactory, CarMessages messages, @Assisted MyProxy proxy, @Assisted CarDto carDto) { super(eventBus, view, proxy, RootCarPresenter.SLOT_CAR_CONTENT); this.carsDelegate = carsDelegate; this.manufacturersDelegate = manufacturersDelegate; this.messages = messages; this.placeManager = placeManager; this.carProxyFactory = carProxyFactory; this.carDto = carDto != null ? carDto : new CarDto(); getView().setUiHandlers(this); } @Override public void onGoBack(GoBackEvent event) { placeManager.revealPlace(new PlaceRequest.Builder().nameToken(NameTokens.getCars()).build()); } @Override public void onActionEvent(ActionBarEvent event) { if (event.isTheSameToken(NameTokens.NEW_CAR)) { if (event.getActionType() == ActionType.DONE) { getView().getCar(); } } else if (event.isTheSameToken(carDto.getManufacturer().getName() + carDto.getModel())) { if (event.getActionType() == ActionType.UPDATE) { getView().getCar(); } else if (event.getActionType() == ActionType.DELETE) { onDeleteCar(); } } } @Override public void onCancel() { NavigationTabEvent.fireClose(this, this); } @Override public void onSave(final CarDto carDto) { carsDelegate .withCallback(new ErrorHandlerAsyncCallback<CarDto>(this) { @Override public void onSuccess(CarDto newCar) { onCarSaved(carDto, newCar); } }) .saveOrCreate(carDto); } @Override public String getName() { if (carDto.getId() != null) { return carDto.getManufacturer().getName() + " " + carDto.getModel(); } else { return "New car"; } } @Override public String getToken() { return getProxy().getNameToken(); } @Override public boolean isClosable() { return true; } @Override protected void onBind() { addRegisteredHandler(GoBackEvent.getType(), this); addRegisteredHandler(ActionBarEvent.getType(), this); } @Override protected void onReveal() { manufacturersDelegate .withCallback( (AbstractRestCallback<List<ManufacturerDto>>) this::onGetManufacturerSuccess) .getManufacturers(); Boolean createNew = placeManager.getCurrentPlaceRequest().matchesNameToken(NameTokens.NEW_CAR); List<ActionType> actions; if (createNew) { actions = Arrays.asList(ActionType.DONE); ChangeActionBarEvent.fire(this, actions, false); } else { actions = Arrays.asList(ActionType.DELETE, ActionType.UPDATE); ChangeActionBarEvent.fire(this, actions, false); } NavigationTabEvent.fireReveal(this, this); } private void onGetManufacturerSuccess(List<ManufacturerDto> manufacturerDtos) { getView().setAllowedManufacturers(manufacturerDtos); getView().edit(carDto); } private void onCarSaved(CarDto oldCar, CarDto newCar) { DisplayMessageEvent.fire(CarPresenter.this, new Message(messages.carSaved(), MessageStyle.SUCCESS)); CarAddedEvent.fire(CarPresenter.this, newCar, oldCar.getId() == null); if (oldCar.getId() == null) { carDto = new CarDto(); getView().resetFields(carDto); MyProxy proxy = carProxyFactory.create(newCar, newCar.getManufacturer().getName() + newCar.getModel()); placeManager.revealPlace(new PlaceRequest.Builder().nameToken(proxy.getNameToken()).build()); } } private void onDeleteCar() { Boolean confirm = Window.confirm("Are you sure you want to delete " + carDto.getModel() + "?"); if (confirm) { carsDelegate .withCallback(new ErrorHandlerAsyncCallback<Void>(this) { @Override public void onSuccess(Void nothing) { NavigationTabEvent.fireClose(CarPresenter.this, CarPresenter.this); } }) .car(carDto.getId()) .delete(); } } }