// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/chromeos/ui/focus_ring_controller.h" #include "ash/wm/window_util.h" #include "chrome/browser/chromeos/ui/focus_ring_layer.h" #include "ui/views/widget/widget.h" namespace chromeos { FocusRingController::FocusRingController() : visible_(false), widget_(NULL) { } FocusRingController::~FocusRingController() { SetVisible(false); } void FocusRingController::SetVisible(bool visible) { if (visible_ == visible) return; visible_ = visible; if (visible_) { views::WidgetFocusManager::GetInstance()->AddFocusChangeListener(this); aura::Window* active_window = ash::wm::GetActiveWindow(); if (active_window) SetWidget(views::Widget::GetWidgetForNativeWindow(active_window)); } else { views::WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(this); SetWidget(NULL); } } void FocusRingController::UpdateFocusRing() { views::View* focused_view = NULL; if (widget_ && widget_->GetFocusManager()) focused_view = widget_->GetFocusManager()->GetFocusedView(); // No focus ring if no focused view or the focused view covers the whole // widget content area (such as RenderWidgetHostWidgetAura). if (!focused_view || focused_view->ConvertRectToWidget(focused_view->bounds()) == widget_->GetContentsView()->bounds()) { focus_ring_layer_.reset(); return; } if (!focus_ring_layer_) focus_ring_layer_.reset(new FocusRingLayer); focus_ring_layer_->SetForView(focused_view); } void FocusRingController::SetWidget(views::Widget* widget) { if (widget_) { widget_->RemoveObserver(this); if (widget_->GetFocusManager()) widget_->GetFocusManager()->RemoveFocusChangeListener(this); } widget_ = widget; if (widget_) { widget_->AddObserver(this); if (widget_->GetFocusManager()) widget_->GetFocusManager()->AddFocusChangeListener(this); } UpdateFocusRing(); } void FocusRingController::OnWidgetDestroying(views::Widget* widget) { DCHECK_EQ(widget_, widget); SetWidget(NULL); } void FocusRingController::OnWidgetBoundsChanged(views::Widget* widget, const gfx::Rect& new_bounds) { DCHECK_EQ(widget_, widget); UpdateFocusRing(); } void FocusRingController::OnNativeFocusChange(gfx::NativeView focused_before, gfx::NativeView focused_now) { views::Widget* widget = focused_now ? views::Widget::GetWidgetForNativeWindow(focused_now) : NULL; SetWidget(widget); } void FocusRingController::OnWillChangeFocus(views::View* focused_before, views::View* focused_now) { } void FocusRingController::OnDidChangeFocus(views::View* focused_before, views::View* focused_now) { DCHECK_EQ(focused_now, widget_->GetFocusManager()->GetFocusedView()); UpdateFocusRing(); } } // namespace chromeos