| // 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/client/activation_change_observer.h" |
| #include "ui/aura/client/activation_delegate.h" |
| #include "ui/aura/window.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 |