// 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. #ifndef ASH_SHELF_SHELF_WINDOW_WATCHER_H_ #define ASH_SHELF_SHELF_WINDOW_WATCHER_H_ #include "ash/shelf/scoped_observer_with_duplicated_sources.h" #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/scoped_observer.h" #include "ui/aura/window_observer.h" #include "ui/gfx/display_observer.h" #include "ui/wm/public/activation_change_observer.h" namespace aura { class Window; namespace client { class ActivationClient; } } // namespace aura namespace ash { class ShelfModel; class ShelfItemDelegateManager; // ShelfWindowWatcher creates and handles a ShelfItem for windows that have // a ShelfItemDetails property in the default container. class ShelfWindowWatcher : public aura::client::ActivationChangeObserver, public aura::WindowObserver, public gfx::DisplayObserver { public: ShelfWindowWatcher(ShelfModel* model, ShelfItemDelegateManager* item_delegate_manager); virtual ~ShelfWindowWatcher(); private: class RootWindowObserver : public aura::WindowObserver { public: explicit RootWindowObserver(ShelfWindowWatcher* window_watcher); virtual ~RootWindowObserver(); private: // aura::WindowObserver overrides: virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; // Owned by Shell. ShelfWindowWatcher* window_watcher_; DISALLOW_COPY_AND_ASSIGN(RootWindowObserver); }; // Used to track windows that are removed. See description of // ShelfWindowWatcher::StartObservingRemovedWindow() for more details. class RemovedWindowObserver : public aura::WindowObserver { public: explicit RemovedWindowObserver(ShelfWindowWatcher* window_watcher); virtual ~RemovedWindowObserver(); private: // aura::WindowObserver overrides: virtual void OnWindowParentChanged(aura::Window* window, aura::Window* parent) OVERRIDE; virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; // Owned by Shell. ShelfWindowWatcher* window_watcher_; DISALLOW_COPY_AND_ASSIGN(RemovedWindowObserver); }; // Creates a ShelfItem for |window| that has ShelfItemDetails. void AddShelfItem(aura::Window* window); // Removes a ShelfItem for |window|. void RemoveShelfItem(aura::Window* window); // Adds observer to default container and ActivationClient of |root_window|. void OnRootWindowAdded(aura::Window* root_window); // Removes observer from ActivationClient of |root_window|. void OnRootWindowRemoved(aura::Window* root_window); // Updates the status of ShelfItem for |window|. void UpdateShelfItemStatus(aura::Window* window, bool is_active); // Returns the index of ShelfItem associated with |window|. int GetShelfItemIndexForWindow(aura::Window* window) const; // Used when a window is removed. During the dragging a window may be removed // and when the drag completes added back. When this happens we don't want to // remove the shelf item. StartObservingRemovedWindow, if necessary, attaches // an observer. When done, FinishObservingRemovedWindow() is invoked. void StartObservingRemovedWindow(aura::Window* window); // Stop observing |window| by RemovedWindowObserver and remove an item // associated with |window|. void FinishObservingRemovedWindow(aura::Window* window); // aura::client::ActivationChangeObserver overrides: virtual void OnWindowActivated(aura::Window* gained_active, aura::Window* lost_active) OVERRIDE; // aura::WindowObserver overrides: virtual void OnWindowAdded(aura::Window* window) OVERRIDE; virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE; virtual void OnWindowDestroying(aura::Window* window) OVERRIDE; virtual void OnWindowPropertyChanged(aura::Window* window, const void* key, intptr_t old) OVERRIDE; // gfx::DisplayObserver overrides: virtual void OnDisplayAdded(const gfx::Display& display) OVERRIDE; virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; virtual void OnDisplayMetricsChanged(const gfx::Display& display, uint32_t metrics) OVERRIDE; // Owned by Shell. ShelfModel* model_; ShelfItemDelegateManager* item_delegate_manager_; RootWindowObserver root_window_observer_; RemovedWindowObserver removed_window_observer_; // Holds all observed windows. ScopedObserver<aura::Window, aura::WindowObserver> observed_windows_; // Holds all observed root windows. ScopedObserver<aura::Window, aura::WindowObserver> observed_root_windows_; // Holds removed windows that has an item from default container. ScopedObserver<aura::Window, aura::WindowObserver> observed_removed_windows_; // Holds all observed activation clients. ScopedObserverWithDuplicatedSources<aura::client::ActivationClient, aura::client::ActivationChangeObserver> observed_activation_clients_; DISALLOW_COPY_AND_ASSIGN(ShelfWindowWatcher); }; } // namespace ash #endif // ASH_SHELF_SHELF_WINDOW_WATCHER_H_