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