package de.tud.kom.socom.web.client.influence.strategies; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.ui.Widget; import de.tud.kom.socom.web.client.AppController; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorInfluenceFreeAnswerCountView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorInfluenceFreeAnswerLengthView; import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorView; import de.tud.kom.socom.web.client.influence.InfluencePresenter; import de.tud.kom.socom.web.client.influence.InfluencePresenter.InfluenceAnswerViewInterface; import de.tud.kom.socom.web.client.influence.InfluencePresenter.InfluenceFreeAnswerViewInterface; import de.tud.kom.socom.web.client.influence.text.InfluenceAnswerFreeTextView; import de.tud.kom.socom.web.client.influence.text.InfluenceAnswerTextView; import de.tud.kom.socom.web.client.sharedmodels.InfluenceAnswer; import de.tud.kom.socom.web.client.sharedmodels.SimpleEntry; public class TextInfluenceStrategy extends InfluenceStrategy<String> { private InfluencePresenter presenter; private List<InfluenceAnswerViewInterface<String>> answersText; private Map<InfluenceAnswerViewInterface<String>, InfluenceAnswer> answers; private int freeAnswerFormCount, maxDigits, maxLines; private ErrorView answerLengthError; public TextInfluenceStrategy(AppController appController, InfluencePresenter influencePresenter) { super(appController); presenter = influencePresenter; maxDigits = presenter.getInfluenceObject().getMaxDigits(); maxLines = presenter.getInfluenceObject().getMaxLines(); answersText = new LinkedList<InfluenceAnswerViewInterface<String>>(); answers = new HashMap<InfluenceAnswerViewInterface<String>, InfluenceAnswer>(); freeAnswerFormCount = 1; } @Override public void addPredefinedAnswer(InfluenceAnswer answer) { //in sql fetch already checked if deleted answers are also welcome in case of admin is logged in.. InfluenceAnswerTextView textanswer = new InfluenceAnswerTextView(presenter.showResults); textanswer.setAnswer(answer.getAnswer()); if (presenter.showResults) { textanswer.setResultInformation(presenter.getTotalNumberOfVotes(), answer.getResult().getVotes(), presenter.getWinner().equals(answer)); } answersText.add(textanswer); answers.put(textanswer, answer); textanswer.enableReporting(false); } @Override public InfluenceAnswerViewInterface<String> addFreeAnswer(InfluenceAnswer answer, boolean votable) { InfluenceAnswerTextView textanswer = new InfluenceAnswerTextView(presenter.showResults); textanswer.setAnswer(answer.getAnswer()); textanswer.setFromUser(answer.getOwnerId(), answer.getOwnerName(), answer.getResult().getTimestamp()); if (presenter.showResults) { textanswer.setResultInformation(presenter.getTotalNumberOfVotes(), answer.getResult().getVotes(), presenter.getWinner().equals(answer)); } textanswer.setVotable(votable); answersText.add(textanswer); answers.put(textanswer, answer); textanswer.enableReporting(presenter.getUserId() != -1 && presenter.getUserId() != answer.getOwnerId()); return textanswer; } @Override public void addFreeAnswerForm() { if (presenter.showResults) return; InfluenceAnswerFreeTextView freetextanswer = new InfluenceAnswerFreeTextView(presenter.showResults, 60); answersText.add(freetextanswer); //TODO visibility answers.put(freetextanswer, new InfluenceAnswer(this.presenter.getUserId(), true, 2)); updateFreeAnswerOnChange(freetextanswer, freetextanswer.getFreeAnswerValue()); if(this.presenter.maxOptions == 1) // only one answer allowed freetextanswer.disableAddAnswer(); } @Override public List<InfluenceAnswerViewInterface<String>> getPossibleAnswers() { return answersText; } @Override public List<InfluenceAnswer> collectSelectedAnswers(List<InfluenceAnswerViewInterface<String>> selected) { List<InfluenceAnswer> selectedAnswers = new LinkedList<InfluenceAnswer>(); for (InfluenceAnswerViewInterface<String> formelem : selected) { InfluenceAnswer a = this.answers.get(formelem); if (a != null) { if (a.isNewFreeAnswer()) { if(a.getAnswer().length() > maxDigits){ presenter.showError(answerLengthError); return null; } a.setOwnerId(presenter.getUserId()); } selectedAnswers.add(a); } } if (selectedAnswers.size() < presenter.minOptions || selectedAnswers.size() > presenter.maxOptions) { presenter.showErrorMinMax(selectedAnswers.size()); return null; } return selectedAnswers; } @Override public InfluenceAnswerViewInterface<String> findParentViewForElement(Widget formOptionWidget) { for (InfluenceAnswerViewInterface<String> a : answersText) { if (a.equals(formOptionWidget)) return a; } return null; } @Override public void updateFreeAnswerOnChange(InfluenceFreeAnswerViewInterface<String> parent, String message) { if(answerLengthError != null) { presenter.hideError(answerLengthError); answerLengthError = null; presenter.enableSubmit(true); } int currLength = message.length(); if(currLength > maxDigits) { if(message.equals(InfluenceAnswerFreeTextView.defaultTextBoxValue)) return; presenter.showError((answerLengthError = new ErrorInfluenceFreeAnswerLengthView(maxDigits, currLength))); presenter.enableSubmit(false); } if(currLength > 0) parent.setSelected(true); answers.get(parent).setAnswer(message); } @Override public void updateFreeAnswerOnUploadSuccess(InfluenceFreeAnswerViewInterface<String> answer, SimpleEntry<String, String>[] sourceParameter, JSONValue result) { answer.disableAddAnswer(); // texts do not have an upload of stuff via form. ignore // new free answer button is something like "successfull upload", so we // use this function in this case if (this.presenter.maxOptions > this.freeAnswerFormCount) { this.addFreeAnswerForm(); this.presenter.paintAnswers(); this.freeAnswerFormCount++; } else { this.presenter.showError(new ErrorInfluenceFreeAnswerCountView(this.presenter.maxOptions, this.freeAnswerFormCount)); } } @Override public void clearAnsweres() { answersText.clear(); answers.clear(); } @Override public Map<InfluenceAnswerViewInterface<String>, InfluenceAnswer> getAnswerMap() { return answers; } @Override public boolean hasValidFileEnding(String filename) { return false; } @Override public String[] getValidFileEndings() { return null; } }