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

Unified 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, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « athena/activity/activity_manager_impl.cc ('k') | athena/activity/public/DEPS » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: athena/activity/activity_view_manager_impl.cc
diff --git a/athena/activity/activity_view_manager_impl.cc b/athena/activity/activity_view_manager_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..eaf0792458b6614be6483c18cc6a87c24f6fff1e
--- /dev/null
+++ b/athena/activity/activity_view_manager_impl.cc
@@ -0,0 +1,166 @@
+// 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/public/activity_view_manager.h"
+
+#include <algorithm>
+#include <map>
+
+#include "athena/activity/public/activity.h"
+#include "athena/activity/public/activity_view_model.h"
+#include "athena/screen/public/screen_manager.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/aura/window.h"
+#include "ui/views/background.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/native/native_view_host.h"
+#include "ui/views/layout/layout_manager.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace athena {
+namespace {
+
+class ActivityWidget : public views::LayoutManager {
+ public:
+ explicit ActivityWidget(Activity* activity)
+ : activity_(activity),
+ container_(NULL),
+ title_(NULL),
+ host_(NULL),
+ widget_(NULL) {
+ container_ = new views::View;
+
+ title_ = new views::Label();
+ title_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
+ const gfx::FontList& font_list = title_->font_list();
+ title_->SetFontList(font_list.Derive(1, gfx::Font::BOLD));
+ title_->SetEnabledColor(SK_ColorBLACK);
+ title_->SetShadowColors(SK_ColorWHITE, SK_ColorWHITE);
+ title_->set_shadow_blur(.5);
+ container_->AddChildView(title_);
+ container_->SetLayoutManager(this);
+
+ host_ = new views::NativeViewHost();
+ container_->AddChildView(host_);
+
+ widget_ = new views::Widget;
+ views::Widget::InitParams params(
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ params.context = ScreenManager::Get()->GetContext();
+ params.delegate = NULL;
+ params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
+ widget_->Init(params);
+ widget_->SetContentsView(container_);
+
+ host_->Attach(activity_->GetActivityViewModel()->GetNativeWindow());
+ }
+
+ virtual ~ActivityWidget() {}
+
+ void Show() {
+ Update();
+ widget_->Show();
+ }
+
+ void Update() {
+ title_->SetText(
+ base::UTF8ToUTF16(activity_->GetActivityViewModel()->GetTitle()));
+ title_->set_background(views::Background::CreateSolidBackground(
+ activity_->GetActivityViewModel()->GetRepresentativeColor()));
+ }
+
+ private:
+ // views::LayoutManager:
+ virtual void Layout(views::View* host) OVERRIDE {
+ CHECK_EQ(container_, host);
+ const gfx::Rect& host_bounds = host->bounds();
+ const int kTitleHeight = 25;
+ title_->SetBounds(0, 0, host_bounds.width(), kTitleHeight);
+ host_->SetBounds(0,
+ kTitleHeight,
+ host_bounds.width(),
+ host_bounds.height() - kTitleHeight);
+ }
+
+ virtual gfx::Size GetPreferredSize(const views::View* host) const OVERRIDE {
+ CHECK_EQ(container_, host);
+ gfx::Size size;
+ gfx::Size label_size = title_->GetPreferredSize();
+ gfx::Size host_size = host_->GetPreferredSize();
+
+ size.set_width(std::max(label_size.width(), host_size.width()));
+ size.set_height(label_size.height() + host_size.height());
+ return size;
+ }
+
+ Activity* activity_;
+ views::View* container_;
+ views::Label* title_;
+ views::NativeViewHost* host_;
+ views::Widget* widget_;
+
+ DISALLOW_COPY_AND_ASSIGN(ActivityWidget);
+};
+
+ActivityViewManager* instance = NULL;
+
+class ActivityViewManagerImpl : public ActivityViewManager {
+ public:
+ ActivityViewManagerImpl() {
+ CHECK(!instance);
+ instance = this;
+ }
+ virtual ~ActivityViewManagerImpl() {
+ CHECK_EQ(this, instance);
+ instance = NULL;
+ }
+
+ // ActivityViewManager:
+ virtual void AddActivity(Activity* activity) OVERRIDE {
+ CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
+ ActivityWidget* container = new ActivityWidget(activity);
+ activity_widgets_[activity] = container;
+ container->Show();
+ }
+
+ virtual void RemoveActivity(Activity* activity) OVERRIDE {
+ std::map<Activity*, ActivityWidget*>::iterator find =
+ activity_widgets_.find(activity);
+ if (find != activity_widgets_.end())
+ activity_widgets_.erase(activity);
+ }
+
+ virtual void UpdateActivity(Activity* activity) OVERRIDE {
+ std::map<Activity*, ActivityWidget*>::iterator find =
+ activity_widgets_.find(activity);
+ if (find != activity_widgets_.end())
+ find->second->Update();
+ }
+
+ private:
+ std::map<Activity*, ActivityWidget*> activity_widgets_;
+
+ DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
+};
+
+} // namespace
+
+// static
+ActivityViewManager* ActivityViewManager::Create() {
+ new ActivityViewManagerImpl();
+ CHECK(instance);
+ return instance;
+}
+
+ActivityViewManager* ActivityViewManager::Get() {
+ return instance;
+}
+
+void ActivityViewManager::Shutdown() {
+ CHECK(instance);
+ delete instance;
+}
+
+} // namespace athena
« no previous file with comments | « athena/activity/activity_manager_impl.cc ('k') | athena/activity/public/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698