• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_CHROMEOS_UI_FOCUS_RING_CONTROLLER_H_
6 #define CHROME_BROWSER_CHROMEOS_UI_FOCUS_RING_CONTROLLER_H_
7 
8 #include "base/basictypes.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "ui/views/focus/focus_manager.h"
11 #include "ui/views/focus/widget_focus_manager.h"
12 #include "ui/views/widget/widget_observer.h"
13 
14 namespace views {
15 class View;
16 class Widget;
17 }
18 
19 namespace chromeos {
20 
21 class FocusRingLayer;
22 
23 // FocusRingController manages the focus ring around the focused view. It
24 // follows widget focus change and update the focus ring layer when the focused
25 // view of the widget changes.
26 class FocusRingController : public views::WidgetObserver,
27                             public views::WidgetFocusChangeListener,
28                             public views::FocusChangeListener {
29  public:
30   FocusRingController();
31   virtual ~FocusRingController();
32 
33   // Turns on/off the focus ring.
34   void SetVisible(bool visible);
35 
36  private:
37   // Sets the focused |widget|.
38   void SetWidget(views::Widget* widget);
39 
40   // Updates the focus ring to the focused view of |widget_|. If |widget_| is
41   // NULL or has no focused view, removes the focus ring. Otherwise, draws it.
42   void UpdateFocusRing();
43 
44   // views::WidgetObserver overrides:
45   virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
46   virtual void OnWidgetBoundsChanged(views::Widget* widget,
47                                      const gfx::Rect& new_bounds) OVERRIDE;
48 
49   // views::WidgetFocusChangeListener overrides:
50   virtual void OnNativeFocusChange(gfx::NativeView focused_before,
51                                    gfx::NativeView focused_now) OVERRIDE;
52 
53   // views::FocusChangeListener overrides:
54   virtual void OnWillChangeFocus(views::View* focused_before,
55                                  views::View* focused_now) OVERRIDE;
56   virtual void OnDidChangeFocus(views::View* focused_before,
57                                 views::View* focused_now) OVERRIDE;
58 
59   bool visible_;
60 
61   views::Widget* widget_;
62   scoped_ptr<FocusRingLayer> focus_ring_layer_;
63 
64   DISALLOW_COPY_AND_ASSIGN(FocusRingController);
65 };
66 
67 }  // namespace chromeos
68 
69 #endif  // CHROME_BROWSER_CHROMEOS_UI_FOCUS_RING_CONTROLLER_H_
70