constrained_window_views.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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/constrained_window_views.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/theme_image_mapper.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_resources.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h" 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/views/border.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/color_constants.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget_observer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/frame_background.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/window_resources.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/window_shape.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/shell.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_win.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/custom_frame_view_ash.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogHost; 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogHostObserver; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The name of a key to store on the window handle to associate 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// WebContentsModalDialogHostObserverViews with the Widget. 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char* const kWebContentsModalDialogHostObserverViewsKey = 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "__WEB_CONTENTS_MODAL_DIALOG_HOST_OBSERVER_VIEWS__"; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Applies positioning changes from the WebContentsModalDialogHost to the 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Widget. 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebContentsModalDialogHostObserverViews 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public views::WidgetObserver, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public WebContentsModalDialogHostObserver { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsModalDialogHostObserverViews( 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsModalDialogHost* host, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget* target_widget, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char *const native_window_property) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : host_(host), 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_widget_(target_widget), 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) native_window_property_(native_window_property) { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(host_); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(target_widget_); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_->AddObserver(this); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_widget_->AddObserver(this); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~WebContentsModalDialogHostObserverViews() { 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (host_) 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_->RemoveObserver(this); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_widget_->RemoveObserver(this); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_widget_->SetNativeWindowProperty(native_window_property_, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // WidgetObserver overrides 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete this; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // WebContentsModalDialogHostObserver overrides 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPositionRequiresUpdate() OVERRIDE { 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateWebContentsModalDialogPosition(target_widget_, host_); 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnHostDestroying() OVERRIDE { 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_->RemoveObserver(this); 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_ = NULL; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsModalDialogHost* host_; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget* target_widget_; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* const native_window_property_; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebContentsModalDialogHostObserverViews); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An enumeration of image resources used by this window. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_PART_IMAGE_FIRST = 0, // Must be first. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window Frame Border. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_BOTTOM_EDGE, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_BOTTOM_LEFT_CORNER, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_BOTTOM_RIGHT_CORNER, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_LEFT_EDGE, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_RIGHT_EDGE, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_TOP_EDGE, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_TOP_LEFT_CORNER, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_TOP_RIGHT_CORNER, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_PART_IMAGE_COUNT // Must be last. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kXPFramePartIDs[] = { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_WINDOW_BOTTOM_CENTER, IDR_WINDOW_BOTTOM_LEFT_CORNER, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_WINDOW_BOTTOM_RIGHT_CORNER, IDR_WINDOW_LEFT_SIDE, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_WINDOW_RIGHT_SIDE, IDR_WINDOW_TOP_CENTER, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_WINDOW_TOP_LEFT_CORNER, IDR_WINDOW_TOP_RIGHT_CORNER, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 }; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kVistaFramePartIDs[] = { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_CONSTRAINED_BOTTOM_CENTER_V, IDR_CONSTRAINED_BOTTOM_LEFT_CORNER_V, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_CONSTRAINED_BOTTOM_RIGHT_CORNER_V, IDR_CONSTRAINED_LEFT_SIDE_V, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_CONSTRAINED_RIGHT_SIDE_V, IDR_CONSTRAINED_TOP_CENTER_V, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_CONSTRAINED_TOP_LEFT_CORNER_V, IDR_CONSTRAINED_TOP_RIGHT_CORNER_V, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 }; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XPWindowResources : public views::WindowResources { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XPWindowResources() { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitClass(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~XPWindowResources() {} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::ImageSkia* GetPartImage( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::FramePartImage part_id) const OVERRIDE { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return images_[part_id]; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitClass() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool initialized = false; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < FRAME_PART_IMAGE_COUNT; ++i) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = kXPFramePartIDs[i]; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id != 0) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_[i] = rb.GetImageSkiaNamed(id); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized = true; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static gfx::ImageSkia* images_[FRAME_PART_IMAGE_COUNT]; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(XPWindowResources); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VistaWindowResources : public views::WindowResources { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VistaWindowResources() { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitClass(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VistaWindowResources() {} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::ImageSkia* GetPartImage( 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::FramePartImage part_id) const OVERRIDE { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return images_[part_id]; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitClass() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool initialized = false; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < FRAME_PART_IMAGE_COUNT; ++i) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = kVistaFramePartIDs[i]; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id != 0) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_[i] = rb.GetImageSkiaNamed(id); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized = true; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static gfx::ImageSkia* images_[FRAME_PART_IMAGE_COUNT]; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VistaWindowResources); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* XPWindowResources::images_[]; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* VistaWindowResources::images_[]; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConstrainedWindowFrameView : public views::NonClientFrameView, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ButtonListener { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConstrainedWindowFrameView(views::Widget* container, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool browser_is_off_the_record); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ConstrainedWindowFrameView(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateWindowTitle() OVERRIDE; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::NonClientFrameView: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Rect GetWindowBoundsForClientBounds( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& client_bounds) const OVERRIDE; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetWindowMask(const gfx::Size& size, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Path* window_mask) OVERRIDE; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResetWindowControls() OVERRIDE {} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateWindowIcon() OVERRIDE {} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnThemeChanged() OVERRIDE; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::ButtonListener: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the thickness of the entire nonclient left, right, and bottom 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // borders, including both the window frame and any client edge. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int NonClientBorderThickness() const; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the height of the entire nonclient top border, including the window 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame, any title area, and any connected client edge. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int NonClientTopBorderHeight() const; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the thickness of the nonclient portion of the 3D edge along the 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bottom of the titlebar. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int TitlebarBottomThickness() const; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns what the size of the titlebar icon would be if there was one. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int IconSize() const; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns what the titlebar icon's bounds would be if there was one. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect IconBounds() const; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paints different parts of the window to the incoming canvas. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintFrameBorder(gfx::Canvas* canvas); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintTitleBar(gfx::Canvas* canvas); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintClientEdge(gfx::Canvas* canvas); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout various sub-components of this view. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LayoutWindowControls(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LayoutTitleBar(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the bounds of the client area for the specified view size. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect CalculateClientAreaBounds(int width, int height) const; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor GetTitleColor() const { 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_is_off_the_record_ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || !ui::win::IsAeroGlassEnabled() 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? SK_ColorWHITE : SK_ColorBLACK; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the appropriate set of WindowResources for the frame view. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitWindowResources(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* container_; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool browser_is_off_the_record_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::WindowResources> resources_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect title_bounds_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageButton* close_button_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bounds of the ClientView. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect client_view_bounds_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background painter for the frame. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::FrameBackground> frame_background_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitClass(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The font to be used to render the titlebar text. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const gfx::Font* title_font_; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowFrameView); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Font* ConstrainedWindowFrameView::title_font_ = NULL; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The frame border is only visible in restored mode and is hardcoded to 4 px on 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each side regardless of the system window border size. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFrameBorderThickness = 4; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various edges of the frame border have a 1 px shadow along their edges; in a 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// few cases we shift elements based on this amount for visual appeal. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFrameShadowThickness = 1; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In the window corners, the resize areas don't actually expand bigger, but the 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16 px at the end of each edge triggers diagonal resizing. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kResizeAreaCornerSize = 16; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The titlebar never shrinks too short to show the caption button plus some 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// padding below it. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kCaptionButtonHeightWithPadding = 19; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The titlebar has a 2 px 3D edge along the top and bottom. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTitlebarTopAndBottomEdgeThickness = 2; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The icon would never shrink below 16 px on a side, if there was one. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconMinimumSize = 16; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The title text starts 2 px from the right edge of the left frame border. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTitleLeftSpacing = 2; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is a 5 px gap between the title text and the caption buttons. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTitleCaptionSpacing = 5; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConstrainedWindowFrameView::ConstrainedWindowFrameView( 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* container, bool browser_is_off_the_record) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NonClientFrameView(), 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_(container), 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_is_off_the_record_(browser_is_off_the_record), 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_button_(new views::ImageButton(this)), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_(new views::FrameBackground()) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitClass(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitWindowResources(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constrained windows always use the custom frame - they just have a 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different set of images. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::CustomButton::STATE_NORMAL, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageSkiaNamed(IDR_CLOSE_SA)); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::CustomButton::STATE_HOVERED, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageSkiaNamed(IDR_CLOSE_SA_H)); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button_->SetImage(views::CustomButton::STATE_PRESSED, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageSkiaNamed(IDR_CLOSE_SA_P)); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageButton::ALIGN_MIDDLE); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(close_button_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConstrainedWindowFrameView::~ConstrainedWindowFrameView() { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::UpdateWindowTitle() { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaintInRect(title_bounds_); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConstrainedWindowFrameView::GetBoundsForClientView() const { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return client_view_bounds_; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConstrainedWindowFrameView::GetWindowBoundsForClientBounds( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& client_bounds) const { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int top_height = NonClientTopBorderHeight(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int border_thickness = NonClientBorderThickness(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, client_bounds.y() - top_height), 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_bounds.width() + (2 * border_thickness), 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_bounds.height() + top_height + border_thickness); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConstrainedWindowFrameView::NonClientHitTest(const gfx::Point& point) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bounds().Contains(point)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HTNOWHERE; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frame_component = 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->client_view()->NonClientHitTest(point); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if we're in the sysmenu region. (We check the ClientView first to be 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consistent with OpaqueBrowserFrameView; it's not really necessary here.) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect sysmenu_rect(IconBounds()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sysmenu_rect.set_x(GetMirroredXForRect(sysmenu_rect)); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sysmenu_rect.Contains(point)) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (frame_component == HTCLIENT) ? HTCLIENT : HTSYSMENU; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame_component != HTNOWHERE) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_component; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then see if the point is within any of the window controls. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (close_button_->GetMirroredBounds().Contains(point)) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HTCLOSE; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_component = GetHTComponentForFrame(point, kFrameBorderThickness, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->widget_delegate()->CanResize()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall back to the caption if no other component matches. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (window_component == HTNOWHERE) ? HTCAPTION : window_component; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::GetWindowMask(const gfx::Size& size, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Path* window_mask) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(window_mask); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GetDefaultWindowMask(size, window_mask); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::OnPaint(gfx::Canvas* canvas) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintFrameBorder(canvas); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTitleBar(canvas); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintClientEdge(canvas); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::Layout() { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayoutWindowControls(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayoutTitleBar(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_bounds_ = CalculateClientAreaBounds(width(), height()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::OnThemeChanged() { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitWindowResources(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::ButtonPressed( 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Button* sender, const ui::Event& event) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == close_button_) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->Close(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConstrainedWindowFrameView::NonClientBorderThickness() const { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kFrameBorderThickness + kClientEdgeThickness; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConstrainedWindowFrameView::NonClientTopBorderHeight() const { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::max(kFrameBorderThickness + IconSize(), 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFrameShadowThickness + kCaptionButtonHeightWithPadding) + 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TitlebarBottomThickness(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConstrainedWindowFrameView::TitlebarBottomThickness() const { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kTitlebarTopAndBottomEdgeThickness + kClientEdgeThickness; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConstrainedWindowFrameView::IconSize() const { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This metric scales up if either the titlebar height or the titlebar font 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size are increased. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSystemMetrics(SM_CYSMICON); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::max(title_font_->GetHeight(), kIconMinimumSize); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConstrainedWindowFrameView::IconBounds() const { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = IconSize(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our frame border has a different "3D look" than Windows'. Theirs has a 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // more complex gradient on the top that they push their icon/title below; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then the maximized window cuts this off and the icon/title are centered 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the remaining space. Because the apparent shape of our border is 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simpler, using the same positioning makes things look slightly uncentered 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with restored windows, so instead of calculating the remaining space from 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // below the frame border, we calculate from below the 3D edge. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int unavailable_px_at_top = kTitlebarTopAndBottomEdgeThickness; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the icon is shorter than the minimum space we reserve for the caption 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // button, we vertically center it. We want to bias rounding to put extra 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // space above the icon, since the 3D edge + client edge below looks (to the 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // eye) more like additional space than does the 3D edge above; hence the +1. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y = unavailable_px_at_top + (NonClientTopBorderHeight() - 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unavailable_px_at_top - size - TitlebarBottomThickness() + 1) / 2; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(kFrameBorderThickness + kTitleLeftSpacing, y, size, size); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::PaintFrameBorder(gfx::Canvas* canvas) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_background_->set_frame_color(ThemeProperties::GetDefaultColor( 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME)); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType desktop_type = 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::GetHostDesktopTypeForNativeView(GetWidget()->GetNativeView()); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia* theme_frame = rb.GetImageSkiaNamed( 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::MapThemeImage(desktop_type, IDR_THEME_FRAME)); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->set_theme_image(theme_frame); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->set_theme_overlay_image(NULL); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->set_top_area_height(theme_frame->height()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->SetCornerImages( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_TOP_LEFT_CORNER), 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_TOP_RIGHT_CORNER), 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_BOTTOM_LEFT_CORNER), 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_BOTTOM_RIGHT_CORNER)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->SetSideImages( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_LEFT_EDGE), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_TOP_EDGE), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_RIGHT_EDGE), 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_->GetPartImage(FRAME_BOTTOM_EDGE)); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_background_->PaintRestored(canvas, this); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::PaintTitleBar(gfx::Canvas* canvas) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->DrawStringInt( 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->widget_delegate()->GetWindowTitle(), 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *title_font_, GetTitleColor(), GetMirroredXForRect(title_bounds_), 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::PaintClientEdge(gfx::Canvas* canvas) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect client_edge_bounds(CalculateClientAreaBounds(width(), height())); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_edge_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect frame_shadow_bounds(client_edge_bounds); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_shadow_bounds.Inset(-kFrameShadowThickness, -kFrameShadowThickness); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(frame_shadow_bounds, kContentsBorderShadow); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(client_edge_bounds, views::kClientEdgeColor); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::LayoutWindowControls() { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size close_button_size = close_button_->GetPreferredSize(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_button_->SetBounds( 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width() - kFrameBorderThickness - close_button_size.width(), 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFrameShadowThickness, close_button_size.width(), 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_button_size.height()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::LayoutTitleBar() { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window title is based on the calculated icon position, even though' 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no icon in constrained windows. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect icon_bounds(IconBounds()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_x = icon_bounds.x(); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_height = title_font_->GetHeight(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We bias the title position so that when the difference between the icon and 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title heights is odd, the extra pixel of the title is above the vertical 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // midline rather than below. This compensates for how the icon is already 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // biased downwards (see IconBounds()) and helps prevent descenders on the 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title from overlapping the 3D edge at the bottom of the titlebar. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_bounds_.SetRect(title_x, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_bounds.y() + ((icon_bounds.height() - title_height - 1) / 2), 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, close_button_->x() - kTitleCaptionSpacing - title_x), 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_height); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConstrainedWindowFrameView::CalculateClientAreaBounds( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height) const { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int top_height = NonClientTopBorderHeight(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int border_thickness = NonClientBorderThickness(); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(border_thickness, top_height, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, width - (2 * border_thickness)), 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, height - top_height - border_thickness)); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::InitWindowResources() { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_.reset(ui::win::IsAeroGlassEnabled() ? 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<views::WindowResources*>(new VistaWindowResources) : 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new XPWindowResources); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Use aura frame decoration. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_.reset(new XPWindowResources); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstrainedWindowFrameView::InitClass() { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool initialized = false; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_font_ = new gfx::Font(views::NativeWidgetWin::GetWindowTitleFont()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_font_ = &rb.GetFont(ui::ResourceBundle::MediumFont); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized = true; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void UpdateWebContentsModalDialogPosition( 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::Widget* widget, 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) web_modal::WebContentsModalDialogHost* dialog_host) { 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size size = widget->GetRootView()->GetPreferredSize(); 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::Border* border = 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) widget->non_client_view()->frame_view()->border(); 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size max_size = dialog_host->GetMaximumDialogSize(); 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Enlarge the max size by the top border, as the dialog will be shifted 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // outside the area specified by the dialog host by this amount later in the 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // function. 5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Border may be null during widget initialization. 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (border) 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) max_size.Enlarge(0, border->GetInsets().top()); 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size.SetToMin(max_size); 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Point position = dialog_host->GetDialogPosition(size); 5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (border) { 5873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Align the first row of pixels inside the border. This is the apparent 5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // top of the dialog. 5893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) position.set_y(position.y() - border->GetInsets().top()); 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (widget->is_top_level()) { 5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) position += 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::Widget::GetWidgetForNativeView(dialog_host->GetHostView())-> 5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetClientAreaBoundsInScreen().OffsetFromOrigin(); 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) widget->SetBounds(gfx::Rect(position, size)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)views::Widget* CreateBrowserModalDialogViews(views::DialogDelegate* dialog, 6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::NativeWindow parent) { 6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::Widget* widget = 6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) views::DialogDelegate::CreateDialogWidget(dialog, NULL, parent); 6057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!dialog->UseNewStyleForThisDialog()) 6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return widget; 6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Get the browser dialog management and hosting components from |parent|. 6097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWindow(parent); 6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (browser) { 6117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ChromeWebModalDialogManagerDelegate* manager = browser; 6127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebContentsModalDialogHost* host = manager->GetWebContentsModalDialogHost(); 6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK_EQ(parent, host->GetHostView()); 6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebContentsModalDialogHostObserver* dialog_host_observer = 6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new WebContentsModalDialogHostObserverViews( 6167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host, widget, kWebContentsModalDialogHostObserverViewsKey); 6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog_host_observer->OnPositionRequiresUpdate(); 6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return widget; 6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::NonClientFrameView* CreateConstrainedStyleNonClientFrameView( 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget, 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context) { 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (views::DialogDelegate::UseNewStyle()) { 626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(USE_AURA) 627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const bool force_opaque_border = false; 628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else 629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const bool force_opaque_border = true; 630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return views::DialogDelegate::CreateNewStyleFrameView(widget, 632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) force_opaque_border); 633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 6353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh; 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->Init(widget); 6373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Always use "active" look. 6383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) frame->SetInactiveRenderingDisabled(true); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ConstrainedWindowFrameView(widget, 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_context->IsOffTheRecord()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 644