| Index: ui/aura/client/default_activation_client.cc
|
| diff --git a/ui/aura/client/default_activation_client.cc b/ui/aura/client/default_activation_client.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b11d7bfa3f96decb24465d6bc4fa178c72dc6c08
|
| --- /dev/null
|
| +++ b/ui/aura/client/default_activation_client.cc
|
| @@ -0,0 +1,128 @@
|
| +// 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 "ui/aura/client/default_activation_client.h"
|
| +
|
| +#include "ui/aura/window.h"
|
| +#include "ui/wm/public/activation_change_observer.h"
|
| +#include "ui/wm/public/activation_delegate.h"
|
| +
|
| +namespace aura {
|
| +namespace client {
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// DefaultActivationClient, public:
|
| +
|
| +DefaultActivationClient::DefaultActivationClient(Window* root_window)
|
| + : last_active_(NULL) {
|
| + client::SetActivationClient(root_window, this);
|
| +}
|
| +
|
| +DefaultActivationClient::~DefaultActivationClient() {
|
| + for (unsigned int i = 0; i < active_windows_.size(); ++i) {
|
| + active_windows_[i]->RemoveObserver(this);
|
| + }
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// DefaultActivationClient, client::ActivationClient implementation:
|
| +
|
| +void DefaultActivationClient::AddObserver(
|
| + client::ActivationChangeObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void DefaultActivationClient::RemoveObserver(
|
| + client::ActivationChangeObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void DefaultActivationClient::ActivateWindow(Window* window) {
|
| + Window* last_active = GetActiveWindow();
|
| + if (last_active == window)
|
| + return;
|
| +
|
| + last_active_ = last_active;
|
| + RemoveActiveWindow(window);
|
| + active_windows_.push_back(window);
|
| + window->parent()->StackChildAtTop(window);
|
| + window->AddObserver(this);
|
| +
|
| + FOR_EACH_OBSERVER(client::ActivationChangeObserver,
|
| + observers_,
|
| + OnWindowActivated(window, last_active));
|
| +
|
| + aura::client::ActivationChangeObserver* observer =
|
| + aura::client::GetActivationChangeObserver(last_active);
|
| + if (observer)
|
| + observer->OnWindowActivated(window, last_active);
|
| + observer = aura::client::GetActivationChangeObserver(window);
|
| + if (observer)
|
| + observer->OnWindowActivated(window, last_active);
|
| +}
|
| +
|
| +void DefaultActivationClient::DeactivateWindow(Window* window) {
|
| + aura::client::ActivationChangeObserver* observer =
|
| + aura::client::GetActivationChangeObserver(window);
|
| + if (observer)
|
| + observer->OnWindowActivated(NULL, window);
|
| + if (last_active_)
|
| + ActivateWindow(last_active_);
|
| +}
|
| +
|
| +Window* DefaultActivationClient::GetActiveWindow() {
|
| + if (active_windows_.empty())
|
| + return NULL;
|
| + return active_windows_.back();
|
| +}
|
| +
|
| +Window* DefaultActivationClient::GetActivatableWindow(Window* window) {
|
| + return NULL;
|
| +}
|
| +
|
| +Window* DefaultActivationClient::GetToplevelWindow(Window* window) {
|
| + return NULL;
|
| +}
|
| +
|
| +bool DefaultActivationClient::OnWillFocusWindow(Window* window,
|
| + const ui::Event* event) {
|
| + return true;
|
| +}
|
| +
|
| +bool DefaultActivationClient::CanActivateWindow(Window* window) const {
|
| + return true;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// DefaultActivationClient, WindowObserver implementation:
|
| +
|
| +void DefaultActivationClient::OnWindowDestroyed(Window* window) {
|
| + if (window == last_active_)
|
| + last_active_ = NULL;
|
| +
|
| + if (window == GetActiveWindow()) {
|
| + active_windows_.pop_back();
|
| + Window* next_active = GetActiveWindow();
|
| + if (next_active && aura::client::GetActivationChangeObserver(next_active)) {
|
| + aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated(
|
| + next_active, NULL);
|
| + }
|
| + return;
|
| + }
|
| +
|
| + RemoveActiveWindow(window);
|
| +}
|
| +
|
| +void DefaultActivationClient::RemoveActiveWindow(Window* window) {
|
| + for (unsigned int i = 0; i < active_windows_.size(); ++i) {
|
| + if (active_windows_[i] == window) {
|
| + active_windows_.erase(active_windows_.begin() + i);
|
| + window->RemoveObserver(this);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace client
|
| +} // namespace aura
|
|
|