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