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

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

Issue 302683002: athena: Add the concept of Activity and related managers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 6 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 | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "athena/activity/public/activity_view_manager.h"
6
7 #include <algorithm>
8 #include <map>
9
10 #include "athena/activity/public/activity.h"
11 #include "athena/activity/public/activity_view_model.h"
12 #include "athena/screen/public/screen_manager.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "ui/aura/window.h"
15 #include "ui/views/background.h"
16 #include "ui/views/controls/label.h"
17 #include "ui/views/controls/native/native_view_host.h"
18 #include "ui/views/layout/layout_manager.h"
19 #include "ui/views/view.h"
20 #include "ui/views/widget/widget.h"
21
22 namespace athena {
23 namespace {
24
25 class ActivityWidget : public views::LayoutManager {
26 public:
27 explicit ActivityWidget(Activity* activity)
28 : activity_(activity),
29 container_(NULL),
30 title_(NULL),
31 host_(NULL),
32 widget_(NULL) {
33 container_ = new views::View;
34
oshima 2014/05/30 20:55:59 Do you think using WebView is better option? It se
sadrul 2014/05/30 23:45:36 It may make sense to use WebView for WebActivity,
oshima 2014/05/31 00:58:01 I understand the motivation and am ok for now. I b
35 title_ = new views::Label();
36 title_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
37 const gfx::FontList& font_list = title_->font_list();
38 title_->SetFontList(font_list.Derive(1, gfx::Font::BOLD));
39 title_->SetEnabledColor(SK_ColorBLACK);
40 title_->SetShadowColors(SK_ColorWHITE, SK_ColorWHITE);
41 title_->set_shadow_blur(.5);
42 container_->AddChildView(title_);
43 container_->SetLayoutManager(this);
44
45 host_ = new views::NativeViewHost();
46 container_->AddChildView(host_);
47
48 widget_ = new views::Widget;
49 views::Widget::InitParams params(
50 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
51 params.parent = ScreenManager::Get()->GetContext();
52 params.delegate = NULL;
53 params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
54 widget_->Init(params);
55 widget_->SetContentsView(container_);
56
57 host_->Attach(activity_->GetActivityViewModel()->GetNativeWindow());
58 }
59
60 virtual ~ActivityWidget() {}
61
62 void Show() {
63 Update();
64 widget_->Show();
65 }
66
67 void Update() {
68 title_->SetText(
69 base::UTF8ToUTF16(activity_->GetActivityViewModel()->GetTitle()));
70 title_->set_background(views::Background::CreateSolidBackground(
71 activity_->GetActivityViewModel()->GetRepresentativeColor()));
72 }
73
74 private:
75 // views::LayoutManager:
76 virtual void Layout(views::View* host) OVERRIDE {
77 CHECK_EQ(container_, host);
78 const gfx::Rect& host_bounds = host->bounds();
79 const int kTitleHeight = 25;
80 title_->SetBounds(0, 0, host_bounds.width(), kTitleHeight);
81 host_->SetBounds(0,
82 kTitleHeight,
83 host_bounds.width(),
84 host_bounds.height() - kTitleHeight);
85 }
86
87 virtual gfx::Size GetPreferredSize(const views::View* host) const OVERRIDE {
88 CHECK_EQ(container_, host);
89 gfx::Size size;
90 gfx::Size label_size = title_->GetPreferredSize();
91 gfx::Size host_size = host_->GetPreferredSize();
92
93 size.set_width(std::max(label_size.width(), host_size.width()));
94 size.set_height(label_size.height() + host_size.height());
95 return size;
96 }
97
98 Activity* activity_;
99 views::View* container_;
100 views::Label* title_;
101 views::NativeViewHost* host_;
102 views::Widget* widget_;
103
104 DISALLOW_COPY_AND_ASSIGN(ActivityWidget);
105 };
106
107 class ActivityViewManagerImpl : public ActivityViewManager {
108 public:
109 ActivityViewManagerImpl() {}
110 virtual ~ActivityViewManagerImpl() {}
111
112 // ActivityViewManager:
113 virtual void AddActivity(Activity* activity) OVERRIDE {
114 CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
115 ActivityWidget* container = new ActivityWidget(activity);
116 activity_widgets_[activity] = container;
117 container->Show();
118 }
119
120 virtual void RemoveActivity(Activity* activity) OVERRIDE {
121 std::map<Activity*, ActivityWidget*>::iterator find =
122 activity_widgets_.find(activity);
123 if (find != activity_widgets_.end())
124 activity_widgets_.erase(activity);
125 }
126
127 virtual void UpdateActivity(Activity* activity) OVERRIDE {
128 std::map<Activity*, ActivityWidget*>::iterator find =
129 activity_widgets_.find(activity);
130 if (find != activity_widgets_.end())
131 find->second->Update();
132 }
133
134 private:
135 std::map<Activity*, ActivityWidget*> activity_widgets_;
136
137 DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
138 };
139
140 static ActivityViewManagerImpl* g_instance;
141
142 } // namespace
143
144 // static
145 ActivityViewManager* ActivityViewManager::Create() {
146 CHECK(!g_instance);
147 g_instance = new ActivityViewManagerImpl();
148 return g_instance;
149 }
150
151 ActivityViewManager* ActivityViewManager::Get() {
152 return g_instance;
153 }
154
155 void ActivityViewManager::Shutdown() {
156 CHECK(g_instance);
157 delete g_instance;
158 g_instance = NULL;
159 }
160
161 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698