diff options
Diffstat (limited to 'views/focus/focus_manager.h')
-rw-r--r-- | views/focus/focus_manager.h | 275 |
1 files changed, 2 insertions, 273 deletions
diff --git a/views/focus/focus_manager.h b/views/focus/focus_manager.h index 5d4caa7..5432cb5 100644 --- a/views/focus/focus_manager.h +++ b/views/focus/focus_manager.h @@ -6,278 +6,7 @@ #define VIEWS_FOCUS_FOCUS_MANAGER_H_ #pragma once -#include <list> -#include <map> - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/observer_list.h" -#include "ui/base/models/accelerator.h" -#include "ui/gfx/native_widget_types.h" -#include "views/views_export.h" -#include "views/events/event.h" - -// The FocusManager class is used to handle focus traversal, store/restore -// focused views and handle keyboard accelerators. -// -// There are 2 types of focus: -// - the native focus, which is the focus that an gfx::NativeView has. -// - the view focus, which is the focus that a views::View has. -// -// Each native view must register with their Focus Manager so the focus manager -// gets notified when they are focused (and keeps track of the native focus) and -// as well so that the tab key events can be intercepted. -// They can provide when they register a View that is kept in synch in term of -// focus. This is used in NativeControl for example, where a View wraps an -// actual native window. -// This is already done for you if you subclass the NativeControl class or if -// you use the NativeViewHost class. -// -// When creating a top window (derived from views::Widget) that is not a child -// window, it creates and owns a FocusManager to manage the focus for itself and -// all its child windows. -// -// The FocusTraversable interface exposes the methods a class should implement -// in order to be able to be focus traversed when tab key is pressed. -// RootViews implement FocusTraversable. -// The FocusManager contains a top FocusTraversable instance, which is the top -// RootView. -// -// If you just use views, then the focus traversal is handled for you by the -// RootView. The default traversal order is the order in which the views have -// been added to their container. You can modify this order by using the View -// method SetNextFocusableView(). -// -// If you are embedding a native view containing a nested RootView (for example -// by adding a NativeControl that contains a NativeWidgetWin as its native -// component), then you need to: -// - override the View::GetFocusTraversable() method in your outer component. -// It should return the RootView of the inner component. This is used when -// the focus traversal traverse down the focus hierarchy to enter the nested -// RootView. In the example mentioned above, the NativeControl overrides -// GetFocusTraversable() and returns hwnd_view_container_->GetRootView(). -// - call Widget::SetFocusTraversableParent() on the nested RootView and point -// it to the outer RootView. This is used when the focus goes out of the -// nested RootView. In the example: -// hwnd_view_container_->GetWidget()->SetFocusTraversableParent( -// native_control->GetRootView()); -// - call RootView::SetFocusTraversableParentView() on the nested RootView with -// the parent view that directly contains the native window. This is needed -// when traversing up from the nested RootView to know which view to start -// with when going to the next/previous view. -// In our example: -// hwnd_view_container_->GetWidget()->SetFocusTraversableParent( -// native_control); -// -// Note that FocusTraversable do not have to be RootViews: AccessibleToolbarView -// is FocusTraversable. - -namespace ui { -class AcceleratorTarget; -class AcceleratorManager; -} - -namespace views { - -class FocusSearch; -class RootView; -class View; -class Widget; - -// The FocusTraversable interface is used by components that want to process -// focus traversal events (due to Tab/Shift-Tab key events). -class VIEWS_EXPORT FocusTraversable { - public: - // Return a FocusSearch object that implements the algorithm to find - // the next or previous focusable view. - virtual FocusSearch* GetFocusSearch() = 0; - - // Should return the parent FocusTraversable. - // The top RootView which is the top FocusTraversable returns NULL. - virtual FocusTraversable* GetFocusTraversableParent() = 0; - - // This should return the View this FocusTraversable belongs to. - // It is used when walking up the view hierarchy tree to find which view - // should be used as the starting view for finding the next/previous view. - virtual View* GetFocusTraversableParentView() = 0; - - protected: - virtual ~FocusTraversable() {} -}; - -// This interface should be implemented by classes that want to be notified when -// the focus is about to change. See the Add/RemoveFocusChangeListener methods. -class VIEWS_EXPORT FocusChangeListener { - public: - // No change to focus state has occurred yet when this function is called. - virtual void OnWillChangeFocus(View* focused_before, View* focused_now) = 0; - - // Called after focus state has changed. - virtual void OnDidChangeFocus(View* focused_before, View* focused_now) = 0; - - protected: - virtual ~FocusChangeListener() {} -}; - -class VIEWS_EXPORT FocusManager { - public: - // The reason why the focus changed. - enum FocusChangeReason { - // The focus changed because the user traversed focusable views using - // keys like Tab or Shift+Tab. - kReasonFocusTraversal, - - // The focus changed due to restoring the focus. - kReasonFocusRestore, - - // The focus changed due to a click or a shortcut to jump directly to - // a particular view. - kReasonDirectFocusChange - }; - - explicit FocusManager(Widget* widget); - virtual ~FocusManager(); - - // Processes the passed key event for accelerators and tab traversal. - // Returns false if the event has been consumed and should not be processed - // further. - bool OnKeyEvent(const KeyEvent& event); - - // Returns true is the specified is part of the hierarchy of the window - // associated with this FocusManager. - bool ContainsView(View* view); - - // Advances the focus (backward if reverse is true). - void AdvanceFocus(bool reverse); - - // The FocusManager keeps track of the focused view within a RootView. - View* GetFocusedView() { return focused_view_; } - const View* GetFocusedView() const { return focused_view_; } - - // Low-level methods to force the focus to change (and optionally provide - // a reason). If the focus change should only happen if the view is - // currenty focusable, enabled, and visible, call view->RequestFocus(). - void SetFocusedViewWithReason(View* view, FocusChangeReason reason); - void SetFocusedView(View* view) { - SetFocusedViewWithReason(view, kReasonDirectFocusChange); - } - - // Get the reason why the focus most recently changed. - FocusChangeReason focus_change_reason() const { - return focus_change_reason_; - } - - // Clears the focused view. The window associated with the top root view gets - // the native focus (so we still get keyboard events). - void ClearFocus(); - - // Validates the focused view, clearing it if the window it belongs too is not - // attached to the window hierarchy anymore. - void ValidateFocusedView(); - - // Stores and restores the focused view. Used when the window becomes - // active/inactive. - void StoreFocusedView(); - void RestoreFocusedView(); - - // Clears the stored focused view. - void ClearStoredFocusedView(); - - // Returns true if in the process of changing the focused view. - bool is_changing_focus() const { return is_changing_focus_; } - - // Register a keyboard accelerator for the specified target. If multiple - // targets are registered for an accelerator, a target registered later has - // higher priority. - // Note that we are currently limited to accelerators that are either: - // - a key combination including Ctrl or Alt - // - the escape key - // - the enter key - // - any F key (F1, F2, F3 ...) - // - any browser specific keys (as available on special keyboards) - void RegisterAccelerator(const ui::Accelerator& accelerator, - ui::AcceleratorTarget* target); - - // Unregister the specified keyboard accelerator for the specified target. - void UnregisterAccelerator(const ui::Accelerator& accelerator, - ui::AcceleratorTarget* target); - - // Unregister all keyboard accelerator for the specified target. - void UnregisterAccelerators(ui::AcceleratorTarget* target); - - // Activate the target associated with the specified accelerator. - // First, AcceleratorPressed handler of the most recently registered target - // is called, and if that handler processes the event (i.e. returns true), - // this method immediately returns. If not, we do the same thing on the next - // target, and so on. - // Returns true if an accelerator was activated. - bool ProcessAccelerator(const ui::Accelerator& accelerator); - - // Called by a RootView when a view within its hierarchy is removed - // from its parent. This will only be called by a RootView in a - // hierarchy of Widgets that this FocusManager is attached to the - // parent Widget of. - void ViewRemoved(View* removed); - - // Adds/removes a listener. The FocusChangeListener is notified every time - // the focused view is about to change. - void AddFocusChangeListener(FocusChangeListener* listener); - void RemoveFocusChangeListener(FocusChangeListener* listener); - - // Returns the AcceleratorTarget that should be activated for the specified - // keyboard accelerator, or NULL if no view is registered for that keyboard - // accelerator. - ui::AcceleratorTarget* GetCurrentTargetForAccelerator( - const ui::Accelerator& accelertor) const; - - // Sets the focus to the specified native view. - virtual void FocusNativeView(gfx::NativeView native_view); - - // Clears the native view having the focus. - virtual void ClearNativeFocus(); - - // Convenience method that returns true if the passed |key_event| should - // trigger tab traversal (if it is a TAB key press with or without SHIFT - // pressed). - static bool IsTabTraversalKeyEvent(const KeyEvent& key_event); - - private: - // Returns the next focusable view. - View* GetNextFocusableView(View* starting_view, bool reverse, bool dont_loop); - - // Returns the focusable view found in the FocusTraversable specified starting - // at the specified view. This traverses down along the FocusTraversable - // hierarchy. - // Returns NULL if no focusable view were found. - View* FindFocusableView(FocusTraversable* focus_traversable, - View* starting_view, - bool reverse); - - // The top-level Widget this FocusManager is associated with. - Widget* widget_; - - // The view that currently is focused. - View* focused_view_; - - // The AcceleratorManager this FocusManager is associated with. - scoped_ptr<ui::AcceleratorManager> accelerator_manager_; - - // The storage id used in the ViewStorage to store/restore the view that last - // had focus. - int stored_focused_view_storage_id_; - - // The reason why the focus most recently changed. - FocusChangeReason focus_change_reason_; - - // The list of registered FocusChange listeners. - ObserverList<FocusChangeListener, true> focus_change_listeners_; - - // See description above getter. - bool is_changing_focus_; - - DISALLOW_COPY_AND_ASSIGN(FocusManager); -}; - -} // namespace views +#include "ui/views/focus/focus_manager.h" +// TODO(tfarina): remove this file once all includes have been updated. #endif // VIEWS_FOCUS_FOCUS_MANAGER_H_ |