widget_delegate.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved. 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// Use of this source code is governed by a BSD-style license that can be 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file. 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "ui/views/widget/widget_delegate.h" 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "base/strings/utf_string_conversions.h" 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/gfx/image/image_skia.h" 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "ui/views/bubble/bubble_delegate.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/views/view.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/views/views_delegate.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/views/widget/widget.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/views/window/client_view.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace views { 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////// 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// WidgetDelegate: 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comWidgetDelegate::WidgetDelegate() 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com : default_contents_view_(NULL), 226f8f292aa768869a9e85c314b124875f57504f2creed@google.com can_activate_(true) { 23ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com} 24ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com 25ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.comvoid WidgetDelegate::OnWidgetMove() { 26ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com} 27ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid WidgetDelegate::OnDisplayChanged() { 296f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 306f8f292aa768869a9e85c314b124875f57504f2creed@google.com 316f8f292aa768869a9e85c314b124875f57504f2creed@google.comvoid WidgetDelegate::OnWorkAreaChanged() { 326f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 336f8f292aa768869a9e85c314b124875f57504f2creed@google.com 346f8f292aa768869a9e85c314b124875f57504f2creed@google.comView* WidgetDelegate::GetInitiallyFocusedView() { 356f8f292aa768869a9e85c314b124875f57504f2creed@google.com return NULL; 366f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 376f8f292aa768869a9e85c314b124875f57504f2creed@google.com 386f8f292aa768869a9e85c314b124875f57504f2creed@google.comBubbleDelegateView* WidgetDelegate::AsBubbleDelegate() { 396f8f292aa768869a9e85c314b124875f57504f2creed@google.com return NULL; 406f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 416f8f292aa768869a9e85c314b124875f57504f2creed@google.com 426f8f292aa768869a9e85c314b124875f57504f2creed@google.comDialogDelegate* WidgetDelegate::AsDialogDelegate() { 436f8f292aa768869a9e85c314b124875f57504f2creed@google.com return NULL; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::CanResize() const { 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::CanMaximize() const { 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::CanActivate() const { 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return can_activate_; 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comui::ModalType WidgetDelegate::GetModalType() const { 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return ui::MODAL_TYPE_NONE; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comui::AXRole WidgetDelegate::GetAccessibleWindowRole() const { 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return ui::AX_ROLE_WINDOW; 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 666f8f292aa768869a9e85c314b124875f57504f2creed@google.combase::string16 WidgetDelegate::GetAccessibleWindowTitle() const { 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return GetWindowTitle(); 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 706f8f292aa768869a9e85c314b124875f57504f2creed@google.combase::string16 WidgetDelegate::GetWindowTitle() const { 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return base::string16(); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ShouldShowWindowTitle() const { 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ShouldShowCloseButton() const { 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ShouldHandleSystemCommands() const { 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const Widget* widget = GetWidget(); 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!widget) 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 866f8f292aa768869a9e85c314b124875f57504f2creed@google.com 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return widget->non_client_view() != NULL; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comgfx::ImageSkia WidgetDelegate::GetWindowAppIcon() { 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // Use the window icon as app icon by default. 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return GetWindowIcon(); 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// Returns the icon to be displayed in the window. 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comgfx::ImageSkia WidgetDelegate::GetWindowIcon() { 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return gfx::ImageSkia(); 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ShouldShowWindowIcon() const { 1016f8f292aa768869a9e85c314b124875f57504f2creed@google.com return false; 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ExecuteWindowsCommand(int command_id) { 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstd::string WidgetDelegate::GetWindowName() const { 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return std::string(); 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid WidgetDelegate::SaveWindowPlacement(const gfx::Rect& bounds, 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ui::WindowShowState show_state) { 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com std::string window_name = GetWindowName(); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!ViewsDelegate::views_delegate || window_name.empty()) 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ViewsDelegate::views_delegate->SaveWindowPlacement( 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com GetWidget(), window_name, bounds, show_state); 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1226f8f292aa768869a9e85c314b124875f57504f2creed@google.combool WidgetDelegate::GetSavedWindowPlacement( 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const Widget* widget, 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gfx::Rect* bounds, 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ui::WindowShowState* show_state) const { 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com std::string window_name = GetWindowName(); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!ViewsDelegate::views_delegate || window_name.empty()) 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return ViewsDelegate::views_delegate->GetSavedWindowPlacement( 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com widget, window_name, bounds, show_state); 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::ShouldRestoreWindowSize() const { 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1367ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org} 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comView* WidgetDelegate::GetContentsView() { 139ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com if (!default_contents_view_) 140ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com default_contents_view_ = new View; 141ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com return default_contents_view_; 142ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com} 143ac753098e8af4a17e5df97b3a4dd0ce123f8d70creed@android.com 1446f8f292aa768869a9e85c314b124875f57504f2creed@google.comClientView* WidgetDelegate::CreateClientView(Widget* widget) { 145b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org return new ClientView(widget, GetContentsView()); 146b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org} 147b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comNonClientFrameView* WidgetDelegate::CreateNonClientFrameView(Widget* widget) { 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1506f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comView* WidgetDelegate::CreateOverlayView() { 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::WillProcessWorkAreaChange() const { 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1586f8f292aa768869a9e85c314b124875f57504f2creed@google.com} 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool WidgetDelegate::WidgetHasHitTestMask() const { 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid WidgetDelegate::GetWidgetHitTestMask(gfx::Path* mask) const { 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com DCHECK(mask); 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1677744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1687744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.combool WidgetDelegate::ShouldAdvanceFocusToTopLevelWidget() const { 1697744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com return false; 1707744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1717744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1727744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.combool WidgetDelegate::ShouldDescendIntoChildForEventHandling( 1737744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com gfx::NativeView child, 1747744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com const gfx::Point& location) { 1757744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com return true; 1767744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1777744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1787744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com//////////////////////////////////////////////////////////////////////////////// 1797744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com// WidgetDelegateView: 1807744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1817744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.comWidgetDelegateView::WidgetDelegateView() { 1827744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com // A WidgetDelegate should be deleted on DeleteDelegate. 1837744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com set_owned_by_client(); 1847744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1857744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1867744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.comWidgetDelegateView::~WidgetDelegateView() { 1877744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1887744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1897744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.comvoid WidgetDelegateView::DeleteDelegate() { 1907744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com delete this; 1917744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1927744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1937744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.comWidget* WidgetDelegateView::GetWidget() { 1947744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com return View::GetWidget(); 1957744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com} 1967744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst Widget* WidgetDelegateView::GetWidget() const { 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return View::GetWidget(); 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2007744c205f20b5617e83d4af8f97b5771bfa8d671reed@google.com 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} // namespace views 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com