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