Home | History | Annotate | Download | only in ui
      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 
     16 namespace ui {
     17 class Compositor;
     18 }
     19 
     20 namespace chromeos {
     21 
     22 // AccessibilityFocusRingController manages a custom focus ring (or multiple
     23 // rings) for accessibility.
     24 class 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