普通文本  |  135行  |  3.69 KB

// Copyright 2014 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.

#include "athena/activity/activity_manager_impl.h"

#include <algorithm>

#include "athena/activity/activity_widget_delegate.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager_observer.h"
#include "athena/activity/public/activity_view_model.h"
#include "base/logging.h"
#include "base/observer_list.h"
#include "ui/views/widget/widget.h"

namespace athena {

namespace {

ActivityManager* instance = NULL;

views::Widget* CreateWidget(Activity* activity) {
  ActivityViewModel* view_model = activity->GetActivityViewModel();
  views::Widget* widget = view_model->CreateWidget();
  if (widget)
    return widget;
  widget = new views::Widget;
  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
  params.delegate = new ActivityWidgetDelegate(view_model);
  widget->Init(params);
  activity->GetActivityViewModel()->Init();
  return widget;
}

views::Widget* GetWidget(Activity* activity) {
  CHECK(activity);
  CHECK(activity->GetWindow());
  return views::Widget::GetWidgetForNativeWindow(activity->GetWindow());
}

}  // namespace

ActivityManagerImpl::ActivityManagerImpl() {
  CHECK(!instance);
  instance = this;
}

ActivityManagerImpl::~ActivityManagerImpl() {
  while (!activities_.empty())
    Activity::Delete(activities_.front());

  CHECK_EQ(this, instance);
  instance = NULL;
}

void ActivityManagerImpl::AddActivity(Activity* activity) {
  CHECK(activities_.end() ==
        std::find(activities_.begin(), activities_.end(), activity));
  activities_.push_back(activity);
  views::Widget* widget = CreateWidget(activity);
  widget->AddObserver(this);
  FOR_EACH_OBSERVER(ActivityManagerObserver,
                    observers_,
                    OnActivityStarted(activity));
}

void ActivityManagerImpl::RemoveActivity(Activity* activity) {
  std::vector<Activity*>::iterator find =
      std::find(activities_.begin(), activities_.end(), activity);
  DCHECK(find != activities_.end());
  if (find != activities_.end()) {
    FOR_EACH_OBSERVER(
        ActivityManagerObserver, observers_, OnActivityEnding(activity));
    activities_.erase(find);
    views::Widget* widget = GetWidget(activity);
    widget->RemoveObserver(this);
    widget->Close();
  }
}

void ActivityManagerImpl::UpdateActivity(Activity* activity) {
  views::Widget* widget = GetWidget(activity);
  widget->UpdateWindowIcon();
  widget->UpdateWindowTitle();
}

Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) {
  struct Matcher {
    Matcher(aura::Window* w) : window(w) {}
    bool operator()(Activity* activity) {
      return activity->GetWindow() == window;
    }
    aura::Window* window;
  };
  std::vector<Activity*>::iterator iter =
      std::find_if(activities_.begin(), activities_.end(), Matcher(window));
  return iter != activities_.end() ? *iter : NULL;
}

void ActivityManagerImpl::AddObserver(ActivityManagerObserver* observer) {
  observers_.AddObserver(observer);
}

void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) {
  observers_.RemoveObserver(observer);
}

void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) {
  Activity* activity = GetActivityForWindow(widget->GetNativeWindow());
  if (activity) {
    widget->RemoveObserver(this);
    Activity::Delete(activity);
  }
}

// static
ActivityManager* ActivityManager::Create() {
  new ActivityManagerImpl();
  CHECK(instance);
  return instance;
}

ActivityManager* ActivityManager::Get() {
  return instance;
}

void ActivityManager::Shutdown() {
  CHECK(instance);
  delete instance;
}


}  // namespace athena