summaryrefslogtreecommitdiffstats
path: root/chrome/views/bitmap_scroll_bar.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-17 04:56:55 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-17 04:56:55 +0000
commit6f3290938a0f8a839ce75df6359d36145ba3b6af (patch)
tree338c21aafe3f28f94a3d7134cf96ad4a13f63459 /chrome/views/bitmap_scroll_bar.cc
parent0520d327302fe86f633191d68d56925fd64719fc (diff)
downloadchromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.zip
chromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.tar.gz
chromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.tar.bz2
Move controls into their own dir under chrome/views/controls
TBR=sky Review URL: http://codereview.chromium.org/48058 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/views/bitmap_scroll_bar.cc')
-rw-r--r--chrome/views/bitmap_scroll_bar.cc703
1 files changed, 0 insertions, 703 deletions
diff --git a/chrome/views/bitmap_scroll_bar.cc b/chrome/views/bitmap_scroll_bar.cc
deleted file mode 100644
index f96a9e8..0000000
--- a/chrome/views/bitmap_scroll_bar.cc
+++ /dev/null
@@ -1,703 +0,0 @@
-// Copyright (c) 2006-2008 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 "chrome/views/bitmap_scroll_bar.h"
-
-#include "base/message_loop.h"
-#include "chrome/common/gfx/chrome_canvas.h"
-#include "chrome/common/l10n_util.h"
-#include "chrome/views/menu.h"
-#include "chrome/views/scroll_view.h"
-#include "chrome/views/widget/widget.h"
-#include "grit/generated_resources.h"
-#include "skia/include/SkBitmap.h"
-
-#undef min
-#undef max
-
-namespace views {
-
-namespace {
-
-// The distance the mouse can be dragged outside the bounds of the thumb during
-// dragging before the scrollbar will snap back to its regular position.
-static const int kScrollThumbDragOutSnap = 100;
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// AutorepeatButton
-//
-// A button that activates on mouse pressed rather than released, and that
-// continues to fire the clicked action as the mouse button remains pressed
-// down on the button.
-//
-///////////////////////////////////////////////////////////////////////////////
-class AutorepeatButton : public ImageButton {
- public:
- AutorepeatButton(ButtonListener* listener)
- : ImageButton(listener),
- repeater_(NewCallback<AutorepeatButton>(this,
- &AutorepeatButton::NotifyClick)) {
- }
- virtual ~AutorepeatButton() {}
-
- protected:
- virtual bool OnMousePressed(const MouseEvent& event) {
- Button::NotifyClick(event.GetFlags());
- repeater_.Start();
- return true;
- }
-
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled) {
- repeater_.Stop();
- View::OnMouseReleased(event, canceled);
- }
-
- private:
- void NotifyClick() {
- Button::NotifyClick(0);
- }
-
- // The repeat controller that we use to repeatedly click the button when the
- // mouse button is down.
- RepeatController repeater_;
-
- DISALLOW_EVIL_CONSTRUCTORS(AutorepeatButton);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// BitmapScrollBarThumb
-//
-// A view that acts as the thumb in the scroll bar track that the user can
-// drag to scroll the associated contents view within the viewport.
-//
-///////////////////////////////////////////////////////////////////////////////
-class BitmapScrollBarThumb : public View {
- public:
- explicit BitmapScrollBarThumb(BitmapScrollBar* scroll_bar)
- : scroll_bar_(scroll_bar),
- drag_start_position_(-1),
- mouse_offset_(-1),
- state_(CustomButton::BS_NORMAL) {
- }
- virtual ~BitmapScrollBarThumb() { }
-
- // Sets the size (width or height) of the thumb to the specified value.
- void SetSize(int size) {
- // Make sure the thumb is never sized smaller than its minimum possible
- // display size.
- gfx::Size prefsize = GetPreferredSize();
- size = std::max(size,
- static_cast<int>(scroll_bar_->IsHorizontal() ?
- prefsize.width() : prefsize.height()));
- gfx::Rect thumb_bounds = bounds();
- if (scroll_bar_->IsHorizontal()) {
- thumb_bounds.set_width(size);
- } else {
- thumb_bounds.set_height(size);
- }
- SetBounds(thumb_bounds);
- }
-
- // Retrieves the size (width or height) of the thumb.
- int GetSize() const {
- if (scroll_bar_->IsHorizontal())
- return width();
- return height();
- }
-
- // Sets the position of the thumb on the x or y axis.
- void SetPosition(int position) {
- gfx::Rect thumb_bounds = bounds();
- gfx::Rect track_bounds = scroll_bar_->GetTrackBounds();
- if (scroll_bar_->IsHorizontal()) {
- thumb_bounds.set_x(track_bounds.x() + position);
- } else {
- thumb_bounds.set_x(track_bounds.y() + position);
- }
- SetBounds(thumb_bounds);
- }
-
- // Gets the position of the thumb on the x or y axis.
- int GetPosition() const {
- gfx::Rect track_bounds = scroll_bar_->GetTrackBounds();
- if (scroll_bar_->IsHorizontal())
- return x() - track_bounds.x();
- return y() - track_bounds.y();
- }
-
- // View overrides:
- virtual gfx::Size GetPreferredSize() {
- return gfx::Size(background_bitmap()->width(),
- start_cap_bitmap()->height() +
- end_cap_bitmap()->height() +
- grippy_bitmap()->height());
- }
-
- protected:
- // View overrides:
- virtual void Paint(ChromeCanvas* canvas) {
- canvas->DrawBitmapInt(*start_cap_bitmap(), 0, 0);
- int top_cap_height = start_cap_bitmap()->height();
- int bottom_cap_height = end_cap_bitmap()->height();
- int thumb_body_height = height() - top_cap_height - bottom_cap_height;
- canvas->TileImageInt(*background_bitmap(), 0, top_cap_height,
- background_bitmap()->width(), thumb_body_height);
- canvas->DrawBitmapInt(*end_cap_bitmap(), 0,
- height() - bottom_cap_height);
-
- // Paint the grippy over the track.
- int grippy_x = (width() - grippy_bitmap()->width()) / 2;
- int grippy_y = (thumb_body_height - grippy_bitmap()->height()) / 2;
- canvas->DrawBitmapInt(*grippy_bitmap(), grippy_x, grippy_y);
- }
-
- virtual void OnMouseEntered(const MouseEvent& event) {
- SetState(CustomButton::BS_HOT);
- }
-
- virtual void OnMouseExited(const MouseEvent& event) {
- SetState(CustomButton::BS_NORMAL);
- }
-
- virtual bool OnMousePressed(const MouseEvent& event) {
- mouse_offset_ = scroll_bar_->IsHorizontal() ? event.x() : event.y();
- drag_start_position_ = GetPosition();
- SetState(CustomButton::BS_PUSHED);
- return true;
- }
-
- virtual bool OnMouseDragged(const MouseEvent& event) {
- // If the user moves the mouse more than |kScrollThumbDragOutSnap| outside
- // the bounds of the thumb, the scrollbar will snap the scroll back to the
- // point it was at before the drag began.
- if (scroll_bar_->IsHorizontal()) {
- if ((event.y() < y() - kScrollThumbDragOutSnap) ||
- (event.y() > (y() + height() + kScrollThumbDragOutSnap))) {
- scroll_bar_->ScrollToThumbPosition(drag_start_position_, false);
- return true;
- }
- } else {
- if ((event.x() < x() - kScrollThumbDragOutSnap) ||
- (event.x() > (x() + width() + kScrollThumbDragOutSnap))) {
- scroll_bar_->ScrollToThumbPosition(drag_start_position_, false);
- return true;
- }
- }
- if (scroll_bar_->IsHorizontal()) {
- int thumb_x = event.x() - mouse_offset_;
- scroll_bar_->ScrollToThumbPosition(x() + thumb_x, false);
- } else {
- int thumb_y = event.y() - mouse_offset_;
- scroll_bar_->ScrollToThumbPosition(y() + thumb_y, false);
- }
- return true;
- }
-
- virtual void OnMouseReleased(const MouseEvent& event,
- bool canceled) {
- SetState(CustomButton::BS_HOT);
- View::OnMouseReleased(event, canceled);
- }
-
- private:
- // Returns the bitmap rendered at the start of the thumb.
- SkBitmap* start_cap_bitmap() const {
- return scroll_bar_->images_[BitmapScrollBar::THUMB_START_CAP][state_];
- }
-
- // Returns the bitmap rendered at the end of the thumb.
- SkBitmap* end_cap_bitmap() const {
- return scroll_bar_->images_[BitmapScrollBar::THUMB_END_CAP][state_];
- }
-
- // Returns the bitmap that is tiled in the background of the thumb between
- // the start and the end caps.
- SkBitmap* background_bitmap() const {
- return scroll_bar_->images_[BitmapScrollBar::THUMB_MIDDLE][state_];
- }
-
- // Returns the bitmap that is rendered in the middle of the thumb
- // transparently over the background bitmap.
- SkBitmap* grippy_bitmap() const {
- return scroll_bar_->images_[BitmapScrollBar::THUMB_GRIPPY]
- [CustomButton::BS_NORMAL];
- }
-
- // Update our state and schedule a repaint when the mouse moves over us.
- void SetState(CustomButton::ButtonState state) {
- state_ = state;
- SchedulePaint();
- }
-
- // The BitmapScrollBar that owns us.
- BitmapScrollBar* scroll_bar_;
-
- int drag_start_position_;
-
- // The position of the mouse on the scroll axis relative to the top of this
- // View when the drag started.
- int mouse_offset_;
-
- // The current state of the thumb button.
- CustomButton::ButtonState state_;
-
- DISALLOW_EVIL_CONSTRUCTORS(BitmapScrollBarThumb);
-};
-
-} // anonymous namespace
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, public:
-
-BitmapScrollBar::BitmapScrollBar(bool horizontal, bool show_scroll_buttons)
- : contents_size_(0),
- contents_scroll_offset_(0),
- prev_button_(new AutorepeatButton(this)),
- next_button_(new AutorepeatButton(this)),
- thumb_(new BitmapScrollBarThumb(this)),
- thumb_track_state_(CustomButton::BS_NORMAL),
- last_scroll_amount_(SCROLL_NONE),
- repeater_(NewCallback<BitmapScrollBar>(this,
- &BitmapScrollBar::TrackClicked)),
- context_menu_mouse_position_(0),
- show_scroll_buttons_(show_scroll_buttons),
- ScrollBar(horizontal) {
- if (!show_scroll_buttons_) {
- prev_button_->SetVisible(false);
- next_button_->SetVisible(false);
- }
-
- AddChildView(prev_button_);
- AddChildView(next_button_);
- AddChildView(thumb_);
-
- SetContextMenuController(this);
- prev_button_->SetContextMenuController(this);
- next_button_->SetContextMenuController(this);
- thumb_->SetContextMenuController(this);
-}
-
-gfx::Rect BitmapScrollBar::GetTrackBounds() const {
- gfx::Size prefsize = prev_button_->GetPreferredSize();
- if (IsHorizontal()) {
- if (!show_scroll_buttons_)
- prefsize.set_width(0);
- int new_width =
- std::max(0, static_cast<int>(width() - (prefsize.width() * 2)));
- gfx::Rect track_bounds(prefsize.width(), 0, new_width, prefsize.height());
- return track_bounds;
- }
- if (!show_scroll_buttons_)
- prefsize.set_height(0);
- gfx::Rect track_bounds(0, prefsize.height(), prefsize.width(),
- std::max(0, height() - (prefsize.height() * 2)));
- return track_bounds;
-}
-
-void BitmapScrollBar::SetImage(ScrollBarPart part,
- CustomButton::ButtonState state,
- SkBitmap* bitmap) {
- DCHECK(part < PART_COUNT);
- DCHECK(state < CustomButton::BS_COUNT);
- switch (part) {
- case PREV_BUTTON:
- prev_button_->SetImage(state, bitmap);
- break;
- case NEXT_BUTTON:
- next_button_->SetImage(state, bitmap);
- break;
- case THUMB_START_CAP:
- case THUMB_MIDDLE:
- case THUMB_END_CAP:
- case THUMB_GRIPPY:
- case THUMB_TRACK:
- images_[part][state] = bitmap;
- break;
- }
-}
-
-void BitmapScrollBar::ScrollByAmount(ScrollAmount amount) {
- ScrollBarController* controller = GetController();
- int offset = contents_scroll_offset_;
- switch (amount) {
- case SCROLL_START:
- offset = GetMinPosition();
- break;
- case SCROLL_END:
- offset = GetMaxPosition();
- break;
- case SCROLL_PREV_LINE:
- offset -= controller->GetScrollIncrement(this, false, false);
- offset = std::max(GetMinPosition(), offset);
- break;
- case SCROLL_NEXT_LINE:
- offset += controller->GetScrollIncrement(this, false, true);
- offset = std::min(GetMaxPosition(), offset);
- break;
- case SCROLL_PREV_PAGE:
- offset -= controller->GetScrollIncrement(this, true, false);
- offset = std::max(GetMinPosition(), offset);
- break;
- case SCROLL_NEXT_PAGE:
- offset += controller->GetScrollIncrement(this, true, true);
- offset = std::min(GetMaxPosition(), offset);
- break;
- }
- contents_scroll_offset_ = offset;
- ScrollContentsToOffset();
-}
-
-void BitmapScrollBar::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();
-}
-
-void BitmapScrollBar::ScrollByContentsOffset(int contents_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();
- }
- ScrollContentsToOffset();
-}
-
-void BitmapScrollBar::TrackClicked() {
- if (last_scroll_amount_ != SCROLL_NONE)
- ScrollByAmount(last_scroll_amount_);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, View implementation:
-
-gfx::Size BitmapScrollBar::GetPreferredSize() {
- // In this case, we're returning the desired width of the scrollbar and its
- // minimum allowable height.
- gfx::Size button_prefsize = prev_button_->GetPreferredSize();
- return gfx::Size(button_prefsize.width(), button_prefsize.height() * 2);
-}
-
-void BitmapScrollBar::Paint(ChromeCanvas* canvas) {
- // Paint the track.
- gfx::Rect track_bounds = GetTrackBounds();
- canvas->TileImageInt(*images_[THUMB_TRACK][thumb_track_state_],
- track_bounds.x(), track_bounds.y(),
- track_bounds.width(), track_bounds.height());
-}
-
-void BitmapScrollBar::Layout() {
- // Size and place the two scroll buttons.
- if (show_scroll_buttons_) {
- gfx::Size prefsize = prev_button_->GetPreferredSize();
- prev_button_->SetBounds(0, 0, prefsize.width(), prefsize.height());
- prefsize = next_button_->GetPreferredSize();
- if (IsHorizontal()) {
- next_button_->SetBounds(width() - prefsize.width(), 0, prefsize.width(),
- prefsize.height());
- } else {
- next_button_->SetBounds(0, height() - prefsize.height(), prefsize.width(),
- prefsize.height());
- }
- } else {
- prev_button_->SetBounds(0, 0, 0, 0);
- next_button_->SetBounds(0, 0, 0, 0);
- }
-
- // Size and place the thumb
- gfx::Size thumb_prefsize = thumb_->GetPreferredSize();
- gfx::Rect track_bounds = GetTrackBounds();
-
- // Preserve the height/width of the thumb (depending on orientation) as set
- // by the last call to |Update|, but coerce the width/height to be the
- // appropriate value for the bitmaps provided.
- if (IsHorizontal()) {
- thumb_->SetBounds(thumb_->x(), thumb_->y(), thumb_->width(),
- thumb_prefsize.height());
- } else {
- thumb_->SetBounds(thumb_->x(), thumb_->y(), thumb_prefsize.width(),
- thumb_->height());
- }
-
- // Hide the thumb if the track isn't tall enough to display even a tiny
- // thumb. The user can only use the mousewheel, scroll buttons or keyboard
- // in this scenario.
- if ((IsHorizontal() && (track_bounds.width() < thumb_prefsize.width()) ||
- (!IsHorizontal() && (track_bounds.height() < thumb_prefsize.height())))) {
- thumb_->SetVisible(false);
- } else if (!thumb_->IsVisible()) {
- thumb_->SetVisible(true);
- }
-}
-
-bool BitmapScrollBar::OnMousePressed(const MouseEvent& event) {
- if (event.IsOnlyLeftMouseButton()) {
- SetThumbTrackState(CustomButton::BS_PUSHED);
- gfx::Rect thumb_bounds = thumb_->bounds();
- if (IsHorizontal()) {
- if (event.x() < thumb_bounds.x()) {
- last_scroll_amount_ = SCROLL_PREV_PAGE;
- } else if (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();
- }
- return true;
-}
-
-void BitmapScrollBar::OnMouseReleased(const MouseEvent& event, bool canceled) {
- SetThumbTrackState(CustomButton::BS_NORMAL);
- repeater_.Stop();
- View::OnMouseReleased(event, canceled);
-}
-
-bool BitmapScrollBar::OnMouseWheel(const MouseWheelEvent& event) {
- ScrollByContentsOffset(event.GetOffset());
- return true;
-}
-
-bool BitmapScrollBar::OnKeyPressed(const KeyEvent& event) {
- ScrollAmount amount = SCROLL_NONE;
- switch(event.GetCharacter()) {
- case VK_UP:
- if (!IsHorizontal())
- amount = SCROLL_PREV_LINE;
- break;
- case VK_DOWN:
- if (!IsHorizontal())
- amount = SCROLL_NEXT_LINE;
- break;
- case VK_LEFT:
- if (IsHorizontal())
- amount = SCROLL_PREV_LINE;
- break;
- case VK_RIGHT:
- if (IsHorizontal())
- amount = SCROLL_NEXT_LINE;
- break;
- case VK_PRIOR:
- amount = SCROLL_PREV_PAGE;
- break;
- case VK_NEXT:
- amount = SCROLL_NEXT_PAGE;
- break;
- case VK_HOME:
- amount = SCROLL_START;
- break;
- case VK_END:
- amount = SCROLL_END;
- break;
- }
- if (amount != SCROLL_NONE) {
- ScrollByAmount(amount);
- return true;
- }
- return false;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, ContextMenuController implementation:
-
-enum ScrollBarContextMenuCommands {
- ScrollBarContextMenuCommand_ScrollHere = 1,
- ScrollBarContextMenuCommand_ScrollStart,
- ScrollBarContextMenuCommand_ScrollEnd,
- ScrollBarContextMenuCommand_ScrollPageUp,
- ScrollBarContextMenuCommand_ScrollPageDown,
- ScrollBarContextMenuCommand_ScrollPrev,
- ScrollBarContextMenuCommand_ScrollNext
-};
-
-void BitmapScrollBar::ShowContextMenu(View* source,
- int x,
- int y,
- bool is_mouse_gesture) {
- Widget* widget = GetWidget();
- gfx::Rect widget_bounds;
- widget->GetBounds(&widget_bounds, true);
- gfx::Point temp_pt(x - widget_bounds.x(), y - widget_bounds.y());
- View::ConvertPointFromWidget(this, &temp_pt);
- context_menu_mouse_position_ = IsHorizontal() ? temp_pt.x() : temp_pt.y();
-
- Menu menu(this, Menu::TOPLEFT, GetWidget()->GetNativeView());
- 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);
- menu.RunMenuAt(x, y);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, Menu::Delegate implementation:
-
-std::wstring BitmapScrollBar::GetLabel(int id) const {
- switch (id) {
- case ScrollBarContextMenuCommand_ScrollHere:
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLHERE);
- case ScrollBarContextMenuCommand_ScrollStart:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLLEFTEDGE);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLHOME);
- case ScrollBarContextMenuCommand_ScrollEnd:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLRIGHTEDGE);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLEND);
- case ScrollBarContextMenuCommand_ScrollPageUp:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLPAGEUP);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLPAGEUP);
- case ScrollBarContextMenuCommand_ScrollPageDown:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLPAGEDOWN);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLPAGEDOWN);
- case ScrollBarContextMenuCommand_ScrollPrev:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLLEFT);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLUP);
- case ScrollBarContextMenuCommand_ScrollNext:
- if (IsHorizontal())
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLRIGHT);
- return l10n_util::GetString(IDS_SCROLLBAR_CXMENU_SCROLLDOWN);
- }
- NOTREACHED() << "Invalid BitmapScrollBar Context Menu command!";
- return L"";
-}
-
-bool BitmapScrollBar::IsCommandEnabled(int id) const {
- switch (id) {
- case ScrollBarContextMenuCommand_ScrollPageUp:
- case ScrollBarContextMenuCommand_ScrollPageDown:
- return !IsHorizontal();
- }
- return true;
-}
-
-void BitmapScrollBar::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;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, ButtonListener implementation:
-
-void BitmapScrollBar::ButtonPressed(Button* sender) {
- if (sender == prev_button_) {
- ScrollByAmount(SCROLL_PREV_LINE);
- } else if (sender == next_button_) {
- ScrollByAmount(SCROLL_NEXT_LINE);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, ScrollBar implementation:
-
-void BitmapScrollBar::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);
-
- 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;
-
- // 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 BitmapScrollBar::GetLayoutSize() const {
- gfx::Size prefsize = prev_button_->GetPreferredSize();
- return IsHorizontal() ? prefsize.height() : prefsize.width();
-}
-
-int BitmapScrollBar::GetPosition() const {
- return thumb_->GetPosition();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// BitmapScrollBar, private:
-
-void BitmapScrollBar::ScrollContentsToOffset() {
- GetController()->ScrollToPosition(this, contents_scroll_offset_);
- thumb_->SetPosition(CalculateThumbPosition(contents_scroll_offset_));
-}
-
-int BitmapScrollBar::GetTrackSize() const {
- gfx::Rect track_bounds = GetTrackBounds();
- return IsHorizontal() ? track_bounds.width() : track_bounds.height();
-}
-
-int BitmapScrollBar::CalculateThumbPosition(int contents_scroll_offset) const {
- return (contents_scroll_offset * GetTrackSize()) / contents_size_;
-}
-
-int BitmapScrollBar::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 BitmapScrollBar::SetThumbTrackState(CustomButton::ButtonState state) {
- thumb_track_state_ = state;
- SchedulePaint();
-}
-
-} // namespace views