diff options
Diffstat (limited to 'views/controls/scrollbar/base_scroll_bar.h')
-rw-r--r-- | views/controls/scrollbar/base_scroll_bar.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/views/controls/scrollbar/base_scroll_bar.h b/views/controls/scrollbar/base_scroll_bar.h new file mode 100644 index 0000000..7dc037b --- /dev/null +++ b/views/controls/scrollbar/base_scroll_bar.h @@ -0,0 +1,156 @@ +// Copyright (c) 2011 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 VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_ +#define VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_ +#pragma once + +#include "views/context_menu_controller.h" +#include "views/controls/button/image_button.h" +#include "views/controls/menu/menu.h" +#include "views/controls/scrollbar/scroll_bar.h" +#include "views/repeat_controller.h" + +namespace views { + +class BaseScrollBarThumb; + +/////////////////////////////////////////////////////////////////////////////// +// +// BaseScrollBar +// +/////////////////////////////////////////////////////////////////////////////// +class VIEWS_EXPORT BaseScrollBar : public ScrollBar, + public ContextMenuController, + public Menu::Delegate { + public: + BaseScrollBar(bool horizontal, BaseScrollBarThumb* thumb); + virtual ~BaseScrollBar() { } + + // Get the bounds of the "track" area that the thumb is free to slide within. + virtual gfx::Rect GetTrackBounds() const = 0; + + // An enumeration of different amounts of incremental scroll, representing + // events sent from different parts of the UI/keyboard. + enum ScrollAmount { + SCROLL_NONE = 0, + SCROLL_START, + SCROLL_END, + SCROLL_PREV_LINE, + SCROLL_NEXT_LINE, + SCROLL_PREV_PAGE, + SCROLL_NEXT_PAGE, + }; + + // Scroll the contents by the specified type (see ScrollAmount above). + void ScrollByAmount(ScrollAmount amount); + + // Scroll the contents to the appropriate position given the supplied + // position of the thumb (thumb track coordinates). If |scroll_to_middle| is + // true, then the conversion assumes |thumb_position| is in the middle of the + // thumb rather than the top. + void ScrollToThumbPosition(int thumb_position, bool scroll_to_middle); + + // Scroll the contents by the specified offset (contents coordinates). + void ScrollByContentsOffset(int contents_offset); + + // View overrides: + virtual gfx::Size GetPreferredSize() OVERRIDE = 0; + virtual void Layout() OVERRIDE = 0; + virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE; + virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE; + virtual void OnMouseCaptureLost() OVERRIDE; + virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE; + virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE; + + // ScrollBar overrides: + virtual void Update(int viewport_size, + int content_size, + int contents_scroll_offset) OVERRIDE; + virtual int GetLayoutSize() const OVERRIDE = 0; + virtual int GetPosition() const OVERRIDE; + + // ContextMenuController overrides. + virtual void ShowContextMenuForView(View* source, + const gfx::Point& p, + bool is_mouse_gesture) OVERRIDE; + + // Menu::Delegate overrides: + virtual std::wstring GetLabel(int id) const OVERRIDE; + virtual bool IsCommandEnabled(int id) const OVERRIDE; + virtual void ExecuteCommand(int id) OVERRIDE; + + protected: + // View overrides: + virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE = 0; + + BaseScrollBarThumb* GetThumb() const; + + CustomButton::ButtonState GetThumbTrackState() const; + + // Wrapper functions that calls the controller. We need this since native + // scrollbars wrap around a different scrollbar. When calling the controller + // we need to pass in the appropriate scrollbar. For normal scrollbars it's + // the |this| scrollbar, for native scrollbars it's the native scrollbar used + // to create this. + virtual void ScrollToPosition(int position); + virtual int GetScrollIncrement(bool is_page, bool is_positive); + + private: + // Called when the mouse is pressed down in the track area. + void TrackClicked(); + + // Responsible for scrolling the contents and also updating the UI to the + // current value of the Scroll Offset. + void ScrollContentsToOffset(); + + // Returns the size (width or height) of the track area of the ScrollBar. + int GetTrackSize() const; + + // Calculate the position of the thumb within the track based on the + // specified scroll offset of the contents. + int CalculateThumbPosition(int contents_scroll_offset) const; + + // Calculates the current value of the contents offset (contents coordinates) + // based on the current thumb position (thumb track coordinates). See + // |ScrollToThumbPosition| for an explanation of |scroll_to_middle|. + int CalculateContentsOffset(int thumb_position, + bool scroll_to_middle) const; + + // Called when the state of the thumb track changes (e.g. by the user + // pressing the mouse button down in it). + void SetThumbTrackState(CustomButton::ButtonState state); + + BaseScrollBarThumb* thumb_; + + // The size of the scrolled contents, in pixels. + int contents_size_; + + // The current amount the contents is offset by in the viewport. + int contents_scroll_offset_; + + // The state of the scrollbar track. Typically, the track will highlight when + // the user presses the mouse on them (during page scrolling). + CustomButton::ButtonState thumb_track_state_; + + // The last amount of incremental scroll that this scrollbar performed. This + // is accessed by the callbacks for the auto-repeat up/down buttons to know + // what direction to repeatedly scroll in. + ScrollAmount last_scroll_amount_; + + // An instance of a RepeatController which scrolls the scrollbar continuously + // as the user presses the mouse button down on the up/down buttons or the + // track. + RepeatController repeater_; + + // The position of the mouse within the scroll bar when the context menu + // was invoked. + int context_menu_mouse_position_; + + DISALLOW_COPY_AND_ASSIGN(BaseScrollBar); +}; + +} // namespace views + +#endif // VIEWS_CONTROLS_SCROLLBAR_BASE_SCROLL_BAR_H_ |