diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-14 00:29:54 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-14 00:29:54 +0000 |
commit | 103b290595a05fc1bb8b239ed80bfdc701c39105 (patch) | |
tree | ff2845f9b949f63ec710386187cc5642f1f544ec | |
parent | 36cb77af1fd4dd1b1daff4dfb989398a27d774a1 (diff) | |
download | chromium_src-103b290595a05fc1bb8b239ed80bfdc701c39105.zip chromium_src-103b290595a05fc1bb8b239ed80bfdc701c39105.tar.gz chromium_src-103b290595a05fc1bb8b239ed80bfdc701c39105.tar.bz2 |
views: Factor WidgetFocusManager out of FocusManager class.
This moves WidgetFocusManager into its source/header files avoiding the use of nested classes.
R=sky@chromium.org
Review URL: http://codereview.chromium.org/7885001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101002 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/extension_browser_event_router.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_browser_event_router.h | 3 | ||||
-rw-r--r-- | chrome/browser/ui/views/about_chrome_view.cc | 1 | ||||
-rw-r--r-- | chrome/browser/ui/views/tab_contents/native_tab_contents_container_views.cc | 1 | ||||
-rw-r--r-- | chrome/browser/ui/views/tab_contents/native_tab_contents_container_win.cc | 1 | ||||
-rw-r--r-- | views/focus/focus_manager.cc | 41 | ||||
-rw-r--r-- | views/focus/focus_manager.h | 69 | ||||
-rw-r--r-- | views/focus/widget_focus_manager.cc | 50 | ||||
-rw-r--r-- | views/focus/widget_focus_manager.h | 82 | ||||
-rw-r--r-- | views/views.gyp | 2 | ||||
-rw-r--r-- | views/widget/widget.cc | 22 |
11 files changed, 153 insertions, 123 deletions
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc index 976c251..b72f425 100644 --- a/chrome/browser/extensions/extension_browser_event_router.cc +++ b/chrome/browser/extensions/extension_browser_event_router.cc @@ -67,7 +67,7 @@ void ExtensionBrowserEventRouter::Init() { return; BrowserList::AddObserver(this); #if defined(TOOLKIT_VIEWS) - views::FocusManager::GetWidgetFocusManager()->AddFocusChangeListener(this); + views::WidgetFocusManager::GetInstance()->AddFocusChangeListener(this); #elif defined(TOOLKIT_GTK) ui::ActiveWindowWatcherX::AddObserver(this); #elif defined(OS_MACOSX) @@ -108,7 +108,7 @@ ExtensionBrowserEventRouter::ExtensionBrowserEventRouter(Profile* profile) ExtensionBrowserEventRouter::~ExtensionBrowserEventRouter() { BrowserList::RemoveObserver(this); #if defined(TOOLKIT_VIEWS) - views::FocusManager::GetWidgetFocusManager()->RemoveFocusChangeListener(this); + views::WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(this); #elif defined(TOOLKIT_GTK) ui::ActiveWindowWatcherX::RemoveObserver(this); #endif diff --git a/chrome/browser/extensions/extension_browser_event_router.h b/chrome/browser/extensions/extension_browser_event_router.h index 08e37a4..409e744 100644 --- a/chrome/browser/extensions/extension_browser_event_router.h +++ b/chrome/browser/extensions/extension_browser_event_router.h @@ -16,8 +16,7 @@ #include "chrome/browser/ui/browser_list.h" #include "content/common/notification_registrar.h" #if defined(TOOLKIT_VIEWS) -#include "views/focus/focus_manager.h" -#include "views/view.h" +#include "views/focus/widget_focus_manager.h" #elif defined(TOOLKIT_GTK) #include "ui/base/x/active_window_watcher_x.h" #endif diff --git a/chrome/browser/ui/views/about_chrome_view.cc b/chrome/browser/ui/views/about_chrome_view.cc index a75ec62..d1d2ae7 100644 --- a/chrome/browser/ui/views/about_chrome_view.cc +++ b/chrome/browser/ui/views/about_chrome_view.cc @@ -14,6 +14,7 @@ #include "base/callback.h" #include "base/i18n/rtl.h" #include "base/string_number_conversions.h" +#include "base/threading/thread_restrictions.h" #include "base/utf_string_conversions.h" #include "base/win/windows_version.h" #include "chrome/browser/google/google_util.h" diff --git a/chrome/browser/ui/views/tab_contents/native_tab_contents_container_views.cc b/chrome/browser/ui/views/tab_contents/native_tab_contents_container_views.cc index 1849428..4ab1aaa 100644 --- a/chrome/browser/ui/views/tab_contents/native_tab_contents_container_views.cc +++ b/chrome/browser/ui/views/tab_contents/native_tab_contents_container_views.cc @@ -13,6 +13,7 @@ #include "content/browser/tab_contents/tab_contents.h" #include "ui/base/accessibility/accessible_view_state.h" #include "views/focus/focus_manager.h" +#include "views/focus/widget_focus_manager.h" #include "views/layout/fill_layout.h" #include "views/widget/native_widget_views.h" diff --git a/chrome/browser/ui/views/tab_contents/native_tab_contents_container_win.cc b/chrome/browser/ui/views/tab_contents/native_tab_contents_container_win.cc index 750dc45..9ef98ad 100644 --- a/chrome/browser/ui/views/tab_contents/native_tab_contents_container_win.cc +++ b/chrome/browser/ui/views/tab_contents/native_tab_contents_container_win.cc @@ -13,6 +13,7 @@ #include "content/browser/tab_contents/tab_contents.h" #include "ui/base/accessibility/accessible_view_state.h" #include "views/focus/focus_manager.h" +#include "views/focus/widget_focus_manager.h" //////////////////////////////////////////////////////////////////////////////// // NativeTabContentsContainerWin, public: diff --git a/views/focus/focus_manager.cc b/views/focus/focus_manager.cc index d58e4a11..d09d615 100644 --- a/views/focus/focus_manager.cc +++ b/views/focus/focus_manager.cc @@ -13,47 +13,13 @@ #include "views/accelerator.h" #include "views/focus/focus_search.h" #include "views/focus/view_storage.h" +#include "views/focus/widget_focus_manager.h" #include "views/view.h" #include "views/widget/root_view.h" #include "views/widget/widget.h" namespace views { -// FocusManager::WidgetFocusManager --------------------------------- - -void FocusManager::WidgetFocusManager::AddFocusChangeListener( - WidgetFocusChangeListener* listener) { - focus_change_listeners_.AddObserver(listener); -} - -void FocusManager::WidgetFocusManager::RemoveFocusChangeListener( - WidgetFocusChangeListener* listener) { - focus_change_listeners_.RemoveObserver(listener); -} - -void FocusManager::WidgetFocusManager::OnWidgetFocusEvent( - gfx::NativeView focused_before, - gfx::NativeView focused_now) { - if (enabled_) { - FOR_EACH_OBSERVER(WidgetFocusChangeListener, focus_change_listeners_, - NativeFocusWillChange(focused_before, focused_now)); - } -} - -FocusManager::WidgetFocusManager::WidgetFocusManager() : enabled_(true) { -} - -FocusManager::WidgetFocusManager::~WidgetFocusManager() { -} - -// static -FocusManager::WidgetFocusManager* -FocusManager::WidgetFocusManager::GetInstance() { - return Singleton<WidgetFocusManager>::get(); -} - -// FocusManager ----------------------------------------------------- - FocusManager::FocusManager(Widget* widget) : widget_(widget), focused_view_(NULL), @@ -67,11 +33,6 @@ FocusManager::FocusManager(Widget* widget) FocusManager::~FocusManager() { } -// static -FocusManager::WidgetFocusManager* FocusManager::GetWidgetFocusManager() { - return WidgetFocusManager::GetInstance(); -} - bool FocusManager::OnKeyEvent(const KeyEvent& event) { #if defined(OS_WIN) // If the focused view wants to process the key event as is, let it be. diff --git a/views/focus/focus_manager.h b/views/focus/focus_manager.h index 88f7a1c..8650d2c 100644 --- a/views/focus/focus_manager.h +++ b/views/focus/focus_manager.h @@ -10,7 +10,6 @@ #include <map> #include "base/basictypes.h" -#include "base/memory/singleton.h" #include "base/observer_list.h" #include "ui/gfx/native_widget_types.h" #include "views/accelerator.h" @@ -109,58 +108,8 @@ class VIEWS_EXPORT FocusChangeListener { virtual ~FocusChangeListener() {} }; -// This interface should be implemented by classes that want to be notified when -// the native focus is about to change. Listeners implementing this interface -// will be invoked for all native focus changes across the entire Chrome -// application. FocusChangeListeners are only called for changes within the -// children of a single top-level native-view. -class WidgetFocusChangeListener { - public: - virtual void NativeFocusWillChange(gfx::NativeView focused_before, - gfx::NativeView focused_now) = 0; - - protected: - virtual ~WidgetFocusChangeListener() {} -}; - class VIEWS_EXPORT FocusManager { public: - class VIEWS_EXPORT WidgetFocusManager { - public: - // Returns the singleton instance. - static WidgetFocusManager* GetInstance(); - - // Adds/removes a WidgetFocusChangeListener |listener| to the set of - // active listeners. - void AddFocusChangeListener(WidgetFocusChangeListener* listener); - void RemoveFocusChangeListener(WidgetFocusChangeListener* listener); - - // To be called when native-focus shifts from |focused_before| to - // |focused_now|. - // TODO(port) : Invocations to this routine are only implemented for - // the Win32 platform. Calls need to be placed appropriately for - // non-Windows environments. - void OnWidgetFocusEvent(gfx::NativeView focused_before, - gfx::NativeView focused_now); - - // Enable/Disable notification of registered listeners during calls - // to OnWidgetFocusEvent. Used to prevent unwanted focus changes from - // propagating notifications. - void EnableNotifications() { enabled_ = true; } - void DisableNotifications() { enabled_ = false; } - - private: - WidgetFocusManager(); - ~WidgetFocusManager(); - - ObserverList<WidgetFocusChangeListener> focus_change_listeners_; - - bool enabled_; - - friend struct DefaultSingletonTraits<WidgetFocusManager>; - DISALLOW_COPY_AND_ASSIGN(WidgetFocusManager); - }; - // The reason why the focus changed. enum FocusChangeReason { // The focus changed because the user traversed focusable views using @@ -178,9 +127,6 @@ class VIEWS_EXPORT FocusManager { explicit FocusManager(Widget* widget); virtual ~FocusManager(); - // Returns the global WidgetFocusManager instance for the running application. - static WidgetFocusManager* GetWidgetFocusManager(); - // Processes the passed key event for accelerators and tab traversal. // Returns false if the event has been consumed and should not be processed // further. @@ -322,21 +268,6 @@ class VIEWS_EXPORT FocusManager { DISALLOW_COPY_AND_ASSIGN(FocusManager); }; -// A basic helper class that is used to disable native focus change -// notifications within a scope. -class AutoNativeNotificationDisabler { - public: - AutoNativeNotificationDisabler() { - FocusManager::GetWidgetFocusManager()->DisableNotifications(); - } - - ~AutoNativeNotificationDisabler() { - FocusManager::GetWidgetFocusManager()->EnableNotifications(); - } - private: - DISALLOW_COPY_AND_ASSIGN(AutoNativeNotificationDisabler); -}; - } // namespace views #endif // VIEWS_FOCUS_FOCUS_MANAGER_H_ diff --git a/views/focus/widget_focus_manager.cc b/views/focus/widget_focus_manager.cc new file mode 100644 index 0000000..3ff0a17 --- /dev/null +++ b/views/focus/widget_focus_manager.cc @@ -0,0 +1,50 @@ +// 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/focus/widget_focus_manager.h" + +#include "base/memory/singleton.h" + +namespace views { + +// WidgetFocusManager ---------------------------------------------------------- + +// static +WidgetFocusManager* WidgetFocusManager::GetInstance() { + return Singleton<WidgetFocusManager>::get(); +} + +void WidgetFocusManager::AddFocusChangeListener( + WidgetFocusChangeListener* listener) { + focus_change_listeners_.AddObserver(listener); +} + +void WidgetFocusManager::RemoveFocusChangeListener( + WidgetFocusChangeListener* listener) { + focus_change_listeners_.RemoveObserver(listener); +} + +void WidgetFocusManager::OnWidgetFocusEvent(gfx::NativeView focused_before, + gfx::NativeView focused_now) { + if (enabled_) { + FOR_EACH_OBSERVER(WidgetFocusChangeListener, focus_change_listeners_, + NativeFocusWillChange(focused_before, focused_now)); + } +} + +WidgetFocusManager::WidgetFocusManager() : enabled_(true) {} + +WidgetFocusManager::~WidgetFocusManager() {} + +// AutoNativeNotificationDisabler ---------------------------------------------- + +AutoNativeNotificationDisabler::AutoNativeNotificationDisabler() { + WidgetFocusManager::GetInstance()->DisableNotifications(); +} + +AutoNativeNotificationDisabler::~AutoNativeNotificationDisabler() { + WidgetFocusManager::GetInstance()->EnableNotifications(); +} + +} // namespace views diff --git a/views/focus/widget_focus_manager.h b/views/focus/widget_focus_manager.h new file mode 100644 index 0000000..36430fb --- /dev/null +++ b/views/focus/widget_focus_manager.h @@ -0,0 +1,82 @@ +// 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_FOCUS_WIDGET_FOCUS_MANAGER_H_ +#define VIEWS_FOCUS_WIDGET_FOCUS_MANAGER_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/observer_list.h" +#include "ui/gfx/native_widget_types.h" +#include "views/views_export.h" + +template <typename T> struct DefaultSingletonTraits; + +namespace views { + +// This interface should be implemented by classes that want to be notified when +// the native focus is about to change. Listeners implementing this interface +// will be invoked for all native focus changes across the entire Chrome +// application. FocusChangeListeners are only called for changes within the +// children of a single top-level native-view. +class WidgetFocusChangeListener { + public: + virtual void NativeFocusWillChange(gfx::NativeView focused_before, + gfx::NativeView focused_now) = 0; + + protected: + virtual ~WidgetFocusChangeListener() {} +}; + +class VIEWS_EXPORT WidgetFocusManager { + public: + // Returns the singleton instance. + static WidgetFocusManager* GetInstance(); + + // Adds/removes a WidgetFocusChangeListener |listener| to the set of + // active listeners. + void AddFocusChangeListener(WidgetFocusChangeListener* listener); + void RemoveFocusChangeListener(WidgetFocusChangeListener* listener); + + // To be called when native-focus shifts from |focused_before| to + // |focused_now|. + // TODO(port) : Invocations to this routine are only implemented for + // the Win32 platform. Calls need to be placed appropriately for + // non-Windows environments. + void OnWidgetFocusEvent(gfx::NativeView focused_before, + gfx::NativeView focused_now); + + // Enable/Disable notification of registered listeners during calls + // to OnWidgetFocusEvent. Used to prevent unwanted focus changes from + // propagating notifications. + void EnableNotifications() { enabled_ = true; } + void DisableNotifications() { enabled_ = false; } + + private: + friend struct DefaultSingletonTraits<WidgetFocusManager>; + + WidgetFocusManager(); + ~WidgetFocusManager(); + + ObserverList<WidgetFocusChangeListener> focus_change_listeners_; + + bool enabled_; + + DISALLOW_COPY_AND_ASSIGN(WidgetFocusManager); +}; + +// A basic helper class that is used to disable native focus change +// notifications within a scope. +class AutoNativeNotificationDisabler { + public: + AutoNativeNotificationDisabler(); + ~AutoNativeNotificationDisabler(); + + private: + DISALLOW_COPY_AND_ASSIGN(AutoNativeNotificationDisabler); +}; + +} // namespace views + +#endif // VIEWS_FOCUS_WIDGET_FOCUS_MANAGER_H_ diff --git a/views/views.gyp b/views/views.gyp index d6e3145..6d651fa 100644 --- a/views/views.gyp +++ b/views/views.gyp @@ -264,6 +264,8 @@ 'focus/focus_search.h', 'focus/view_storage.cc', 'focus/view_storage.h', + 'focus/widget_focus_manager.cc', + 'focus/widget_focus_manager.h', 'ime/character_composer.cc', 'ime/character_composer.h', 'ime/input_method.h', diff --git a/views/widget/widget.cc b/views/widget/widget.cc index 909fc50..de44fdb 100644 --- a/views/widget/widget.cc +++ b/views/widget/widget.cc @@ -12,26 +12,30 @@ #include "ui/gfx/compositor/compositor.h" #include "ui/gfx/compositor/layer.h" #include "views/controls/menu/menu_controller.h" +#include "views/focus/focus_manager.h" #include "views/focus/focus_manager_factory.h" #include "views/focus/view_storage.h" +#include "views/focus/widget_focus_manager.h" #include "views/ime/input_method.h" #include "views/views_delegate.h" #include "views/widget/default_theme_provider.h" -#include "views/widget/root_view.h" #include "views/widget/native_widget_private.h" +#include "views/widget/root_view.h" #include "views/widget/tooltip_manager.h" #include "views/widget/widget_delegate.h" #include "views/window/custom_frame_view.h" -namespace views { - namespace { + // Set to true if a pure Views implementation is preferred bool use_pure_views = false; // True to enable debug paint that indicates where to be painted. bool debug_paint = false; -} + +} // namespace + +namespace views { // This class is used to keep track of the event a Widget is processing, and // restore any previously active event afterwards. @@ -844,15 +848,13 @@ void Widget::OnNativeWidgetActivationChanged(bool active) { } void Widget::OnNativeFocus(gfx::NativeView focused_view) { - GetFocusManager()->GetWidgetFocusManager()->OnWidgetFocusEvent( - focused_view, - GetNativeView()); + WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(focused_view, + GetNativeView()); } void Widget::OnNativeBlur(gfx::NativeView focused_view) { - GetFocusManager()->GetWidgetFocusManager()->OnWidgetFocusEvent( - GetNativeView(), - focused_view); + WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(GetNativeView(), + focused_view); } void Widget::OnNativeWidgetVisibilityChanged(bool visible) { |