#ifndef UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
#define UI_EVENTS_GESTURE_DETECTION_SCALE_GESTURE_DETECTOR_H_
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "ui/events/gesture_detection/gesture_detection_export.h"
#include "ui/events/gesture_detection/gesture_detector.h"
namespace ui {
class MotionEvent;
class ScaleGestureDetector : public GestureDetector::SimpleGestureListener {
public:
struct GESTURE_DETECTION_EXPORT Config {
Config();
~Config();
GestureDetector::Config gesture_detector_config;
bool quick_scale_enabled;
int min_scaling_touch_major;
int min_scaling_span;
};
class ScaleGestureListener {
public:
virtual ~ScaleGestureListener() {}
virtual bool OnScale(const ScaleGestureDetector& detector,
const MotionEvent& e) = 0;
virtual bool OnScaleBegin(const ScaleGestureDetector& detector,
const MotionEvent& e) = 0;
virtual void OnScaleEnd(const ScaleGestureDetector& detector,
const MotionEvent& e) = 0;
};
class SimpleScaleGestureListener : public ScaleGestureListener {
public:
virtual bool OnScale(const ScaleGestureDetector&,
const MotionEvent&) OVERRIDE;
virtual bool OnScaleBegin(const ScaleGestureDetector&,
const MotionEvent&) OVERRIDE;
virtual void OnScaleEnd(const ScaleGestureDetector&,
const MotionEvent&) OVERRIDE;
};
ScaleGestureDetector(const Config& config, ScaleGestureListener* listener);
virtual ~ScaleGestureDetector();
bool OnTouchEvent(const MotionEvent& event);
void SetQuickScaleEnabled(bool scales);
bool IsQuickScaleEnabled() const;
bool IsInProgress() const;
bool InDoubleTapMode() const;
float GetFocusX() const;
float GetFocusY() const;
float GetCurrentSpan() const;
float GetCurrentSpanX() const;
float GetCurrentSpanY() const;
float GetPreviousSpan() const;
float GetPreviousSpanX() const;
float GetPreviousSpanY() const;
float GetScaleFactor() const;
base::TimeDelta GetTimeDelta() const;
base::TimeTicks GetEventTime() const;
private:
enum DoubleTapMode { DOUBLE_TAP_MODE_NONE, DOUBLE_TAP_MODE_IN_PROGRESS };
virtual bool OnDoubleTap(const MotionEvent& ev) OVERRIDE;
void AddTouchHistory(const MotionEvent& ev);
void ClearTouchHistory();
ScaleGestureListener* const listener_;
Config config_;
float focus_x_;
float focus_y_;
bool quick_scale_enabled_;
float curr_span_;
float prev_span_;
float initial_span_;
float curr_span_x_;
float curr_span_y_;
float prev_span_x_;
float prev_span_y_;
base::TimeTicks curr_time_;
base::TimeTicks prev_time_;
bool in_progress_;
int span_slop_;
int min_span_;
float touch_upper_;
float touch_lower_;
float touch_history_last_accepted_;
int touch_history_direction_;
base::TimeTicks touch_history_last_accepted_time_;
int touch_min_major_;
float double_tap_focus_x_;
float double_tap_focus_y_;
DoubleTapMode double_tap_mode_;
bool event_before_or_above_starting_gesture_event_;
scoped_ptr<GestureDetector> gesture_detector_;
DISALLOW_COPY_AND_ASSIGN(ScaleGestureDetector);
};
}
#endif