1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "athena/activity/activity_frame_view.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "athena/activity/public/activity_view_model.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/wm/public/window_manager.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/base/hit_test.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/canvas.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/image/image_skia.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/background.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/controls/image_view.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/label.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/view.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget_delegate.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/window/client_view.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace athena {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The icon size.
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kIconSize = 32;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The distance between the icon and the title when the icon is visible.
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kIconTitleSpacing = 10;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The height of the top border necessary to display the title without the icon.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kDefaultTitleHeight = 25;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The height of the top border in overview mode.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kOverviewTitleHeight = 55;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The height of the top border for fullscreen and frameless activities in
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// overview mode.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kOverviewShortTitleHeight = 30;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The thickness of the left, right and bottom borders in overview mode.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kOverviewBorderThickness = 5;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char ActivityFrameView::kViewClassName[] = "ActivityFrameView";
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben MurdochActivityFrameView::ActivityFrameView(views::Widget* frame,
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     ActivityViewModel* view_model)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : frame_(frame),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      view_model_(view_model),
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      title_(new views::Label),
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      icon_(new views::ImageView),
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      in_overview_(false) {
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  title_->SetEnabledColor(SkColorSetA(SK_ColorBLACK, 0xe5));
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddChildView(title_);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddChildView(icon_);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateWindowTitle();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateWindowIcon();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowManager::Get()->AddObserver(this);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben MurdochActivityFrameView::~ActivityFrameView() {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowManager::Get()->RemoveObserver(this);
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Rect ActivityFrameView::GetBoundsForClientView() const {
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Rect client_bounds = bounds();
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client_bounds.Inset(NonClientBorderInsets());
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return client_bounds;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Rect ActivityFrameView::GetWindowBoundsForClientBounds(
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const gfx::Rect& client_bounds) const {
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Rect window_bounds = client_bounds;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_bounds.Inset(-NonClientBorderInsets());
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return window_bounds;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ActivityFrameView::NonClientHitTest(const gfx::Point& point) {
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!bounds().Contains(point))
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return HTNOWHERE;
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int client_hit_test = frame_->client_view()->NonClientHitTest(point);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (client_hit_test != HTNOWHERE)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return client_hit_test;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int window_hit_test =
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetHTComponentForFrame(point, 0, NonClientBorderThickness(), 0, 0, false);
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return (window_hit_test == HTNOWHERE) ? HTCAPTION : client_hit_test;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ActivityFrameView::GetWindowMask(const gfx::Size& size,
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      gfx::Path* window_mask) {
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ActivityFrameView::ResetWindowControls() {
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ActivityFrameView::UpdateWindowIcon() {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The activity has a frame in overview mode regardless of the value of
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ActivityViewModel::UsesFrame().
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkColor bgcolor = view_model_->GetRepresentativeColor();
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  set_background(views::Background::CreateSolidBackground(bgcolor));
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  title_->SetBackgroundColor(bgcolor);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (view_model_->UsesFrame())
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    icon_->SetImage(view_model_->GetIcon());
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SchedulePaint();
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ActivityFrameView::UpdateWindowTitle() {
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!view_model_->UsesFrame())
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  title_->SetText(frame_->widget_delegate()->GetWindowTitle());
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Layout();
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::SizeConstraintsChanged() {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Size ActivityFrameView::GetPreferredSize() const {
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Size pref = frame_->client_view()->GetPreferredSize();
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Rect bounds(0, 0, pref.width(), pref.height());
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return frame_->non_client_view()
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ->GetWindowBoundsForClientBounds(bounds)
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .size();
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* ActivityFrameView::GetClassName() const {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return kViewClassName;
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ActivityFrameView::Layout() {
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (frame_->IsFullscreen() || !view_model_->UsesFrame()) {
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    title_->SetVisible(false);
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    icon_->SetVisible(false);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  title_->SetVisible(true);
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  icon_->SetVisible(in_overview_);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Size preferred_title_size = title_->GetPreferredSize();
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int top_height = NonClientTopBorderHeight();
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int title_x = 0;
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (in_overview_) {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int edge = (top_height - kIconSize) / 2;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    icon_->SetBounds(edge, edge, kIconSize, kIconSize);
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    title_x = icon_->bounds().right() + kIconTitleSpacing;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    title_x = (width() - preferred_title_size.width()) / 2;
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  title_->SetBounds(title_x,
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    (top_height - preferred_title_size.height()) / 2,
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    preferred_title_size.width(),
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    preferred_title_size.height());
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::OnPaintBackground(gfx::Canvas* canvas) {
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  View::OnPaintBackground(canvas);
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Paint a border around the client view.
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect border_bounds = GetLocalBounds();
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  border_bounds.Inset(NonClientBorderInsets());
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  border_bounds.Inset(-1, -1, 0, 0);
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  canvas->DrawRect(border_bounds, SkColorSetA(SK_ColorGRAY, 0x7f));
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::OnOverviewModeEnter() {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  view_model_->PrepareContentsForOverview();
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  in_overview_ = true;
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InvalidateLayout();
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  frame_->client_view()->InvalidateLayout();
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  frame_->GetRootView()->Layout();
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SchedulePaint();
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::OnOverviewModeExit() {
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  in_overview_ = false;
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InvalidateLayout();
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  frame_->client_view()->InvalidateLayout();
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  frame_->GetRootView()->Layout();
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SchedulePaint();
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  view_model_->ResetContentsView();
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::OnSplitViewModeEnter() {
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ActivityFrameView::OnSplitViewModeExit() {
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Insets ActivityFrameView::NonClientBorderInsets() const {
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int border_thickness = NonClientBorderThickness();
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return gfx::Insets(NonClientTopBorderHeight(),
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     border_thickness,
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     border_thickness,
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     border_thickness);
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ActivityFrameView::NonClientBorderThickness() const {
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return in_overview_ ? kOverviewBorderThickness : 0;
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint ActivityFrameView::NonClientTopBorderHeight() const {
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (frame_->IsFullscreen() || !view_model_->UsesFrame())
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return in_overview_ ? kOverviewShortTitleHeight : 0;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return in_overview_ ? kOverviewTitleHeight : kDefaultTitleHeight;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace athena
215