1/*
2 * Copyright (C) 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "IntPoint.h"
29#include "Timer.h"
30#include <wtf/WallTime.h>
31
32namespace WebCore {
33
34class EventHandler;
35class Frame;
36class FrameView;
37class Node;
38class PlatformMouseEvent;
39class RenderBox;
40class RenderObject;
41
42enum AutoscrollType {
43 NoAutoscroll,
44 AutoscrollForDragAndDrop,
45 AutoscrollForSelection,
46#if ENABLE(PAN_SCROLLING)
47 AutoscrollForPanCanStop,
48 AutoscrollForPan,
49#endif
50};
51
52// AutscrollController handles autoscroll and pan scroll for EventHandler.
53class AutoscrollController {
54 WTF_MAKE_FAST_ALLOCATED;
55public:
56 AutoscrollController();
57 RenderBox* autoscrollRenderer() const;
58 bool autoscrollInProgress() const;
59 bool panScrollInProgress() const;
60 void startAutoscrollForSelection(RenderObject*);
61 void stopAutoscrollTimer(bool rendererIsBeingDestroyed = false);
62 void updateAutoscrollRenderer();
63 void updateDragAndDrop(Node* targetNode, const IntPoint& eventPosition, WallTime eventTime);
64#if ENABLE(PAN_SCROLLING)
65 void didPanScrollStart();
66 void didPanScrollStop();
67 void handleMouseReleaseEvent(const PlatformMouseEvent&);
68 void setPanScrollInProgress(bool);
69 void startPanScrolling(RenderBox*, const IntPoint&);
70#endif
71
72private:
73 void autoscrollTimerFired();
74 void startAutoscrollTimer();
75#if ENABLE(PAN_SCROLLING)
76 void updatePanScrollState(FrameView*, const IntPoint&);
77#endif
78
79 Timer m_autoscrollTimer;
80 RenderBox* m_autoscrollRenderer;
81 AutoscrollType m_autoscrollType;
82 IntPoint m_dragAndDropAutoscrollReferencePosition;
83 WallTime m_dragAndDropAutoscrollStartTime;
84#if ENABLE(PAN_SCROLLING)
85 IntPoint m_panScrollStartPos;
86#endif
87};
88
89} // namespace WebCore
90