Index: ui/views/corewm/base_focus_rules.cc |
diff --git a/ui/views/corewm/base_focus_rules.cc b/ui/views/corewm/base_focus_rules.cc |
deleted file mode 100644 |
index 3674ff01fa3454c4de56dde6f84c19bf28eb22d2..0000000000000000000000000000000000000000 |
--- a/ui/views/corewm/base_focus_rules.cc |
+++ /dev/null |
@@ -1,197 +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/base_focus_rules.h" |
- |
-#include "ui/aura/client/activation_delegate.h" |
-#include "ui/aura/client/focus_client.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura/window_event_dispatcher.h" |
-#include "ui/views/corewm/window_modality_controller.h" |
-#include "ui/views/corewm/window_util.h" |
- |
-namespace views { |
-namespace corewm { |
-namespace { |
- |
-aura::Window* GetFocusedWindow(aura::Window* context) { |
- aura::client::FocusClient* focus_client = |
- aura::client::GetFocusClient(context); |
- return focus_client ? focus_client->GetFocusedWindow() : NULL; |
-} |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BaseFocusRules, protected: |
- |
-BaseFocusRules::BaseFocusRules() { |
-} |
- |
-BaseFocusRules::~BaseFocusRules() { |
-} |
- |
-bool BaseFocusRules::IsWindowConsideredVisibleForActivation( |
- aura::Window* window) const { |
- return window->IsVisible(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BaseFocusRules, FocusRules implementation: |
- |
-bool BaseFocusRules::IsToplevelWindow(aura::Window* window) const { |
- // The window must in a valid hierarchy. |
- if (!window->GetRootWindow()) |
- return false; |
- |
- // The window must exist within a container that supports activation. |
- // The window cannot be blocked by a modal transient. |
- return SupportsChildActivation(window->parent()); |
-} |
- |
-bool BaseFocusRules::CanActivateWindow(aura::Window* window) const { |
- // It is possible to activate a NULL window, it is equivalent to clearing |
- // activation. |
- if (!window) |
- return true; |
- |
- // Only toplevel windows can be activated. |
- if (!IsToplevelWindow(window)) |
- return false; |
- |
- // The window must be visible. |
- if (!IsWindowConsideredVisibleForActivation(window)) |
- return false; |
- |
- // The window's activation delegate must allow this window to be activated. |
- if (aura::client::GetActivationDelegate(window) && |
- !aura::client::GetActivationDelegate(window)->ShouldActivate()) { |
- return false; |
- } |
- |
- // A window must be focusable to be activatable. We don't call |
- // CanFocusWindow() from here because it will call back to us via |
- // GetActivatableWindow(). |
- if (!window->CanFocus()) |
- return false; |
- |
- // The window cannot be blocked by a modal transient. |
- return !GetModalTransient(window); |
-} |
- |
-bool BaseFocusRules::CanFocusWindow(aura::Window* window) const { |
- // It is possible to focus a NULL window, it is equivalent to clearing focus. |
- if (!window) |
- return true; |
- |
- // The focused window is always inside the active window, so windows that |
- // aren't activatable can't contain the focused window. |
- aura::Window* activatable = GetActivatableWindow(window); |
- if (!activatable || !activatable->Contains(window)) |
- return false; |
- return window->CanFocus(); |
-} |
- |
-aura::Window* BaseFocusRules::GetToplevelWindow(aura::Window* window) const { |
- aura::Window* parent = window->parent(); |
- aura::Window* child = window; |
- while (parent) { |
- if (IsToplevelWindow(child)) |
- return child; |
- |
- parent = parent->parent(); |
- child = child->parent(); |
- } |
- return NULL; |
-} |
- |
-aura::Window* BaseFocusRules::GetActivatableWindow(aura::Window* window) const { |
- aura::Window* parent = window->parent(); |
- aura::Window* child = window; |
- while (parent) { |
- if (CanActivateWindow(child)) |
- return child; |
- |
- // CanActivateWindow() above will return false if |child| is blocked by a |
- // modal transient. In this case the modal is or contains the activatable |
- // window. We recurse because the modal may itself be blocked by a modal |
- // transient. |
- aura::Window* modal_transient = GetModalTransient(child); |
- if (modal_transient) |
- return GetActivatableWindow(modal_transient); |
- |
- if (views::corewm::GetTransientParent(child)) { |
- // To avoid infinite recursion, if |child| has a transient parent |
- // whose own modal transient is |child| itself, just return |child|. |
- aura::Window* parent_modal_transient = |
- GetModalTransient(views::corewm::GetTransientParent(child)); |
- if (parent_modal_transient == child) |
- return child; |
- |
- return GetActivatableWindow(views::corewm::GetTransientParent(child)); |
- } |
- |
- parent = parent->parent(); |
- child = child->parent(); |
- } |
- return NULL; |
-} |
- |
-aura::Window* BaseFocusRules::GetFocusableWindow(aura::Window* window) const { |
- if (CanFocusWindow(window)) |
- return window; |
- |
- // |window| may be in a hierarchy that is non-activatable, in which case we |
- // need to cut over to the activatable hierarchy. |
- aura::Window* activatable = GetActivatableWindow(window); |
- if (!activatable) { |
- // There may not be a related activatable hierarchy to cut over to, in which |
- // case we try an unrelated one. |
- aura::Window* toplevel = GetToplevelWindow(window); |
- if (toplevel) |
- activatable = GetNextActivatableWindow(toplevel); |
- if (!activatable) |
- return NULL; |
- } |
- |
- if (!activatable->Contains(window)) { |
- // If there's already a child window focused in the activatable hierarchy, |
- // just use that (i.e. don't shift focus), otherwise we need to at least cut |
- // over to the activatable hierarchy. |
- aura::Window* focused = GetFocusedWindow(activatable); |
- return activatable->Contains(focused) ? focused : activatable; |
- } |
- |
- while (window && !CanFocusWindow(window)) |
- window = window->parent(); |
- return window; |
-} |
- |
-aura::Window* BaseFocusRules::GetNextActivatableWindow( |
- aura::Window* ignore) const { |
- DCHECK(ignore); |
- |
- // Can be called from the RootWindow's destruction, which has a NULL parent. |
- if (!ignore->parent()) |
- return NULL; |
- |
- // In the basic scenarios handled by BasicFocusRules, the pool of activatable |
- // windows is limited to the |ignore|'s siblings. |
- const aura::Window::Windows& siblings = ignore->parent()->children(); |
- DCHECK(!siblings.empty()); |
- |
- for (aura::Window::Windows::const_reverse_iterator rit = siblings.rbegin(); |
- rit != siblings.rend(); |
- ++rit) { |
- aura::Window* cur = *rit; |
- if (cur == ignore) |
- continue; |
- if (CanActivateWindow(cur)) |
- return cur; |
- } |
- return NULL; |
-} |
- |
-} // namespace corewm |
-} // namespace views |