Home | History | Annotate | Download | only in ui
      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_LAYER_H_
      6 #define CHROME_BROWSER_CHROMEOS_UI_FOCUS_RING_LAYER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "ui/compositor/layer_delegate.h"
     11 #include "ui/gfx/rect.h"
     12 
     13 namespace aura {
     14 class Window;
     15 }
     16 
     17 namespace ui {
     18 class Layer;
     19 }
     20 
     21 namespace chromeos {
     22 
     23 // A delegate interface implemented by the object that owns a FocusRingLayer.
     24 class FocusRingLayerDelegate {
     25  public:
     26   virtual void OnDeviceScaleFactorChanged() = 0;
     27 
     28  protected:
     29   virtual ~FocusRingLayerDelegate();
     30 };
     31 
     32 // FocusRingLayer draws a focus ring at a given global rectangle.
     33 class FocusRingLayer : public ui::LayerDelegate {
     34  public:
     35   explicit FocusRingLayer(FocusRingLayerDelegate* delegate);
     36   virtual ~FocusRingLayer();
     37 
     38   // Move the focus ring layer to the given bounds in the coordinates of
     39   // the given root window.
     40   void Set(aura::Window* root_window, const gfx::Rect& bounds);
     41 
     42   ui::Layer* layer() { return layer_.get(); }
     43   aura::Window* root_window() { return root_window_; }
     44 
     45  protected:
     46   // Updates |root_window_| and creates |layer_| if it doesn't exist,
     47   // or if the root window has changed. Moves the layer to the top if
     48   // it wasn't there already.
     49   void CreateOrUpdateLayer(aura::Window* root_window, const char* layer_name);
     50 
     51  private:
     52   // ui::LayerDelegate overrides:
     53   virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE;
     54   virtual void OnDelegatedFrameDamage(
     55       const gfx::Rect& damage_rect_in_dip) OVERRIDE;
     56   virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
     57   virtual base::Closure PrepareForLayerBoundsChange() OVERRIDE;
     58 
     59   // The object that owns this layer.
     60   FocusRingLayerDelegate* delegate_;
     61 
     62   // The current root window containing the focused object.
     63   aura::Window* root_window_;
     64 
     65   // The current layer.
     66   scoped_ptr<ui::Layer> layer_;
     67 
     68   // The bounding rectangle of the focused object, in |root_window_|
     69   // coordinates.
     70   gfx::Rect focus_ring_;
     71 
     72   DISALLOW_COPY_AND_ASSIGN(FocusRingLayer);
     73 };
     74 
     75 }  // namespace chromeos
     76 
     77 #endif  // CHROME_BROWSER_CHROMEOS_UI_FOCUS_RING_LAYER_H_
     78