// 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 #include #include "athena/activity/public/activity.h" #include "athena/activity/public/activity_view_model.h" #include "athena/screen/public/screen_manager.h" #include "ui/aura/window.h" #include "ui/views/background.h" #include "ui/views/controls/label.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), content_(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); container_->AddChildView(title_); container_->SetLayoutManager(this); content_ = activity->GetActivityViewModel()->GetContentsView(); container_->AddChildView(content_); 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_); activity_->GetActivityViewModel()->Init(); } virtual ~ActivityWidget() {} void Show() { Update(); widget_->Show(); } void Update() { title_->SetText(activity_->GetActivityViewModel()->GetTitle()); SkColor bgcolor = activity_->GetActivityViewModel()->GetRepresentativeColor(); title_->set_background(views::Background::CreateSolidBackground(bgcolor)); title_->SetBackgroundColor(bgcolor); } private: // views::LayoutManager: virtual void Layout(views::View* host) OVERRIDE { CHECK_EQ(container_, host); const gfx::Rect& content_bounds = host->bounds(); const int kTitleHeight = 25; title_->SetBounds(0, 0, content_bounds.width(), kTitleHeight); content_->SetBounds(0, kTitleHeight, content_bounds.width(), content_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 content_size = content_->GetPreferredSize(); size.set_width(std::max(label_size.width(), content_size.width())); size.set_height(label_size.height() + content_size.height()); return size; } Activity* activity_; views::View* container_; views::Label* title_; views::View* content_; 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::iterator find = activity_widgets_.find(activity); if (find != activity_widgets_.end()) activity_widgets_.erase(activity); } virtual void UpdateActivity(Activity* activity) OVERRIDE { std::map::iterator find = activity_widgets_.find(activity); if (find != activity_widgets_.end()) find->second->Update(); } private: std::map 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