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