package org.ourproject.massmob.client.ui;
import org.ourproject.massmob.client.CustomConstants;
import org.ourproject.massmob.client.StateManager;
import org.ourproject.massmob.client.ui.EditEvent.EditHandler;
import org.ourproject.massmob.client.ui.img.Images;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiFactory;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import com.thezukunft.wave.connector.GadgetUpdateEvent;
import com.thezukunft.wave.connector.Participant;
import com.thezukunft.wave.connector.ParticipantUpdateEvent;
import com.thezukunft.wave.connector.ParticipantUpdateEventHandler;
import com.thezukunft.wave.connector.StateUpdateEvent;
import com.thezukunft.wave.connector.StateUpdateEventHandler;
import com.thezukunft.wave.connector.Wave;
public class Assistance extends Composite {
interface AssistanceUiBinder extends UiBinder<Widget, Assistance> {
}
private static AssistanceUiBinder uiBinder = GWT.create(AssistanceUiBinder.class);
private final AssistanceTitleSumData data;
@UiField
CustomDisclosure disclo;
private final EventBus eventBus;
@UiField
AssistanceHeader header;
private final AssistanceTitleSum headerSum;
private final Images img;
@UiField
FlowPanel maybep;
@UiField
FlowPanel nop;
@UiField
SetMyStatus setMyStatus;
private final StateManager stateManager;
private final Wave wave;
@UiField
FlowPanel yesp;
public Assistance(final EventBus eventBus, final Wave wave, final StateManager stateManager,
final Images img) {
this.eventBus = eventBus;
this.wave = wave;
this.stateManager = stateManager;
this.img = img;
initWidget(uiBinder.createAndBindUi(this));
data = new AssistanceTitleSumData();
headerSum = new AssistanceTitleSum(data);
final boolean assistantOpen = stateManager.getAssistantOpen();
headerSum.setVisible(!assistantOpen);
disclo.setHeader(headerSum);
disclo.setOpen(assistantOpen);
eventBus.addHandler(StateUpdateEvent.TYPE, new StateUpdateEventHandler() {
@Override
public void onUpdate(final StateUpdateEvent event) {
updateView(wave.getParticipants());
}
});
eventBus.addHandler(ParticipantUpdateEvent.TYPE, new ParticipantUpdateEventHandler() {
@Override
public void onUpdate(final ParticipantUpdateEvent event) {
updateView(wave.getParticipants());
}
});
updateView(wave.getParticipants());
setMyStatus.setValue(stateManager.getStatus(wave.getViewer()));
setMyStatus.addEditHandler(new EditHandler() {
@Override
public void fire(final EditEvent event) {
stateManager.setStatus(event.getText());
}
});
}
public void addMaybe(final ParticipantAnswer part) {
data.maybe++;
maybep.insert(part, 0);
}
public void addNo(final ParticipantAnswer part) {
data.no++;
nop.insert(part, 0);
}
public void addYes(final ParticipantAnswer part) {
data.yes++;
yesp.insert(part, 0);
}
@UiFactory
CustomDisclosure getDisclo() {
return new CustomDisclosure(img);
}
@UiFactory
AssistanceHeader makeAssitHeader() {
return new AssistanceHeader(stateManager);
}
@UiHandler("disclo")
void onClose(final CloseEvent<DisclosurePanel> event) {
headerSum.setVisible(true);
updateGadgetSize();
stateManager.setAssistanceOpen(false);
}
@UiHandler("disclo")
void onOpen(final OpenEvent<DisclosurePanel> event) {
headerSum.setVisible(false);
updateGadgetSize();
stateManager.setAssistanceOpen(true);
}
private void reset() {
data.reset();
yesp.clear();
nop.clear();
maybep.clear();
}
public void setEnabled(final boolean enabled) {
setMyStatus.setEnabled(enabled);
}
private void updateGadgetSize() {
eventBus.fireEvent(new GadgetUpdateEvent());
}
private void updateView(final JsArray<Participant> participants) {
reset();
for (int i = 0; i < participants.length(); i++) {
data.total++;
final Participant part = participants.get(i);
final String answer = stateManager.getAnswer(part);
if (part.getId().equals(wave.getViewer().getId())) {
setMyStatus.setVisible(answer != null);
updateGadgetSize();
}
if (answer == null) {
data.noyet++;
} else {
final String status = stateManager.getStatus(part);
final String shortName = part.getDisplayName().split("@")[0]; // ParticipantId.DOMAIN_PREFIX
final ParticipantAnswer partAnswer = new ParticipantAnswer(part.getThumbnailUrl(), shortName,
part.getDisplayName(), status);
if (answer.equals(CustomConstants.YES)) {
addYes(partAnswer);
} else if (answer.equals(CustomConstants.NO)) {
addNo(partAnswer);
} else if (answer.equals(CustomConstants.MAYBE)) {
addMaybe(partAnswer);
}
}
}
headerSum.set(data);
}
}