custom_frame_view_ash.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char CustomFrameViewAsh::kViewClassName[] = "ash/wm/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() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->SchedulePaintForTitle(this, 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();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int theme_image_id = paint_as_active ? IDR_AURA_WINDOW_HEADER_BASE_ACTIVE :
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDR_AURA_WINDOW_HEADER_BASE_INACTIVE;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintHeader(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paint_as_active ? FramePainter::ACTIVE : FramePainter::INACTIVE,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      theme_image_id,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintTitleBar(this, canvas, GetTitleFont());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame_painter_->PaintHeaderContentSeparator(this, canvas);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->Restore();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CustomFrameViewAsh::GetClassName() const {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size CustomFrameViewAsh::GetMinimumSize() {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frame_painter_->GetMinimumSize(this);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size CustomFrameViewAsh::GetMaximumSize() {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frame_painter_->GetMaximumSize(this);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views::ButtonListener overrides:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CustomFrameViewAsh::ButtonPressed(views::Button* sender,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const ui::Event& event) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::ScopedAnimationDurationScaleMode> slow_duration_mode;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.IsShiftDown()) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    slow_duration_mode.reset(new ui::ScopedAnimationDurationScaleMode(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ScopedAnimationDurationScaleMode::SLOW_DURATION));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ash::UserMetricsAction action =
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_MAXIMIZE;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == maximize_button_) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The maximize button may move out from under the cursor.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetWindowControls();
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (frame_->IsMaximized()) {
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action = ash::UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_RESTORE;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_->Restore();
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_->Maximize();
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |this| may be deleted - some windows delete their frames on maximize.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == close_button_) {
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    action = ash::UMA_WINDOW_CLOSE_BUTTON_CLICK;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_->Close();
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ash::Shell::GetInstance()->delegate()->RecordUserMetricsAction(action);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CustomFrameViewAsh, private:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CustomFrameViewAsh::NonClientTopBorderHeight() const {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_->IsFullscreen())
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserve enough space to see the buttons, including any offset from top and
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reserving space for the separator line.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return close_button_->bounds().bottom() +
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_painter_->HeaderContentSeparatorSize();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
212