Commit 326fd075 authored by oshima@chromium.org's avatar oshima@chromium.org

Use Widget frame and WidgetDelegate in ActvityWidget

BUG=389170

Review URL: https://codereview.chromium.org/375143002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282595 0039d316-1c4b-4281-b951-d872f2087c98
parent 6dd13f73
// 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/activity_frame_view.h"
#include <algorithm>
#include <vector>
#include "athena/activity/public/activity_view_model.h"
#include "ui/views/background.h"
#include "ui/views/controls/label.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
namespace athena {
////////////////////////////////////////////////////////////////////////////////
// FrameViewAthena, public:
// static
const char ActivityFrameView::kViewClassName[] = "ActivityFrameView";
ActivityFrameView::ActivityFrameView(views::Widget* frame,
ActivityViewModel* view_model)
: frame_(frame), view_model_(view_model), 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);
AddChildView(title_);
}
ActivityFrameView::~ActivityFrameView() {
}
////////////////////////////////////////////////////////////////////////////////
// ActivityFrameView, views::NonClientFrameView overrides:
gfx::Rect ActivityFrameView::GetBoundsForClientView() const {
gfx::Rect client_bounds = bounds();
client_bounds.Inset(0, NonClientTopBorderHeight(), 0, 0);
return client_bounds;
}
gfx::Rect ActivityFrameView::GetWindowBoundsForClientBounds(
const gfx::Rect& client_bounds) const {
gfx::Rect window_bounds = client_bounds;
window_bounds.Inset(0, -NonClientTopBorderHeight(), 0, 0);
return window_bounds;
}
int ActivityFrameView::NonClientHitTest(const gfx::Point& point) {
return 0;
}
void ActivityFrameView::GetWindowMask(const gfx::Size& size,
gfx::Path* window_mask) {
}
void ActivityFrameView::ResetWindowControls() {
}
void ActivityFrameView::UpdateWindowIcon() {
}
void ActivityFrameView::UpdateWindowTitle() {
SkColor bgcolor = view_model_->GetRepresentativeColor();
title_->set_background(views::Background::CreateSolidBackground(bgcolor));
title_->SetBackgroundColor(bgcolor);
title_->SetText(frame_->widget_delegate()->GetWindowTitle());
}
////////////////////////////////////////////////////////////////////////////////
// ActivityFrameView, views::View overrides:
gfx::Size ActivityFrameView::GetPreferredSize() const {
gfx::Size pref = frame_->client_view()->GetPreferredSize();
gfx::Rect bounds(0, 0, pref.width(), pref.height());
return frame_->non_client_view()
->GetWindowBoundsForClientBounds(bounds)
.size();
}
const char* ActivityFrameView::GetClassName() const {
return kViewClassName;
}
void ActivityFrameView::Layout() {
title_->SetBounds(0, 0, width(), NonClientTopBorderHeight());
}
////////////////////////////////////////////////////////////////////////////////
// ActivityFrameView, private:
int ActivityFrameView::NonClientTopBorderHeight() const {
return frame_->IsFullscreen() ? 0 : title_->GetPreferredSize().height();
}
} // namespace ash
// 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.
#ifndef ATHENA_ACTIVITY_ACTIVITY_FRAME_VIEW_H_
#define ATHENA_ACTIVITY_ACTIVITY_FRAME_VIEW_H_
#include "base/memory/scoped_ptr.h"
#include "ui/views/window/non_client_view.h"
namespace views {
class Label;
class Widget;
}
namespace athena {
class ActivityViewModel;
// A NonClientFrameView used for activity.
class ActivityFrameView : public views::NonClientFrameView {
public:
// Internal class name.
static const char kViewClassName[];
ActivityFrameView(views::Widget* frame, ActivityViewModel* view_model);
virtual ~ActivityFrameView();
// views::NonClientFrameView overrides:
virtual gfx::Rect GetBoundsForClientView() const OVERRIDE;
virtual gfx::Rect GetWindowBoundsForClientBounds(
const gfx::Rect& client_bounds) const OVERRIDE;
virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE;
virtual void GetWindowMask(const gfx::Size& size,
gfx::Path* window_mask) OVERRIDE;
virtual void ResetWindowControls() OVERRIDE;
virtual void UpdateWindowIcon() OVERRIDE;
virtual void UpdateWindowTitle() OVERRIDE;
// views::View overrides:
virtual gfx::Size GetPreferredSize() const OVERRIDE;
virtual const char* GetClassName() const OVERRIDE;
virtual void Layout() OVERRIDE;
private:
int NonClientTopBorderHeight() const;
// Not owned.
views::Widget* frame_;
ActivityViewModel* view_model_;
views::Label* title_;
DISALLOW_COPY_AND_ASSIGN(ActivityFrameView);
};
} // namespace athena
#endif // ATHENA_ACTIVITY_ACTIVITY_FRAME_VIEW_H_
...@@ -7,48 +7,31 @@ ...@@ -7,48 +7,31 @@
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include "athena/activity/activity_widget_delegate.h"
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "athena/screen/public/screen_manager.h" #include "athena/screen/public/screen_manager.h"
#include "ui/aura/window.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/view.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
namespace athena { namespace athena {
namespace { namespace {
class ActivityWidget : public views::LayoutManager { class ActivityWidget {
public: public:
explicit ActivityWidget(Activity* activity) explicit ActivityWidget(Activity* activity)
: activity_(activity), : activity_(activity), widget_(NULL) {
container_(NULL), ActivityViewModel* view_model = activity->GetActivityViewModel();
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; widget_ = new views::Widget;
views::Widget::InitParams params( views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); view_model->UsesFrame()
? views::Widget::InitParams::TYPE_WINDOW
: views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.context = ScreenManager::Get()->GetContext(); params.context = ScreenManager::Get()->GetContext();
params.delegate = NULL; params.delegate = new ActivityWidgetDelegate(view_model);
params.activatable = views::Widget::InitParams::ACTIVATABLE_YES; params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
widget_->Init(params); widget_->Init(params);
widget_->SetContentsView(container_);
activity_->GetActivityViewModel()->Init(); activity_->GetActivityViewModel()->Init();
} }
...@@ -60,41 +43,12 @@ class ActivityWidget : public views::LayoutManager { ...@@ -60,41 +43,12 @@ class ActivityWidget : public views::LayoutManager {
} }
void Update() { void Update() {
title_->SetText(activity_->GetActivityViewModel()->GetTitle()); widget_->UpdateWindowTitle();
SkColor bgcolor =
activity_->GetActivityViewModel()->GetRepresentativeColor();
title_->set_background(views::Background::CreateSolidBackground(bgcolor));
title_->SetBackgroundColor(bgcolor);
} }
private: 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_; Activity* activity_;
views::View* container_;
views::Label* title_;
views::View* content_;
views::Widget* widget_; views::Widget* widget_;
DISALLOW_COPY_AND_ASSIGN(ActivityWidget); DISALLOW_COPY_AND_ASSIGN(ActivityWidget);
......
// 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/activity_widget_delegate.h"
#include "athena/activity/activity_frame_view.h"
#include "athena/activity/public/activity_view_model.h"
#include "ui/views/view.h"
#include "ui/views/window/client_view.h"
namespace athena {
ActivityWidgetDelegate::ActivityWidgetDelegate(ActivityViewModel* view_model)
: view_model_(view_model) {
}
ActivityWidgetDelegate::~ActivityWidgetDelegate() {
}
base::string16 ActivityWidgetDelegate::GetWindowTitle() const {
return view_model_->GetTitle();
}
void ActivityWidgetDelegate::DeleteDelegate() {
delete this;
}
views::Widget* ActivityWidgetDelegate::GetWidget() {
return GetContentsView()->GetWidget();
}
const views::Widget* ActivityWidgetDelegate::GetWidget() const {
return const_cast<ActivityWidgetDelegate*>(this)->GetWidget();
}
views::View* ActivityWidgetDelegate::GetContentsView() {
return view_model_->GetContentsView();
}
views::ClientView* ActivityWidgetDelegate::CreateClientView(
views::Widget* widget) {
return new views::ClientView(widget, view_model_->GetContentsView());
}
views::NonClientFrameView* ActivityWidgetDelegate::CreateNonClientFrameView(
views::Widget* widget) {
return new ActivityFrameView(widget, view_model_);
}
} // namespace athena
// 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.
#ifndef ATHENA_ACTIVITY_ACTIVITY_WIDGET_DELEGATE_H_
#define ATHENA_ACTIVITY_ACTIVITY_WIDGET_DELEGATE_H_
#include "base/macros.h"
#include "ui/views/widget/widget_delegate.h"
namespace athena {
class ActivityViewModel;
// A default WidgetDelegate for activities.
// TODO(oshima): Allow AcitivyViewModel to create custom WidgetDelegate.
class ActivityWidgetDelegate : public views::WidgetDelegate {
public:
explicit ActivityWidgetDelegate(ActivityViewModel* view_model);
virtual ~ActivityWidgetDelegate();
// views::WidgetDelegate:
virtual base::string16 GetWindowTitle() const OVERRIDE;
virtual void DeleteDelegate() OVERRIDE;
virtual views::Widget* GetWidget() OVERRIDE;
virtual const views::Widget* GetWidget() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE;
virtual views::ClientView* CreateClientView(views::Widget* widget) OVERRIDE;
virtual views::NonClientFrameView* CreateNonClientFrameView(
views::Widget* widget) OVERRIDE;
private:
ActivityViewModel* view_model_;
DISALLOW_COPY_AND_ASSIGN(ActivityWidgetDelegate);
};
} // namespace athena
#endif // ATHENA_ACTIVITY_ACTIVITY_WIDGET_DELEGATE_H_
...@@ -24,10 +24,14 @@ class ATHENA_EXPORT ActivityViewModel { ...@@ -24,10 +24,14 @@ class ATHENA_EXPORT ActivityViewModel {
virtual void Init() = 0; virtual void Init() = 0;
// Returns a color most representative of this activity. // Returns a color most representative of this activity.
virtual SkColor GetRepresentativeColor() = 0; virtual SkColor GetRepresentativeColor() const = 0;
// Returns a title for the activity. // Returns a title for the activity.
virtual base::string16 GetTitle() = 0; virtual base::string16 GetTitle() const = 0;
// True if the activity wants to use Widget's frame, or false if the activity
// draws its own frame.
virtual bool UsesFrame() const = 0;
// Returns the contents view. // Returns the contents view.
virtual views::View* GetContentsView() = 0; virtual views::View* GetContentsView() = 0;
......
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
'activity/activity_factory.cc', 'activity/activity_factory.cc',
'activity/activity_manager_impl.cc', 'activity/activity_manager_impl.cc',
'activity/activity_view_manager_impl.cc', 'activity/activity_view_manager_impl.cc',
'activity/activity_frame_view.cc',
'activity/activity_frame_view.h',
'activity/activity_widget_delegate.cc',
'activity/activity_widget_delegate.h',
'activity/public/activity.h', 'activity/public/activity.h',
'activity/public/activity_factory.h', 'activity/public/activity_factory.h',
'activity/public/activity_manager.h', 'activity/public/activity_manager.h',
......
...@@ -27,17 +27,22 @@ ActivityViewModel* AppActivity::GetActivityViewModel() { ...@@ -27,17 +27,22 @@ ActivityViewModel* AppActivity::GetActivityViewModel() {
void AppActivity::Init() { void AppActivity::Init() {
} }
SkColor AppActivity::GetRepresentativeColor() { SkColor AppActivity::GetRepresentativeColor() const {
// TODO(sad): Compute the color from the favicon. // TODO(sad): Compute the color from the favicon.
return SK_ColorGRAY; return SK_ColorGRAY;
} }
base::string16 AppActivity::GetTitle() { base::string16 AppActivity::GetTitle() const {
return web_view_->GetWebContents()->GetTitle(); return web_view_->GetWebContents()->GetTitle();
} }
bool AppActivity::UsesFrame() const {
return false;
}
views::View* AppActivity::GetContentsView() { views::View* AppActivity::GetContentsView() {
if (!web_view_) { if (!web_view_) {
// TODO(oshima): use apps::NativeAppWindowViews
content::WebContents* web_contents = content::WebContents* web_contents =
app_window_->GetAssociatedWebContents(); app_window_->GetAssociatedWebContents();
web_view_ = new views::WebView(web_contents->GetBrowserContext()); web_view_ = new views::WebView(web_contents->GetBrowserContext());
......
...@@ -32,8 +32,9 @@ class AppActivity : public Activity, ...@@ -32,8 +32,9 @@ class AppActivity : public Activity,
// ActivityViewModel: // ActivityViewModel:
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
// content::WebContentsObserver: // content::WebContentsObserver:
......
...@@ -150,7 +150,9 @@ class AthenaWebView : public views::WebView { ...@@ -150,7 +150,9 @@ class AthenaWebView : public views::WebView {
WebActivity::WebActivity(content::BrowserContext* browser_context, WebActivity::WebActivity(content::BrowserContext* browser_context,
const GURL& url) const GURL& url)
: browser_context_(browser_context), url_(url), web_view_(NULL) { : browser_context_(browser_context),
url_(url),
web_view_(NULL) {
} }
WebActivity::~WebActivity() { WebActivity::~WebActivity() {
...@@ -165,15 +167,19 @@ void WebActivity::Init() { ...@@ -165,15 +167,19 @@ void WebActivity::Init() {
static_cast<AthenaWebView*>(web_view_)->InstallAccelerators(); static_cast<AthenaWebView*>(web_view_)->InstallAccelerators();
} }
SkColor WebActivity::GetRepresentativeColor() { SkColor WebActivity::GetRepresentativeColor() const {
// TODO(sad): Compute the color from the favicon. // TODO(sad): Compute the color from the favicon.
return SK_ColorGRAY; return SK_ColorGRAY;
} }
base::string16 WebActivity::GetTitle() { base::string16 WebActivity::GetTitle() const {
return web_view_->GetWebContents()->GetTitle(); return web_view_->GetWebContents()->GetTitle();
} }
bool WebActivity::UsesFrame() const {
return true;
}
views::View* WebActivity::GetContentsView() { views::View* WebActivity::GetContentsView() {
if (!web_view_) { if (!web_view_) {
web_view_ = new AthenaWebView(browser_context_); web_view_ = new AthenaWebView(browser_context_);
......
...@@ -16,6 +16,7 @@ class WebContents; ...@@ -16,6 +16,7 @@ class WebContents;
namespace views { namespace views {
class WebView; class WebView;
class WidgetDelegate;
} }
namespace athena { namespace athena {
...@@ -33,8 +34,9 @@ class WebActivity : public Activity, ...@@ -33,8 +34,9 @@ class WebActivity : public Activity,
// ActivityViewModel: // ActivityViewModel:
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
// content::WebContentsObserver: // content::WebContentsObserver:
...@@ -45,7 +47,6 @@ class WebActivity : public Activity, ...@@ -45,7 +47,6 @@ class WebActivity : public Activity,
private: private:
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
content::WebContents* web_contents_;
const GURL url_; const GURL url_;
views::WebView* web_view_; views::WebView* web_view_;
......
...@@ -29,14 +29,18 @@ athena::ActivityViewModel* SampleActivity::GetActivityViewModel() { ...@@ -29,14 +29,18 @@ athena::ActivityViewModel* SampleActivity::GetActivityViewModel() {
void SampleActivity::Init() { void SampleActivity::Init() {
} }
SkColor SampleActivity::GetRepresentativeColor() { SkColor SampleActivity::GetRepresentativeColor() const {
return color_; return color_;
} }
base::string16 SampleActivity::GetTitle() { base::string16 SampleActivity::GetTitle() const {
return title_; return title_;
} }
bool SampleActivity::UsesFrame() const {
return true;
}
views::View* SampleActivity::GetContentsView() { views::View* SampleActivity::GetContentsView() {
if (!contents_view_) { if (!contents_view_) {
contents_view_ = new views::View; contents_view_ = new views::View;
......
...@@ -26,8 +26,9 @@ class SampleActivity : public Activity, ...@@ -26,8 +26,9 @@ class SampleActivity : public Activity,
// athena::ActivityViewModel: // athena::ActivityViewModel:
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
SkColor color_; SkColor color_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment