172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/chrome_views_delegate.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_util.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/scoped_user_pref_update.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile_manager.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/views/accessibility_event_router_views.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/window_sizer.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/pref_names.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/clipboard/clipboard.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/widget/native_widget.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/widget/widget.h" 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/window/window.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/app_icon_win.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// If the given window has a profile associated with it, use that profile's 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// preference service. Otherwise, store and retrieve the data from Local State. 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This function may return NULL if the necessary pref service has not yet 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// been initialized. 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(mirandac): This function will also separate windows by profile in a 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// multi-profile environment. 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrefService* GetPrefsForWindow(views::Window* window) { 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Profile* profile = reinterpret_cast<Profile*>( 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen window->AsWidget()->native_widget()->GetNativeWindowProperty( 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Profile::kProfileKey)); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!profile) { 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Use local state for windows that have no explicit profile. 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return g_browser_process->local_state(); 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return profile->GetPrefs(); 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ChromeViewsDelegate, views::ViewsDelegate implementation: 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::Clipboard* ChromeViewsDelegate::GetClipboard() const { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return g_browser_process->clipboard(); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ChromeViewsDelegate::SaveWindowPlacement(views::Window* window, 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::wstring& window_name, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& bounds, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool maximized) { 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefService* prefs = GetPrefsForWindow(window); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!prefs) 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(prefs->FindPreference(WideToUTF8(window_name).c_str())); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryPrefUpdate update(prefs, WideToUTF8(window_name).c_str()); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue* window_preferences = update.Get(); 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("left", bounds.x()); 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("top", bounds.y()); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("right", bounds.right()); 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("bottom", bounds.bottom()); 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetBoolean("maximized", maximized); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<WindowSizer::MonitorInfoProvider> monitor_info_provider( 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WindowSizer::CreateDefaultMonitorInfoProvider()); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect work_area( 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch monitor_info_provider->GetMonitorWorkAreaMatching(bounds)); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("work_area_left", work_area.x()); 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("work_area_top", work_area.y()); 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("work_area_right", work_area.right()); 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick window_preferences->SetInteger("work_area_bottom", work_area.bottom()); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ChromeViewsDelegate::GetSavedWindowBounds(views::Window* window, 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::wstring& window_name, 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect* bounds) const { 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefService* prefs = GetPrefsForWindow(window); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!prefs) 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(prefs->FindPreference(WideToUTF8(window_name).c_str())); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const DictionaryValue* dictionary = 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen prefs->GetDictionary(WideToUTF8(window_name).c_str()); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int left, top, right, bottom; 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!dictionary || !dictionary->GetInteger("left", &left) || 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !dictionary->GetInteger("top", &top) || 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !dictionary->GetInteger("right", &right) || 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !dictionary->GetInteger("bottom", &bottom)) 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bounds->SetRect(left, top, right - left, bottom - top); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ChromeViewsDelegate::GetSavedMaximizedState( 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::Window* window, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::wstring& window_name, 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* maximized) const { 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefService* prefs = GetPrefsForWindow(window); 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!prefs) 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(prefs->FindPreference(WideToUTF8(window_name).c_str())); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const DictionaryValue* dictionary = 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen prefs->GetDictionary(WideToUTF8(window_name).c_str()); 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return dictionary && dictionary->GetBoolean("maximized", maximized) && 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch maximized; 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ChromeViewsDelegate::NotifyAccessibilityEvent( 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::View* view, ui::AccessibilityTypes::Event event_type) { 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AccessibilityEventRouterViews::GetInstance()->HandleAccessibilityEvent( 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick view, event_type); 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ChromeViewsDelegate::NotifyMenuItemFocused( 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::wstring& menu_name, 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::wstring& menu_item_name, 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int item_index, 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int item_count, 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool has_submenu) { 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AccessibilityEventRouterViews::GetInstance()->HandleMenuItemFocused( 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen menu_name, menu_item_name, item_index, item_count, has_submenu); 133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHICON ChromeViewsDelegate::GetDefaultWindowIcon() const { 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return GetAppIcon(); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeViewsDelegate::AddRef() { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->AddRefModule(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeViewsDelegate::ReleaseRef() { 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->ReleaseModule(); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 148