1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ash/wm/panels/panel_frame_view.h" 6 7#include "ash/wm/caption_buttons/frame_caption_button_container_view.h" 8#include "ash/wm/frame_border_hit_test_controller.h" 9#include "ash/wm/header_painter.h" 10#include "grit/ash_resources.h" 11#include "ui/base/hit_test.h" 12#include "ui/base/l10n/l10n_util.h" 13#include "ui/gfx/canvas.h" 14#include "ui/gfx/font.h" 15#include "ui/views/controls/image_view.h" 16#include "ui/views/widget/native_widget_aura.h" 17#include "ui/views/widget/widget.h" 18#include "ui/views/widget/widget_delegate.h" 19 20namespace ash { 21 22// static 23const char PanelFrameView::kViewClassName[] = "PanelFrameView"; 24 25PanelFrameView::PanelFrameView(views::Widget* frame, FrameType frame_type) 26 : frame_(frame), 27 caption_button_container_(NULL), 28 window_icon_(NULL), 29 title_font_(gfx::Font(views::NativeWidgetAura::GetWindowTitleFont())), 30 frame_border_hit_test_controller_( 31 new FrameBorderHitTestController(frame_)) { 32 DCHECK(!frame_->widget_delegate()->CanMaximize()); 33 if (frame_type != FRAME_NONE) 34 InitHeaderPainter(); 35} 36 37PanelFrameView::~PanelFrameView() { 38} 39 40const char* PanelFrameView::GetClassName() const { 41 return kViewClassName; 42} 43 44void PanelFrameView::InitHeaderPainter() { 45 header_painter_.reset(new HeaderPainter); 46 47 caption_button_container_ = new FrameCaptionButtonContainerView(frame_, 48 FrameCaptionButtonContainerView::MINIMIZE_ALLOWED); 49 AddChildView(caption_button_container_); 50 51 if (frame_->widget_delegate()->ShouldShowWindowIcon()) { 52 window_icon_ = new views::ImageView(); 53 AddChildView(window_icon_); 54 } 55 56 header_painter_->Init(frame_, this, window_icon_, caption_button_container_); 57} 58 59int PanelFrameView::NonClientTopBorderHeight() const { 60 if (!header_painter_) 61 return 0; 62 // Reserve enough space to see the buttons and the separator line. 63 return caption_button_container_->bounds().bottom() + 64 header_painter_->HeaderContentSeparatorSize(); 65} 66 67gfx::Size PanelFrameView::GetMinimumSize() { 68 if (!header_painter_) 69 return gfx::Size(); 70 gfx::Size min_client_view_size(frame_->client_view()->GetMinimumSize()); 71 return gfx::Size( 72 std::max(header_painter_->GetMinimumHeaderWidth(), 73 min_client_view_size.width()), 74 NonClientTopBorderHeight() + min_client_view_size.height()); 75} 76 77void PanelFrameView::Layout() { 78 if (!header_painter_) 79 return; 80 header_painter_->LayoutHeader(true); 81 header_painter_->set_header_height(NonClientTopBorderHeight()); 82} 83 84void PanelFrameView::GetWindowMask(const gfx::Size&, gfx::Path*) { 85 // Nothing. 86} 87 88void PanelFrameView::ResetWindowControls() { 89 NOTIMPLEMENTED(); 90} 91 92void PanelFrameView::UpdateWindowIcon() { 93 if (!window_icon_) 94 return; 95 views::WidgetDelegate* delegate = frame_->widget_delegate(); 96 if (delegate) 97 window_icon_->SetImage(delegate->GetWindowIcon()); 98 window_icon_->SchedulePaint(); 99} 100 101void PanelFrameView::UpdateWindowTitle() { 102 if (!header_painter_) 103 return; 104 header_painter_->SchedulePaintForTitle(title_font_); 105} 106 107int PanelFrameView::NonClientHitTest(const gfx::Point& point) { 108 if (!header_painter_) 109 return HTNOWHERE; 110 return FrameBorderHitTestController::NonClientHitTest(this, 111 header_painter_.get(), point); 112} 113 114void PanelFrameView::OnPaint(gfx::Canvas* canvas) { 115 if (!header_painter_) 116 return; 117 bool paint_as_active = ShouldPaintAsActive(); 118 int theme_frame_id = 0; 119 if (paint_as_active) 120 theme_frame_id = IDR_AURA_WINDOW_HEADER_BASE_ACTIVE; 121 else 122 theme_frame_id = IDR_AURA_WINDOW_HEADER_BASE_INACTIVE; 123 124 header_painter_->PaintHeader( 125 canvas, 126 paint_as_active ? HeaderPainter::ACTIVE : HeaderPainter::INACTIVE, 127 theme_frame_id, 128 0); 129 header_painter_->PaintTitleBar(canvas, title_font_); 130 header_painter_->PaintHeaderContentSeparator(canvas); 131} 132 133gfx::Rect PanelFrameView::GetBoundsForClientView() const { 134 if (!header_painter_) 135 return bounds(); 136 return HeaderPainter::GetBoundsForClientView( 137 NonClientTopBorderHeight(), bounds()); 138} 139 140gfx::Rect PanelFrameView::GetWindowBoundsForClientBounds( 141 const gfx::Rect& client_bounds) const { 142 if (!header_painter_) 143 return client_bounds; 144 return HeaderPainter::GetWindowBoundsForClientBounds( 145 NonClientTopBorderHeight(), client_bounds); 146} 147 148} // namespace ash 149