de.swm.commons.mobile.client.page.Transition.java Source code

Java tutorial

Introduction

Here is the source code for de.swm.commons.mobile.client.page.Transition.java

Source

/*
 * Copyright 2011 SWM Services GmbH.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package de.swm.commons.mobile.client.page;

import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.HasWidgets;
import de.swm.commons.mobile.client.SWMMobile;
import de.swm.commons.mobile.client.utils.Utils;
import de.swm.commons.mobile.client.widgets.SWMMobileWidgetBase;

/**
 * Defines a Transition.
 * 
 */
public class Transition implements EventListener {

    private static final int DEFAULT_TRANSITION_DELAY = 20;
    protected String transitionStyleName;
    protected SWMMobileWidgetBase myFrom, myTo;
    protected boolean myReverse;
    protected HasWidgets myParent;

    /** Defines a transition. **/
    public static final Transition SLIDE = new Transition(
            SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().slide());

    /** Defines a transition. **/
    public static final Transition SLIDEUP = new Transition(
            SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().slideup());

    /** Defines a transition. **/
    public static final Transition SLIDEDOWN = new Transition(
            SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().slidedown());
    /** Defines a transition. **/
    public static final Transition FADE = new Transition(
            SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().fade());
    /** Defines a transition. **/
    public static final Transition POP = new Transition(
            SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().pop());
    /** Defines a transition. **/
    public static final Transition FLIP = new FlipTransition();
    /** Defines a transition. **/
    public static final Transition SWAP = new SwapTransition();

    /**
     * Default constructor.
     * 
     * @param transitionStyleName
     *            the style name.
     */
    public Transition(String transitionStyleName) {
        this.transitionStyleName = transitionStyleName;
    }

    /**
     * Will perform a transition.
     * 
     * @param from
     *            .
     * @param to
     *            .
     * @param parent
     *            the parent widget containing form sand to widgets.
     */
    public static void start(final SWMMobileWidgetBase from, final SWMMobileWidgetBase to,
            final HasWidgets parent) {
        final Timer timer = new Timer() {
            @Override
            public void run() {
                parent.remove(from);
                parent.add(to);
                to.onTransitionEnd();
            }

        };
        timer.schedule(1);
    }

    /**
     * Will perform a transition.
     * 
     * @param from .
     * @param to .
     * @param parent
     *            the parent widget containing form sand to widgets.
     * @param reverse
     *            will be executer in the reverse direction.
     */
    public void start(SWMMobileWidgetBase from, SWMMobileWidgetBase to, HasWidgets parent, boolean reverse) {
        myFrom = from;
        myTo = to;
        myParent = parent;
        myReverse = reverse;
        prepare();
        start();
    }

    /**
     * Will prepare the next transition.
     */
    protected void prepare() {
        myFrom.addStyleName(
                transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().out());
        myTo.addStyleName(
                transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().in());
        if (myReverse) {
            myFrom.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
            myTo.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
        }
        myParent.add(myTo);
    }

    /**
     * Will start the next transition.
     */
    protected void start() {
        registerTransitionEndEvent();
        final Timer timer = new Timer() {
            @Override
            public void run() {
                myFrom.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().start());
                myTo.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().start());
            }
        };
        timer.schedule(DEFAULT_TRANSITION_DELAY); // xxms instead of 1ms, to give iOS/Android enough time to set the
        // starting state.

    }

    /**
     * Will remove the transition styles.
     */
    protected void removeTransitionStyles() {
        myFrom.removeStyleName(transitionStyleName);
        myFrom.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().start());
        myFrom.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().out());
        myFrom.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
        myTo.removeStyleName(transitionStyleName);
        myTo.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().in());
        myTo.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().start());
        myTo.removeStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
    }

    @Override
    public void onBrowserEvent(Event e) {
        String type = e.getType();
        if (type.equals("webkitTransitionEnd") || type.equals("webkitAnimationEnd")) {
            onTransitionEnd();
        }
    }

    /**
     * Will be called after the transition is completed.
     */
    protected void onTransitionEnd() {
        if (myFrom != null && myTo != null) {
            myParent.remove(myFrom);
            removeTransitionStyles();
            myTo.onTransitionEnd();
            myFrom = null;
            myTo = null;
            myParent = null;
        }
    }

    /**
     * Event which will be fired, after the transition is completed.
     */
    protected void registerTransitionEndEvent() {
        if (!myReverse) {
            Utils.addEventListenerOnce(myTo.getElement(), "webkitTransitionEnd", false, this);
        } else {
            Utils.addEventListenerOnce(myFrom.getElement(), "webkitTransitionEnd", false, this);
        }
    }

    /**
     * Flip-Transion.
     * 
     * 
     *         
     * 
     */
    private static class FlipTransition extends Transition {

        private int myPhase = 0;

        /**
         * Default constructor.
         */
        public FlipTransition() {
            super(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().flip0());
        }

        @Override
        protected void registerTransitionEndEvent() {
            if (myPhase == 0) {
                Utils.addEventListenerOnce(myFrom.getElement(), "webkitTransitionEnd", false, this);
            } else {
                Utils.addEventListenerOnce(myTo.getElement(), "webkitTransitionEnd", false, this);
            }
        }

        @Override
        protected void onTransitionEnd() {
            removeTransitionStyles();
            if (myPhase == 0) {
                myParent.remove(myFrom);
                myParent.add(myTo);
                myPhase++;
                transitionStyleName = SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().flip1();
                prepare();
                start();
            } else {
                myTo.onTransitionEnd();
                myFrom = null;
                myTo = null;
                myPhase = 0;
                transitionStyleName = SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().flip0();
            }
        }

        @Override
        protected void prepare() {
            myFrom.addStyleName(
                    transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().out());
            myTo.addStyleName(
                    transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().in());
            if (myReverse) {
                myFrom.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
                myTo.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
            }
        }

    }

    /**
     * Swap-Transition.
     * 
     * 
     *         
     * 
     */
    private static class SwapTransition extends Transition {

        private int myPhase = 0;

        /**
         * D Default constructor.
         */
        public SwapTransition() {
            super(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().swap0());
        }

        @Override
        protected void onTransitionEnd() {
            removeTransitionStyles();
            if (myPhase == 0) {
                myPhase++;
                transitionStyleName = SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().swap1();
                prepare();
                start();
            } else {
                myParent.remove(myFrom);
                myTo.onTransitionEnd();
                myFrom = null;
                myTo = null;
                myPhase = 0;
                transitionStyleName = SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().swap0();
            }
        }

        @Override
        protected void prepare() {
            myFrom.addStyleName(
                    transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().out());
            myTo.addStyleName(
                    transitionStyleName + " " + SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().in());
            if (myReverse) {
                myFrom.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
                myTo.addStyleName(SWMMobile.getTheme().getMGWTCssBundle().getTransitionsCss().reverse());
            }
            if (myPhase == 0) {
                myParent.add(myTo);
            }
        }
    }

}