1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/aura/test/test_activation_client.h" 6 7 #include "ui/aura/client/activation_change_observer.h" 8 #include "ui/aura/client/activation_delegate.h" 9 #include "ui/aura/root_window.h" 10 #include "ui/aura/window.h" 11 12 namespace aura { 13 namespace test { 14 15 //////////////////////////////////////////////////////////////////////////////// 16 // TestActivationClient, public: 17 18 TestActivationClient::TestActivationClient(RootWindow* root_window) 19 : last_active_(NULL) { 20 client::SetActivationClient(root_window, this); 21 } 22 23 TestActivationClient::~TestActivationClient() { 24 for (unsigned int i = 0; i < active_windows_.size(); ++i) { 25 active_windows_[i]->RemoveObserver(this); 26 } 27 } 28 29 //////////////////////////////////////////////////////////////////////////////// 30 // TestActivationClient, client::ActivationClient implementation: 31 32 void TestActivationClient::AddObserver( 33 client::ActivationChangeObserver* observer) { 34 observers_.AddObserver(observer); 35 } 36 37 void TestActivationClient::RemoveObserver( 38 client::ActivationChangeObserver* observer) { 39 observers_.RemoveObserver(observer); 40 } 41 42 void TestActivationClient::ActivateWindow(Window* window) { 43 Window* last_active = GetActiveWindow(); 44 if (last_active == window) 45 return; 46 47 last_active_ = last_active; 48 RemoveActiveWindow(window); 49 active_windows_.push_back(window); 50 window->parent()->StackChildAtTop(window); 51 window->AddObserver(this); 52 53 FOR_EACH_OBSERVER(client::ActivationChangeObserver, 54 observers_, 55 OnWindowActivated(window, last_active)); 56 57 aura::client::ActivationChangeObserver* observer = 58 aura::client::GetActivationChangeObserver(last_active); 59 if (observer) 60 observer->OnWindowActivated(window, last_active); 61 observer = aura::client::GetActivationChangeObserver(window); 62 if (observer) 63 observer->OnWindowActivated(window, last_active); 64 } 65 66 void TestActivationClient::DeactivateWindow(Window* window) { 67 aura::client::ActivationChangeObserver* observer = 68 aura::client::GetActivationChangeObserver(window); 69 if (observer) 70 observer->OnWindowActivated(NULL, window); 71 if (last_active_) 72 ActivateWindow(last_active_); 73 } 74 75 Window* TestActivationClient::GetActiveWindow() { 76 if (active_windows_.empty()) 77 return NULL; 78 return active_windows_.back(); 79 } 80 81 Window* TestActivationClient::GetActivatableWindow(Window* window) { 82 return NULL; 83 } 84 85 Window* TestActivationClient::GetToplevelWindow(Window* window) { 86 return NULL; 87 } 88 89 bool TestActivationClient::OnWillFocusWindow(Window* window, 90 const ui::Event* event) { 91 return true; 92 } 93 94 bool TestActivationClient::CanActivateWindow(Window* window) const { 95 return true; 96 } 97 98 //////////////////////////////////////////////////////////////////////////////// 99 // TestActivationClient, WindowObserver implementation: 100 101 void TestActivationClient::OnWindowDestroyed(Window* window) { 102 if (window == last_active_) 103 last_active_ = NULL; 104 105 if (window == GetActiveWindow()) { 106 window->RemoveObserver(this); 107 active_windows_.pop_back(); 108 Window* next_active = GetActiveWindow(); 109 if (next_active && aura::client::GetActivationChangeObserver(next_active)) { 110 aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated( 111 next_active, NULL); 112 } 113 return; 114 } 115 116 RemoveActiveWindow(window); 117 } 118 119 void TestActivationClient::RemoveActiveWindow(Window* window) { 120 for (unsigned int i = 0; i < active_windows_.size(); ++i) { 121 if (active_windows_[i] == window) { 122 active_windows_.erase(active_windows_.begin() + i); 123 window->RemoveObserver(this); 124 return; 125 } 126 } 127 } 128 129 } // namespace test 130 } // namespace aura 131