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 13namespace aura { 14class Window; 15} 16 17namespace ui { 18class Layer; 19} 20 21namespace chromeos { 22 23// A delegate interface implemented by the object that owns a FocusRingLayer. 24class 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. 33class 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