summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-26 19:04:46 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-26 19:04:46 +0000
commitb6b19e26bb00c8e8bc4ab91b535520352fb009f9 (patch)
treecac19c6ed6138c8a3d80d90558a0f328b558101f /views
parent568f11038c851e25254b364c659504edc8a35d1d (diff)
downloadchromium_src-b6b19e26bb00c8e8bc4ab91b535520352fb009f9.zip
chromium_src-b6b19e26bb00c8e8bc4ab91b535520352fb009f9.tar.gz
chromium_src-b6b19e26bb00c8e8bc4ab91b535520352fb009f9.tar.bz2
Rough cut at window activation.
http://crbug.com/84070 TEST=none Review URL: http://codereview.chromium.org/7071017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86869 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/desktop/desktop_window.cc36
-rw-r--r--views/desktop/desktop_window.h8
-rw-r--r--views/desktop/desktop_window_root_view.cc42
-rw-r--r--views/desktop/desktop_window_root_view.h32
-rw-r--r--views/views.gyp6
-rw-r--r--views/widget/native_widget_view.cc12
-rw-r--r--views/widget/native_widget_view.h5
-rw-r--r--views/widget/native_widget_views.cc8
-rw-r--r--views/widget/native_widget_views.h7
-rw-r--r--views/widget/widget.cc8
-rw-r--r--views/window/native_window_views.cc3
11 files changed, 155 insertions, 12 deletions
diff --git a/views/desktop/desktop_window.cc b/views/desktop/desktop_window.cc
index e6c073b..15c9860 100644
--- a/views/desktop/desktop_window.cc
+++ b/views/desktop/desktop_window.cc
@@ -7,6 +7,8 @@
#include "ui/gfx/canvas.h"
#include "ui/gfx/transform.h"
#include "views/desktop/desktop_background.h"
+#include "views/desktop/desktop_window_root_view.h"
+#include "views/widget/native_widget_view.h"
#include "views/window/native_window_views.h"
#include "views/window/window.h"
@@ -19,6 +21,24 @@
namespace views {
namespace desktop {
+// TODO(beng): resolve naming!
+class DesktopWindowWindow : public Window {
+ public:
+ explicit DesktopWindowWindow(DesktopWindow* desktop_window)
+ : desktop_window_(desktop_window) {}
+ virtual ~DesktopWindowWindow() {}
+
+ private:
+ // Overridden from Widget:
+ virtual internal::RootView* CreateRootView() OVERRIDE {
+ return new DesktopWindowRootView(desktop_window_, this);
+ }
+
+ DesktopWindow* desktop_window_;
+
+ DISALLOW_COPY_AND_ASSIGN(DesktopWindowWindow);
+};
+
class TestWindowContentView : public View,
public WindowDelegate {
public:
@@ -51,7 +71,7 @@ class TestWindowContentView : public View,
////////////////////////////////////////////////////////////////////////////////
// DesktopWindow, public:
-DesktopWindow::DesktopWindow() {
+DesktopWindow::DesktopWindow() : active_widget_(NULL) {
set_background(new DesktopBackground);
}
@@ -61,7 +81,7 @@ DesktopWindow::~DesktopWindow() {
// static
void DesktopWindow::CreateDesktopWindow() {
DesktopWindow* desktop = new DesktopWindow;
- views::Window* window = new views::Window;
+ views::Window* window = new DesktopWindowWindow(desktop);
views::Window::InitParams params(desktop);
// In this environment, CreateChromeWindow will default to creating a views-
// window, so we need to construct a NativeWindowWin by hand.
@@ -81,6 +101,18 @@ void DesktopWindow::CreateDesktopWindow() {
gfx::Rect(600, 650, 450, 300), false);
}
+void DesktopWindow::ActivateWidget(Widget* widget) {
+ if (widget && widget->IsActive())
+ return;
+
+ if (active_widget_)
+ active_widget_->OnActivate(false);
+ if (widget) {
+ active_widget_ = static_cast<NativeWidgetViews*>(widget->native_widget());
+ active_widget_->OnActivate(true);
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
// DesktopWindow, View overrides:
diff --git a/views/desktop/desktop_window.h b/views/desktop/desktop_window.h
index d15bde9..8cd943a 100644
--- a/views/desktop/desktop_window.h
+++ b/views/desktop/desktop_window.h
@@ -9,6 +9,8 @@
#include "views/window/window_delegate.h"
namespace views {
+class NativeWidgetViews;
+
namespace desktop {
class DesktopWindow : public View,
@@ -19,6 +21,10 @@ class DesktopWindow : public View,
static void CreateDesktopWindow();
+ // Changes activation to the specified Widget. The currently active Widget
+ // is de-activated.
+ void ActivateWidget(Widget* widget);
+
private:
// Overridden from View:
virtual void Layout() OVERRIDE;
@@ -38,6 +44,8 @@ class DesktopWindow : public View,
gfx::Rect initial_bounds,
bool rotate);
+ NativeWidgetViews* active_widget_;
+
DISALLOW_COPY_AND_ASSIGN(DesktopWindow);
};
diff --git a/views/desktop/desktop_window_root_view.cc b/views/desktop/desktop_window_root_view.cc
new file mode 100644
index 0000000..5639cb5
--- /dev/null
+++ b/views/desktop/desktop_window_root_view.cc
@@ -0,0 +1,42 @@
+// 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/desktop/desktop_window_root_view.h"
+
+#include "views/desktop/desktop_window.h"
+#include "views/widget/native_widget_view.h"
+#include "views/window/window.h"
+
+namespace views {
+namespace desktop {
+
+////////////////////////////////////////////////////////////////////////////////
+// DesktopWindowRootView, public:
+
+DesktopWindowRootView::DesktopWindowRootView(DesktopWindow* desktop_window,
+ Window* window)
+ : internal::RootView(window),
+ desktop_window_(desktop_window) {
+}
+
+DesktopWindowRootView::~DesktopWindowRootView() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// DesktopWindowRootView, internal::RootView overrides:
+
+bool DesktopWindowRootView::OnMousePressed(const MouseEvent& event) {
+ View* target = GetEventHandlerForPoint(event.location());
+ if (target->GetClassName() == internal::NativeWidgetView::kViewClassName) {
+ internal::NativeWidgetView* native_widget_view =
+ static_cast<internal::NativeWidgetView*>(target);
+ desktop_window_->ActivateWidget(native_widget_view->GetAssociatedWidget());
+ } else {
+ desktop_window_->ActivateWidget(NULL);
+ }
+ return RootView::OnMousePressed(event);
+}
+
+} // namespace desktop
+} // namespace views
diff --git a/views/desktop/desktop_window_root_view.h b/views/desktop/desktop_window_root_view.h
new file mode 100644
index 0000000..9ad5f1c
--- /dev/null
+++ b/views/desktop/desktop_window_root_view.h
@@ -0,0 +1,32 @@
+// 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_DESKTOP_DESKTOP_WINDOW_ROOT_VIEW_H_
+#define VIEWS_DESKTOP_DESKTOP_WINDOW_ROOT_VIEW_H_
+
+#include "views/widget/root_view.h"
+
+namespace views {
+namespace desktop {
+
+class DesktopWindow;
+
+class DesktopWindowRootView : public internal::RootView {
+ public:
+ DesktopWindowRootView(DesktopWindow* desktop_window, Window* window);
+ virtual ~DesktopWindowRootView();
+
+ private:
+ // Overridden from RootView:
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
+
+ DesktopWindow* desktop_window_;
+
+ DISALLOW_COPY_AND_ASSIGN(DesktopWindowRootView);
+};
+
+} // namespace desktop
+} // namespace views
+
+#endif // VIEWS_DESKTOP_DESKTOP_WINDOW_ROOT_VIEW_H_
diff --git a/views/views.gyp b/views/views.gyp
index fe4ccbd..ecac0e2b 100644
--- a/views/views.gyp
+++ b/views/views.gyp
@@ -647,13 +647,15 @@
'..',
],
'sources': [
+ 'desktop/desktop_background.cc',
+ 'desktop/desktop_background.h',
'desktop/desktop_main.cc',
'desktop/desktop_views_delegate.cc',
'desktop/desktop_views_delegate.h',
'desktop/desktop_window.cc',
'desktop/desktop_window.h',
- 'desktop/desktop_background.cc',
- 'desktop/desktop_background.h',
+ 'desktop/desktop_window_root_view.cc',
+ 'desktop/desktop_window_root_view.h',
'<(SHARED_INTERMEDIATE_DIR)/app/app_resources/app_resources.rc',
'<(SHARED_INTERMEDIATE_DIR)/ui/gfx/gfx_resources.rc',
],
diff --git a/views/widget/native_widget_view.cc b/views/widget/native_widget_view.cc
index 525de8e..daaf2cc 100644
--- a/views/widget/native_widget_view.cc
+++ b/views/widget/native_widget_view.cc
@@ -12,6 +12,9 @@ namespace internal {
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetView, public:
+// static
+const char NativeWidgetView::kViewClassName[] = "views/NativeWidgetView";
+
NativeWidgetView::NativeWidgetView(NativeWidgetViews* native_widget)
: native_widget_(native_widget) {
}
@@ -19,6 +22,10 @@ NativeWidgetView::NativeWidgetView(NativeWidgetViews* native_widget)
NativeWidgetView::~NativeWidgetView() {
}
+Widget* NativeWidgetView::GetAssociatedWidget() {
+ return native_widget_->delegate()->AsWidget();
+}
+
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetView, View overrides:
@@ -103,6 +110,11 @@ void NativeWidgetView::OnBlur() {
//delegate()->OnNativeBlur(NULL);
}
+std::string NativeWidgetView::GetClassName() const {
+ return kViewClassName;
+}
+
+
} // namespace internal
} // namespace views
diff --git a/views/widget/native_widget_view.h b/views/widget/native_widget_view.h
index 75084cd..84dcdca 100644
--- a/views/widget/native_widget_view.h
+++ b/views/widget/native_widget_view.h
@@ -25,9 +25,13 @@ namespace internal {
//
class NativeWidgetView : public View {
public:
+ static const char kViewClassName[];
+
explicit NativeWidgetView(NativeWidgetViews* native_widget);
virtual ~NativeWidgetView();
+ Widget* GetAssociatedWidget();
+
private:
// Overridden from View:
virtual void ViewHierarchyChanged(bool is_add,
@@ -50,6 +54,7 @@ class NativeWidgetView : public View {
virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE;
virtual void OnFocus() OVERRIDE;
virtual void OnBlur() OVERRIDE;
+ virtual std::string GetClassName() const OVERRIDE;
internal::NativeWidgetDelegate* delegate() {
return native_widget_->delegate();
diff --git a/views/widget/native_widget_views.cc b/views/widget/native_widget_views.cc
index bff9bde..d1bc2d5 100644
--- a/views/widget/native_widget_views.cc
+++ b/views/widget/native_widget_views.cc
@@ -17,6 +17,7 @@ NativeWidgetViews::NativeWidgetViews(View* host,
: delegate_(delegate),
view_(NULL),
host_view_(host),
+ active_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)) {
}
@@ -31,6 +32,11 @@ const View* NativeWidgetViews::GetView() const {
return view_;
}
+void NativeWidgetViews::OnActivate(bool active) {
+ active_ = active;
+ view_->SchedulePaint();
+}
+
////////////////////////////////////////////////////////////////////////////////
// NativeWidgetViews, NativeWidget implementation:
@@ -184,7 +190,7 @@ bool NativeWidgetViews::IsVisible() const {
}
bool NativeWidgetViews::IsActive() const {
- return view_->HasFocus();
+ return active_;
}
bool NativeWidgetViews::IsAccessibleWidget() const {
diff --git a/views/widget/native_widget_views.h b/views/widget/native_widget_views.h
index 5089d59..63a5908 100644
--- a/views/widget/native_widget_views.h
+++ b/views/widget/native_widget_views.h
@@ -28,9 +28,11 @@ class NativeWidgetViews : public NativeWidget {
View* GetView();
const View* GetView() const;
+ void OnActivate(bool active);
+
internal::NativeWidgetDelegate* delegate() { return delegate_; }
- private:
+ protected:
// Overridden from NativeWidget:
virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE;
virtual Widget* GetWidget() OVERRIDE;
@@ -76,6 +78,7 @@ class NativeWidgetViews : public NativeWidget {
virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE;
+ private:
NativeWidget* GetParentNativeWidget();
const NativeWidget* GetParentNativeWidget() const;
@@ -85,6 +88,8 @@ class NativeWidgetViews : public NativeWidget {
View* host_view_;
+ bool active_;
+
// The following factory is used for calls to close the NativeWidgetViews
// instance.
ScopedRunnableMethodFactory<NativeWidgetViews> close_widget_factory_;
diff --git a/views/widget/widget.cc b/views/widget/widget.cc
index ad537f1..8b4e793 100644
--- a/views/widget/widget.cc
+++ b/views/widget/widget.cc
@@ -213,6 +213,10 @@ void Widget::Hide() {
native_widget_->Hide();
}
+bool Widget::IsActive() const {
+ return native_widget_->IsActive();
+}
+
void Widget::SetOpacity(unsigned char opacity) {
native_widget_->SetOpacity(opacity);
}
@@ -233,10 +237,6 @@ bool Widget::IsVisible() const {
return native_widget_->IsVisible();
}
-bool Widget::IsActive() const {
- return native_widget_->IsActive();
-}
-
bool Widget::IsAccessibleWidget() const {
return native_widget_->IsAccessibleWidget();
}
diff --git a/views/window/native_window_views.cc b/views/window/native_window_views.cc
index 3957835..156338b 100644
--- a/views/window/native_window_views.cc
+++ b/views/window/native_window_views.cc
@@ -117,8 +117,7 @@ void NativeWindowViews::Restore() {
}
bool NativeWindowViews::IsActive() const {
- NOTIMPLEMENTED();
- return false;
+ return NativeWidgetViews::IsActive();
}
bool NativeWindowViews::IsVisible() const {