package org.realityforge.gwt.sample.contacts.client.activity;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.realityforge.gwt.sample.contacts.client.common.SelectionModel;
import org.realityforge.gwt.sample.contacts.client.data_type.ContactDetailsDTO;
import org.realityforge.gwt.sample.contacts.client.event.AddContactEvent;
import org.realityforge.gwt.sample.contacts.client.event.ShowContactEvent;
import org.realityforge.gwt.sample.contacts.client.service.ContactsAsyncCallback;
import org.realityforge.gwt.sample.contacts.client.service.ContactsAsyncErrorCallback;
import org.realityforge.gwt.sample.contacts.client.service.ContactsService;
import org.realityforge.gwt.sample.contacts.client.view.ListContactsView;
public class ListContactsActivity
extends AbstractActivity
implements ListContactsView.Presenter
{
private final ContactsService _rpcService;
private final EventBus _eventBus;
private final ListContactsView _view;
private final SelectionModel<ContactDetailsDTO> _selectionModel;
private List<ContactDetailsDTO> _contactDetails;
@Inject
public ListContactsActivity( final ContactsService rpcService,
final EventBus eventBus,
final ListContactsView view )
{
_rpcService = rpcService;
_eventBus = eventBus;
_view = view;
_selectionModel = new SelectionModel<ContactDetailsDTO>();
}
@Override
public void start( final AcceptsOneWidget panel, final EventBus eventBus )
{
_view.setPresenter( this );
panel.setWidget( _view.asWidget() );
fetchContactDetails();
}
public void onAddButtonClicked()
{
_eventBus.fireEvent( new AddContactEvent() );
}
public void onDeleteButtonClicked()
{
deleteSelectedContacts();
}
public void onItemClicked( final ContactDetailsDTO contactDetails )
{
_eventBus.fireEvent( new ShowContactEvent( contactDetails.getID() ) );
}
public void onItemSelected( final ContactDetailsDTO contactDetails )
{
if ( _selectionModel.isSelected( contactDetails ) )
{
_selectionModel.removeSelection( contactDetails );
}
else
{
_selectionModel.addSelection( contactDetails );
}
}
public void sortContactDetails()
{
// Yes, we could use a more optimized method of sorting, but the
// point is to create a test case that helps illustrate the higher
// level concepts used when creating MVP-based applications.
//
final int size = _contactDetails.size();
for ( int i = 0; i < size; ++i )
{
for ( int j = 0; j < size - 1; ++j )
{
final ContactDetailsDTO current = _contactDetails.get( j );
final ContactDetailsDTO last = _contactDetails.get( j + 1 );
if ( current.getDisplayName().compareToIgnoreCase( last.getDisplayName() ) >= 0 )
{
_contactDetails.set( j, last );
_contactDetails.set( j + 1, current );
}
}
}
}
public void setContactDetails( final List<ContactDetailsDTO> contactDetails )
{
_contactDetails = contactDetails;
sortContactDetails();
}
public List<ContactDetailsDTO> getContactDetails()
{
return _contactDetails;
}
private void fetchContactDetails()
{
final ContactsAsyncCallback<List<ContactDetailsDTO>> success = new ContactsAsyncCallback<List<ContactDetailsDTO>>()
{
public void onSuccess( final List<ContactDetailsDTO> result )
{
setContactDetails( result );
_view.setRowData( _contactDetails );
}
};
final ContactsAsyncErrorCallback errorCallback = new ContactsAsyncErrorCallback()
{
@Override
public void onFailure( final Throwable caught )
{
Window.alert( "Error fetching contact details" );
}
};
_rpcService.getContactDetails( success, errorCallback );
}
private void deleteSelectedContacts()
{
final List<ContactDetailsDTO> selectedContacts = _selectionModel.getSelectedItems();
final ArrayList<String> ids = new ArrayList<String>();
for ( final ContactDetailsDTO selected : selectedContacts )
{
ids.add( selected.getID() );
}
final ContactsAsyncCallback<Void> success = new ContactsAsyncCallback<Void>()
{
public void onSuccess( final Void result )
{
fetchContactDetails();
_selectionModel.clear();
}
};
final ContactsAsyncErrorCallback errorCallback = new ContactsAsyncErrorCallback()
{
@Override
public void onFailure( final Throwable caught )
{
System.out.println( "Error deleting selected contacts" );
}
};
_rpcService.deleteContacts( ids, success, errorCallback );
}
}