package graphview;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;

/**
 * Copyright (C) 2011 Jonas Gehring
 * Licensed under the GNU Lesser General Public License (LGPL)
 * http://www.gnu.org/licenses/lgpl.html
 */
public class ScaleGestureDetector {
	public interface SimpleOnScaleGestureListener {
		boolean onScale(ScaleGestureDetector detector);
	}

	private Object realScaleGestureDetector;
	private Method method_getScaleFactor;
	private Method method_isInProgress;
	private Method method_onTouchEvent;

	/**
	 * @param context
	 * @param simpleOnScaleGestureListener
	 */
	public ScaleGestureDetector(Context context, SimpleOnScaleGestureListener simpleOnScaleGestureListener) {
		try {
			// check if class is available
			Class.forName("android.view.ScaleGestureDetector");

			// load class and methods
			Class<?> classRealScaleGestureDetector = Class.forName("com.jjoe64.graphview.compatible.RealScaleGestureDetector");
			method_getScaleFactor = classRealScaleGestureDetector.getMethod("getScaleFactor");
			method_isInProgress = classRealScaleGestureDetector.getMethod("isInProgress");
			method_onTouchEvent = classRealScaleGestureDetector.getMethod("onTouchEvent", MotionEvent.class);

			// create real ScaleGestureDetector
			Constructor<?> constructor = classRealScaleGestureDetector.getConstructor(Context.class, getClass(), SimpleOnScaleGestureListener.class);
			realScaleGestureDetector = constructor.newInstance(context, this, simpleOnScaleGestureListener);
		} catch (Exception e) {
			// not available
			Log.w("com.jjoe64.graphview", "*** WARNING *** No scaling available for graphs. Exception:");
			e.printStackTrace();
		}
	}

	public double getScaleFactor() {
		if (method_getScaleFactor != null) {
			try {
				return (Float) method_getScaleFactor.invoke(realScaleGestureDetector);
			} catch (Exception e) {
				e.printStackTrace();
				return 1.0;
			}
		}
		return 1.0;
	}

	public boolean isInProgress() {
		if (method_getScaleFactor != null) {
			try {
				return (Boolean) method_isInProgress.invoke(realScaleGestureDetector);
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}
		return false;
	}

	public void onTouchEvent(MotionEvent event) {
		if (method_onTouchEvent != null) {
			try {
				method_onTouchEvent.invoke(realScaleGestureDetector, event);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
