Index: content/browser/renderer_host/input/touch_handle.h |
diff --git a/content/browser/renderer_host/input/touch_handle.h b/content/browser/renderer_host/input/touch_handle.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4458ee75a8a26bfcf7291a4c57453294d491881c |
--- /dev/null |
+++ b/content/browser/renderer_host/input/touch_handle.h |
@@ -0,0 +1,127 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_HANDLE_H_ |
+#define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_HANDLE_H_ |
+ |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/time/time.h" |
+#include "content/common/content_export.h" |
+#include "ui/events/gesture_detection/motion_event.h" |
+#include "ui/gfx/geometry/point_f.h" |
+#include "ui/gfx/geometry/vector2d_f.h" |
+ |
+namespace content { |
+ |
+class TouchHandle; |
+ |
+enum TouchHandleOrientation { |
+ TOUCH_HANDLE_LEFT, |
+ TOUCH_HANDLE_CENTER, |
+ TOUCH_HANDLE_RIGHT, |
+ TOUCH_HANDLE_ORIENTATION_UNDEFINED, |
+}; |
+ |
+// Interface through which |TouchHandle| delegates rendering-specific duties. |
+class CONTENT_EXPORT TouchHandleDrawable { |
+ public: |
+ virtual ~TouchHandleDrawable() {} |
+ virtual void SetOrientation(TouchHandleOrientation orientation) = 0; |
+ virtual void SetAlpha(float alpha) = 0; |
+ virtual void SetFocus(const gfx::PointF& position) = 0; |
+ virtual void SetVisible(bool visible) = 0; |
+ virtual bool ContainsPoint(const gfx::PointF& point) const = 0; |
+}; |
+ |
+// Interface through which |TouchHandle| communicates handle manipulation and |
+// requests concrete drawable instances. |
+class CONTENT_EXPORT TouchHandleClient { |
+ public: |
+ virtual ~TouchHandleClient() {} |
+ virtual void OnHandleDragBegin(const TouchHandle& handle) = 0; |
+ virtual void OnHandleDragUpdate(const TouchHandle& handle, |
+ const gfx::PointF& new_position) = 0; |
+ virtual void OnHandleDragEnd(const TouchHandle& handle) = 0; |
+ virtual void OnHandleTapped(const TouchHandle& handle) = 0; |
+ virtual void SetNeedsAnimate() = 0; |
+ virtual scoped_ptr<TouchHandleDrawable> CreateDrawable() = 0; |
+}; |
+ |
+// Responsible for displaying a selection or insertion handle for text |
+// interaction. |
+class CONTENT_EXPORT TouchHandle { |
+ public: |
+ // The created drawable will remain invisible until otherwise specified. |
+ TouchHandle(TouchHandleClient* client, TouchHandleOrientation orientation); |
+ ~TouchHandle(); |
+ |
+ enum AnimationStyle { |
+ ANIMATION_NONE, |
+ ANIMATION_SMOOTH |
+ }; |
+ // Update the handle visibility, fading in/out according to |animation_style|. |
+ // If an animation is in-progress, it will be overriden appropriately. |
+ void SetVisible(bool visible, AnimationStyle animation_style); |
+ |
+ // Update the handle placement to |position|. |
+ // Note: If a handle fade animation is active, the visual handle position will |
+ // not be updated. |
+ void SetPosition(const gfx::PointF& position); |
+ |
+ // Update the handle visuals to |orientation|. |
+ // Note: If the handle is being dragged, the orientation change will be |
+ // deferred until the drag has ceased. |
+ void SetOrientation(TouchHandleOrientation orientation); |
+ |
+ // Hide the handles and cancel any active animations. |
+ void Hide(); |
+ |
+ // Allows touch-dragging of the handle. Returns true if the event was |
+ // consumed, in which case the caller should cease further handling. |
+ bool WillHandleTouchEvent(const ui::MotionEvent& event); |
+ |
+ // Ticks an active animation, as requested to the client by |SetNeedsAnimate|. |
+ // Returns true if an animation is active and requires further ticking. |
+ bool Animate(base::TimeTicks frame_time); |
+ |
+ bool is_dragging() const { return is_dragging_; } |
+ const gfx::PointF& position() const { return position_; } |
+ TouchHandleOrientation orientation() const { return orientation_; } |
+ |
+ private: |
+ void BeginDrag(); |
+ void EndDrag(); |
+ void ScheduleFade(); |
+ void CancelFade(); |
+ void SetAlpha(float alpha); |
+ |
+ scoped_ptr<TouchHandleDrawable> drawable_; |
+ |
+ TouchHandleClient* const client_; |
+ |
+ gfx::PointF position_; |
+ TouchHandleOrientation orientation_; |
+ TouchHandleOrientation deferred_orientation_; |
+ |
+ gfx::PointF touch_down_position_; |
+ gfx::Vector2dF touch_to_focus_offset_; |
+ base::TimeTicks touch_down_time_; |
+ |
+ // Note that when a fade animation is active, |is_visible_| and |position_| |
+ // may not reflect the actual visibilty and position of the drawable. This |
+ // discrepancy is resolved either upon fade completion or cancellation. |
+ base::TimeTicks fade_end_time_; |
+ gfx::PointF fade_start_position_; |
+ float alpha_; |
+ |
+ bool is_visible_; |
+ bool is_dragging_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TouchHandle); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_HANDLE_H_ |