15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/custom_frame_view_ash.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_delegate.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/frame_painter.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/frame_maximize_button.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_strings.h"  // Accessibility names
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Font& GetTitleFont() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::Font* title_font = NULL;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!title_font)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title_font = new gfx::Font(views::NativeWidgetAura::GetWindowTitleFont());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *title_font;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char CustomFrameViewAsh::kViewClassName[] = "CustomFrameViewAsh";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CustomFrameViewAsh, public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CustomFrameViewAsh::CustomFrameViewAsh()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : frame_(NULL),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      maximize_button_(NULL),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close_button_(NULL),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_icon_(NULL),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_painter_(new ash::FramePainter) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CustomFrameViewAsh::~CustomFrameViewAsh() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::Init(views::Widget* frame) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_ = frame;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  maximize_button_ = new FrameMaximizeButton(this, this);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  maximize_button_->SetAccessibleName(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(maximize_button_);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button_ = new views::ImageButton(this);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button_->SetAccessibleName(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(close_button_);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  maximize_button_->SetVisible(frame_->widget_delegate()->CanMaximize());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_->widget_delegate()->ShouldShowWindowIcon()) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_icon_ = new views::ImageButton(this);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(window_icon_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->Init(frame_, window_icon_, maximize_button_, close_button_,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       FramePainter::SIZE_BUTTON_MAXIMIZES);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CustomFrameViewAsh, views::NonClientFrameView overrides:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect CustomFrameViewAsh::GetBoundsForClientView() const {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top_height = NonClientTopBorderHeight();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_painter_->GetBoundsForClientView(top_height,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bounds());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect CustomFrameViewAsh::GetWindowBoundsForClientBounds(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& client_bounds) const {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top_height = NonClientTopBorderHeight();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_painter_->GetWindowBoundsForClientBounds(top_height,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        client_bounds);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CustomFrameViewAsh::NonClientHitTest(const gfx::Point& point) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_painter_->NonClientHitTest(this, point);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::GetWindowMask(const gfx::Size& size,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       gfx::Path* window_mask) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No window masks in Aura.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::ResetWindowControls() {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  maximize_button_->SetState(views::CustomButton::STATE_NORMAL);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::UpdateWindowIcon() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window_icon_)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_icon_->SchedulePaint();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::UpdateWindowTitle() {
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  frame_painter_->SchedulePaintForTitle(GetTitleFont());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CustomFrameViewAsh, views::View overrides:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size CustomFrameViewAsh::GetPreferredSize() {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pref = frame_->client_view()->GetPreferredSize();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds(0, 0, pref.width(), pref.height());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_->non_client_view()->GetWindowBoundsForClientBounds(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds).size();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::Layout() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the shorter maximized layout headers.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->LayoutHeader(this, true);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::OnPaint(gfx::Canvas* canvas) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_->IsFullscreen())
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prevent bleeding paint onto the client area below the window frame, which
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // may become visible when the WebContent is transparent.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->Save();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->ClipRect(gfx::Rect(0, 0, width(), NonClientTopBorderHeight()));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool paint_as_active = ShouldPaintAsActive();
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int theme_image_id = 0;
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (frame_painter_->ShouldUseMinimalHeaderStyle(FramePainter::THEMED_NO))
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    theme_image_id = IDR_AURA_WINDOW_HEADER_BASE_MINIMAL;
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else if (paint_as_active)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    theme_image_id = IDR_AURA_WINDOW_HEADER_BASE_ACTIVE;
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    theme_image_id = IDR_AURA_WINDOW_HEADER_BASE_INACTIVE;
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintHeader(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paint_as_active ? FramePainter::ACTIVE : FramePainter::INACTIVE,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      theme_image_id,
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      0);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintTitleBar(this, canvas, GetTitleFont());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintHeaderContentSeparator(this, canvas);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->Restore();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* CustomFrameViewAsh::GetClassName() const {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size CustomFrameViewAsh::GetMinimumSize() {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_painter_->GetMinimumSize(this);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size CustomFrameViewAsh::GetMaximumSize() {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frame_painter_->GetMaximumSize(this);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views::ButtonListener overrides:
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::ButtonPressed(views::Button* sender,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const ui::Event& event) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::ScopedAnimationDurationScaleMode> slow_duration_mode;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.IsShiftDown()) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    slow_duration_mode.reset(new ui::ScopedAnimationDurationScaleMode(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ScopedAnimationDurationScaleMode::SLOW_DURATION));
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ash::UserMetricsAction action =
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_MAXIMIZE;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == maximize_button_) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The maximize button may move out from under the cursor.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetWindowControls();
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (frame_->IsMaximized()) {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action = ash::UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_RESTORE;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_->Restore();
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_->Maximize();
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |this| may be deleted - some windows delete their frames on maximize.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == close_button_) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    action = ash::UMA_WINDOW_CLOSE_BUTTON_CLICK;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_->Close();
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ash::Shell::GetInstance()->delegate()->RecordUserMetricsAction(action);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CustomFrameViewAsh, private:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CustomFrameViewAsh::NonClientTopBorderHeight() const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_->IsFullscreen())
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserve enough space to see the buttons, including any offset from top and
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reserving space for the separator line.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return close_button_->bounds().bottom() +
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_painter_->HeaderContentSeparatorSize();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
218