Add ICU message format support
[chromium-blink-merge.git] / ui / views / controls / scrollbar / base_scroll_bar.h
blobfec2fd8fc8fbe88884e90418a28d516dc30856b5
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef UI_VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_
6 #define UI_VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_
8 #include "base/gtest_prod_util.h"
9 #include "ui/views/animation/scroll_animator.h"
10 #include "ui/views/context_menu_controller.h"
11 #include "ui/views/controls/button/image_button.h"
12 #include "ui/views/controls/menu/menu_delegate.h"
13 #include "ui/views/controls/scrollbar/scroll_bar.h"
14 #include "ui/views/repeat_controller.h"
16 namespace views {
18 class BaseScrollBarThumb;
19 class MenuRunner;
21 ///////////////////////////////////////////////////////////////////////////////
23 // BaseScrollBar
25 ///////////////////////////////////////////////////////////////////////////////
26 class VIEWS_EXPORT BaseScrollBar : public ScrollBar,
27 public ScrollDelegate,
28 public ContextMenuController,
29 public MenuDelegate {
30 public:
31 BaseScrollBar(bool horizontal, BaseScrollBarThumb* thumb);
32 ~BaseScrollBar() override;
34 // Get the bounds of the "track" area that the thumb is free to slide within.
35 virtual gfx::Rect GetTrackBounds() const = 0;
37 // An enumeration of different amounts of incremental scroll, representing
38 // events sent from different parts of the UI/keyboard.
39 enum ScrollAmount {
40 SCROLL_NONE = 0,
41 SCROLL_START,
42 SCROLL_END,
43 SCROLL_PREV_LINE,
44 SCROLL_NEXT_LINE,
45 SCROLL_PREV_PAGE,
46 SCROLL_NEXT_PAGE,
49 // Scroll the contents by the specified type (see ScrollAmount above).
50 void ScrollByAmount(ScrollAmount amount);
52 // Scroll the contents to the appropriate position given the supplied
53 // position of the thumb (thumb track coordinates). If |scroll_to_middle| is
54 // true, then the conversion assumes |thumb_position| is in the middle of the
55 // thumb rather than the top.
56 void ScrollToThumbPosition(int thumb_position, bool scroll_to_middle);
58 // Scroll the contents by the specified offset (contents coordinates).
59 bool ScrollByContentsOffset(int contents_offset);
61 // Called when the thumb state has been changed from |old_state| to
62 // |new_state|.
63 void OnThumbStateChanged(CustomButton::ButtonState old_state,
64 CustomButton::ButtonState new_state);
66 // View overrides:
67 gfx::Size GetPreferredSize() const override = 0;
68 void Layout() override = 0;
69 bool OnMousePressed(const ui::MouseEvent& event) override;
70 void OnMouseReleased(const ui::MouseEvent& event) override;
71 void OnMouseCaptureLost() override;
72 void OnMouseEntered(const ui::MouseEvent& event) override;
73 void OnMouseExited(const ui::MouseEvent& event) override;
74 bool OnKeyPressed(const ui::KeyEvent& event) override;
75 bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
77 // ui::EventHandler overrides:
78 void OnGestureEvent(ui::GestureEvent* event) override;
80 // ScrollBar overrides:
81 void Update(int viewport_size,
82 int content_size,
83 int contents_scroll_offset) override;
84 int GetLayoutSize() const override = 0;
85 int GetPosition() const override;
87 // ScrollDelegate overrides:
88 bool OnScroll(float dx, float dy) override;
90 // ContextMenuController overrides:
91 void ShowContextMenuForView(View* source,
92 const gfx::Point& point,
93 ui::MenuSourceType source_type) override;
95 // Menu::Delegate overrides:
96 base::string16 GetLabel(int id) const override;
97 bool IsCommandEnabled(int id) const override;
98 void ExecuteCommand(int id) override;
100 protected:
101 // View overrides:
102 void OnPaint(gfx::Canvas* canvas) override = 0;
104 BaseScrollBarThumb* GetThumb() const;
105 CustomButton::ButtonState GetThumbTrackState() const;
107 // Wrapper functions that calls the controller. We need this since native
108 // scrollbars wrap around a different scrollbar. When calling the controller
109 // we need to pass in the appropriate scrollbar. For normal scrollbars it's
110 // the |this| scrollbar, for native scrollbars it's the native scrollbar used
111 // to create this.
112 virtual void ScrollToPosition(int position);
113 virtual int GetScrollIncrement(bool is_page, bool is_positive);
115 private:
116 FRIEND_TEST_ALL_PREFIXES(NativeScrollBarTest, ScrollBarFitsToBottom);
117 int GetThumbSizeForTest();
119 // Changes to 'pushed' state and starts a timer to scroll repeatedly.
120 void ProcessPressEvent(const ui::LocatedEvent& event);
122 // Sets state to |state| and stops the repeater.
123 void SetState(CustomButton::ButtonState state);
125 // Called when the mouse is pressed down in the track area.
126 void TrackClicked();
128 // Responsible for scrolling the contents and also updating the UI to the
129 // current value of the Scroll Offset.
130 void ScrollContentsToOffset();
132 // Returns the size (width or height) of the track area of the ScrollBar.
133 int GetTrackSize() const;
135 // Calculate the position of the thumb within the track based on the
136 // specified scroll offset of the contents.
137 int CalculateThumbPosition(int contents_scroll_offset) const;
139 // Calculates the current value of the contents offset (contents coordinates)
140 // based on the current thumb position (thumb track coordinates). See
141 // |ScrollToThumbPosition| for an explanation of |scroll_to_middle|.
142 int CalculateContentsOffset(int thumb_position,
143 bool scroll_to_middle) const;
145 // Called when the state of the thumb track changes (e.g. by the user
146 // pressing the mouse button down in it).
147 void SetThumbTrackState(CustomButton::ButtonState state);
149 BaseScrollBarThumb* thumb_;
151 // The size of the scrolled contents, in pixels.
152 int contents_size_;
154 // The current amount the contents is offset by in the viewport.
155 int contents_scroll_offset_;
157 // The current size of the view port, in pixels.
158 int viewport_size_;
160 // The state of the scrollbar track. Typically, the track will highlight when
161 // the user presses the mouse on them (during page scrolling).
162 CustomButton::ButtonState thumb_track_state_;
164 // The last amount of incremental scroll that this scrollbar performed. This
165 // is accessed by the callbacks for the auto-repeat up/down buttons to know
166 // what direction to repeatedly scroll in.
167 ScrollAmount last_scroll_amount_;
169 // An instance of a RepeatController which scrolls the scrollbar continuously
170 // as the user presses the mouse button down on the up/down buttons or the
171 // track.
172 RepeatController repeater_;
174 // The position of the mouse within the scroll bar when the context menu
175 // was invoked.
176 int context_menu_mouse_position_;
178 scoped_ptr<MenuRunner> menu_runner_;
179 scoped_ptr<ScrollAnimator> scroll_animator_;
181 // Difference between current position and cumulative deltas obtained from
182 // scroll update events.
183 // TODO(tdresser): This should be removed when raw pixel scrolling for views
184 // is enabled. See crbug.com/329354.
185 gfx::Vector2dF roundoff_error_;
187 DISALLOW_COPY_AND_ASSIGN(BaseScrollBar);
190 } // namespace views
192 #endif // UI_VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_