Index: ui/views/corewm/focus_controller.cc |
diff --git a/ui/views/corewm/focus_controller.cc b/ui/views/corewm/focus_controller.cc |
deleted file mode 100644 |
index a3107a19b4be27e51a4b550257f06786c327f4be..0000000000000000000000000000000000000000 |
--- a/ui/views/corewm/focus_controller.cc |
+++ /dev/null |
@@ -1,379 +0,0 @@ |
-// Copyright (c) 2012 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 "ui/views/corewm/focus_controller.h" |
- |
-#include "base/auto_reset.h" |
-#include "ui/aura/client/activation_change_observer.h" |
-#include "ui/aura/client/aura_constants.h" |
-#include "ui/aura/client/capture_client.h" |
-#include "ui/aura/client/focus_change_observer.h" |
-#include "ui/aura/env.h" |
-#include "ui/aura/window_tracker.h" |
-#include "ui/events/event.h" |
-#include "ui/views/corewm/focus_rules.h" |
-#include "ui/views/corewm/window_util.h" |
- |
-namespace views { |
-namespace corewm { |
-namespace { |
- |
-// When a modal window is activated, we bring its entire transient parent chain |
-// to the front. This function must be called before the modal transient is |
-// stacked at the top to ensure correct stacking order. |
-void StackTransientParentsBelowModalWindow(aura::Window* window) { |
- if (window->GetProperty(aura::client::kModalKey) != ui::MODAL_TYPE_WINDOW) |
- return; |
- |
- aura::Window* transient_parent = views::corewm::GetTransientParent(window); |
- while (transient_parent) { |
- transient_parent->parent()->StackChildAtTop(transient_parent); |
- transient_parent = views::corewm::GetTransientParent(transient_parent); |
- } |
-} |
- |
-// Stack's |window|'s layer above |relative_to|'s layer. |
-void StackWindowLayerAbove(aura::Window* window, aura::Window* relative_to) { |
- // Stack |window| above the last transient child of |relative_to| that shares |
- // the same parent. |
- const aura::Window::Windows& window_transients( |
- GetTransientChildren(relative_to)); |
- for (aura::Window::Windows::const_iterator i = window_transients.begin(); |
- i != window_transients.end(); ++i) { |
- aura::Window* transient = *i; |
- if (transient->parent() == relative_to->parent()) |
- relative_to = transient; |
- } |
- if (window != relative_to) { |
- window->layer()->parent()->StackAbove(window->layer(), |
- relative_to->layer()); |
- } |
-} |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, public: |
- |
-FocusController::FocusController(FocusRules* rules) |
- : active_window_(NULL), |
- focused_window_(NULL), |
- updating_focus_(false), |
- updating_activation_(false), |
- rules_(rules), |
- observer_manager_(this) { |
- DCHECK(rules); |
-} |
- |
-FocusController::~FocusController() { |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, aura::client::ActivationClient implementation: |
- |
-void FocusController::AddObserver( |
- aura::client::ActivationChangeObserver* observer) { |
- activation_observers_.AddObserver(observer); |
-} |
- |
-void FocusController::RemoveObserver( |
- aura::client::ActivationChangeObserver* observer) { |
- activation_observers_.RemoveObserver(observer); |
-} |
- |
-void FocusController::ActivateWindow(aura::Window* window) { |
- FocusWindow(window); |
-} |
- |
-void FocusController::DeactivateWindow(aura::Window* window) { |
- if (window) |
- FocusWindow(rules_->GetNextActivatableWindow(window)); |
-} |
- |
-aura::Window* FocusController::GetActiveWindow() { |
- return active_window_; |
-} |
- |
-aura::Window* FocusController::GetActivatableWindow(aura::Window* window) { |
- return rules_->GetActivatableWindow(window); |
-} |
- |
-aura::Window* FocusController::GetToplevelWindow(aura::Window* window) { |
- return rules_->GetToplevelWindow(window); |
-} |
- |
-bool FocusController::OnWillFocusWindow(aura::Window* window, |
- const ui::Event* event) { |
- NOTREACHED(); |
- return false; |
-} |
- |
-bool FocusController::CanActivateWindow(aura::Window* window) const { |
- return rules_->CanActivateWindow(window); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, aura::client::FocusClient implementation: |
- |
-void FocusController::AddObserver( |
- aura::client::FocusChangeObserver* observer) { |
- focus_observers_.AddObserver(observer); |
-} |
- |
-void FocusController::RemoveObserver( |
- aura::client::FocusChangeObserver* observer) { |
- focus_observers_.RemoveObserver(observer); |
-} |
- |
-void FocusController::FocusWindow(aura::Window* window) { |
- if (window && |
- (window->Contains(focused_window_) || window->Contains(active_window_))) { |
- return; |
- } |
- |
- // We should not be messing with the focus if the window has capture, unless |
- // no has focus. |
- if (window && (aura::client::GetCaptureWindow(window) == window) && |
- focused_window_) { |
- return; |
- } |
- |
- // Focusing a window also activates its containing activatable window. Note |
- // that the rules could redirect activation activation and/or focus. |
- aura::Window* focusable = rules_->GetFocusableWindow(window); |
- aura::Window* activatable = |
- focusable ? rules_->GetActivatableWindow(focusable) : NULL; |
- |
- // We need valid focusable/activatable windows in the event we're not clearing |
- // focus. "Clearing focus" is inferred by whether or not |window| passed to |
- // this function is non-NULL. |
- if (window && (!focusable || !activatable)) |
- return; |
- DCHECK((focusable && activatable) || !window); |
- |
- // Activation change observers may change the focused window. If this happens |
- // we must not adjust the focus below since this will clobber that change. |
- aura::Window* last_focused_window = focused_window_; |
- if (!updating_activation_) |
- SetActiveWindow(window, activatable); |
- |
- // If the window's ActivationChangeObserver shifted focus to a valid window, |
- // we don't want to focus the window we thought would be focused by default. |
- bool activation_changed_focus = last_focused_window != focused_window_; |
- if (!updating_focus_ && (!activation_changed_focus || !focused_window_)) { |
- if (active_window_ && focusable) |
- DCHECK(active_window_->Contains(focusable)); |
- SetFocusedWindow(focusable); |
- } |
-} |
- |
-void FocusController::ResetFocusWithinActiveWindow(aura::Window* window) { |
- DCHECK(window); |
- if (!active_window_) |
- return; |
- if (!active_window_->Contains(window)) |
- return; |
- SetFocusedWindow(window); |
-} |
- |
-aura::Window* FocusController::GetFocusedWindow() { |
- return focused_window_; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, ui::EventHandler implementation: |
-void FocusController::OnKeyEvent(ui::KeyEvent* event) { |
-} |
- |
-void FocusController::OnMouseEvent(ui::MouseEvent* event) { |
- if (event->type() == ui::ET_MOUSE_PRESSED) |
- WindowFocusedFromInputEvent(static_cast<aura::Window*>(event->target())); |
-} |
- |
-void FocusController::OnScrollEvent(ui::ScrollEvent* event) { |
-} |
- |
-void FocusController::OnTouchEvent(ui::TouchEvent* event) { |
-} |
- |
-void FocusController::OnGestureEvent(ui::GestureEvent* event) { |
- if (event->type() == ui::ET_GESTURE_BEGIN && |
- event->details().touch_points() == 1) { |
- WindowFocusedFromInputEvent(static_cast<aura::Window*>(event->target())); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, aura::WindowObserver implementation: |
- |
-void FocusController::OnWindowVisibilityChanged(aura::Window* window, |
- bool visible) { |
- if (!visible) { |
- WindowLostFocusFromDispositionChange(window, window->parent()); |
- // Despite the focus change, we need to keep the window being hidden |
- // stacked above the new window so it stays open on top as it animates away. |
- aura::Window* next_window = GetActiveWindow(); |
- if (next_window && next_window->parent() == window->parent()) |
- StackWindowLayerAbove(window, next_window); |
- } |
-} |
- |
-void FocusController::OnWindowDestroying(aura::Window* window) { |
- WindowLostFocusFromDispositionChange(window, window->parent()); |
-} |
- |
-void FocusController::OnWindowHierarchyChanging( |
- const HierarchyChangeParams& params) { |
- if (params.receiver == active_window_ && |
- params.target->Contains(params.receiver) && (!params.new_parent || |
- aura::client::GetFocusClient(params.new_parent) != |
- aura::client::GetFocusClient(params.receiver))) { |
- WindowLostFocusFromDispositionChange(params.receiver, params.old_parent); |
- } |
-} |
- |
-void FocusController::OnWindowHierarchyChanged( |
- const HierarchyChangeParams& params) { |
- if (params.receiver == focused_window_ && |
- params.target->Contains(params.receiver) && (!params.new_parent || |
- aura::client::GetFocusClient(params.new_parent) != |
- aura::client::GetFocusClient(params.receiver))) { |
- WindowLostFocusFromDispositionChange(params.receiver, params.old_parent); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// FocusController, private: |
- |
-void FocusController::SetFocusedWindow(aura::Window* window) { |
- if (updating_focus_ || window == focused_window_) |
- return; |
- DCHECK(rules_->CanFocusWindow(window)); |
- if (window) |
- DCHECK_EQ(window, rules_->GetFocusableWindow(window)); |
- |
- base::AutoReset<bool> updating_focus(&updating_focus_, true); |
- aura::Window* lost_focus = focused_window_; |
- // Allow for the window losing focus to be deleted during dispatch. If it is |
- // deleted pass NULL to observers instead of a deleted window. |
- aura::WindowTracker window_tracker; |
- if (lost_focus) |
- window_tracker.Add(lost_focus); |
- if (focused_window_ && observer_manager_.IsObserving(focused_window_) && |
- focused_window_ != active_window_) { |
- observer_manager_.Remove(focused_window_); |
- } |
- focused_window_ = window; |
- if (focused_window_ && !observer_manager_.IsObserving(focused_window_)) |
- observer_manager_.Add(focused_window_); |
- |
- FOR_EACH_OBSERVER(aura::client::FocusChangeObserver, |
- focus_observers_, |
- OnWindowFocused(focused_window_, |
- window_tracker.Contains(lost_focus) ? |
- lost_focus : NULL)); |
- if (window_tracker.Contains(lost_focus)) { |
- aura::client::FocusChangeObserver* observer = |
- aura::client::GetFocusChangeObserver(lost_focus); |
- if (observer) |
- observer->OnWindowFocused(focused_window_, lost_focus); |
- } |
- aura::client::FocusChangeObserver* observer = |
- aura::client::GetFocusChangeObserver(focused_window_); |
- if (observer) { |
- observer->OnWindowFocused( |
- focused_window_, |
- window_tracker.Contains(lost_focus) ? lost_focus : NULL); |
- } |
-} |
- |
-void FocusController::SetActiveWindow(aura::Window* requested_window, |
- aura::Window* window) { |
- if (updating_activation_) |
- return; |
- |
- if (window == active_window_) { |
- if (requested_window) { |
- FOR_EACH_OBSERVER(aura::client::ActivationChangeObserver, |
- activation_observers_, |
- OnAttemptToReactivateWindow(requested_window, |
- active_window_)); |
- } |
- return; |
- } |
- |
- DCHECK(rules_->CanActivateWindow(window)); |
- if (window) |
- DCHECK_EQ(window, rules_->GetActivatableWindow(window)); |
- |
- base::AutoReset<bool> updating_activation(&updating_activation_, true); |
- aura::Window* lost_activation = active_window_; |
- // Allow for the window losing activation to be deleted during dispatch. If |
- // it is deleted pass NULL to observers instead of a deleted window. |
- aura::WindowTracker window_tracker; |
- if (lost_activation) |
- window_tracker.Add(lost_activation); |
- if (active_window_ && observer_manager_.IsObserving(active_window_) && |
- focused_window_ != active_window_) { |
- observer_manager_.Remove(active_window_); |
- } |
- active_window_ = window; |
- if (active_window_ && !observer_manager_.IsObserving(active_window_)) |
- observer_manager_.Add(active_window_); |
- if (active_window_) { |
- StackTransientParentsBelowModalWindow(active_window_); |
- active_window_->parent()->StackChildAtTop(active_window_); |
- } |
- |
- aura::client::ActivationChangeObserver* observer = NULL; |
- if (window_tracker.Contains(lost_activation)) { |
- observer = aura::client::GetActivationChangeObserver(lost_activation); |
- if (observer) |
- observer->OnWindowActivated(active_window_, lost_activation); |
- } |
- observer = aura::client::GetActivationChangeObserver(active_window_); |
- if (observer) { |
- observer->OnWindowActivated( |
- active_window_, |
- window_tracker.Contains(lost_activation) ? lost_activation : NULL); |
- } |
- FOR_EACH_OBSERVER(aura::client::ActivationChangeObserver, |
- activation_observers_, |
- OnWindowActivated(active_window_, |
- window_tracker.Contains(lost_activation) ? |
- lost_activation : NULL)); |
-} |
- |
-void FocusController::WindowLostFocusFromDispositionChange( |
- aura::Window* window, |
- aura::Window* next) { |
- // A window's modality state will interfere with focus restoration during its |
- // destruction. |
- window->ClearProperty(aura::client::kModalKey); |
- // TODO(beng): See if this function can be replaced by a call to |
- // FocusWindow(). |
- // Activation adjustments are handled first in the event of a disposition |
- // changed. If an activation change is necessary, focus is reset as part of |
- // that process so there's no point in updating focus independently. |
- if (window == active_window_) { |
- aura::Window* next_activatable = rules_->GetNextActivatableWindow(window); |
- SetActiveWindow(NULL, next_activatable); |
- if (!(active_window_ && active_window_->Contains(focused_window_))) |
- SetFocusedWindow(next_activatable); |
- } else if (window->Contains(focused_window_)) { |
- // Active window isn't changing, but focused window might be. |
- SetFocusedWindow(rules_->GetFocusableWindow(next)); |
- } |
-} |
- |
-void FocusController::WindowFocusedFromInputEvent(aura::Window* window) { |
- // Only focus |window| if it or any of its parents can be focused. Otherwise |
- // FocusWindow() will focus the topmost window, which may not be the |
- // currently focused one. |
- if (rules_->CanFocusWindow(GetToplevelWindow(window))) |
- FocusWindow(window); |
-} |
- |
-} // namespace corewm |
-} // namespace views |