package com.andreiolar.abms.client.widgets;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.andreiolar.abms.client.rpc.DBGetFinishedVoteIds;
import com.andreiolar.abms.client.rpc.DBGetFinishedVoteIdsAsync;
import com.andreiolar.abms.client.rpc.DBGetUserVote;
import com.andreiolar.abms.client.rpc.DBGetUserVoteAsync;
import com.andreiolar.abms.client.rpc.DBGetVotingResults;
import com.andreiolar.abms.client.rpc.DBGetVotingResultsAsync;
import com.andreiolar.abms.client.utils.ChartDrawer;
import com.andreiolar.abms.shared.UserInfo;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class VotingResultsWidget extends Composite implements CustomWidget {
private UserInfo userInfo;
private boolean all;
public VotingResultsWidget(UserInfo userInfo, boolean all) {
this.userInfo = userInfo;
this.all = all;
initWidget(initializeWidget());
}
@Override
public Widget initializeWidget() {
final VerticalPanel panel = new VerticalPanel();
panel.setSpacing(10);
DBGetFinishedVoteIdsAsync rpc = (DBGetFinishedVoteIdsAsync) GWT.create(DBGetFinishedVoteIds.class);
ServiceDefTarget tar = (ServiceDefTarget) rpc;
String moduleURL = GWT.getModuleBaseURL() + "DBGetFinishedVoteIdsImpl";
tar.setServiceEntryPoint(moduleURL);
rpc.getFinishedVoteIds(all, new AsyncCallback<List<String>>() {
@Override
public void onFailure(Throwable caught) {
panel.add(new HTML("<p style=\"font-size:20px\"><b>" + caught.getMessage() + "</b></p>"));
}
@Override
public void onSuccess(List<String> result) {
HTML text = new HTML();
text.setHTML(
"<p>Please select vote ID in order to display results. <br>Obs: In order to display results voting session can't be in progress.</p>");
panel.add(text);
final ListBox dropBox = new ListBox();
dropBox.setMultipleSelect(false);
dropBox.setSize("75px", "25px");
for (String voteId : result) {
dropBox.addItem(voteId);
}
panel.add(dropBox);
final SimplePanel sPanel = new SimplePanel();
final SimplePanel iPanel = new SimplePanel();
Button showResultsButton = new Button();
showResultsButton.setText("Show Results");
showResultsButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
DBGetVotingResultsAsync rpc = (DBGetVotingResultsAsync) GWT.create(DBGetVotingResults.class);
ServiceDefTarget tar = (ServiceDefTarget) rpc;
String moduleURL = GWT.getModuleBaseURL() + "DBGetVotingResultsImpl";
tar.setServiceEntryPoint(moduleURL);
final String voteId = dropBox.getSelectedItemText();
rpc.getVotingResults(voteId, all, new AsyncCallback<Map<String, Number>>() {
@Override
public void onFailure(Throwable caught) {
panel.add(new HTML("<p style=\"font-size:20px\"><b>" + caught.getMessage() + "</b></p>"));
}
@Override
public void onSuccess(Map<String, Number> result) {
String[] options = new String[result.size()];
Number[] results = new Number[result.size()];
int i = 0;
Iterator<Entry<String, Number>> it = result.entrySet().iterator();
while (it.hasNext()) {
Entry<String, Number> entry = it.next();
String key = entry.getKey();
Number value = entry.getValue();
options[i] = key;
results[i] = value;
i++;
}
sPanel.clear();
Widget chart = ChartDrawer.createColumnChart(options, results);
sPanel.add(chart);
DBGetUserVoteAsync rpc = (DBGetUserVoteAsync) GWT.create(DBGetUserVote.class);
ServiceDefTarget tar = (ServiceDefTarget) rpc;
String moduleURL = GWT.getModuleBaseURL() + "DBGetUserVoteImpl";
tar.setServiceEntryPoint(moduleURL);
rpc.getUserVote(userInfo.getUsername(), voteId, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
iPanel.clear();
iPanel.add(new HTML("<p style=\"font-size:20px\"><b>" + caught.getMessage() + "</b></p>"));
}
@Override
public void onSuccess(String result) {
iPanel.clear();
iPanel.add(new HTML("<p style=\"font-size:20px\"><b>" + "Your voting option: " + result + "</b></p>"));
}
});
}
});
}
});
panel.add(showResultsButton);
panel.add(sPanel);
panel.setCellHorizontalAlignment(sPanel, HasHorizontalAlignment.ALIGN_CENTER);
panel.add(iPanel);
}
});
return panel;
}
}