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 "chrome/browser/ui/views/panels/panel_frame_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_constants.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/panels/panel_view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tab_icon_view.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/screen.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/scoped_gdi_object.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/shell.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/path_win.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/win/hwnd_util.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The thickness of the border when Aero is not enabled. In this case, the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shadow around the window will not be painted by the system and we need to
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// paint a frame in order to differentiate the client area from the background.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNonAeroBorderThickness = 1;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The height and width in pixels of the icon.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconSize = 16;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The extra padding between the button and the top edge.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kExtraPaddingBetweenButtonAndTop = 1;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Colors used to draw titlebar background under default theme.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kActiveBackgroundDefaultColor = SkColorSetRGB(0x3a, 0x3d, 0x3d);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kInactiveBackgroundDefaultColor = SkColorSetRGB(0x7a, 0x7c, 0x7c);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kAttentionBackgroundDefaultColor =
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkColorSetRGB(0x53, 0xa9, 0x3f);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Color used to draw the minimized panel.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kMinimizeBackgroundDefaultColor = SkColorSetRGB(0xf5, 0xf4, 0xf0);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Color used to draw the title text under default theme.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kTitleTextDefaultColor = SkColorSetRGB(0xf9, 0xf9, 0xf9);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* CreateImageForColor(SkColor color) {
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(1, 1), 1.0f, true);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.DrawColor(color);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new gfx::ImageSkia(canvas.ExtractImageRep());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetTopLeftCornerImage(panel::CornerStyle corner_style) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* rounded_image = NULL;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* non_rounded_image = NULL;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rounded_image) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rounded_image = rb.GetImageSkiaNamed(IDR_WINDOW_TOP_LEFT_CORNER);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    non_rounded_image = rb.GetImageSkiaNamed(IDR_PANEL_TOP_LEFT_CORNER);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (corner_style & panel::TOP_ROUNDED) ? *rounded_image
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             : *non_rounded_image;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetTopRightCornerImage(panel::CornerStyle corner_style) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* rounded_image = NULL;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* non_rounded_image = NULL;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rounded_image) {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rounded_image = rb.GetImageSkiaNamed(IDR_WINDOW_TOP_RIGHT_CORNER);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    non_rounded_image = rb.GetImageSkiaNamed(IDR_PANEL_TOP_RIGHT_CORNER);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (corner_style & panel::TOP_ROUNDED) ? *rounded_image
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             : *non_rounded_image;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetBottomLeftCornerImage(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    panel::CornerStyle corner_style) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* rounded_image = NULL;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* non_rounded_image = NULL;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rounded_image) {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rounded_image = rb.GetImageSkiaNamed(IDR_WINDOW_BOTTOM_LEFT_CORNER);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    non_rounded_image = rb.GetImageSkiaNamed(IDR_PANEL_BOTTOM_LEFT_CORNER);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (corner_style & panel::BOTTOM_ROUNDED) ? *rounded_image
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                : *non_rounded_image;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetBottomRightCornerImage(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    panel::CornerStyle corner_style) {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* rounded_image = NULL;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* non_rounded_image = NULL;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rounded_image) {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rounded_image = rb.GetImageSkiaNamed(IDR_WINDOW_BOTTOM_RIGHT_CORNER);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    non_rounded_image = rb.GetImageSkiaNamed(IDR_PANEL_BOTTOM_RIGHT_CORNER);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (corner_style & panel::BOTTOM_ROUNDED) ? *rounded_image
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                : *non_rounded_image;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetTopEdgeImage() {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!image) {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image = rb.GetImageSkiaNamed(IDR_WINDOW_TOP_CENTER);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *image;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetBottomEdgeImage() {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!image) {
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image = rb.GetImageSkiaNamed(IDR_WINDOW_BOTTOM_CENTER);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *image;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetLeftEdgeImage() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!image) {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image = rb.GetImageSkiaNamed(IDR_WINDOW_LEFT_SIDE);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *image;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const gfx::ImageSkia& GetRightEdgeImage() {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!image) {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image = rb.GetImageSkiaNamed(IDR_WINDOW_RIGHT_SIDE);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *image;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(OS_WIN)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia* GetActiveBackgroundDefaultImage() {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image = CreateImageForColor(kActiveBackgroundDefaultColor);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia* GetInactiveBackgroundDefaultImage() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image = CreateImageForColor(kInactiveBackgroundDefaultColor);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia* GetAttentionBackgroundDefaultImage() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image = CreateImageForColor(kAttentionBackgroundDefaultColor);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia* GetMinimizeBackgroundDefaultImage() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::ImageSkia* image = NULL;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image = CreateImageForColor(kMinimizeBackgroundDefaultColor);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetFrameEdgeHitTest(const gfx::Point& point,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::Size& frame_size,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int resize_area_size,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        panel::Resizability resizability) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int x = point.x();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int y = point.y();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width = frame_size.width();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height = frame_size.height();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (x < resize_area_size) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (y < resize_area_size && (resizability & panel::RESIZABLE_TOP_LEFT)) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTTOPLEFT;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (y >= height - resize_area_size &&
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              (resizability & panel::RESIZABLE_BOTTOM_LEFT)) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTBOTTOMLEFT;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (resizability & panel::RESIZABLE_LEFT) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTLEFT;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (x >= width - resize_area_size) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (y < resize_area_size && (resizability & panel::RESIZABLE_TOP_RIGHT)) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTTOPRIGHT;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (y >= height - resize_area_size &&
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              (resizability & panel::RESIZABLE_BOTTOM_RIGHT)) {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTBOTTOMRIGHT;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (resizability & panel::RESIZABLE_RIGHT) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return HTRIGHT;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (y < resize_area_size && (resizability & panel::RESIZABLE_TOP)) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HTTOP;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (y >= height - resize_area_size &&
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            (resizability & panel::RESIZABLE_BOTTOM)) {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HTBOTTOM;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return HTNOWHERE;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Frameless is only supported when Aero is enabled and shadow effect is
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// present.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldRenderAsFrameless() {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_frameless = ui::win::IsAeroGlassEnabled();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_frameless) {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BOOL shadow_enabled = FALSE;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (::SystemParametersInfo(SPI_GETDROPSHADOW, 0, &shadow_enabled, 0) &&
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !shadow_enabled)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_frameless = false;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_frameless;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char PanelFrameView::kViewClassName[] = "PanelFrameView";
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PanelFrameView::PanelFrameView(PanelView* panel_view)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : is_frameless_(ShouldRenderAsFrameless()),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      panel_view_(panel_view),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close_button_(NULL),
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      minimize_button_(NULL),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_button_(NULL),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title_icon_(NULL),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title_label_(NULL),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      corner_style_(panel::ALL_ROUNDED) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PanelFrameView::~PanelFrameView() {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::Init() {
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button_ = new views::ImageButton(this);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_button_->SetImage(views::CustomButton::STATE_NORMAL,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          rb.GetImageSkiaNamed(IDR_PANEL_CLOSE));
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_button_->SetImage(views::CustomButton::STATE_HOVERED,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          rb.GetImageSkiaNamed(IDR_PANEL_CLOSE_H));
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_button_->SetImage(views::CustomButton::STATE_PRESSED,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          rb.GetImageSkiaNamed(IDR_PANEL_CLOSE_C));
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   views::ImageButton::ALIGN_MIDDLE);
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 tooltip_text =
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_PANEL_CLOSE_TOOLTIP);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button_->SetTooltipText(tooltip_text);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(close_button_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minimize_button_ = new views::ImageButton(this);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetImage(views::CustomButton::STATE_NORMAL,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             rb.GetImageSkiaNamed(IDR_PANEL_MINIMIZE));
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetImage(views::CustomButton::STATE_HOVERED,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             rb.GetImageSkiaNamed(IDR_PANEL_MINIMIZE_H));
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetImage(views::CustomButton::STATE_PRESSED,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             rb.GetImageSkiaNamed(IDR_PANEL_MINIMIZE_C));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_text = l10n_util::GetStringUTF16(IDS_PANEL_MINIMIZE_TOOLTIP);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minimize_button_->SetTooltipText(tooltip_text);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      views::ImageButton::ALIGN_MIDDLE);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(minimize_button_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restore_button_ = new views::ImageButton(this);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetImage(views::CustomButton::STATE_NORMAL,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            rb.GetImageSkiaNamed(IDR_PANEL_RESTORE));
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetImage(views::CustomButton::STATE_HOVERED,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            rb.GetImageSkiaNamed(IDR_PANEL_RESTORE_H));
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetImage(views::CustomButton::STATE_PRESSED,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            rb.GetImageSkiaNamed(IDR_PANEL_RESTORE_C));
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     views::ImageButton::ALIGN_MIDDLE);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_text = l10n_util::GetStringUTF16(IDS_PANEL_RESTORE_TOOLTIP);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restore_button_->SetTooltipText(tooltip_text);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restore_button_->SetVisible(false);  // only visible when panel is minimized
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(restore_button_);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_icon_ = new TabIconView(this, NULL);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_icon_->set_is_light(true);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(title_icon_);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_icon_->Update();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_label_ = new views::Label(
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      panel_view_->panel()->GetWindowTitle(),
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rb.GetFontList(ui::ResourceBundle::BoldFont));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_label_->SetAutoColorReadabilityEnabled(false);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(title_label_);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute the thickness of the client area that needs to be counted towards
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // mouse resizing.
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(tdanderson): Remove this if possible (crbug.com/344924).
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int thickness_for_mouse_resizing =
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PanelView::kResizeInsideBoundsSize - BorderThickness();
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = panel_view_->GetNativePanelWindow();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->set_hit_test_bounds_override_inner(
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Insets(thickness_for_mouse_resizing, thickness_for_mouse_resizing,
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  thickness_for_mouse_resizing, thickness_for_mouse_resizing));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateTitle() {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateWindowTitle();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateIcon() {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateWindowIcon();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateThrobber() {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_icon_->Update();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateTitlebarMinimizeRestoreButtonVisibility() {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Panel* panel = panel_view_->panel();
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetVisible(panel->CanShowMinimizeButton());
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetVisible(panel->CanShowRestoreButton());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the button states in case that the hover states are not cleared when
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse is clicked but not moved.
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimize_button_->SetState(views::CustomButton::STATE_NORMAL);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  restore_button_->SetState(views::CustomButton::STATE_NORMAL);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PanelFrameView::SetWindowCornerStyle(panel::CornerStyle corner_style) {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  corner_style_ = corner_style;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changing the window region is going to force a paint. Only change the
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window region if the region really differs.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HWND native_window = views::HWNDForWidget(panel_view_->window());
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::win::ScopedRegion current_region(::CreateRectRgn(0, 0, 0, 0));
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int current_region_result = ::GetWindowRgn(native_window, current_region);
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Path window_mask;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetWindowMask(size(), &window_mask);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::win::ScopedRegion new_region(gfx::CreateHRGNFromSkPath(window_mask));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_region_result == ERROR ||
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !::EqualRgn(current_region, new_region)) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SetWindowRgn takes ownership of the new_region.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ::SetWindowRgn(native_window, new_region.release(), TRUE);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect PanelFrameView::GetBoundsForClientView() const {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The origin of client-area bounds starts after left border and titlebar and
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // spans until hitting the right and bottom borders.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    +------------------------------+
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |         Top Titlebar         |
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |-+--------------------------+-|
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |L|                          |R|
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |e|                          |i|
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |f|                          |g|
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |t|                          |h|
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    | |         Client           |t|
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    | |                          | |
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |B|          Area            |B|
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |o|                          |o|
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |r|                          |r|
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |d|                          |d|
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |e|                          |e|
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |r|                          |r|
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    | +--------------------------+ |
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    |        Bottom Border         |
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    +------------------------------+
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int titlebar_height = TitlebarHeight();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_thickness = BorderThickness();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(border_thickness,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   titlebar_height,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   std::max(0, width() - border_thickness * 2),
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   std::max(0, height() - titlebar_height - border_thickness));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect PanelFrameView::GetWindowBoundsForClientBounds(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& client_bounds) const {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int titlebar_height = TitlebarHeight();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border_thickness = BorderThickness();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The window bounds include both client area and non-client area (titlebar
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and left, right and bottom borders).
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(client_bounds.x() - border_thickness,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   client_bounds.y() - titlebar_height,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   client_bounds.width() + border_thickness * 2,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   client_bounds.height() + titlebar_height + border_thickness);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PanelFrameView::NonClientHitTest(const gfx::Point& point) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  panel::Resizability resizability = panel_view_->panel()->CanResizeByMouse();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the frame first, as we allow a small area overlapping the contents
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be used for resize handles.
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int frame_component = GetFrameEdgeHitTest(
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      point, size(), PanelView::kResizeInsideBoundsSize, resizability);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (frame_component != HTNOWHERE)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return frame_component;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int client_component =
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      panel_view_->window()->client_view()->NonClientHitTest(point);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (client_component != HTNOWHERE)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return client_component;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (close_button_ && close_button_->visible() &&
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close_button_->GetMirroredBounds().Contains(point))
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HTCLOSE;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (minimize_button_ && minimize_button_->visible() &&
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      minimize_button_->GetMirroredBounds().Contains(point))
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HTMINBUTTON;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (restore_button_ && restore_button_->visible() &&
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_button_->GetMirroredBounds().Contains(point))
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HTMAXBUTTON;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTNOWHERE;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::GetWindowMask(const gfx::Size& size,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   gfx::Path* window_mask) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width = size.width();
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height = size.height();
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (corner_style_ & panel::TOP_ROUNDED) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->moveTo(0, 3);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(1, 2);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(1, 1);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(2, 1);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(3, 0);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 3), 0);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 2), 1);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 1), 1);
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 1), 2);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 1), 3);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->moveTo(0, 0);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(width, 0);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (corner_style_ & panel::BOTTOM_ROUNDED) {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 1), SkIntToScalar(height - 4));
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 2), SkIntToScalar(height - 3));
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 2), SkIntToScalar(height - 2));
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 3), SkIntToScalar(height - 2));
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width - 4), SkIntToScalar(height - 1));
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(3, SkIntToScalar(height - 1));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(2, SkIntToScalar(height - 2));
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(1, SkIntToScalar(height - 2));
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(1, SkIntToScalar(height - 3));
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(0, SkIntToScalar(height - 4));
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(SkIntToScalar(width), SkIntToScalar(height));
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_mask->lineTo(0, SkIntToScalar(height));
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_mask->close();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::ResetWindowControls() {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The controls aren't affected by this constraint.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateWindowIcon() {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_icon_->SchedulePaint();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateWindowTitle() {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_label_->SetText(panel_view_->panel()->GetWindowTitle());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PanelFrameView::SizeConstraintsChanged() {
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size PanelFrameView::GetPreferredSize() const {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pref_size =
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      panel_view_->window()->client_view()->GetPreferredSize();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds(0, 0, pref_size.width(), pref_size.height());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return panel_view_->window()->non_client_view()->
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWindowBoundsForClientBounds(bounds).size();
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
503b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* PanelFrameView::GetClassName() const {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size PanelFrameView::GetMinimumSize() const {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return panel_view_->GetMinimumSize();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size PanelFrameView::GetMaximumSize() const {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return panel_view_->GetMaximumSize();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::Layout() {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_frameless_ = ShouldRenderAsFrameless();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the close button.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right = width();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button_->SetBounds(
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width() - panel::kTitlebarRightPadding - panel::kPanelButtonSize,
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (TitlebarHeight() - panel::kPanelButtonSize) / 2 +
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kExtraPaddingBetweenButtonAndTop,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      panel::kPanelButtonSize,
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      panel::kPanelButtonSize);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  right = close_button_->x();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the minimize and restore button. Both occupy the same space,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but at most one is visible at any time.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minimize_button_->SetBounds(
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      right - panel::kButtonPadding - panel::kPanelButtonSize,
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (TitlebarHeight() - panel::kPanelButtonSize) / 2 +
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kExtraPaddingBetweenButtonAndTop,
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      panel::kPanelButtonSize,
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      panel::kPanelButtonSize);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restore_button_->SetBoundsRect(minimize_button_->bounds());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  right = minimize_button_->x();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the icon.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int icon_y = (TitlebarHeight() - kIconSize) / 2;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_icon_->SetBounds(
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      panel::kTitlebarLeftPadding,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon_y,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kIconSize,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kIconSize);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the title.
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int title_x = title_icon_->bounds().right() + panel::kIconAndTitlePadding;
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int title_height = title_label_->font_list().GetHeight();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_label_->SetBounds(
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title_x,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon_y + ((kIconSize - title_height - 1) / 2),
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::max(0, right - panel::kTitleAndButtonPadding - title_x),
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title_height);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::OnPaint(gfx::Canvas* canvas) {
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateControlStyles(GetPaintState());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintFrameBackground(canvas);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintFrameEdge(canvas);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PanelFrameView::OnMousePressed(const ui::MouseEvent& event) {
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the mouse location falls within the resizing area of the titlebar, do
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // not handle the event so that the system resizing logic can kick in.
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event.IsOnlyLeftMouseButton() &&
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      !IsWithinResizingArea(event.location())) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |event.location| is in the view's coordinate system. Convert it to the
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // screen coordinate system.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point mouse_location = event.location();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(this, &mouse_location);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (panel_view_->OnTitlebarMousePressed(mouse_location))
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NonClientFrameView::OnMousePressed(event);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PanelFrameView::OnMouseDragged(const ui::MouseEvent& event) {
580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Converting the mouse location to screen coordinates returns an incorrect
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // location while the panel is moving. See crbug.com/353393 for more details.
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TODO(pkotwicz): Fix conversion to screen coordinates
584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Screen* screen = gfx::Screen::GetNativeScreen();
585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point mouse_location = screen->GetCursorScreenPoint();
586effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |event.location| is in the view's coordinate system. Convert it to the
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // screen coordinate system.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point mouse_location = event.location();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View::ConvertPointToScreen(this, &mouse_location);
591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (panel_view_->OnTitlebarMouseDragged(mouse_location))
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NonClientFrameView::OnMouseDragged(event);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::OnMouseReleased(const ui::MouseEvent& event) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (panel_view_->OnTitlebarMouseReleased(
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event.IsControlDown() ? panel::APPLY_TO_ALL : panel::NO_MODIFIER))
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NonClientFrameView::OnMouseReleased(event);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::OnMouseCaptureLost() {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (panel_view_->OnTitlebarMouseCaptureLost())
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NonClientFrameView::OnMouseCaptureLost();
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::ButtonPressed(views::Button* sender,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const ui::Event& event) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == close_button_) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    panel_view_->ClosePanel();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    panel::ClickModifier modifier =
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event.IsControlDown() ? panel::APPLY_TO_ALL : panel::NO_MODIFIER;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sender == minimize_button_)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      panel_view_->panel()->OnMinimizeButtonClicked(modifier);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (sender == restore_button_)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      panel_view_->panel()->OnRestoreButtonClicked(modifier);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PanelFrameView::ShouldTabIconViewAnimate() const {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is queried during the creation of the window as the
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TabIconView we host is initialized, so we need to NULL check the selected
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebContents because in this condition there is not yet a selected tab.
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* contents = panel_view_->panel()->GetWebContents();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents ? contents->IsLoading() : false;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia PanelFrameView::GetFaviconForTabIconView() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return panel_view_->window()->widget_delegate()->GetWindowIcon();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size PanelFrameView::NonClientAreaSize() const {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_frameless_)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(0, TitlebarHeight());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the frame is present, the width of non-client area consists of
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // left and right borders, while the height consists of the top area
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (titlebar) and the bottom border.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(2 * kNonAeroBorderThickness,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   TitlebarHeight() + kNonAeroBorderThickness);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PanelFrameView::TitlebarHeight() const {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return panel::kTitlebarHeight;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PanelFrameView::BorderThickness() const {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_frameless_ ? 0 : kNonAeroBorderThickness;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PanelFrameView::PaintState PanelFrameView::GetPaintState() const {
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (panel_view_->panel()->IsDrawingAttention())
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PAINT_FOR_ATTENTION;
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (bounds().height() <= panel::kMinimizedPanelHeight)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PAINT_AS_MINIMIZED;
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (panel_view_->IsPanelActive() &&
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           !panel_view_->force_to_paint_as_inactive())
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PAINT_AS_ACTIVE;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PAINT_AS_INACTIVE;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor PanelFrameView::GetTitleColor(PaintState paint_state) const {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kTitleTextDefaultColor;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia* PanelFrameView::GetFrameBackground(
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PaintState paint_state) const {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (paint_state) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PAINT_AS_INACTIVE:
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetInactiveBackgroundDefaultImage();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PAINT_AS_ACTIVE:
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetActiveBackgroundDefaultImage();
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PAINT_AS_MINIMIZED:
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetMinimizeBackgroundDefaultImage();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PAINT_FOR_ATTENTION:
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetAttentionBackgroundDefaultImage();
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return GetInactiveBackgroundDefaultImage();
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::UpdateControlStyles(PaintState paint_state) {
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  title_label_->SetEnabledColor(GetTitleColor(paint_state));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::PaintFrameBackground(gfx::Canvas* canvas) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We only need to paint the title-bar since no resizing border is shown.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Instead, we allow part of the inner content area be used to trigger the
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mouse resizing.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int titlebar_height = TitlebarHeight();
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia* image = GetFrameBackground(GetPaintState());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->TileImageInt(*image, 0, 0, width(), titlebar_height);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_frameless_)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Left border, below title-bar.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(*image, 0, titlebar_height, kNonAeroBorderThickness,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      height() - titlebar_height);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right border, below title-bar.
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(*image, width() - kNonAeroBorderThickness,
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      titlebar_height, kNonAeroBorderThickness, height() - titlebar_height);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bottom border.
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(*image, 0, height() - kNonAeroBorderThickness, width(),
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kNonAeroBorderThickness);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PanelFrameView::PaintFrameEdge(gfx::Canvas* canvas) {
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Border is not needed when panel is not shown as minimized.
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetPaintState() != PAINT_AS_MINIMIZED)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& top_left_image = GetTopLeftCornerImage(corner_style_);
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& top_right_image = GetTopRightCornerImage(corner_style_);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& bottom_left_image =
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetBottomLeftCornerImage(corner_style_);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& bottom_right_image =
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetBottomRightCornerImage(corner_style_);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& top_image = GetTopEdgeImage();
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& bottom_image = GetBottomEdgeImage();
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& left_image = GetLeftEdgeImage();
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::ImageSkia& right_image = GetRightEdgeImage();
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the top border.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInt(top_left_image, 0, 0);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(top_image,
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       top_left_image.width(),
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       0,
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       width() - top_right_image.width(),
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       top_image.height());
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInt(top_right_image, width() - top_right_image.width(), 0);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the right border.
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(right_image,
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       width() - right_image.width(),
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       top_right_image.height(),
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       right_image.width(),
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       height() - top_right_image.height() -
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           bottom_right_image.height());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the bottom border.
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInt(bottom_right_image,
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       width() - bottom_right_image.width(),
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       height() - bottom_right_image.height());
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(bottom_image,
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       bottom_left_image.width(),
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       height() - bottom_image.height(),
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       width() - bottom_left_image.width() -
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           bottom_right_image.width(),
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       bottom_image.height());
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->DrawImageInt(bottom_left_image,
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       0,
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       height() - bottom_left_image.height());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the left border.
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas->TileImageInt(left_image,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       0,
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       top_left_image.height(),
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       left_image.width(),
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       height() - top_left_image.height() -
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           bottom_left_image.height());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool PanelFrameView::IsWithinResizingArea(
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const gfx::Point& mouse_location) const {
7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  panel::Resizability resizability = panel_view_->panel()->CanResizeByMouse();
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int edge_hittest = GetFrameEdgeHitTest(
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      mouse_location, size(), PanelView::kResizeInsideBoundsSize, resizability);
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return edge_hittest != HTNOWHERE;
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
780