1// Copyright 2014 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_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_
6#define CHROME_BROWSER_CHROMEOS_UI_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/memory/singleton.h"
11#include "base/time/time.h"
12#include "chrome/browser/chromeos/ui/accessibility_focus_ring_layer.h"
13#include "ui/compositor/compositor_animation_observer.h"
14#include "ui/gfx/rect.h"
15
16namespace ui {
17class Compositor;
18}
19
20namespace chromeos {
21
22// AccessibilityFocusRingController manages a custom focus ring (or multiple
23// rings) for accessibility.
24class AccessibilityFocusRingController
25    : public FocusRingLayerDelegate,
26      public ui::CompositorAnimationObserver {
27 public:
28  // Get the single instance of this class.
29  static AccessibilityFocusRingController* GetInstance();
30
31  // Draw a focus ring around the given set of rects, in global screen
32  // coordinates.
33  void SetFocusRing(const std::vector<gfx::Rect>& rects);
34
35 protected:
36  AccessibilityFocusRingController();
37  virtual ~AccessibilityFocusRingController();
38
39  // Given an unordered vector of bounding rectangles that cover everything
40  // that currently has focus, populate a vector of one or more
41  // AccessibilityFocusRings that surround the rectangles. Adjacent or
42  // overlapping rectangles are combined first. This function is protected
43  // so it can be unit-tested.
44  void RectsToRings(const std::vector<gfx::Rect>& rects,
45                    std::vector<AccessibilityFocusRing>* rings) const;
46
47  virtual int GetMargin() const;
48
49 private:
50  // FocusRingLayerDelegate.
51  virtual void OnDeviceScaleFactorChanged() OVERRIDE;
52
53  // CompositorAnimationObserver.
54  virtual void OnAnimationStep(base::TimeTicks timestamp) OVERRIDE;
55
56  void Update();
57
58  AccessibilityFocusRing RingFromSortedRects(
59      const std::vector<gfx::Rect>& rects) const;
60  void SplitIntoParagraphShape(
61      const std::vector<gfx::Rect>& rects,
62      gfx::Rect* top,
63      gfx::Rect* middle,
64      gfx::Rect* bottom) const;
65  bool Intersects(const gfx::Rect& r1, const gfx::Rect& r2) const;
66
67  std::vector<gfx::Rect> rects_;
68  std::vector<AccessibilityFocusRing> previous_rings_;
69  std::vector<AccessibilityFocusRing> rings_;
70  std::vector<scoped_ptr<AccessibilityFocusRingLayer> > layers_;
71  base::TimeTicks focus_change_time_;
72  ui::Compositor* compositor_;
73
74  friend struct DefaultSingletonTraits<AccessibilityFocusRingController>;
75
76  DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController);
77};
78
79}  // namespace chromeos
80
81#endif  // CHROME_BROWSER_CHROMEOS_UI_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_
82