summaryrefslogtreecommitdiffstats
path: root/views/controls
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 18:25:10 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-28 18:25:10 +0000
commit6845f46001496a8bfd3ec3706533aeded64099ac (patch)
tree4ebba84405102896658c5b906d2b1b2889b4a3bb /views/controls
parent4b60c637205ac05d039a3219da88e51af52e9213 (diff)
downloadchromium_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.cc4
-rw-r--r--views/controls/scrollbar/native_scroll_bar_gtk.cc215
-rw-r--r--views/controls/scrollbar/native_scroll_bar_gtk.h77
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_