blob: a67e6bbd2f5be48845ed79747149fd01464e7716 [file] [log] [blame]
// 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 "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<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