Home | History | Annotate | Download | only in test
      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