| Index: athena/wm/window_list_provider_impl.cc
|
| diff --git a/athena/wm/window_list_provider_impl.cc b/athena/wm/window_list_provider_impl.cc
|
| index 8b4cba5abdc2831bd80c81ccc263c33300e366b0..6c6580f777d1900b0f1a84c3fc8ee927de850518 100644
|
| --- a/athena/wm/window_list_provider_impl.cc
|
| +++ b/athena/wm/window_list_provider_impl.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "athena/wm/window_list_provider_impl.h"
|
|
|
| +#include "athena/wm/public/window_list_provider_observer.h"
|
| #include "ui/aura/window.h"
|
|
|
| namespace athena {
|
| @@ -11,9 +12,28 @@ namespace athena {
|
| WindowListProviderImpl::WindowListProviderImpl(aura::Window* container)
|
| : container_(container) {
|
| CHECK(container_);
|
| + container_->AddObserver(this);
|
| }
|
|
|
| WindowListProviderImpl::~WindowListProviderImpl() {
|
| + // Remove all remaining window observers.
|
| + const aura::Window::Windows& container_children = container_->children();
|
| + for (aura::Window::Windows::const_iterator iter = container_children.begin();
|
| + iter != container_children.end();
|
| + ++iter) {
|
| + if (IsValidWindow(*iter))
|
| + (*iter)->RemoveObserver(this);
|
| + }
|
| + container_->RemoveObserver(this);
|
| +}
|
| +
|
| +void WindowListProviderImpl::AddObserver(WindowListProviderObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void WindowListProviderImpl::RemoveObserver(
|
| + WindowListProviderObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| }
|
|
|
| aura::Window::Windows WindowListProviderImpl::GetWindowList() const {
|
| @@ -22,10 +42,65 @@ aura::Window::Windows WindowListProviderImpl::GetWindowList() const {
|
| for (aura::Window::Windows::const_iterator iter = container_children.begin();
|
| iter != container_children.end();
|
| ++iter) {
|
| - if ((*iter)->type() == ui::wm::WINDOW_TYPE_NORMAL)
|
| + if (IsValidWindow(*iter))
|
| list.push_back(*iter);
|
| }
|
| return list;
|
| }
|
|
|
| +bool WindowListProviderImpl::IsWindowInList(aura::Window* window) const {
|
| + return window->parent() == container_ && IsValidWindow(window);
|
| +}
|
| +
|
| +bool WindowListProviderImpl::IsValidWindow(aura::Window* window) const {
|
| + return window->type() == ui::wm::WINDOW_TYPE_NORMAL;
|
| +}
|
| +
|
| +void WindowListProviderImpl::MoveToFront(aura::Window* window) {
|
| + DCHECK(IsWindowInList(window));
|
| + container_->StackChildAtTop(window);
|
| +}
|
| +
|
| +void WindowListProviderImpl::StackWindowFrontOf(
|
| + aura::Window* window,
|
| + aura::Window* reference_window) {
|
| + DCHECK_NE(window, reference_window);
|
| + DCHECK(IsWindowInList(window));
|
| + DCHECK(IsWindowInList(reference_window));
|
| + container_->StackChildAbove(window, reference_window);
|
| +}
|
| +
|
| +void WindowListProviderImpl::StackWindowBehindTo(
|
| + aura::Window* window,
|
| + aura::Window* reference_window) {
|
| + DCHECK_NE(window, reference_window);
|
| + DCHECK(IsWindowInList(window));
|
| + DCHECK(IsWindowInList(reference_window));
|
| + container_->StackChildBelow(window, reference_window);
|
| +}
|
| +
|
| +void WindowListProviderImpl::OnWindowAdded(aura::Window* window) {
|
| + if (!IsValidWindow(window) || window->parent() != container_)
|
| + return;
|
| + DCHECK(IsWindowInList(window));
|
| + window->AddObserver(this);
|
| +}
|
| +
|
| +void WindowListProviderImpl::OnWillRemoveWindow(aura::Window* window) {
|
| + if (!IsValidWindow(window) || window->parent() != container_)
|
| + return;
|
| + DCHECK(IsWindowInList(window));
|
| + window->RemoveObserver(this);
|
| +}
|
| +
|
| +void WindowListProviderImpl::OnWindowStackingChanged(aura::Window* window) {
|
| + if (window == container_)
|
| + return;
|
| + DCHECK(IsWindowInList(window));
|
| + // Inform our listeners that the stacking has been changed.
|
| + FOR_EACH_OBSERVER(WindowListProviderObserver,
|
| + observers_,
|
| + OnWindowStackingChanged());
|
| +}
|
| +
|
| } // namespace athena
|
|
|