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#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_SHELL_WINDOW_LAUNCHER_CONTROLLER_H_
6#define CHROME_BROWSER_UI_ASH_LAUNCHER_SHELL_WINDOW_LAUNCHER_CONTROLLER_H_
7
8#include <list>
9#include <map>
10#include <string>
11
12#include "apps/shell_window_registry.h"
13#include "ui/aura/client/activation_change_observer.h"
14#include "ui/aura/window_observer.h"
15
16namespace apps {
17class ShellWindow;
18}
19
20namespace aura {
21
22class Window;
23
24namespace client {
25class ActivationClient;
26}
27
28}
29
30class ChromeLauncherController;
31class Profile;
32class ShellWindowLauncherItemController;
33
34// ShellWindowLauncherController observes the Shell Window registry and the
35// aura window manager. It handles adding and removing launcher items from
36// ChromeLauncherController.
37class ShellWindowLauncherController
38    : public apps::ShellWindowRegistry::Observer,
39      public aura::WindowObserver,
40      public aura::client::ActivationChangeObserver {
41 public:
42  explicit ShellWindowLauncherController(ChromeLauncherController* owner);
43  virtual ~ShellWindowLauncherController();
44
45  // Called by ChromeLauncherController when the active user changed and the
46  // items need to be updated.
47  virtual void ActiveUserChanged(const std::string& user_email) {}
48
49  // An additional user identified by |Profile|, got added to the existing
50  // session.
51  virtual void AdditionalUserAddedToSession(Profile* profile);
52
53  // Overridden from ShellWindowRegistry::Observer:
54  virtual void OnShellWindowAdded(apps::ShellWindow* shell_window) OVERRIDE;
55  virtual void OnShellWindowIconChanged(
56      apps::ShellWindow* shell_window) OVERRIDE;
57  virtual void OnShellWindowRemoved(apps::ShellWindow* shell_window) OVERRIDE;
58
59  // Overriden from aura::WindowObserver:
60  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
61
62  // Overriden from client::ActivationChangeObserver:
63  virtual void OnWindowActivated(aura::Window* gained_active,
64                                 aura::Window* lost_active) OVERRIDE;
65
66 protected:
67  // Registers a shell window with the shelf and this object.
68  void RegisterApp(apps::ShellWindow* shell_window);
69
70  // Unregisters a shell window with the shelf and this object.
71  void UnregisterApp(aura::Window* window);
72
73  // Check if a given window is known to the launcher controller.
74  bool IsRegisteredApp(aura::Window* window);
75
76 private:
77  typedef std::map<std::string, ShellWindowLauncherItemController*>
78      AppControllerMap;
79  typedef std::map<aura::Window*, std::string> WindowToAppLauncherIdMap;
80
81  ShellWindowLauncherItemController* ControllerForWindow(aura::Window* window);
82
83  ChromeLauncherController* owner_;
84  // A set of unowned ShellWindowRegistry pointers for loaded users.
85  // Note that this will only be used with multiple users in the side by side
86  // mode.
87  std::set<apps::ShellWindowRegistry*> registry_;
88  aura::client::ActivationClient* activation_client_;
89
90  // Map of app launcher id to controller.
91  AppControllerMap app_controller_map_;
92
93  // Allows us to get from an aura::Window to the app launcher id.
94  WindowToAppLauncherIdMap window_to_app_launcher_id_map_;
95
96  DISALLOW_COPY_AND_ASSIGN(ShellWindowLauncherController);
97};
98
99#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_SHELL_WINDOW_LAUNCHER_CONTROLLER_H_
100