summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-24 23:54:35 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-24 23:54:35 +0000
commit65fffb56ebe6c8df9448f7a1e3bb6a86234de026 (patch)
treee374390a3d3fbc20ae2776ce5790131272707443
parent09733b45d3254d0f270c9ac2f9134dbc69f08304 (diff)
downloadchromium_src-65fffb56ebe6c8df9448f7a1e3bb6a86234de026.zip
chromium_src-65fffb56ebe6c8df9448f7a1e3bb6a86234de026.tar.gz
chromium_src-65fffb56ebe6c8df9448f7a1e3bb6a86234de026.tar.bz2
Hook up more of the NativeWidgetViews.
- Move NativeWidgetView to its own file. - Enhances the example to contain a button. http://crbug.com/83663 TEST=none Review URL: http://codereview.chromium.org/7065042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86527 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--views/events/event.h3
-rw-r--r--views/examples/native_widget_views_example.cc49
-rw-r--r--views/views.gyp2
-rw-r--r--views/widget/native_widget_view.cc108
-rw-r--r--views/widget/native_widget_view.h66
-rw-r--r--views/widget/native_widget_views.cc26
-rw-r--r--views/widget/native_widget_views.h24
7 files changed, 248 insertions, 30 deletions
diff --git a/views/events/event.h b/views/events/event.h
index 2c23104..7f4b2e3 100644
--- a/views/events/event.h
+++ b/views/events/event.h
@@ -27,6 +27,7 @@ namespace views {
class View;
namespace internal {
+class NativeWidgetView;
class RootView;
}
@@ -234,6 +235,7 @@ class MouseEvent : public LocatedEvent {
}
private:
+ friend class internal::NativeWidgetView;
friend class internal::RootView;
DISALLOW_COPY_AND_ASSIGN(MouseEvent);
@@ -377,6 +379,7 @@ class MouseWheelEvent : public MouseEvent {
private:
friend class internal::RootView;
+ friend class internal::NativeWidgetView;
MouseWheelEvent(const MouseWheelEvent& model, View* root)
: MouseEvent(model, root),
diff --git a/views/examples/native_widget_views_example.cc b/views/examples/native_widget_views_example.cc
index f02b3e1..8aaf68f 100644
--- a/views/examples/native_widget_views_example.cc
+++ b/views/examples/native_widget_views_example.cc
@@ -4,6 +4,8 @@
#include "views/examples/native_widget_views_example.h"
+#include "ui/gfx/canvas.h"
+#include "views/controls/button/text_button.h"
#include "views/examples/example_base.h"
#include "views/view.h"
#include "views/widget/widget.h"
@@ -11,6 +13,46 @@
namespace examples {
+// A ContentView for our example widget. Contains a variety of controls for
+// testing NativeWidgetViews event handling. If any part of the Widget's bounds
+// are rendered red, something went wrong.
+class TestContentView : public views::View,
+ public views::ButtonListener {
+ public:
+ TestContentView()
+ : click_count_(0),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ button_(new views::TextButton(this, L"Click me!"))) {
+ AddChildView(button_);
+ }
+ virtual ~TestContentView() {
+ }
+
+ // Overridden from views::View:
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
+ SkColor color = click_count_ % 2 == 0 ? SK_ColorGREEN : SK_ColorBLUE;
+ canvas->FillRectInt(color, 0, 0, width(), height());
+ }
+ virtual void Layout() OVERRIDE {
+ button_->SetBounds(10, 10, width() - 20, height() - 20);
+ }
+
+ // Overridden from views::ButtonListener:
+ virtual void ButtonPressed(views::Button* sender,
+ const views::Event& event) OVERRIDE {
+ if (sender == button_) {
+ ++click_count_;
+ SchedulePaint();
+ }
+ }
+
+ private:
+ int click_count_;
+ views::TextButton* button_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestContentView);
+};
+
NativeWidgetViewsExample::NativeWidgetViewsExample(ExamplesMain* main)
: ExampleBase(main) {
}
@@ -24,12 +66,13 @@ std::wstring NativeWidgetViewsExample::GetExampleTitle() {
void NativeWidgetViewsExample::CreateExampleView(views::View* container) {
views::Widget* widget = new views::Widget;
- views::NativeWidgetViews* nwv = new views::NativeWidgetViews(widget);
+ views::NativeWidgetViews* nwv =
+ new views::NativeWidgetViews(container, widget);
views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
params.native_widget = nwv;
widget->Init(params);
- container->AddChildView(nwv->GetView());
- widget->SetBounds(gfx::Rect(10, 10, 50, 50));
+ widget->SetContentsView(new TestContentView);
+ widget->SetBounds(gfx::Rect(10, 10, 300, 150));
}
} // namespace examples
diff --git a/views/views.gyp b/views/views.gyp
index d3f4272..f103475 100644
--- a/views/views.gyp
+++ b/views/views.gyp
@@ -362,6 +362,8 @@
'widget/native_widget_delegate.h',
'widget/native_widget_gtk.cc',
'widget/native_widget_gtk.h',
+ 'widget/native_widget_view.cc',
+ 'widget/native_widget_view.h',
'widget/native_widget_views.cc',
'widget/native_widget_views.h',
'widget/native_widget_win.cc',
diff --git a/views/widget/native_widget_view.cc b/views/widget/native_widget_view.cc
new file mode 100644
index 0000000..525de8e
--- /dev/null
+++ b/views/widget/native_widget_view.cc
@@ -0,0 +1,108 @@
+// Copyright (c) 2011 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/widget/native_widget_view.h"
+
+#include "ui/gfx/canvas.h"
+
+namespace views {
+namespace internal {
+
+////////////////////////////////////////////////////////////////////////////////
+// NativeWidgetView, public:
+
+NativeWidgetView::NativeWidgetView(NativeWidgetViews* native_widget)
+ : native_widget_(native_widget) {
+}
+
+NativeWidgetView::~NativeWidgetView() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NativeWidgetView, View overrides:
+
+void NativeWidgetView::ViewHierarchyChanged(bool is_add, View* parent,
+ View* child) {
+ if (is_add && child == this)
+ delegate()->OnNativeWidgetCreated();
+}
+
+void NativeWidgetView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
+ delegate()->OnSizeChanged(size());
+}
+
+void NativeWidgetView::OnPaint(gfx::Canvas* canvas) {
+ canvas->FillRectInt(SK_ColorRED, 0, 0, width(), height());
+ delegate()->OnNativeWidgetPaint(canvas);
+}
+
+bool NativeWidgetView::OnMousePressed(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ return delegate()->OnMouseEvent(event);
+}
+
+bool NativeWidgetView::OnMouseDragged(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ return delegate()->OnMouseEvent(event);
+}
+
+void NativeWidgetView::OnMouseReleased(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ delegate()->OnMouseEvent(event);
+}
+
+void NativeWidgetView::OnMouseCaptureLost() {
+ delegate()->OnMouseCaptureLost();
+}
+
+void NativeWidgetView::OnMouseMoved(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ delegate()->OnMouseEvent(event);
+}
+
+void NativeWidgetView::OnMouseEntered(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ delegate()->OnMouseEvent(event);
+}
+
+void NativeWidgetView::OnMouseExited(const MouseEvent& event) {
+ MouseEvent e(event, this);
+ delegate()->OnMouseEvent(event);
+}
+
+#if defined(TOUCH_UI)
+View::TouchStatus NativeWidgetView::OnTouchEvent(const TouchEvent& event) {
+ NOTIMPLEMENTED();
+ // TODO(beng): TouchEvents don't go through the Widget right now... so we
+ // can't just pass them to the delegate...
+ return TOUCH_STATUS_UNKNOWN;
+}
+#endif
+
+bool NativeWidgetView::OnKeyPressed(const KeyEvent& event) {
+ return delegate()->OnKeyEvent(event);
+}
+
+bool NativeWidgetView::OnKeyReleased(const KeyEvent& event) {
+ return delegate()->OnKeyEvent(event);
+}
+
+bool NativeWidgetView::OnMouseWheel(const MouseWheelEvent& event) {
+ MouseWheelEvent e(event, this);
+ return delegate()->OnMouseEvent(event);
+}
+
+void NativeWidgetView::OnFocus() {
+ // TODO(beng): check if we have to do this.
+ //delegate()->OnNativeFocus(NULL);
+}
+
+void NativeWidgetView::OnBlur() {
+ // TODO(beng): check if we have to do this.
+ //delegate()->OnNativeBlur(NULL);
+}
+
+} // namespace internal
+} // namespace views
+
diff --git a/views/widget/native_widget_view.h b/views/widget/native_widget_view.h
new file mode 100644
index 0000000..75084cd
--- /dev/null
+++ b/views/widget/native_widget_view.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2011 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_WIDGET_NATIVE_WIDGET_VIEW_H_
+#define VIEWS_WIDGET_NATIVE_WIDGET_VIEW_H_
+#pragma once
+
+#include "views/view.h"
+#include "views/widget/native_widget_delegate.h"
+#include "views/widget/native_widget_views.h"
+
+namespace views {
+class NativeWidgetViews;
+
+namespace internal {
+
+////////////////////////////////////////////////////////////////////////////////
+// NativeWidgetView
+//
+// This class represents the View that is the "native view" for a
+// NativeWidgetViews. It is the View that is a member of the parent Widget's
+// View hierarchy. It is responsible for receiving relevant events from that
+// hierarchy and forwarding them to its NativeWidgetViews' delegate's hierarchy.
+//
+class NativeWidgetView : public View {
+ public:
+ explicit NativeWidgetView(NativeWidgetViews* native_widget);
+ virtual ~NativeWidgetView();
+
+ private:
+ // Overridden from View:
+ virtual void ViewHierarchyChanged(bool is_add,
+ View* parent,
+ View* child) OVERRIDE;
+ virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
+ virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseCaptureLost() OVERRIDE;
+ virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseEntered(const MouseEvent& event) OVERRIDE;
+ virtual void OnMouseExited(const MouseEvent& event) OVERRIDE;
+#if defined(TOUCH_UI)
+ virtual TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE;
+#endif
+ virtual bool OnKeyPressed(const KeyEvent& event) OVERRIDE;
+ virtual bool OnKeyReleased(const KeyEvent& event) OVERRIDE;
+ virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
+ virtual void OnFocus() OVERRIDE;
+ virtual void OnBlur() OVERRIDE;
+
+ internal::NativeWidgetDelegate* delegate() {
+ return native_widget_->delegate();
+ }
+
+ NativeWidgetViews* native_widget_;
+
+ DISALLOW_COPY_AND_ASSIGN(NativeWidgetView);
+};
+
+} // namespace internal
+} // namespace views
+
+#endif // VIEWS_WIDGET_NATIVE_WIDGET_VIEW_H_
diff --git a/views/widget/native_widget_views.cc b/views/widget/native_widget_views.cc
index 5928f36..8e0df5a 100644
--- a/views/widget/native_widget_views.cc
+++ b/views/widget/native_widget_views.cc
@@ -4,34 +4,19 @@
#include "views/widget/native_widget_views.h"
-#include "ui/gfx/canvas.h"
#include "views/view.h"
+#include "views/widget/native_widget_view.h"
namespace views {
////////////////////////////////////////////////////////////////////////////////
-// NativeWidgetViews::NativeWidgetView:
-
-class NativeWidgetViews::NativeWidgetView : public View {
- public:
- NativeWidgetView() {}
- virtual ~NativeWidgetView() {}
-
- // Overridden from View:
- virtual void OnPaint(gfx::Canvas* canvas) {
- canvas->FillRectInt(SK_ColorRED, 0, 0, width(), height());
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(NativeWidgetView);
-};
-
-////////////////////////////////////////////////////////////////////////////////
// NativeWidgetViews, public:
-NativeWidgetViews::NativeWidgetViews(internal::NativeWidgetDelegate* delegate)
+NativeWidgetViews::NativeWidgetViews(View* host,
+ internal::NativeWidgetDelegate* delegate)
: delegate_(delegate),
view_(NULL),
+ host_view_(host),
ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)) {
}
@@ -46,7 +31,8 @@ View* NativeWidgetViews::GetView() {
// NativeWidgetViews, NativeWidget implementation:
void NativeWidgetViews::InitNativeWidget(const Widget::InitParams& params) {
- view_ = new NativeWidgetView;
+ view_ = new internal::NativeWidgetView(this);
+ host_view_->AddChildView(view_);
// TODO(beng): handle parenting.
// TODO(beng): SetInitParams().
diff --git a/views/widget/native_widget_views.h b/views/widget/native_widget_views.h
index dbd0a57..c0d6a25 100644
--- a/views/widget/native_widget_views.h
+++ b/views/widget/native_widget_views.h
@@ -2,26 +2,34 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
-#define VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
+#ifndef VIEWS_WIDGET_NATIVE_WIDGET_VIEWS_H_
+#define VIEWS_WIDGET_NATIVE_WIDGET_VIEWS_H_
#pragma once
#include "base/message_loop.h"
#include "views/widget/native_widget.h"
namespace views {
+namespace internal {
+class NativeWidgetView;
+}
+////////////////////////////////////////////////////////////////////////////////
+// NativeWidgetViews
+//
+// A NativeWidget implementation that uses another View as its native widget.
+//
class NativeWidgetViews : public NativeWidget {
public:
- explicit NativeWidgetViews(internal::NativeWidgetDelegate* delegate);
+ NativeWidgetViews(View* host, internal::NativeWidgetDelegate* delegate);
virtual ~NativeWidgetViews();
// TODO(beng): remove.
View* GetView();
- private:
- class NativeWidgetView;
+ internal::NativeWidgetDelegate* delegate() { return delegate_; }
+ private:
// Overridden from NativeWidget:
virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE;
virtual Widget* GetWidget() OVERRIDE;
@@ -72,7 +80,9 @@ class NativeWidgetViews : public NativeWidget {
internal::NativeWidgetDelegate* delegate_;
- NativeWidgetView* view_;
+ internal::NativeWidgetView* view_;
+
+ View* host_view_;
// The following factory is used for calls to close the NativeWidgetViews
// instance.
@@ -83,4 +93,4 @@ class NativeWidgetViews : public NativeWidget {
}
-#endif // VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
+#endif // VIEWS_WIDGET_NATIVE_WIDGET_VIEWS_H_