package de.tud.kom.socom.web.client.influence; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwt.cell.client.Cell; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.json.client.JSONException; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONValue; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Random; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.view.client.AsyncDataProvider; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.Range; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import de.tud.kom.socom.web.client.AppController; import de.tud.kom.socom.web.client.HistoryManager; import de.tud.kom.socom.web.client.HistoryToken; import de.tud.kom.socom.web.client.AppController.PageElementIDs; import de.tud.kom.socom.web.client.AppController.Presenters; import de.tud.kom.socom.web.client.administration.itemadministration.ViewWithItemAdministration; import de.tud.kom.socom.web.client.baseelements.AbstractMainPresenter; import de.tud.kom.socom.web.client.baseelements.MainPresenter; import de.tud.kom.socom.web.client.baseelements.Presenter; import de.tud.kom.socom.web.client.baseelements.ViewInterface; import de.tud.kom.socom.web.client.baseelements.ViewWithErrorsInterface; import de.tud.kom.socom.web.client.baseelements.presenters.ListPresenter; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorCodeUnknownTypeView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorIllegalDurationNumberView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorLoginNeededView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorNotYetStartedView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorSelectionRestrictionView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorServerUnknownErrorView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorViewFactory; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorVisibilityViolationView; import de.tud.kom.socom.web.client.baseelements.viewinfos.InfoInfluenceAlreadyFinishedView; import de.tud.kom.socom.web.client.content.ContentPresenter; import de.tud.kom.socom.web.client.eventhandler.FormSubmitCompleteEventHandler; import de.tud.kom.socom.web.client.eventhandler.FormSubmitEventHandler; import de.tud.kom.socom.web.client.eventhandler.FormValueChangeEventHandler; import de.tud.kom.socom.web.client.eventhandler.HasFormSubmitCompleteHandlers; import de.tud.kom.socom.web.client.eventhandler.HasFormSubmitHandlers; import de.tud.kom.socom.web.client.eventhandler.HasFormValueChangeHandlers; import de.tud.kom.socom.web.client.eventhandler.LoginEventHandler; import de.tud.kom.socom.web.client.eventhandler.ViewChangeWithinPresenterEventHandler; import de.tud.kom.socom.web.client.events.FormSubmitCompleteEvent; import de.tud.kom.socom.web.client.events.FormSubmitEvent; import de.tud.kom.socom.web.client.events.FormValueChangeEvent; import de.tud.kom.socom.web.client.events.LoginErrorNetworkUserNotFoundEvent; import de.tud.kom.socom.web.client.events.LoginErrorWrongUserIDPasswortEvent; import de.tud.kom.socom.web.client.events.LoginEvent; import de.tud.kom.socom.web.client.events.LogoutEvent; import de.tud.kom.socom.web.client.events.ViewChangeWithinPresenterEvent; import de.tud.kom.socom.web.client.influence.strategies.AudioInfluenceStrategy; import de.tud.kom.socom.web.client.influence.strategies.ImageInfluenceStrategy; import de.tud.kom.socom.web.client.influence.strategies.InfluenceStrategy; import de.tud.kom.socom.web.client.influence.strategies.TextInfluenceStrategy; import de.tud.kom.socom.web.client.services.influence.SoComInfluenceServiceAsync; import de.tud.kom.socom.web.client.sharedmodels.Influence; import de.tud.kom.socom.web.client.sharedmodels.InfluenceAnswer; import de.tud.kom.socom.web.client.sharedmodels.SimpleEntry; import de.tud.kom.socom.web.client.util.FileUtils.FileState; import de.tud.kom.socom.web.client.util.exceptions.NotVisibleException; /** this presenter shows a list of active and visible influences for current user * If an Id parameter is found it hands-over to InfluencePresenter * @author jkonert * */ public class InfluenceListPresenter extends ListPresenter<Influence> implements MainPresenter, LoginEventHandler, ViewChangeWithinPresenterEventHandler { private static Cell<Influence> influenceListItemCell; private static InfluenceListPresenter instance; private AsyncDataProvider<Influence> dataProvider; InfluenceListPrefixView prefix; InfluenceListPresenter(AppController appController) { super(getInfluenceListItemCell() , appController); appController.getEventHandler().addHandler(ViewChangeWithinPresenterEvent.TYPE, this); } @Override public void init() { prefix = new InfluenceListPrefixView(this); super.init(); if (dataProvider == null) { // create AsyncDataProvider and use getListView as Display dataProvider = new AsyncDataProvider<Influence>() { private int maxNumber = 0; // known end of data private int maxDisplayed=0; // estimate of length boolean reachedEnd; @Override protected void onRangeChanged(HasData<Influence> display) { final Range range = display.getVisibleRange(); AppController ac = InfluenceListPresenter.this.getAppController(); ac.getRPCFactory().getInfluenceService().getInfluences(ac.getLoginManager().getSessionID(), true, range.getStart(), range.getStart()+range.getLength(), new AsyncCallback<List<Influence>>() { @Override public void onSuccess(List<Influence> results) { if (results.size() <range.getLength()) {// reached end maxNumber = range.getStart() + results.size() -1; maxDisplayed = maxNumber; reachedEnd = true; } else if (!reachedEnd) { maxDisplayed = range.getStart()+range.getLength(); } updateRowCount(maxDisplayed, reachedEnd); updateRowData(range.getStart(), results); } @Override public void onFailure(Throwable t) { } }); // } }; } getListView().setDataProvider(dataProvider); // this can be called each time on init } public static InfluenceListPresenter getInstance(AppController appController) { if (instance == null) instance = new InfluenceListPresenter(appController); return instance; } private static Cell<Influence> getInfluenceListItemCell() { if (influenceListItemCell == null) { influenceListItemCell = new InfluenceListItemCell(); } return influenceListItemCell; } @Override public void go(RootPanel targetPanel) { // normally never to be found as this is a Listcontroller here final String influenceId = getAppController().getCurrentHistoryToken().getPresenterModule(); // switch to single-View if parameter found if (influenceId != null && !influenceId.isEmpty()) { InfluencePresenter.getInstance(this.getAppController()).go(targetPanel); } else { // show List-View if (targetPanel.getWidgetIndex(this.prefix.asWidget()) < 0) {// not attached yet targetPanel.add(prefix); } super.go(targetPanel); } } @Override public void onLoginSuccessEvent(LoginEvent event) { // TODO Auto-generated method stub } @Override public void onLogoutEvent(LogoutEvent event) { // TODO Auto-generated method stub } @Override public void onLoginNetworkSuccessEvent(LoginEvent event) { // TODO Auto-generated method stub } @Override public void onLoginErrorNetworkUserNotFound( LoginErrorNetworkUserNotFoundEvent loginErrorNetworkUserNotFound) { // TODO Auto-generated method stub } @Override public void onLoginErrorWrongUserIDPasswortEvent( LoginErrorWrongUserIDPasswortEvent loginErrorWrongUserIDPasswortEvent) { // TODO Auto-generated method stub } @Override public void onSelectionChanged(SelectionChangeEvent event, SingleSelectionModel<Influence> model) { String id = model.getSelectedObject().getExternalId(); HistoryToken t = getAppController().getCurrentHistoryToken().clone(); t.setPresenter(Presenters.influence, false); t.setPresenterModule(id, true); HistoryManager.newItem(t, true); // FIRE! } @Override public void onViewChangeWithinPresenterEvent( ViewChangeWithinPresenterEvent event) { if (event.getCurrentPresenter().equals(this)) { go(getTargetPanel()); } } // TODO add more events and methods to implement here in parent abstract class to listen/react to events in List... }