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