/**
* Copyright 2010 Daniel Guermeur and Amy Unruh
*
* 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.
*
* See http://connectrapp.appspot.com/ for a demo, and links to more information
* about this app and the book that it accompanies.
*/
package com.casamind.adware.client.presenter;
import java.util.ArrayList;
import java.util.List;
import com.casamind.adware.client.Adware;
import com.casamind.adware.client.event.EntityAddEvent;
import com.casamind.adware.client.event.EntityDeletedEvent;
import com.casamind.adware.client.event.EntityDeletedEventHandler;
import com.casamind.adware.client.event.EntityEditEvent;
import com.casamind.adware.client.event.EntityListChangedEvent;
import com.casamind.adware.client.event.EntityUpdatedEvent;
import com.casamind.adware.client.event.EntityUpdatedEventHandler;
import com.casamind.adware.client.helper.ClickPoint;
import com.casamind.adware.client.helper.RPCCall;
import com.casamind.adware.client.resources.ErrorMessages;
import com.casamind.adware.client.service.DataServiceAsync;
import com.casamind.adware.shared.EntityTypes;
import com.casamind.adware.shared.model.CompanySummaryDTO;
import com.casamind.adware.shared.model.EntitySummary;
import com.casamind.adware.shared.model.ProductSummaryDTO;
import com.casamind.adware.shared.model.PublisherSummaryDTO;
import com.casamind.adware.shared.model.SlotSummaryDTO;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
public class EntityListPresenter implements Presenter {
private final DataServiceAsync rpcService;
private final SimpleEventBus eventBus;
private final Display display;
private final ErrorMessages errorMessages = GWT.create(ErrorMessages.class);
private List<EntitySummary> entitySummaries;
public interface Display {
HasClickHandlers getAddButton();
HasClickHandlers getList();
void setData(List<String> entityNames);
int getClickedRow(ClickEvent event);
ClickPoint getClickedPoint(ClickEvent event);
List<Integer> getSelectedRows();
Widget asWidget();
}
public EntityListPresenter(DataServiceAsync rpcService, SimpleEventBus eventBus, Display view) {
this.rpcService = rpcService;
this.eventBus = eventBus;
this.display = view;
bind();
}
public void bind() {
display.getAddButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
eventBus.fireEvent(new EntityAddEvent(EntityTypes.Entity));
}
});
if (display.getList() != null)
display.getList().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
int selectedPropertyButtonRow = display.getClickedRow(event);
if (selectedPropertyButtonRow >= 0) {
EntitySummary entity = entitySummaries.get(selectedPropertyButtonRow);
if (entity.getClass().equals(CompanySummaryDTO.class)) {
eventBus.fireEvent(new EntityEditEvent(entity, EntityTypes.Company));
} else if (entity.getClass().equals(PublisherSummaryDTO.class)) {
eventBus.fireEvent(new EntityEditEvent(entity, EntityTypes.Publisher));
} else if (entity.getClass().equals(ProductSummaryDTO.class)) {
eventBus.fireEvent(new EntityEditEvent(entity, EntityTypes.Product));
} else if (entity.getClass().equals(SlotSummaryDTO.class)) {
eventBus.fireEvent(new EntityEditEvent(entity, EntityTypes.Slot));
}
} else {
eventBus.fireEvent(new EntityListChangedEvent(entitySummaries));
}
}
});
// Listen to events
eventBus.addHandler(EntityUpdatedEvent.TYPE, new EntityUpdatedEventHandler() {
@Override
public void onEntityUpdated(EntityUpdatedEvent event) {
fetchEntitySummaryDTO();
}
});
eventBus.addHandler(EntityDeletedEvent.TYPE, new EntityDeletedEventHandler() {
@Override
public void onEntityDeleted(EntityDeletedEvent event) {
fetchEntitySummaryDTO();
}
});
}
public void go(final HasWidgets container) {
GWT.log("Loading entities...");
container.clear();
container.add(display.asWidget());
fetchEntitySummaryDTO();
}
public void sortEntitySummaryDTO() {
for (int i = 0; i < entitySummaries.size(); ++i) {
for (int j = 0; j < entitySummaries.size() - 1; ++j) {
if (entitySummaries.get(j).getDisplayName().compareToIgnoreCase(entitySummaries.get(j + 1).getDisplayName()) >= 0) {
EntitySummary tmp = entitySummaries.get(j);
entitySummaries.set(j, entitySummaries.get(j + 1));
entitySummaries.set(j + 1, tmp);
}
}
}
}
public void setEntitySummaryDTO(List<EntitySummary> EntitySummaryDTO) {
this.entitySummaries = EntitySummaryDTO;
}
public EntitySummary getEntitySummary(int index) {
return entitySummaries.get(index);
}
private void fetchEntitySummaryDTO() {
new RPCCall<List<EntitySummary>>() {
@Override
protected void callService(AsyncCallback<List<EntitySummary>> cb) {
rpcService.getEntitySummaries(Adware.get().getCurrentUser(), cb);
}
@Override
public void onSuccess(List<EntitySummary> result) {
entitySummaries = result;
sortEntitySummaryDTO();
display.setData(toStringList(entitySummaries));
eventBus.fireEvent(new EntityListChangedEvent(entitySummaries));
}
@Override
public void onFailure(Throwable caught) {
Window.alert(errorMessages.rpcError(caught.getMessage()));
}
}.retry(3);
}
private List<String> toStringList(List<EntitySummary> entitySummaries) {
List<String> list = new ArrayList<String>();
for (EntitySummary e : entitySummaries) {
list.add(e.getDisplayName());
}
return list;
}
@Override
public void go(DeckPanel container) {
// TODO Auto-generated method stub
}
}