summaryrefslogtreecommitdiffstats
path: root/views/controls/scrollbar/base_scroll_bar.h
diff options
context:
space:
mode:
Diffstat (limited to 'views/controls/scrollbar/base_scroll_bar.h')
-rw-r--r--views/controls/scrollbar/base_scroll_bar.h156
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_