package de.tud.kom.socom.web.client.influence.image; import java.util.Date; import com.google.gwt.animation.client.Animation; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.dom.client.Style.Visibility; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.InlineHyperlink; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration; import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration.ChangeVisibilityButtonCallback; import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration.DeleteButtonCallback; import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministrationState; import de.tud.kom.socom.web.client.eventhandler.FormValueChangeEventHandler; import de.tud.kom.socom.web.client.events.FormValueChangeEvent; import de.tud.kom.socom.web.client.events.FormValueChangeEvent.ChangeType; import de.tud.kom.socom.web.client.influence.InfluencePresenter; import de.tud.kom.socom.web.client.reporting.ItemReportView; import de.tud.kom.socom.web.client.reporting.ItemReportView.SendReportCallback; import de.tud.kom.socom.web.client.util.DateTimeUtils; import de.tud.kom.socom.web.client.util.FileUtils.FileState; /** * @author rhaban * */ public class InfluenceAnswerImageView extends Composite implements InfluencePresenter.InfluenceAnswerViewInterface<AnswerImage>{ private static final String COLOR_DEFAULT = "#787CBF"; private static final String COLOR_SELECTED = "#2EB800"; private static final String COLOR_HOVER = "#289E00"; @UiTemplate("InfluenceAnswerImageView.ui.xml") interface InfluenceAnswerViewUiBinder extends UiBinder<Widget, InfluenceAnswerImageView> { } private static InfluenceAnswerViewUiBinder uiBinder = GWT.create(InfluenceAnswerViewUiBinder.class); @UiField Label answerLabel; @UiField FocusPanel img; @UiField SpanElement textbox; //fullscreen image stuff @UiField Label magnifier; //lupe @UiField DivElement fullscreen; @UiField FocusPanel fullscreenimg; @UiField DivElement fullscreenimgcontainer; @UiField DivElement engreyimg; //result bar @UiField DivElement resultBar; @UiField SpanElement number; @UiField SpanElement total; @UiField DivElement bar; @UiField DivElement percent; //from user .. @UiField DivElement fromUserContainer; @UiField SpanElement fromTime; @UiField InlineHyperlink fromLink; //admin&report stuff @UiField ItemReportView itemReportView; @UiField ItemAdministration itemAdministration; protected boolean isResultView; // central boolean if element is selected! private boolean isSelected; // if element should be selectable private boolean votable; //current answer private AnswerImage answer; /** * @param isResultView if set true, this view displays itself as a result view and does not report/display any inputs for a form */ public InfluenceAnswerImageView(boolean isResultView) { initWidget(); itemAdministration.changeToOnImageView(); // initialize form elements switchResultView(isResultView); isSelected = false; votable = true; } /** * can be overridden by childclass */ void initWidget() { initWidget(uiBinder.createAndBindUi(this)); } @Override public HandlerRegistration addValueChangeHandler(FormValueChangeEventHandler handler) { return addHandler(handler, FormValueChangeEvent.TYPE); } @Override public void setAdministrationState(ItemAdministrationState state, DeleteButtonCallback cb) { itemAdministration.setState(state,cb); disableAnswer(state == ItemAdministrationState.undelete); } @Override public void setAdministrationState(ItemAdministrationState state) { itemAdministration.setState(state); disableAnswer(state == ItemAdministrationState.undelete); } private void disableAnswer(boolean disable) { if(disable) { engreyimg.removeClassName("hidden"); } else { engreyimg.addClassName("hidden"); } } @Override public void setItemAdministrationVisibility(int visibility) { itemAdministration.setCurrentVisibility(visibility); } @Override public void setItemAdministrationVisibilityChangeCallback(ChangeVisibilityButtonCallback cb) { itemAdministration.setVisibilityCallback(cb); } @Override public void enableReporting(boolean enable) { if(enable) this.itemReportView.removeStyleName("hidden"); else this.itemReportView.addStyleName("hidden"); } @Override public void setSendReportCallback(SendReportCallback cb) { if(itemReportView != null) itemReportView.setSendReportCallback(cb); } @Override public void setAnswer(AnswerImage answer) { this.answer = answer; String message = answer.getMessage(); if(message.length() > 23) message = message.substring(0, 21) + ".."; answerLabel.setText(message); img.getElement().getStyle().setProperty("background", "url(\"./data/influence_data/" + answer.getPath() + "\") no-repeat scroll center center / 250px auto #787CBF"); } @Override public void setFromUser(long userId, String userName, Date created) { this.fromLink.setTargetHistoryToken("./profiles/"+userId); this.fromLink.setText(SafeHtmlUtils.htmlEscape(userName)); this.fromTime.setInnerText(DateTimeUtils.toShortStringRelative(created)); this.fromUserContainer.removeClassName("hidden"); } @Override public void setResultInformation(int totalnumberOfVotes, int numberOfVotes, boolean isWinner) { switchResultView(true); double percent = 0d; if (totalnumberOfVotes != 0 && numberOfVotes != 0) percent = (((double)numberOfVotes)/(totalnumberOfVotes)*100d); percent = Math.round(percent*10)/10d; String percentString = String.valueOf(percent)+"%"; this.percent.setInnerText(percentString); this.total.setInnerText(String.valueOf(totalnumberOfVotes)); this.number.setInnerText(String.valueOf(numberOfVotes)); this.bar.getStyle().setProperty("width", (int)Math.round(percent), Unit.PCT); if (isWinner) resultBar.addClassName("winner"); else resultBar.removeClassName("winner"); } @Override public boolean isSelected() { return isSelected; } @Override public void switchResultView(boolean showResultView) { this.isResultView = showResultView; if (isResultView) { resultBar.removeClassName("hidden"); } else { resultBar.addClassName("hidden"); } } @Override public FileState getReadyState() { if (this.img.getElement().getStyle().getBackgroundImage().isEmpty()) { return FileState.uninitialized; } else return FileState.success; } @Override public void setVotable(boolean votable) { this.votable = votable; if(!votable) { img.getElement().getStyle().setProperty("cursor", "default"); img.setTitle("Nicht wählbar"); } } @Override public void animate() { // TODO } public void setSelected(boolean select) { if(!votable || isSelected == select) return; isSelected = select; highlightIfSelected(); this.fireEvent(new FormValueChangeEvent(this, ChangeType.select, isSelected, null, null, null)); } @UiHandler("img") public void onClickImage(ClickEvent event) { if(!votable) return; if(isResultView) { onClickMagnifier(null); return; } isSelected = !isSelected; highlightIfSelected(); this.fireEvent(new FormValueChangeEvent(this, ChangeType.select, isSelected, null, null, null)); } @UiHandler("img") public void onHoverImage(MouseOverEvent mov) { img.getElement().getStyle().setProperty("border", "thick solid " + COLOR_HOVER); textbox.getStyle().setProperty("background",COLOR_HOVER); } @UiHandler("img") public void onHoverImage(MouseOutEvent mov) { highlightIfSelected(); } @UiHandler("magnifier") public void onClickMagnifier(ClickEvent event) { final Style bgstyle = fullscreen.getStyle(); final Style bgimgcontainerstyle = fullscreenimgcontainer.getStyle(); final Style bgimgstyle = fullscreenimg.getElement().getStyle(); bgstyle.setVisibility(Visibility.VISIBLE); bgimgcontainerstyle.setVisibility(Visibility.VISIBLE); bgimgstyle.setVisibility(Visibility.VISIBLE); if(bgimgstyle.getBackgroundImage() == null || bgimgstyle.getBackgroundImage().trim().isEmpty()) { bgimgstyle.setProperty("background", "url(\"./data/influence_data/" + answer.getPath() + "\") no-repeat scroll center center / contain rgba(0,0,0,0)"); bgimgstyle.setWidth(100, Unit.PCT); bgimgstyle.setHeight(90, Unit.PCT); } new Animation() { @Override protected void onUpdate(double progress) { bgstyle.setOpacity(Math.min(0.9, progress*2)); bgimgstyle.setOpacity(Math.max(0, progress*2-0.8)); } }.run(1600); } @UiHandler("fullscreenimg") public void onFullscreenImgClicked(ClickEvent e) { final Style bgstyle = fullscreen.getStyle(); final Style bgimgstyle = fullscreenimg.getElement().getStyle(); new Animation() { @Override protected void onUpdate(double progress) { bgstyle.setOpacity(1-progress); bgimgstyle.setOpacity(Math.max(0, 1-progress*2.5)); if(progress == 1) { fullscreen.getStyle().setVisibility(Visibility.HIDDEN); fullscreenimg.getElement().getStyle().setVisibility(Visibility.HIDDEN); fullscreenimgcontainer.getStyle().setVisibility(Visibility.HIDDEN); } } }.run(1000); } private void highlightIfSelected() { img.getElement().getStyle().setProperty("border", "thick solid " + (isSelected?COLOR_SELECTED:COLOR_DEFAULT)); textbox.getStyle().setProperty("background", (isSelected?COLOR_SELECTED:COLOR_DEFAULT)); } }