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.
5 #include "ash/wm/panels/panel_frame_view.h"
7 #include "ash/frame/caption_buttons/frame_caption_button_container_view.h"
8 #include "ash/frame/default_header_painter.h"
9 #include "ash/frame/frame_border_hit_test_controller.h"
10 #include "ui/base/hit_test.h"
11 #include "ui/gfx/canvas.h"
12 #include "ui/views/controls/image_view.h"
13 #include "ui/views/widget/widget.h"
14 #include "ui/views/widget/widget_delegate.h"
19 const char PanelFrameView::kViewClassName
[] = "PanelFrameView";
21 PanelFrameView::PanelFrameView(views::Widget
* frame
, FrameType frame_type
)
23 caption_button_container_(NULL
),
25 frame_border_hit_test_controller_(
26 new FrameBorderHitTestController(frame_
)) {
27 DCHECK(!frame_
->widget_delegate()->CanMaximize());
28 if (frame_type
!= FRAME_NONE
)
32 PanelFrameView::~PanelFrameView() {
35 const char* PanelFrameView::GetClassName() const {
36 return kViewClassName
;
39 void PanelFrameView::InitHeaderPainter() {
40 header_painter_
.reset(new DefaultHeaderPainter
);
42 caption_button_container_
= new FrameCaptionButtonContainerView(frame_
,
43 FrameCaptionButtonContainerView::MINIMIZE_ALLOWED
);
44 AddChildView(caption_button_container_
);
46 header_painter_
->Init(frame_
, this, caption_button_container_
);
48 if (frame_
->widget_delegate()->ShouldShowWindowIcon()) {
49 window_icon_
= new views::ImageView();
50 AddChildView(window_icon_
);
51 header_painter_
->UpdateLeftHeaderView(window_icon_
);
55 int PanelFrameView::NonClientTopBorderHeight() const {
58 return header_painter_
->GetHeaderHeightForPainting();
61 gfx::Size
PanelFrameView::GetMinimumSize() const {
64 gfx::Size
min_client_view_size(frame_
->client_view()->GetMinimumSize());
66 std::max(header_painter_
->GetMinimumHeaderWidth(),
67 min_client_view_size
.width()),
68 NonClientTopBorderHeight() + min_client_view_size
.height());
71 void PanelFrameView::Layout() {
74 header_painter_
->LayoutHeader();
77 void PanelFrameView::GetWindowMask(const gfx::Size
&, gfx::Path
*) {
81 void PanelFrameView::ResetWindowControls() {
85 void PanelFrameView::UpdateWindowIcon() {
88 views::WidgetDelegate
* delegate
= frame_
->widget_delegate();
90 window_icon_
->SetImage(delegate
->GetWindowIcon());
91 window_icon_
->SchedulePaint();
94 void PanelFrameView::UpdateWindowTitle() {
97 header_painter_
->SchedulePaintForTitle();
100 int PanelFrameView::NonClientHitTest(const gfx::Point
& point
) {
101 if (!header_painter_
)
103 return FrameBorderHitTestController::NonClientHitTest(this,
104 caption_button_container_
, point
);
107 void PanelFrameView::OnPaint(gfx::Canvas
* canvas
) {
108 if (!header_painter_
)
110 bool paint_as_active
= ShouldPaintAsActive();
111 caption_button_container_
->SetPaintAsActive(paint_as_active
);
113 HeaderPainter::Mode header_mode
= paint_as_active
?
114 HeaderPainter::MODE_ACTIVE
: HeaderPainter::MODE_INACTIVE
;
115 header_painter_
->PaintHeader(canvas
, header_mode
);
118 gfx::Rect
PanelFrameView::GetBoundsForClientView() const {
119 gfx::Rect client_bounds
= bounds();
120 client_bounds
.Inset(0, NonClientTopBorderHeight(), 0, 0);
121 return client_bounds
;
124 gfx::Rect
PanelFrameView::GetWindowBoundsForClientBounds(
125 const gfx::Rect
& client_bounds
) const {
126 gfx::Rect window_bounds
= client_bounds
;
127 window_bounds
.Inset(0, -NonClientTopBorderHeight(), 0, 0);
128 return window_bounds
;