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