/**
* MVPGettingStarted Application.
*
* Copyright 2011 Harmonic-Pharma
*
* 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://www.harmonic-pharma.com/ for more information
* about this app.
*/
package com.linkcorp.mvp.client.presenter;
import java.util.ArrayList;
import java.util.List;
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.HandlerManager;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.linkcorp.mvp.client.event.AddContactEvent;
import com.linkcorp.mvp.client.event.EditContactEvent;
import com.linkcorp.mvp.client.service.ContactServiceAsync;
import com.linkcorp.mvp.client.view.EditContactView;
import com.linkcorp.mvp.shared.ContactDTO;
import com.linkcorp.mvp.shared.ContactDetailsDTO;
/**
* @author Nelson Lionel KEMINSE
* 18 juil. 2011 17:32:43
*/
public class ContactsPresenter implements Presenter {
public interface Display extends HasValue<List<String>>{
HasClickHandlers getAddButton();
HasClickHandlers getDeleteButton();
HasClickHandlers getEditButton();
HasClickHandlers getContactTable();
void setData(List<String> data);
int getClickRow(ClickEvent event);
List<Integer> getSelectedRows();
Widget asWidget();
}
private final ContactServiceAsync rpcService;
private final Display view;
private final HandlerManager eventBus;
private List<ContactDTO> contacts;
private List<ContactDetailsDTO> contactsDetails;
public ContactsPresenter(ContactServiceAsync rpcService, HandlerManager eventBus, Display view){
this.rpcService = rpcService;
this.view = view;
this.eventBus = eventBus;
}
@Override
public void go(HasWidgets container) {
bind();
container.clear();
container.add(this.view.asWidget());
fetchContactsDetails();
}
@Override
public void bind() {
this.view.getEditButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
EditContactView.get().getDialogEditBox().setText("Edit contact");
EditContactView.get().getDialogEditBox().show();
}
});
this.view.getAddButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
eventBus.fireEvent(new AddContactEvent());
}
});
this.view.getDeleteButton().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
deleteSelectedContacts();
}
});
this.view.getContactTable().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int selectedRow = view.getClickRow(event);
if(selectedRow >= 0){
String id = contacts.get(selectedRow).getId();
eventBus.fireEvent(new EditContactEvent(getContact(id)));
}
}
});
}
private void fetchContactsDetails(){
rpcService.getContactDetails(new AsyncCallback<List<ContactDetailsDTO>>() {
public void onFailure(Throwable caught) {}
public void onSuccess(List<ContactDetailsDTO> result) {
contactsDetails = result;
List<String> data = new ArrayList<String>();
for (ContactDetailsDTO contact : result) {
data.add(contact.getDisplayName());
}
view.setData(data);
}
});
}
public void deleteSelectedContacts(){
List<Integer> selectedRows = view.getSelectedRows();
ArrayList<String> ids = new ArrayList<String>();
for (int i = 0; i < selectedRows.size(); i++) {
ids.add(contactsDetails.get(selectedRows.get(i)).getId());
}
rpcService.deleteContacts(ids, new AsyncCallback<List<ContactDetailsDTO>>() {
public void onSuccess(List<ContactDetailsDTO> result) {
contactsDetails = result;
List<String> data = new ArrayList<String>();
for (ContactDetailsDTO contact : result) {
data.add(contact.getDisplayName());
}
view.setData(data);
}
public void onFailure(Throwable caught) {}
});
}
public void sortContacts(){
List<String> contacts = new ArrayList<String>();
List<ContactDetailsDTO> cdto = new ArrayList<ContactDetailsDTO>();
for (ContactDetailsDTO contact : contactsDetails) {
contacts.add(contact.getDisplayName());
}
java.util.Collections.sort(contacts);
for (String name : contacts) {
for (int j = 0; j < contactsDetails.size(); j++) {
if(contactsDetails.get(j).getDisplayName().equals(name)){
cdto.add(contactsDetails.get(j));
break;
}
}
}
this.contactsDetails = cdto;
view.setData(contacts);
}
/**
* @return the contacts
*/
public List<ContactDetailsDTO> getContactsDetails() {
return this.contactsDetails;
}
public void setContactsDetails(List<ContactDetailsDTO> contactsDetails) {
this.contactsDetails = contactsDetails;
}
private ContactDTO getContact(String id){
ContactDTO contact = null;
for (ContactDTO contactDTO : this.contacts) {
if(contactDTO.getId().equals(id)){
contact = contactDTO;
break;
}
}
return contact;
}
}