nl.ru.languageininteraction.language.client.view.AbstractSvgView.java Source code

Java tutorial

Introduction

Here is the source code for nl.ru.languageininteraction.language.client.view.AbstractSvgView.java

Source

/*
 * 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 nl.mpi.tg.eg.experiment.client.view.AbstractView;
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.mpi.tg.eg.experiment.client.exception.AudioException;
import nl.mpi.tg.eg.experiment.client.listener.PresenterEventListner;
import nl.mpi.tg.eg.experiment.client.listener.SingleShotEventListner;
import nl.mpi.tg.eg.experiment.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();
        String svgDiagramName = null; // MatchLanguageBuilder.SvgGroupStates.svgDiagram.name();
        builder.append(SafeHtmlUtils.fromTrustedString("<svg class='svgDiagram' id='" + svgDiagramName
                + "' 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();
            String svgDiagramName = null; // MatchLanguageBuilder.SvgGroupStates.svgDiagram.name();
            if (elementId.equals(svgDiagramName)) {
                // 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();
        String popupCancelButtonLabel = ""; // messages.popupCancelButtonLabel();
        final Button cancelButton = new Button(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, this);
                }
            };
            String popupOkButtonLabel = ""; // messages.popupOkButtonLabel();
            final Button okButton = new Button(popupOkButtonLabel);
            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();
}