Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Side by Side Diff: athena/activity/activity_view_manager_impl.cc

Issue 498023003: Delete activity upon window deletion (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « athena/activity/activity_manager_unittest.cc ('k') | athena/athena.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "athena/activity/public/activity_view_manager.h" 5 #include "athena/activity/public/activity_view_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "athena/activity/activity_widget_delegate.h" 10 #include "athena/activity/activity_widget_delegate.h"
11 #include "athena/activity/public/activity.h" 11 #include "athena/activity/public/activity.h"
12 #include "athena/activity/public/activity_manager.h"
12 #include "athena/activity/public/activity_view_model.h" 13 #include "athena/activity/public/activity_view_model.h"
13 #include "athena/screen/public/screen_manager.h" 14 #include "athena/screen/public/screen_manager.h"
14 #include "ui/aura/window.h" 15 #include "ui/aura/window.h"
15 #include "ui/views/view.h" 16 #include "ui/views/view.h"
16 #include "ui/views/widget/widget.h" 17 #include "ui/views/widget/widget.h"
18 #include "ui/views/widget/widget_observer.h"
17 19
18 namespace athena { 20 namespace athena {
19 namespace { 21 namespace {
20 22
21 class ActivityWidget { 23 typedef std::map<Activity*, views::Widget*> ActivityWidgetMap;
22 public:
23 explicit ActivityWidget(Activity* activity)
24 : activity_(activity), widget_(NULL) {
25 ActivityViewModel* view_model = activity->GetActivityViewModel();
26 widget_ = new views::Widget;
27 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
28 params.context = ScreenManager::Get()->GetContext();
29 params.delegate = new ActivityWidgetDelegate(view_model);
30 params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
31 widget_->Init(params);
32 activity_->GetActivityViewModel()->Init();
33 }
34 24
35 virtual ~ActivityWidget() { 25 views::Widget* CreateWidget(Activity* activity) {
36 widget_->Close(); 26 ActivityViewModel* view_model = activity->GetActivityViewModel();
37 } 27 views::Widget* widget = new views::Widget;
38 28 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
39 void Show() { 29 params.delegate = new ActivityWidgetDelegate(view_model);
40 Update(); 30 params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
41 widget_->Show(); 31 widget->Init(params);
42 widget_->Activate(); 32 activity->GetActivityViewModel()->Init();
43 } 33 return widget;
44 34 }
45 void Update() {
46 widget_->UpdateWindowTitle();
47 }
48
49 private:
50
51 Activity* activity_;
52 views::Widget* widget_;
53
54 DISALLOW_COPY_AND_ASSIGN(ActivityWidget);
55 };
56 35
57 ActivityViewManager* instance = NULL; 36 ActivityViewManager* instance = NULL;
58 37
59 class ActivityViewManagerImpl : public ActivityViewManager { 38 class ActivityViewManagerImpl : public ActivityViewManager,
39 public views::WidgetObserver {
60 public: 40 public:
61 ActivityViewManagerImpl() { 41 ActivityViewManagerImpl() {
62 CHECK(!instance); 42 CHECK(!instance);
63 instance = this; 43 instance = this;
64 } 44 }
45
65 virtual ~ActivityViewManagerImpl() { 46 virtual ~ActivityViewManagerImpl() {
66 CHECK_EQ(this, instance); 47 CHECK_EQ(this, instance);
67 instance = NULL; 48 instance = NULL;
68 } 49 }
69 50
70 // ActivityViewManager: 51 // ActivityViewManager:
71 virtual void AddActivity(Activity* activity) OVERRIDE { 52 virtual void AddActivity(Activity* activity) OVERRIDE {
72 CHECK(activity_widgets_.end() == activity_widgets_.find(activity)); 53 CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
73 ActivityWidget* container = new ActivityWidget(activity); 54 views::Widget* container = CreateWidget(activity);
55 container->AddObserver(this);
74 activity_widgets_[activity] = container; 56 activity_widgets_[activity] = container;
57 container->UpdateWindowTitle();
75 container->Show(); 58 container->Show();
59 container->Activate();
76 } 60 }
77 61
78 virtual void RemoveActivity(Activity* activity) OVERRIDE { 62 virtual void RemoveActivity(Activity* activity) OVERRIDE {
79 std::map<Activity*, ActivityWidget*>::iterator find = 63 ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
80 activity_widgets_.find(activity);
81 if (find != activity_widgets_.end()) { 64 if (find != activity_widgets_.end()) {
82 ActivityWidget* widget = find->second; 65 views::Widget* widget = find->second;
66 widget->RemoveObserver(this);
67 widget->Close();
83 activity_widgets_.erase(activity); 68 activity_widgets_.erase(activity);
84 delete widget;
85 } 69 }
86 } 70 }
87 71
88 virtual void UpdateActivity(Activity* activity) OVERRIDE { 72 virtual void UpdateActivity(Activity* activity) OVERRIDE {
89 std::map<Activity*, ActivityWidget*>::iterator find = 73 ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
90 activity_widgets_.find(activity);
91 if (find != activity_widgets_.end()) 74 if (find != activity_widgets_.end())
92 find->second->Update(); 75 find->second->UpdateWindowTitle();
76 }
77
78 // views::WidgetObserver:
79 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
80 for (ActivityWidgetMap::iterator iter = activity_widgets_.begin();
81 iter != activity_widgets_.end();
82 ++iter) {
83 if (iter->second == widget) {
84 delete iter->first;
85 break;
86 }
87 }
93 } 88 }
94 89
95 private: 90 private:
96 std::map<Activity*, ActivityWidget*> activity_widgets_; 91 ActivityWidgetMap activity_widgets_;
97 92
98 DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl); 93 DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
99 }; 94 };
100 95
101 } // namespace 96 } // namespace
102 97
103 // static 98 // static
104 ActivityViewManager* ActivityViewManager::Create() { 99 ActivityViewManager* ActivityViewManager::Create() {
105 new ActivityViewManagerImpl(); 100 new ActivityViewManagerImpl();
106 CHECK(instance); 101 CHECK(instance);
107 return instance; 102 return instance;
108 } 103 }
109 104
110 ActivityViewManager* ActivityViewManager::Get() { 105 ActivityViewManager* ActivityViewManager::Get() {
111 return instance; 106 return instance;
112 } 107 }
113 108
114 void ActivityViewManager::Shutdown() { 109 void ActivityViewManager::Shutdown() {
115 CHECK(instance); 110 CHECK(instance);
116 delete instance; 111 delete instance;
117 } 112 }
118 113
119 } // namespace athena 114 } // namespace athena
OLDNEW
« no previous file with comments | « athena/activity/activity_manager_unittest.cc ('k') | athena/athena.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698