/*******************************************************************************
* Copyright (c) 2012 Kai Toedter and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Kai Toedter - initial API and implementation
******************************************************************************/
package com.toedter.gwt.demo.contacts.client.activity;
import java.util.List;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.Place;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.toedter.gwt.demo.contacts.client.IClientFactory;
import com.toedter.gwt.demo.contacts.client.IContactServiceAsync;
import com.toedter.gwt.demo.contacts.client.event.ContactViewEvent;
import com.toedter.gwt.demo.contacts.client.place.ContactPlace;
import com.toedter.gwt.demo.contacts.client.ui.IContactListView;
import com.toedter.gwt.demo.contacts.shared.Contact;
public class ContactListActivity extends AbstractActivity implements IContactListView.Presenter {
private final IClientFactory clientFactory;
private final String token;
private EventBus eventBus;
private IContactListView contactListView;
public ContactListActivity(ContactPlace place, IClientFactory clientFactory) {
System.out.println("ContactListActivity.ContactListActivity()");
token = place.getToken();
this.clientFactory = clientFactory;
}
@Override
public void start(AcceptsOneWidget containerWidget, EventBus eventBus) {
System.out.println("ContactListActivity.start()");
ActivityRegistry.setContactListActivity(this);
this.eventBus = eventBus;
contactListView = clientFactory.getContactListView();
contactListView.setPresenter(this);
containerWidget.setWidget(contactListView.asWidget());
if (clientFactory.getContacts() == null) {
final long startTime = System.currentTimeMillis();
IContactServiceAsync contactService = clientFactory.getContactService();
contactService.getAllContacts(new AsyncCallback<List<Contact>>() {
@Override
public void onSuccess(List<Contact> result) {
System.out.println("Time for RPC: " + (System.currentTimeMillis() - startTime));
clientFactory.setContacts(result);
contactListView.initialize(result);
if (token.length() > 0) {
// views either deal with domain objects (Contact) or
// just row indices
int index = getContactIndex(token);
if (index != -1) {
contactListView.selectInitialRow(index);
}
selectInitialContact(token);
}
}
@Override
public void onFailure(Throwable caught) {
System.err.println("Error in getting contacts form contact service");
}
});
} else if (token.length() > 0) {
selectInitialContact(token);
}
}
@Override
public String mayStop() {
contactListView.setPresenter(null);
return null;
}
@Override
public void goTo(Place place) {
clientFactory.getPlaceController().goTo(place);
}
public void selectInitialContact(String email) {
Contact contact = getContact(email);
if (contact != null) {
contactListView.selectInitialContact(contact);
eventBus.fireEvent(new ContactViewEvent(contact));
}
}
@Override
public void select(Contact contact) {
System.out.println("ContactListActivity.select(): " + token + ":" + contact.getEmail());
eventBus.fireEvent(new ContactViewEvent(contact));
if (token == null || (token != null && !token.equals(contact.getEmail()))) {
goTo(new ContactPlace(contact.getEmail()));
}
}
@Override
public void select(int index) {
System.out.println("ContactListActivity.select(): " + index);
Contact contact = clientFactory.getContacts().get(index);
eventBus.fireEvent(new ContactViewEvent(contact));
goTo(new ContactPlace(contact.getEmail()));
}
private int getContactIndex(String email) {
int i = 0;
for (Contact contact : clientFactory.getContacts()) {
if (email.equals(contact.getEmail())) {
return i;
}
i++;
}
return -1;
}
private Contact getContact(String email) {
for (Contact contact : clientFactory.getContacts()) {
if (email.equals(contact.getEmail())) {
return contact;
}
}
return null;
}
}