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.
4
5#include "ui/views/controls/scrollbar/native_scroll_bar.h"
6
7#include <algorithm>
8#include <string>
9
10#include "base/message_loop/message_loop.h"
11#include "ui/events/event.h"
12#include "ui/views/controls/scrollbar/native_scroll_bar_views.h"
13#include "ui/views/controls/scrollbar/native_scroll_bar_wrapper.h"
14#include "ui/views/widget/widget.h"
15
16namespace views {
17
18// static
19const char NativeScrollBar::kViewClassName[] = "NativeScrollBar";
20
21////////////////////////////////////////////////////////////////////////////////
22// NativeScrollBar, public:
23NativeScrollBar::NativeScrollBar(bool is_horizontal)
24    : ScrollBar(is_horizontal),
25      native_wrapper_(NULL) {
26}
27
28NativeScrollBar::~NativeScrollBar() {
29}
30
31// static
32int NativeScrollBar::GetHorizontalScrollBarHeight(
33    const ui::NativeTheme* theme) {
34  return NativeScrollBarWrapper::GetHorizontalScrollBarHeight(theme);
35}
36
37// static
38int NativeScrollBar::GetVerticalScrollBarWidth(
39    const ui::NativeTheme* theme) {
40  return NativeScrollBarWrapper::GetVerticalScrollBarWidth(theme);
41}
42
43////////////////////////////////////////////////////////////////////////////////
44// NativeScrollBar, View overrides:
45gfx::Size NativeScrollBar::GetPreferredSize() const {
46  if (native_wrapper_)
47    return native_wrapper_->GetView()->GetPreferredSize();
48  return gfx::Size();
49}
50
51void NativeScrollBar::Layout() {
52  if (native_wrapper_) {
53    native_wrapper_->GetView()->SetBounds(0, 0, width(), height());
54    native_wrapper_->GetView()->Layout();
55  }
56}
57
58void NativeScrollBar::ViewHierarchyChanged(
59    const ViewHierarchyChangedDetails& details) {
60  Widget* widget;
61  if (details.is_add && !native_wrapper_ && (widget = GetWidget())) {
62    native_wrapper_ = NativeScrollBarWrapper::CreateWrapper(this);
63    AddChildView(native_wrapper_->GetView());
64  }
65}
66
67const char* NativeScrollBar::GetClassName() const {
68  return kViewClassName;
69}
70
71// Overridden from View for keyboard UI.
72bool NativeScrollBar::OnKeyPressed(const ui::KeyEvent& event) {
73  if (!native_wrapper_)
74    return false;
75  return native_wrapper_->GetView()->OnKeyPressed(event);
76}
77
78void NativeScrollBar::OnGestureEvent(ui::GestureEvent* event) {
79  if (!native_wrapper_)
80    return;
81  native_wrapper_->GetView()->OnGestureEvent(event);
82}
83
84bool NativeScrollBar::OnMouseWheel(const ui::MouseWheelEvent& event) {
85  if (!native_wrapper_)
86    return false;
87  return native_wrapper_->GetView()->OnMouseWheel(event);
88}
89
90////////////////////////////////////////////////////////////////////////////////
91// NativeScrollBar, ScrollBar overrides:
92void NativeScrollBar::Update(int viewport_size,
93                             int content_size,
94                             int current_pos) {
95  ScrollBar::Update(viewport_size, content_size, current_pos);
96
97  if (native_wrapper_)
98    native_wrapper_->Update(viewport_size, content_size, current_pos);
99}
100
101int NativeScrollBar::GetLayoutSize() const {
102  return IsHorizontal() ?
103      GetHorizontalScrollBarHeight(GetNativeTheme()) :
104      GetVerticalScrollBarWidth(GetNativeTheme());
105}
106
107int NativeScrollBar::GetPosition() const {
108  if (!native_wrapper_)
109    return 0;
110  return native_wrapper_->GetPosition();
111}
112
113}  // namespace views
114
115