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

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
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();
oshima 2014/05/31 00:58:01 this should be context
sadrul 2014/05/31 04:23:46 Done.
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 static ActivityViewManager* instance;
oshima 2014/05/31 00:58:01 ditto
sadrul 2014/05/31 04:23:46 Done.
108
109 class ActivityViewManagerImpl : public ActivityViewManager {
110 public:
111 ActivityViewManagerImpl() {
112 CHECK(!instance);
113 instance = this;
114 }
115 virtual ~ActivityViewManagerImpl() {
116 CHECK_EQ(this, instance);
117 instance = NULL;
118 }
119
120 // ActivityViewManager:
121 virtual void AddActivity(Activity* activity) OVERRIDE {
122 CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
123 ActivityWidget* container = new ActivityWidget(activity);
124 activity_widgets_[activity] = container;
125 container->Show();
126 }
127
128 virtual void RemoveActivity(Activity* activity) OVERRIDE {
129 std::map<Activity*, ActivityWidget*>::iterator find =
130 activity_widgets_.find(activity);
131 if (find != activity_widgets_.end())
132 activity_widgets_.erase(activity);
133 }
134
135 virtual void UpdateActivity(Activity* activity) OVERRIDE {
136 std::map<Activity*, ActivityWidget*>::iterator find =
137 activity_widgets_.find(activity);
138 if (find != activity_widgets_.end())
139 find->second->Update();
140 }
141
142 private:
143 std::map<Activity*, ActivityWidget*> activity_widgets_;
144
145 DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
146 };
147
148 } // namespace
149
150 // static
151 ActivityViewManager* ActivityViewManager::Create() {
152 new ActivityViewManagerImpl();
153 CHECK(instance);
154 return instance;
155 }
156
157 ActivityViewManager* ActivityViewManager::Get() {
158 return instance;
159 }
160
161 void ActivityViewManager::Shutdown() {
162 CHECK(instance);
163 delete instance;
164 }
165
166 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698