/* * Copyright (C) 2015 Language In Interaction * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package nl.ru.languageininteraction.language.client.view; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.TouchEndEvent; import com.google.gwt.event.dom.client.TouchEndHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.VerticalPanel; import nl.ru.languageininteraction.language.client.MatchLanguageBuilder; import nl.ru.languageininteraction.language.client.Messages; import nl.ru.languageininteraction.language.client.exception.AudioException; import nl.ru.languageininteraction.language.client.listener.PresenterEventListner; import nl.ru.languageininteraction.language.client.listener.SingleShotEventListner; import nl.ru.languageininteraction.language.client.service.AudioPlayer; /** * @since Jan 15, 2015 5:30:25 PM (creation date) * @author Peter Withers <p.withers@psych.ru.nl> */ public abstract class AbstractSvgView extends AbstractView { protected final Messages messages = GWT.create(Messages.class); final VerticalPanel verticalPanel = new VerticalPanel(); protected final AudioPlayer audioPlayer; protected PresenterEventListner backEventListner = null; protected PresenterEventListner nextEventListner = null; protected Label debugLabel = new Label(); // private static final String ROTATABLE_GROUP = "rotatableGroup"; public AbstractSvgView(AudioPlayer audioPlayer) throws AudioException { this.audioPlayer = audioPlayer; } @Override protected void parentResized(int height, int width, String units) { // final Element diagramElement = DOM.getElementById(MatchLanguageBuilder.SvgGroupStates.svgDiagram.name()); // final Element diagramElement = DOM.getElementById(ROTATABLE_GROUP); // if (diagramElement != null) { // diagramElement.setAttribute("transform", "rotate(-90)"); //// diagramElement.setAttribute("width", width + units); // } // super.parentResized(height, width, units); } // private void showGroup(SvgGroupStates group) { //// DOM.getElementById(group.name()).setAttribute("style", "visibility:" + SvgTemplate.Visibility.visible); // SafeHtmlBuilder builder = new SafeHtmlBuilder(); // matchLanguageBuilder.getSvgChoiceArrow1(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgChoiceArrow2(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgChoiceArrow3(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgChoiceArrow4(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgChoiceArrow5(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgSampleButton1(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgSampleButton2(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgSampleButton3(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgSampleButton4(builder, SvgTemplate.Visibility.visible); // matchLanguageBuilder.getSvgSampleButton5(builder, SvgTemplate.Visibility.visible); //// final HTML html = new HTML(builder.toSafeHtml()); // DOM.getElementById(SvgGroupStates.diagram.name()).setInnerSafeHtml(builder.toSafeHtml()); // } // // private void hideGroup(SvgGroupStates group) { //// DOM.getElementById(group.name()).setAttribute("style", "visibility:" + SvgTemplate.Visibility.hidden); // DOM.getElementById(SvgGroupStates.ChoiceArrow2.name()).removeFromParent(); // } public void setupScreen(PresenterEventListner backEventListner, PresenterEventListner nextEventListner) { this.backEventListner = backEventListner; this.nextEventListner = nextEventListner; verticalPanel.add(debugLabel); SafeHtmlBuilder builder = new SafeHtmlBuilder(); builder.append(SafeHtmlUtils.fromTrustedString("<style>.overlay {pointer-events: none;}</style>")); // int height = Window.getClientHeight() - (HEADER_SIZE * 3); // int width = Window.getClientWidth(); builder.append(SafeHtmlUtils.fromTrustedString("<svg class='svgDiagram' id='" + MatchLanguageBuilder.SvgGroupStates.svgDiagram.name() + "' width=\"100%\" height=\"100%\" viewBox='0 0 568 320' >")); //<g id=\"" + ROTATABLE_GROUP + "\"> getSvg(builder); builder.append(SafeHtmlUtils.fromTrustedString("</svg>")); //</g> final HTML html = new HTML(builder.toSafeHtml()); html.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { event.preventDefault(); eventTriggered(Element.as(event.getNativeEvent().getEventTarget())); } }); html.addTouchEndHandler(new TouchEndHandler() { @Override public void onTouchEnd(TouchEndEvent event) { event.preventDefault(); eventTriggered(Element.as(event.getNativeEvent().getEventTarget())); } }); html.setStylePrimaryName("svgPanel"); verticalPanel.add(html); add(verticalPanel); } protected void showDebugLabel(String labelString) { // debugLabel.setText(labelString); } private void eventTriggered(Element targetElement) { boolean consumed = false; while (!consumed) { while (targetElement.getParentElement() != null && targetElement.getId().isEmpty()) { targetElement = targetElement.getParentElement(); } final String elementId = targetElement.getId(); if (elementId.equals(MatchLanguageBuilder.SvgGroupStates.svgDiagram.name())) { // we have navigated to the root node of the SVG return; } if (!elementId.isEmpty()) { try { consumed = performClick(elementId); } catch (IllegalArgumentException exception) { // id values can exist outside of group tags, only group tags are put into the enum and so this exception is not exceptional } } targetElement = targetElement.getParentElement(); } } public void showWidgetPopup(IsWidget popupContentWidget) { showWidgetPopup(null, popupContentWidget); } public void showWidgetPopup(final PresenterEventListner saveEventListner, IsWidget popupContentWidget) { final PopupPanel popupPanel = new PopupPanel(false); // the close action to this panel causes background buttons to be clicked popupPanel.setGlassEnabled(true); popupPanel.setStylePrimaryName("svgPopupPanel"); final VerticalPanel popupverticalPanel = new VerticalPanel(); popupverticalPanel.add(popupContentWidget); popupverticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); final SingleShotEventListner cancelSingleShotEventListner = new SingleShotEventListner() { @Override protected void singleShotFired() { popupPanel.hide(); } }; final HorizontalPanel buttonPanel = new HorizontalPanel(); final Button cancelButton = new Button(messages.popupCancelButtonLabel()); cancelButton.addClickHandler(cancelSingleShotEventListner); cancelButton.addTouchStartHandler(cancelSingleShotEventListner); cancelButton.addTouchMoveHandler(cancelSingleShotEventListner); cancelButton.addTouchEndHandler(cancelSingleShotEventListner); buttonPanel.add(cancelButton); if (saveEventListner != null) { final SingleShotEventListner okSingleShotEventListner = new SingleShotEventListner() { @Override protected void singleShotFired() { popupPanel.hide(); saveEventListner.eventFired(null); } }; final Button okButton = new Button(saveEventListner.getLabel()); okButton.addClickHandler(okSingleShotEventListner); okButton.addTouchStartHandler(okSingleShotEventListner); okButton.addTouchMoveHandler(okSingleShotEventListner); okButton.addTouchEndHandler(okSingleShotEventListner); buttonPanel.add(okButton); } popupverticalPanel.add(buttonPanel); popupPanel.setWidget(popupverticalPanel); popupPanel.setPopupPositionAndShow(new PopupPanel.PositionCallback() { @Override public void setPosition(int offsetWidth, int offsetHeight) { final int topPosition = Window.getClientHeight() / 2 - offsetHeight; // topPosition is used to make sure the dialogue is above the half way point on the screen to avoid the software keyboard covering the box // topPosition is also checked to make sure it does not show above the top of the page popupPanel.setPopupPosition(Window.getClientWidth() / 2 - offsetWidth / 2, (topPosition < 0) ? 0 : topPosition); } }); } abstract protected void getSvg(SafeHtmlBuilder builder); abstract protected boolean performClick(final String svgGroupStateString); abstract public void showAudioEnded(); }