Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1549)

Unified Diff: ui/views/controls/scrollbar/base_scroll_bar.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/scrollbar/base_scroll_bar.h ('k') | ui/views/controls/scrollbar/base_scroll_bar_button.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/scrollbar/base_scroll_bar.cc
diff --git a/ui/views/controls/scrollbar/base_scroll_bar.cc b/ui/views/controls/scrollbar/base_scroll_bar.cc
deleted file mode 100644
index 117fe345dffea247bef217e0c73e1210d7ea7b24..0000000000000000000000000000000000000000
--- a/ui/views/controls/scrollbar/base_scroll_bar.cc
+++ /dev/null
@@ -1,517 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "ui/views/controls/scrollbar/base_scroll_bar.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/events/event.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/geometry/safe_integer_conversions.h"
-#include "ui/strings/grit/ui_strings.h"
-#include "ui/views/controls/menu/menu_item_view.h"
-#include "ui/views/controls/menu/menu_runner.h"
-#include "ui/views/controls/scroll_view.h"
-#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
-#include "ui/views/widget/widget.h"
-
-#if defined(OS_LINUX)
-#include "ui/gfx/screen.h"
-#endif
-
-#undef min
-#undef max
-
-namespace views {
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, public:
-
-BaseScrollBar::BaseScrollBar(bool horizontal, BaseScrollBarThumb* thumb)
- : ScrollBar(horizontal),
- thumb_(thumb),
- contents_size_(0),
- contents_scroll_offset_(0),
- viewport_size_(0),
- thumb_track_state_(CustomButton::STATE_NORMAL),
- last_scroll_amount_(SCROLL_NONE),
- repeater_(base::Bind(&BaseScrollBar::TrackClicked,
- base::Unretained(this))),
- context_menu_mouse_position_(0) {
- AddChildView(thumb_);
-
- set_context_menu_controller(this);
- thumb_->set_context_menu_controller(this);
-}
-
-void BaseScrollBar::ScrollByAmount(ScrollAmount amount) {
- int offset = contents_scroll_offset_;
- switch (amount) {
- case SCROLL_START:
- offset = GetMinPosition();
- break;
- case SCROLL_END:
- offset = GetMaxPosition();
- break;
- case SCROLL_PREV_LINE:
- offset -= GetScrollIncrement(false, false);
- offset = std::max(GetMinPosition(), offset);
- break;
- case SCROLL_NEXT_LINE:
- offset += GetScrollIncrement(false, true);
- offset = std::min(GetMaxPosition(), offset);
- break;
- case SCROLL_PREV_PAGE:
- offset -= GetScrollIncrement(true, false);
- offset = std::max(GetMinPosition(), offset);
- break;
- case SCROLL_NEXT_PAGE:
- offset += GetScrollIncrement(true, true);
- offset = std::min(GetMaxPosition(), offset);
- break;
- default:
- break;
- }
- contents_scroll_offset_ = offset;
- ScrollContentsToOffset();
-}
-
-BaseScrollBar::~BaseScrollBar() {
-}
-
-void BaseScrollBar::ScrollToThumbPosition(int thumb_position,
- bool scroll_to_middle) {
- contents_scroll_offset_ =
- CalculateContentsOffset(thumb_position, scroll_to_middle);
- if (contents_scroll_offset_ < GetMinPosition()) {
- contents_scroll_offset_ = GetMinPosition();
- } else if (contents_scroll_offset_ > GetMaxPosition()) {
- contents_scroll_offset_ = GetMaxPosition();
- }
- ScrollContentsToOffset();
- SchedulePaint();
-}
-
-bool BaseScrollBar::ScrollByContentsOffset(int contents_offset) {
- int old_offset = contents_scroll_offset_;
- contents_scroll_offset_ -= contents_offset;
- if (contents_scroll_offset_ < GetMinPosition()) {
- contents_scroll_offset_ = GetMinPosition();
- } else if (contents_scroll_offset_ > GetMaxPosition()) {
- contents_scroll_offset_ = GetMaxPosition();
- }
- if (old_offset == contents_scroll_offset_)
- return false;
-
- ScrollContentsToOffset();
- return true;
-}
-
-void BaseScrollBar::OnThumbStateChanged(CustomButton::ButtonState old_state,
- CustomButton::ButtonState new_state) {
- if (old_state == CustomButton::STATE_PRESSED &&
- new_state == CustomButton::STATE_NORMAL &&
- GetThumbTrackState() == CustomButton::STATE_HOVERED) {
- SetThumbTrackState(CustomButton::STATE_NORMAL);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, View implementation:
-
-bool BaseScrollBar::OnMousePressed(const ui::MouseEvent& event) {
- if (event.IsOnlyLeftMouseButton())
- ProcessPressEvent(event);
- return true;
-}
-
-void BaseScrollBar::OnMouseReleased(const ui::MouseEvent& event) {
- SetState(HitTestPoint(event.location()) ?
- CustomButton::STATE_HOVERED : CustomButton::STATE_NORMAL);
-}
-
-void BaseScrollBar::OnMouseCaptureLost() {
- SetState(CustomButton::STATE_NORMAL);
-}
-
-void BaseScrollBar::OnMouseEntered(const ui::MouseEvent& event) {
- SetThumbTrackState(CustomButton::STATE_HOVERED);
-}
-
-void BaseScrollBar::OnMouseExited(const ui::MouseEvent& event) {
- if (GetThumbTrackState() == CustomButton::STATE_HOVERED)
- SetState(CustomButton::STATE_NORMAL);
-}
-
-bool BaseScrollBar::OnKeyPressed(const ui::KeyEvent& event) {
- ScrollAmount amount = SCROLL_NONE;
- switch (event.key_code()) {
- case ui::VKEY_UP:
- if (!IsHorizontal())
- amount = SCROLL_PREV_LINE;
- break;
- case ui::VKEY_DOWN:
- if (!IsHorizontal())
- amount = SCROLL_NEXT_LINE;
- break;
- case ui::VKEY_LEFT:
- if (IsHorizontal())
- amount = SCROLL_PREV_LINE;
- break;
- case ui::VKEY_RIGHT:
- if (IsHorizontal())
- amount = SCROLL_NEXT_LINE;
- break;
- case ui::VKEY_PRIOR:
- amount = SCROLL_PREV_PAGE;
- break;
- case ui::VKEY_NEXT:
- amount = SCROLL_NEXT_PAGE;
- break;
- case ui::VKEY_HOME:
- amount = SCROLL_START;
- break;
- case ui::VKEY_END:
- amount = SCROLL_END;
- break;
- default:
- break;
- }
- if (amount != SCROLL_NONE) {
- ScrollByAmount(amount);
- return true;
- }
- return false;
-}
-
-bool BaseScrollBar::OnMouseWheel(const ui::MouseWheelEvent& event) {
- OnScroll(event.x_offset(), event.y_offset());
- return true;
-}
-
-void BaseScrollBar::OnGestureEvent(ui::GestureEvent* event) {
- // If a fling is in progress, then stop the fling for any incoming gesture
- // event (except for the GESTURE_END event that is generated at the end of the
- // fling).
- if (scroll_animator_.get() && scroll_animator_->is_scrolling() &&
- (event->type() != ui::ET_GESTURE_END ||
- event->details().touch_points() > 1)) {
- scroll_animator_->Stop();
- }
-
- if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
- ProcessPressEvent(*event);
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_LONG_PRESS) {
- // For a long-press, the repeater started in tap-down should continue. So
- // return early.
- return;
- }
-
- SetState(CustomButton::STATE_NORMAL);
-
- if (event->type() == ui::ET_GESTURE_TAP) {
- // TAP_DOWN would have already scrolled some amount. So scrolling again on
- // TAP is not necessary.
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN ||
- event->type() == ui::ET_GESTURE_SCROLL_END) {
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_SCROLL_UPDATE) {
- float scroll_amount_f;
- int scroll_amount;
- if (IsHorizontal()) {
- scroll_amount_f = event->details().scroll_x() - roundoff_error_.x();
- scroll_amount = gfx::ToRoundedInt(scroll_amount_f);
- roundoff_error_.set_x(scroll_amount - scroll_amount_f);
- } else {
- scroll_amount_f = event->details().scroll_y() - roundoff_error_.y();
- scroll_amount = gfx::ToRoundedInt(scroll_amount_f);
- roundoff_error_.set_y(scroll_amount - scroll_amount_f);
- }
- if (ScrollByContentsOffset(scroll_amount))
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_SCROLL_FLING_START) {
- if (!scroll_animator_.get())
- scroll_animator_.reset(new ScrollAnimator(this));
- scroll_animator_->Start(
- IsHorizontal() ? event->details().velocity_x() : 0.f,
- IsHorizontal() ? 0.f : event->details().velocity_y());
- event->SetHandled();
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, ScrollDelegate implementation:
-
-bool BaseScrollBar::OnScroll(float dx, float dy) {
- return IsHorizontal() ? ScrollByContentsOffset(dx) :
- ScrollByContentsOffset(dy);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, ContextMenuController implementation:
-
-enum ScrollBarContextMenuCommands {
- ScrollBarContextMenuCommand_ScrollHere = 1,
- ScrollBarContextMenuCommand_ScrollStart,
- ScrollBarContextMenuCommand_ScrollEnd,
- ScrollBarContextMenuCommand_ScrollPageUp,
- ScrollBarContextMenuCommand_ScrollPageDown,
- ScrollBarContextMenuCommand_ScrollPrev,
- ScrollBarContextMenuCommand_ScrollNext
-};
-
-void BaseScrollBar::ShowContextMenuForView(View* source,
- const gfx::Point& p,
- ui::MenuSourceType source_type) {
- Widget* widget = GetWidget();
- gfx::Rect widget_bounds = widget->GetWindowBoundsInScreen();
- gfx::Point temp_pt(p.x() - widget_bounds.x(), p.y() - widget_bounds.y());
- View::ConvertPointFromWidget(this, &temp_pt);
- context_menu_mouse_position_ = IsHorizontal() ? temp_pt.x() : temp_pt.y();
-
- views::MenuItemView* menu = new views::MenuItemView(this);
- // MenuRunner takes ownership of |menu|.
- menu_runner_.reset(new MenuRunner(
- menu, MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU));
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollHere);
- menu->AppendSeparator();
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollStart);
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollEnd);
- menu->AppendSeparator();
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollPageUp);
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollPageDown);
- menu->AppendSeparator();
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollPrev);
- menu->AppendDelegateMenuItem(ScrollBarContextMenuCommand_ScrollNext);
- if (menu_runner_->RunMenuAt(GetWidget(),
- NULL,
- gfx::Rect(p, gfx::Size()),
- MENU_ANCHOR_TOPLEFT,
- source_type) == MenuRunner::MENU_DELETED) {
- return;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, Menu::Delegate implementation:
-
-base::string16 BaseScrollBar::GetLabel(int id) const {
- int ids_value = 0;
- switch (id) {
- case ScrollBarContextMenuCommand_ScrollHere:
- ids_value = IDS_APP_SCROLLBAR_CXMENU_SCROLLHERE;
- break;
- case ScrollBarContextMenuCommand_ScrollStart:
- ids_value = IsHorizontal() ? IDS_APP_SCROLLBAR_CXMENU_SCROLLLEFTEDGE
- : IDS_APP_SCROLLBAR_CXMENU_SCROLLHOME;
- break;
- case ScrollBarContextMenuCommand_ScrollEnd:
- ids_value = IsHorizontal() ? IDS_APP_SCROLLBAR_CXMENU_SCROLLRIGHTEDGE
- : IDS_APP_SCROLLBAR_CXMENU_SCROLLEND;
- break;
- case ScrollBarContextMenuCommand_ScrollPageUp:
- ids_value = IDS_APP_SCROLLBAR_CXMENU_SCROLLPAGEUP;
- break;
- case ScrollBarContextMenuCommand_ScrollPageDown:
- ids_value = IDS_APP_SCROLLBAR_CXMENU_SCROLLPAGEDOWN;
- break;
- case ScrollBarContextMenuCommand_ScrollPrev:
- ids_value = IsHorizontal() ? IDS_APP_SCROLLBAR_CXMENU_SCROLLLEFT
- : IDS_APP_SCROLLBAR_CXMENU_SCROLLUP;
- break;
- case ScrollBarContextMenuCommand_ScrollNext:
- ids_value = IsHorizontal() ? IDS_APP_SCROLLBAR_CXMENU_SCROLLRIGHT
- : IDS_APP_SCROLLBAR_CXMENU_SCROLLDOWN;
- break;
- default:
- NOTREACHED() << "Invalid BaseScrollBar Context Menu command!";
- }
-
- return ids_value ? l10n_util::GetStringUTF16(ids_value) : base::string16();
-}
-
-bool BaseScrollBar::IsCommandEnabled(int id) const {
- switch (id) {
- case ScrollBarContextMenuCommand_ScrollPageUp:
- case ScrollBarContextMenuCommand_ScrollPageDown:
- return !IsHorizontal();
- }
- return true;
-}
-
-void BaseScrollBar::ExecuteCommand(int id) {
- switch (id) {
- case ScrollBarContextMenuCommand_ScrollHere:
- ScrollToThumbPosition(context_menu_mouse_position_, true);
- break;
- case ScrollBarContextMenuCommand_ScrollStart:
- ScrollByAmount(SCROLL_START);
- break;
- case ScrollBarContextMenuCommand_ScrollEnd:
- ScrollByAmount(SCROLL_END);
- break;
- case ScrollBarContextMenuCommand_ScrollPageUp:
- ScrollByAmount(SCROLL_PREV_PAGE);
- break;
- case ScrollBarContextMenuCommand_ScrollPageDown:
- ScrollByAmount(SCROLL_NEXT_PAGE);
- break;
- case ScrollBarContextMenuCommand_ScrollPrev:
- ScrollByAmount(SCROLL_PREV_LINE);
- break;
- case ScrollBarContextMenuCommand_ScrollNext:
- ScrollByAmount(SCROLL_NEXT_LINE);
- break;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, ScrollBar implementation:
-
-void BaseScrollBar::Update(int viewport_size,
- int content_size,
- int contents_scroll_offset) {
- ScrollBar::Update(viewport_size, content_size, contents_scroll_offset);
-
- // Make sure contents_size is always > 0 to avoid divide by zero errors in
- // calculations throughout this code.
- contents_size_ = std::max(1, content_size);
-
- viewport_size_ = std::max(1, viewport_size);
-
- if (content_size < 0)
- content_size = 0;
- if (contents_scroll_offset < 0)
- contents_scroll_offset = 0;
- if (contents_scroll_offset > content_size)
- contents_scroll_offset = content_size;
- contents_scroll_offset_ = contents_scroll_offset;
-
- // Thumb Height and Thumb Pos.
- // The height of the thumb is the ratio of the Viewport height to the
- // content size multiplied by the height of the thumb track.
- double ratio = static_cast<double>(viewport_size) / contents_size_;
- int thumb_size = static_cast<int>(ratio * GetTrackSize());
- thumb_->SetSize(thumb_size);
-
- int thumb_position = CalculateThumbPosition(contents_scroll_offset);
- thumb_->SetPosition(thumb_position);
-}
-
-int BaseScrollBar::GetPosition() const {
- return thumb_->GetPosition();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, protected:
-
-BaseScrollBarThumb* BaseScrollBar::GetThumb() const {
- return thumb_;
-}
-
-CustomButton::ButtonState BaseScrollBar::GetThumbTrackState() const {
- return thumb_track_state_;
-}
-
-void BaseScrollBar::ScrollToPosition(int position) {
- controller()->ScrollToPosition(this, position);
-}
-
-int BaseScrollBar::GetScrollIncrement(bool is_page, bool is_positive) {
- return controller()->GetScrollIncrement(this, is_page, is_positive);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BaseScrollBar, private:
-
-int BaseScrollBar::GetThumbSizeForTest() {
- return thumb_->GetSize();
-}
-
-void BaseScrollBar::ProcessPressEvent(const ui::LocatedEvent& event) {
- SetThumbTrackState(CustomButton::STATE_PRESSED);
- gfx::Rect thumb_bounds = thumb_->bounds();
- if (IsHorizontal()) {
- if (GetMirroredXInView(event.x()) < thumb_bounds.x()) {
- last_scroll_amount_ = SCROLL_PREV_PAGE;
- } else if (GetMirroredXInView(event.x()) > thumb_bounds.right()) {
- last_scroll_amount_ = SCROLL_NEXT_PAGE;
- }
- } else {
- if (event.y() < thumb_bounds.y()) {
- last_scroll_amount_ = SCROLL_PREV_PAGE;
- } else if (event.y() > thumb_bounds.bottom()) {
- last_scroll_amount_ = SCROLL_NEXT_PAGE;
- }
- }
- TrackClicked();
- repeater_.Start();
-}
-
-void BaseScrollBar::SetState(CustomButton::ButtonState state) {
- SetThumbTrackState(state);
- repeater_.Stop();
-}
-
-void BaseScrollBar::TrackClicked() {
- if (last_scroll_amount_ != SCROLL_NONE)
- ScrollByAmount(last_scroll_amount_);
-}
-
-void BaseScrollBar::ScrollContentsToOffset() {
- ScrollToPosition(contents_scroll_offset_);
- thumb_->SetPosition(CalculateThumbPosition(contents_scroll_offset_));
-}
-
-int BaseScrollBar::GetTrackSize() const {
- gfx::Rect track_bounds = GetTrackBounds();
- return IsHorizontal() ? track_bounds.width() : track_bounds.height();
-}
-
-int BaseScrollBar::CalculateThumbPosition(int contents_scroll_offset) const {
- // In some combination of viewport_size and contents_size_, the result of
- // simple division can be rounded and there could be 1 pixel gap even when the
- // contents scroll down to the bottom. See crbug.com/244671
- if (contents_scroll_offset + viewport_size_ == contents_size_) {
- int track_size = GetTrackSize();
- return track_size - (viewport_size_ * GetTrackSize() / contents_size_);
- }
- return (contents_scroll_offset * GetTrackSize()) / contents_size_;
-}
-
-int BaseScrollBar::CalculateContentsOffset(int thumb_position,
- bool scroll_to_middle) const {
- if (scroll_to_middle)
- thumb_position = thumb_position - (thumb_->GetSize() / 2);
- return (thumb_position * contents_size_) / GetTrackSize();
-}
-
-void BaseScrollBar::SetThumbTrackState(CustomButton::ButtonState state) {
- thumb_track_state_ = state;
- SchedulePaint();
-}
-
-} // namespace views
« no previous file with comments | « ui/views/controls/scrollbar/base_scroll_bar.h ('k') | ui/views/controls/scrollbar/base_scroll_bar_button.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698