diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-28 18:25:10 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-28 18:25:10 +0000 |
commit | 6845f46001496a8bfd3ec3706533aeded64099ac (patch) | |
tree | 4ebba84405102896658c5b906d2b1b2889b4a3bb /views/controls | |
parent | 4b60c637205ac05d039a3219da88e51af52e9213 (diff) | |
download | chromium_src-6845f46001496a8bfd3ec3706533aeded64099ac.zip chromium_src-6845f46001496a8bfd3ec3706533aeded64099ac.tar.gz chromium_src-6845f46001496a8bfd3ec3706533aeded64099ac.tar.bz2 |
gtk implemenation of Scrollbar.
enabled ScrollView on linux.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/222030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27381 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/controls')
-rw-r--r-- | views/controls/scroll_view.cc | 4 | ||||
-rw-r--r-- | views/controls/scrollbar/native_scroll_bar_gtk.cc | 215 | ||||
-rw-r--r-- | views/controls/scrollbar/native_scroll_bar_gtk.h | 77 |
3 files changed, 294 insertions, 2 deletions
diff --git a/views/controls/scroll_view.cc b/views/controls/scroll_view.cc index ecc3033..a5b5f6a 100644 --- a/views/controls/scroll_view.cc +++ b/views/controls/scroll_view.cc @@ -353,7 +353,7 @@ void ScrollView::ScrollToPosition(ScrollBar* source, int position) { else if (position > max_pos) position = max_pos; contents_->SetX(-position); - contents_->SchedulePaint(contents_->GetLocalBounds(true), true); + contents_->SchedulePaint(contents_->GetVisibleBounds(), true); } } else if (source == vert_sb_ && vert_sb_->IsVisible()) { int vh = viewport_->height(); @@ -366,7 +366,7 @@ void ScrollView::ScrollToPosition(ScrollBar* source, int position) { else if (position > max_pos) position = max_pos; contents_->SetY(-position); - contents_->SchedulePaint(contents_->GetLocalBounds(true), true); + contents_->SchedulePaint(contents_->GetVisibleBounds(), true); } } } diff --git a/views/controls/scrollbar/native_scroll_bar_gtk.cc b/views/controls/scrollbar/native_scroll_bar_gtk.cc new file mode 100644 index 0000000..54f68e2 --- /dev/null +++ b/views/controls/scrollbar/native_scroll_bar_gtk.cc @@ -0,0 +1,215 @@ +// Copyright (c) 2009 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 "views/controls/scrollbar/native_scroll_bar_gtk.h" + +#include <gtk/gtk.h> + +#include "base/keyboard_codes_linux.h" +#include "views/controls/scrollbar/native_scroll_bar.h" +#include "views/controls/scrollbar/scroll_bar.h" + +namespace views { + +//////////////////////////////////////////////////////////////////////////////// +// NativeScrollBarGtk, public: + +NativeScrollBarGtk::NativeScrollBarGtk(NativeScrollBar* scroll_bar) + : NativeControlGtk(), + native_scroll_bar_(scroll_bar) { + set_focus_view(scroll_bar); +} + +NativeScrollBarGtk::~NativeScrollBarGtk() { +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeScrollBarGtk, View overrides: + +void NativeScrollBarGtk::Layout() { + SetBounds(native_scroll_bar_->GetLocalBounds(true)); + NativeControlGtk::Layout(); +} + +gfx::Size NativeScrollBarGtk::GetPreferredSize() { + if (native_scroll_bar_->IsHorizontal()) + return gfx::Size(0, GetHorizontalScrollBarHeight()); + return gfx::Size(GetVerticalScrollBarWidth(), 0); +} + +// TODO(oshima|jcampan): key/mouse events are not delievered and +// the following code is not tested. It requires the focus manager to be fully +// implemented. +bool NativeScrollBarGtk::OnKeyPressed(const KeyEvent& event) { + if (!native_view()) + return false; + switch (event.GetCharacter()) { + case base::VKEY_UP: + if (!native_scroll_bar_->IsHorizontal()) + MoveStep(false /* negative */); + break; + case base::VKEY_DOWN: + if (!native_scroll_bar_->IsHorizontal()) + MoveStep(true /* positive */); + break; + case base::VKEY_LEFT: + if (native_scroll_bar_->IsHorizontal()) + MoveStep(false /* negative */); + break; + case base::VKEY_RIGHT: + if (native_scroll_bar_->IsHorizontal()) + MoveStep(true /* positive */); + break; + case base::VKEY_PRIOR: + MovePage(false /* negative */); + break; + case base::VKEY_NEXT: + MovePage(true /* positive */); + break; + case base::VKEY_HOME: + MoveTo(0); + break; + case base::VKEY_END: + MoveToBottom(); + break; + default: + return false; + } + return true; +} + +bool NativeScrollBarGtk::OnMouseWheel(const MouseWheelEvent& e) { + if (!native_view() || native_scroll_bar_->IsHorizontal()) + return false; + MoveBy(e.GetOffset()); + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeScrollBarGtk, NativeControlGtk overrides: + +void NativeScrollBarGtk::CreateNativeControl() { + GtkObject* adj = gtk_adjustment_new(native_scroll_bar_->GetMinPosition(), + native_scroll_bar_->GetMinPosition(), + native_scroll_bar_->GetMaxPosition(), + 10, 10, + 0); + GtkWidget* widget; + if (native_scroll_bar_->IsHorizontal()) { + widget = gtk_hscrollbar_new(GTK_ADJUSTMENT(adj)); + } else { + widget = gtk_vscrollbar_new(GTK_ADJUSTMENT(adj)); + } + + gtk_range_set_update_policy(GTK_RANGE(widget), GTK_UPDATE_CONTINUOUS); + + g_signal_connect(G_OBJECT(adj), "value-changed", + G_CALLBACK(CallValueChanged), this); + + NativeControlCreated(widget); +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeScrollBarGtk, NativeScrollBarWrapper overrides: + +int NativeScrollBarGtk::GetPosition() const { + return static_cast<int>(gtk_range_get_value(GTK_RANGE(native_view()))); +} + +View* NativeScrollBarGtk::GetView() { + return this; +} + +void NativeScrollBarGtk::Update(int viewport_size, + int content_size, + int current_pos) { + if (!native_view()) + return; + + if (content_size < 0) + content_size = 0; + + if (current_pos < 0) + current_pos = 0; + + if (current_pos > content_size) + current_pos = content_size; + + ScrollBarController* controller = native_scroll_bar_->GetController(); + int step = controller->GetScrollIncrement(native_scroll_bar_, + false /* step */, + true /* positive */); + int page = controller->GetScrollIncrement(native_scroll_bar_, + true /* page */, true); + GtkObject* adj = gtk_adjustment_new(current_pos, + native_scroll_bar_->GetMinPosition(), + content_size, + step, page, + viewport_size); + gtk_range_set_adjustment(GTK_RANGE(native_view()), GTK_ADJUSTMENT(adj)); + g_signal_connect(G_OBJECT(adj), "value-changed", + G_CALLBACK(CallValueChanged), this); +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeScrollBarGtk, private: + +void NativeScrollBarGtk::ValueChanged() { + ScrollBarController* controller = native_scroll_bar_->GetController(); + controller->ScrollToPosition(native_scroll_bar_, GetPosition()); +} + +// static +void NativeScrollBarGtk::CallValueChanged(GtkWidget* widget, + NativeScrollBarGtk* scroll_bar) { + scroll_bar->ValueChanged(); +} + +void NativeScrollBarGtk::MoveBy(int o) { + MoveTo(GetPosition() + o); +} + +void NativeScrollBarGtk::MovePage(bool positive) { + ScrollBarController* controller = native_scroll_bar_->GetController(); + MoveBy(controller->GetScrollIncrement(native_scroll_bar_, true, positive)); +} + +void NativeScrollBarGtk::MoveStep(bool positive) { + ScrollBarController* controller = native_scroll_bar_->GetController(); + MoveBy(controller->GetScrollIncrement(native_scroll_bar_, false, positive)); +} + +void NativeScrollBarGtk::MoveTo(int p) { + GtkAdjustment* adj = gtk_range_get_adjustment(GTK_RANGE(native_view())); + gtk_adjustment_set_value(adj, p); +} + +void NativeScrollBarGtk::MoveToBottom() { + GtkAdjustment* adj = gtk_range_get_adjustment(GTK_RANGE(native_view())); + MoveTo(adj->upper); +} + +//////////////////////////////////////////////////////////////////////////////// +// NativewScrollBarWrapper, public: + +// static +NativeScrollBarWrapper* NativeScrollBarWrapper::CreateWrapper( + NativeScrollBar* scroll_bar) { + return new NativeScrollBarGtk(scroll_bar); +} + +// static +int NativeScrollBarWrapper::GetHorizontalScrollBarHeight() { + // TODO(oshima): get this from gtk's widget property "slider-width". + return 20; +} + +// static +int NativeScrollBarWrapper::GetVerticalScrollBarWidth() { + // TODO(oshima): get this from gtk's widget property "slider-width". + return 20; +} + +} // namespace views + diff --git a/views/controls/scrollbar/native_scroll_bar_gtk.h b/views/controls/scrollbar/native_scroll_bar_gtk.h new file mode 100644 index 0000000..945152e --- /dev/null +++ b/views/controls/scrollbar/native_scroll_bar_gtk.h @@ -0,0 +1,77 @@ +// Copyright (c) 2009 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_NATIVE_SCROLL_BAR_GTK_H_ +#define VIEWS_CONTROLS_SCROLLBAR_NATIVE_SCROLL_BAR_GTK_H_ + +#include "views/controls/native_control_gtk.h" +#include "views/controls/scrollbar/native_scroll_bar_wrapper.h" + +namespace views { + +class ScrollBarContainer; + +///////////////////////////////////////////////////////////////////////////// +// +// NativeScrollBarGtk +// +// A View subclass that wraps a Native gtk scrollbar control. +// +// A scrollbar is either horizontal or vertical. +// +///////////////////////////////////////////////////////////////////////////// +class NativeScrollBarGtk : public NativeControlGtk, + public NativeScrollBarWrapper { + public: + // Creates new scrollbar, either horizontal or vertical. + explicit NativeScrollBarGtk(NativeScrollBar* native_scroll_bar); + virtual ~NativeScrollBarGtk(); + + private: + // Overridden from View for layout purpose. + virtual void Layout(); + virtual gfx::Size GetPreferredSize(); + + // Overridden from View for keyboard UI purpose. + virtual bool OnKeyPressed(const KeyEvent& event); + virtual bool OnMouseWheel(const MouseWheelEvent& e); + + // Overridden from NativeControlGtk. + virtual void CreateNativeControl(); + + // Overridden from NativeScrollBarWrapper. + virtual int GetPosition() const; + virtual View* GetView(); + virtual void Update(int viewport_size, int content_size, int current_pos); + + // Moves the scrollbar by the given value. Negative value is allowed. + // (moves upward) + void MoveBy(int o); + + // Moves the scrollbar by the page (viewport) size. + void MovePage(bool positive); + + // Moves the scrollbar by predefined step size. + void MoveStep(bool positive); + + // Moves the scrollbar to the given position. MoveTo(0) moves it to the top. + void MoveTo(int p); + + // Moves the scrollbar to the end. + void MoveToBottom(); + + // Invoked when the scrollbar's position is changed. + void ValueChanged(); + static void CallValueChanged(GtkWidget* widget, + NativeScrollBarGtk* scroll_bar); + + // The NativeScrollBar we are bound to. + NativeScrollBar* native_scroll_bar_; + + DISALLOW_COPY_AND_ASSIGN(NativeScrollBarGtk); +}; + +} // namespace views + +#endif // #ifndef VIEWS_CONTROLS_SCROLLBAR_NATIVE_SCROLL_BAR_GTK_H_ |