public class

ProgressMonitor

extends Object
implements IProgressListener
package org.anddev.andengine.util.progress;

/**
 * (c) 2010 Nicolas Gramlich 
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 18:07:35 - 09.07.2009
 */
public class ProgressMonitor implements IProgressListener {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	private final ProgressMonitor mParentProgressMonitor;
	private final IProgressListener mListener;

	private int mSubMonitorRangeFrom = 0;
	private int mSubMonitorRangeTo = 100;

	private int mProgress = 0;

	// ===========================================================
	// Constructors
	// ===========================================================

	public ProgressMonitor(final IProgressListener pListener) {
		this.mListener = pListener;
		this.mParentProgressMonitor = null;
	}

	public ProgressMonitor(final ProgressMonitor pParent){
		this.mListener = null;
		this.mParentProgressMonitor = pParent;
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	public ProgressMonitor getParentProgressMonitor() {
		return this.mParentProgressMonitor;
	}

	public int getProgress() {
		return this.mProgress;
	}

	public void setSubMonitorRange(final int pSubMonitorRangeFrom, final int pSubMonitorRangeTo) {
		this.mSubMonitorRangeFrom = pSubMonitorRangeFrom;
		this.mSubMonitorRangeTo = pSubMonitorRangeTo;
	}

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	/**
	 * @param pProgress between 0 and 100.
	 */
	@Override
	public void onProgressChanged(final int pProgress){
		this.mProgress = pProgress;
		if(this.mParentProgressMonitor != null) {
			this.mParentProgressMonitor.onSubProgressChanged(pProgress);
		} else {
			this.mListener.onProgressChanged(pProgress);
		}
	}

	private void onSubProgressChanged(final int pSubProgress){
		final int subRange = this.mSubMonitorRangeTo- this.mSubMonitorRangeFrom;
		final int subProgressInRange = this.mSubMonitorRangeFrom + (int)(subRange * pSubProgress / 100f);

		if(this.mParentProgressMonitor != null) {
			this.mParentProgressMonitor.onSubProgressChanged(subProgressInRange);
		}else{
			this.mListener.onProgressChanged(subProgressInRange);
		}
	}
}