1// Copyright 2013 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#ifndef UI_WM_CORE_DEFAULT_ACTIVATION_CLIENT_H_
6#define UI_WM_CORE_DEFAULT_ACTIVATION_CLIENT_H_
7
8#include <vector>
9
10#include "base/compiler_specific.h"
11#include "base/logging.h"
12#include "base/observer_list.h"
13#include "ui/aura/window_observer.h"
14#include "ui/wm/public/activation_client.h"
15#include "ui/wm/wm_export.h"
16
17namespace aura {
18namespace client {
19class ActivationChangeObserver;
20}
21}
22
23namespace wm {
24
25// Simple ActivationClient implementation for use by tests and other targets
26// that just need basic behavior (e.g. activate windows whenever requested,
27// restack windows at the top when they're activated, etc.). This object deletes
28// itself when the root window it is associated with is destroyed.
29class WM_EXPORT DefaultActivationClient : public aura::client::ActivationClient,
30                                          public aura::WindowObserver {
31 public:
32  explicit DefaultActivationClient(aura::Window* root_window);
33
34  // Overridden from aura::client::ActivationClient:
35  virtual void AddObserver(
36      aura::client::ActivationChangeObserver* observer) OVERRIDE;
37  virtual void RemoveObserver(
38      aura::client::ActivationChangeObserver* observer) OVERRIDE;
39  virtual void ActivateWindow(aura::Window* window) OVERRIDE;
40  virtual void DeactivateWindow(aura::Window* window) OVERRIDE;
41  virtual aura::Window* GetActiveWindow() OVERRIDE;
42  virtual aura::Window* GetActivatableWindow(aura::Window* window) OVERRIDE;
43  virtual aura::Window* GetToplevelWindow(aura::Window* window) OVERRIDE;
44  virtual bool CanActivateWindow(aura::Window* window) const OVERRIDE;
45
46  // Overridden from WindowObserver:
47  virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
48
49 private:
50  class Deleter;
51
52  virtual ~DefaultActivationClient();
53  void RemoveActiveWindow(aura::Window* window);
54
55  // This class explicitly does NOT store the active window in a window property
56  // to make sure that ActivationChangeObserver is not treated as part of the
57  // aura API. Assumptions to that end will cause tests that use this client to
58  // fail.
59  std::vector<aura::Window*> active_windows_;
60
61  // The window which was active before the currently active one.
62  aura::Window* last_active_;
63
64  ObserverList<aura::client::ActivationChangeObserver> observers_;
65
66  DISALLOW_COPY_AND_ASSIGN(DefaultActivationClient);
67};
68
69}  // namespace wm
70
71#endif  // UI_WM_CORE_DEFAULT_ACTIVATION_CLIENT_H_
72