All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.refcodes.graphical.ext.javafx.impls.FxFlipBookBuilderImpl Maven / Gradle / Ivy

There is a newer version: 3.3.9
Show newest version
package org.refcodes.graphical.ext.javafx.impls;

import java.util.ArrayList;
import java.util.List;

import org.refcodes.component.LifeCycleStatus;
import org.refcodes.graphical.ext.javafx.FxFlipBookBuilder;

import javafx.animation.PauseTransition;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;

public class FxFlipBookBuilderImpl extends ImageView implements FxFlipBookBuilder {

	// /////////////////////////////////////////////////////////////////////////
	// STATICS:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// CONSTANTS:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// VARIABLES:
	// /////////////////////////////////////////////////////////////////////////

	private List _startUpImages = new ArrayList();
	private List _mainLoopImages = new ArrayList();
	private List _ceaseImages = new ArrayList();
	private LifeCycleStatus _lifeCycleRequest = LifeCycleStatus.NONE;
	private LifeCycleStatus _lifeCycleStatus = LifeCycleStatus.INITIALIZED;
	private int _imageDurationInMs = 250;
	private int _startUpDelayInMs = 1000;
	private PauseTransition _transition = null;

	// /////////////////////////////////////////////////////////////////////////
	// CONSTRUCTORS:
	// /////////////////////////////////////////////////////////////////////////

	public FxFlipBookBuilderImpl() {
		setVisible( false );
	}

	// /////////////////////////////////////////////////////////////////////////
	// BUILDERS:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// INJECTION:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// METHODS:
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void addStartUpImage( Image aImage ) {
		if ( _startUpImages.size() == 0 ) setImage( aImage );
		_startUpImages.add( aImage );
	}

	@Override
	public void addMainLoopImage( Image aImage ) {
		if ( _mainLoopImages.size() == 0 && _startUpImages.size() == 0 ) setImage( aImage );
		_mainLoopImages.add( aImage );
	}

	@Override
	public void addCeaseImage( Image aImage ) {
		if ( _ceaseImages.size() == 0 && _mainLoopImages.size() == 0 && _startUpImages.size() == 0 ) setImage( aImage );
		_ceaseImages.add( aImage );
	}

	@Override
	public void setImageDurationInMs( int aDurationInMs ) {
		_imageDurationInMs = aDurationInMs;
	}

	@Override
	public int getImageDurationInMs() {
		return _imageDurationInMs;
	}

	@Override
	public void setStartUpDelayInMs( int aStartUpDelayInMs ) {
		_startUpDelayInMs = aStartUpDelayInMs;
	}

	@Override
	public int getStartUpDelayInMs() {
		return _startUpDelayInMs;
	}

	@Override
	public FxFlipBookBuilderImpl withImageDurationInMs( int aDurationInMs ) {
		setImageDurationInMs( aDurationInMs );
		return this;
	}

	@Override
	public FxFlipBookBuilderImpl withStartUpDelayInMs( int aStartUpDelayInMs ) {
		setStartUpDelayInMs( aStartUpDelayInMs );
		return this;
	}

	// /////////////////////////////////////////////////////////////////////////
	// LIFE-CYCLE:
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void initialize() {
		_lifeCycleStatus = LifeCycleStatus.INITIALIZED;
	}

	@Override
	public void start() {
		if ( _lifeCycleStatus != LifeCycleStatus.INITIALIZED || _startUpImages.size() == 0 ) _lifeCycleStatus = LifeCycleStatus.STARTED;
		if ( _transition != null ) throw new IllegalStateException( "The flip book must not be started again after it has been started but not stopped (destroyed) again" );
		Runnable theRunner = new AnimationDaemon();
		if ( Platform.isFxApplicationThread() ) {
			theRunner.run();
		}
		else {
			Platform.runLater( theRunner );
		}
	}

	@Override
	public void pause() {
		_lifeCycleRequest = LifeCycleStatus.PAUSED;
	}

	@Override
	public void resume() {
		_lifeCycleRequest = LifeCycleStatus.STARTED;
	}

	@Override
	public void stop() {
		_lifeCycleRequest = LifeCycleStatus.STOPPED;
		PauseTransition theTransition = _transition;
		if ( theTransition != null ) {
			_transition = null;
			theTransition.stop();
		}
	}

	@Override
	public void cease() {
		_lifeCycleRequest = LifeCycleStatus.CEASED;
	}

	@Override
	public void destroy() {
		stop();
		_startUpImages.clear();
	}

	// /////////////////////////////////////////////////////////////////////////
	// HOOKS:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// HELPER:
	// /////////////////////////////////////////////////////////////////////////

	// /////////////////////////////////////////////////////////////////////////
	// INNER CLASSES:
	// /////////////////////////////////////////////////////////////////////////

	private class AnimationDaemon implements Runnable {

		private int _index = 0;

		@Override
		public void run() {

			_transition = new PauseTransition();
			if ( _lifeCycleStatus != LifeCycleStatus.INITIALIZED || _startUpDelayInMs <= 0 ) {
				flipImage();
				_transition.setDuration( Duration.millis( _imageDurationInMs ) );
			}
			else {
				_transition.setDuration( Duration.millis( _startUpDelayInMs ) );
			}

			_transition.setCycleCount( 1 );

			_transition.play();
			EventHandler onFinished = new EventHandler() {
				public void handle( ActionEvent t ) {
					flipImage();
					PauseTransition theTransition = _transition;
					if ( theTransition != null ) {
						theTransition.setDuration( Duration.millis( _imageDurationInMs ) );
						theTransition.play();
					}
				}
			};
			_transition.setOnFinished( onFinished );
		}

		private void flipImage() {
			setVisible( true );
			List theImages = null;

			switch ( _lifeCycleStatus ) {
			case CEASED:
				theImages = _ceaseImages;
				break;
			case DESTROYED:
				break;
			case INITIALIZED:
				theImages = _startUpImages;
				if ( _index > theImages.size() - 1 ) {
					_index = 0;
					_lifeCycleStatus = LifeCycleStatus.STARTED;
					_lifeCycleRequest = LifeCycleStatus.NONE;
					theImages = _mainLoopImages;
				}
				break;
			case NONE:
				break;
			case PAUSED:
				break;
			case STARTED:
				theImages = _mainLoopImages;
				break;
			case STOPPED:
				break;

			default:
				break;
			}

			switch ( _lifeCycleRequest ) {
			case CEASED:
				if ( _index > theImages.size() - 1 ) {
					_index = 0;
					_lifeCycleStatus = LifeCycleStatus.CEASED;
					_lifeCycleRequest = LifeCycleStatus.NONE;
					theImages = _ceaseImages;
				}
				break;
			case DESTROYED:
				break;
			case INITIALIZED:
				_index = 0;
				_lifeCycleStatus = LifeCycleStatus.INITIALIZED;
				_lifeCycleRequest = LifeCycleStatus.NONE;
				theImages = _startUpImages;
				break;
			case NONE:
				break;
			case PAUSED:
				return;
			case STARTED:
				break;
			case STOPPED:
				if ( _index > theImages.size() - 1 ) {
					_index = 0;
					_lifeCycleStatus = LifeCycleStatus.STOPPED;
					_lifeCycleRequest = LifeCycleStatus.NONE;
				}
				return;
			default:
				break;
			}

			if ( theImages.size() > 0 ) {
				if ( _index > theImages.size() - 1 ) _index = 0;
				setImage( theImages.get( _index++ ) );
			}
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy