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 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/basictypes.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/compiler_specific.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_uninstall_dialog.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/checkbox.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/image_view.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/link.h" 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/layout_constants.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/dialog_delegate.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kRightColumnWidth = 210; 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int kIconSize = 69; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionUninstallDialogView : public views::View, 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public views::DialogDelegate { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionUninstallDialogView(ExtensionUninstallDialog::Delegate* delegate, 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Extension* extension, 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkBitmap* icon) 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : delegate_(delegate), 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_(NULL) { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Scale down to icon size, but allow smaller icons (don't scale up). 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Size size(icon->width(), icon->height()); 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (size.width() > kIconSize || size.height() > kIconSize) 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size = gfx::Size(kIconSize, kIconSize); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_ = new views::ImageView(); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_->SetImageSize(size); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_->SetImage(*icon); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddChildView(icon_); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen heading_ = new views::Label(UTF16ToWide( 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, 503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen UTF8ToUTF16(extension->name())))); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch heading_->SetMultiLine(true); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddChildView(heading_); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // views::DialogDelegate: 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual std::wstring GetDialogButtonLabel( 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageBoxFlags::DialogButton button) const OVERRIDE { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (button) { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case MessageBoxFlags::DIALOGBUTTON_OK: 623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide( 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16( 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON)); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case MessageBoxFlags::DIALOGBUTTON_CANCEL: 663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL)); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return L""; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int GetDefaultDialogButton() const OVERRIDE { 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return MessageBoxFlags::DIALOGBUTTON_CANCEL; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool Accept() OVERRIDE { 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delegate_->ExtensionDialogAccepted(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool Cancel() OVERRIDE { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delegate_->ExtensionDialogCanceled(); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // views::WindowDelegate: 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool IsModal() const OVERRIDE { return true; } 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual std::wstring GetWindowTitle() const OVERRIDE { 903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide( 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE)); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual views::View* GetContentsView() { return this; } 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // views::View: 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual gfx::Size GetPreferredSize() OVERRIDE { 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int width = kRightColumnWidth; 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick width += kIconSize; 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen width += views::kPanelHorizMargin * 3; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int height = views::kPanelVertMargin * 2; 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick height += heading_->GetHeightForWidth(kRightColumnWidth); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return gfx::Size(width, 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::max(height, kIconSize + views::kPanelVertMargin * 2)); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Layout() OVERRIDE { 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int x = views::kPanelHorizMargin; 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int y = views::kPanelVertMargin; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick heading_->SizeToFit(kRightColumnWidth); 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (heading_->height() <= kIconSize) { 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick icon_->SetBounds(x, y, kIconSize, kIconSize); 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick x += kIconSize; 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen x += views::kPanelHorizMargin; 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick heading_->SetX(x); 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick heading_->SetY(y + (kIconSize - heading_->height()) / 2); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick icon_->SetBounds(x, 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick y + (heading_->height() - kIconSize) / 2, 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kIconSize, 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kIconSize); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick x += kIconSize; 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen x += views::kPanelHorizMargin; 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick heading_->SetX(x); 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick heading_->SetY(y); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionUninstallDialog::Delegate* delegate_; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::ImageView* icon_; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Label* heading_; 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogView); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ExtensionUninstallDialog::Show( 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionUninstallDialog::Delegate* delegate, 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension, 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkBitmap* icon) { 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* browser = BrowserList::GetLastActiveWithProfile(profile); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!browser) { 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delegate->ExtensionDialogCanceled(); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserWindow* window = browser->window(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!window) { 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delegate->ExtensionDialogCanceled(); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser::CreateViewsWindow(window->GetNativeHandle(), gfx::Rect(), 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new ExtensionUninstallDialogView(delegate, extension, icon))->Show(); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 164