| Index: mojo/services/public/cpp/view_manager/lib/view.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view.cc b/mojo/services/public/cpp/view_manager/lib/view.cc
|
| index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..577aca8d01a0884d397cab670b623d3010ec5a4c 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view.cc
|
| @@ -0,0 +1,82 @@
|
| +// 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 "mojo/services/public/cpp/view_manager/view.h"
|
| +
|
| +#include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
|
| +#include "mojo/services/public/cpp/view_manager/lib/view_private.h"
|
| +#include "mojo/services/public/cpp/view_manager/view_observer.h"
|
| +
|
| +namespace mojo {
|
| +namespace services {
|
| +namespace view_manager {
|
| +
|
| +namespace {
|
| +class ScopedDestructionNotifier {
|
| + public:
|
| + explicit ScopedDestructionNotifier(View* view)
|
| + : view_(view) {
|
| + FOR_EACH_OBSERVER(
|
| + ViewObserver,
|
| + *ViewPrivate(view_).observers(),
|
| + OnViewDestroy(view_, ViewObserver::DISPOSITION_CHANGING));
|
| + }
|
| + ~ScopedDestructionNotifier() {
|
| + FOR_EACH_OBSERVER(
|
| + ViewObserver,
|
| + *ViewPrivate(view_).observers(),
|
| + OnViewDestroy(view_, ViewObserver::DISPOSITION_CHANGED));
|
| + }
|
| +
|
| + private:
|
| + View* view_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedDestructionNotifier);
|
| +};
|
| +} // namespace
|
| +
|
| +// static
|
| +View* View::Create(ViewManager* manager) {
|
| + View* view = new View(manager);
|
| + ViewManagerPrivate(manager).AddView(view->id(), view);
|
| + return view;
|
| +}
|
| +
|
| +void View::Destroy() {
|
| + if (manager_)
|
| + ViewManagerPrivate(manager_).synchronizer()->DestroyView(id_);
|
| + LocalDestroy();
|
| +}
|
| +
|
| +void View::AddObserver(ViewObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void View::RemoveObserver(ViewObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +View::View(ViewManager* manager)
|
| + : id_(ViewManagerPrivate(manager).synchronizer()->CreateView()),
|
| + node_(NULL),
|
| + manager_(manager) {}
|
| +
|
| +View::View()
|
| + : id_(-1),
|
| + node_(NULL),
|
| + manager_(NULL) {}
|
| +
|
| +View::~View() {
|
| + ScopedDestructionNotifier notifier(this);
|
| + if (manager_)
|
| + ViewManagerPrivate(manager_).RemoveView(id_);
|
| +}
|
| +
|
| +void View::LocalDestroy() {
|
| + delete this;
|
| +}
|
| +
|
| +} // namespace view_manager
|
| +} // namespace services
|
| +} // namespace mojo
|
|
|