11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_CHROMEOS_UI_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROME_BROWSER_CHROMEOS_UI_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/singleton.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/ui/accessibility_focus_ring_layer.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/compositor_animation_observer.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/rect.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace ui { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Compositor; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// AccessibilityFocusRingController manages a custom focus ring (or multiple 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// rings) for accessibility. 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AccessibilityFocusRingController 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public FocusRingLayerDelegate, 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public ui::CompositorAnimationObserver { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Get the single instance of this class. 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static AccessibilityFocusRingController* GetInstance(); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Draw a focus ring around the given set of rects, in global screen 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // coordinates. 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetFocusRing(const std::vector<gfx::Rect>& rects); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccessibilityFocusRingController(); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~AccessibilityFocusRingController(); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Given an unordered vector of bounding rectangles that cover everything 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that currently has focus, populate a vector of one or more 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // AccessibilityFocusRings that surround the rectangles. Adjacent or 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // overlapping rectangles are combined first. This function is protected 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // so it can be unit-tested. 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RectsToRings(const std::vector<gfx::Rect>& rects, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AccessibilityFocusRing>* rings) const; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual int GetMargin() const; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // FocusRingLayerDelegate. 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnDeviceScaleFactorChanged() OVERRIDE; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // CompositorAnimationObserver. 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnAnimationStep(base::TimeTicks timestamp) OVERRIDE; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Update(); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AccessibilityFocusRing RingFromSortedRects( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<gfx::Rect>& rects) const; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SplitIntoParagraphShape( 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<gfx::Rect>& rects, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect* top, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect* middle, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect* bottom) const; 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Intersects(const gfx::Rect& r1, const gfx::Rect& r2) const; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<gfx::Rect> rects_; 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AccessibilityFocusRing> previous_rings_; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AccessibilityFocusRing> rings_; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<scoped_ptr<AccessibilityFocusRingLayer> > layers_; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeTicks focus_change_time_; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::Compositor* compositor_; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend struct DefaultSingletonTraits<AccessibilityFocusRingController>; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingController); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromeos 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CHROME_BROWSER_CHROMEOS_UI_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ 82