OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "chrome/browser/extensions/extension_uninstall_dialog.h" | 9 #include "chrome/browser/extensions/extension_uninstall_dialog.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
11 #include "chrome/browser/ui/browser_list.h" | 11 #include "chrome/browser/ui/browser_list.h" |
12 #include "chrome/browser/ui/browser_window.h" | 12 #include "chrome/browser/ui/browser_window.h" |
13 #include "chrome/browser/ui/views/window.h" | 13 #include "chrome/browser/ui/views/window.h" |
14 #include "chrome/common/extensions/extension.h" | 14 #include "chrome/common/extensions/extension.h" |
15 #include "grit/generated_resources.h" | 15 #include "grit/generated_resources.h" |
16 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
17 #include "views/controls/image_view.h" | 17 #include "views/controls/image_view.h" |
18 #include "views/controls/label.h" | 18 #include "views/controls/label.h" |
19 #include "views/layout/layout_constants.h" | 19 #include "views/layout/layout_constants.h" |
20 #include "views/view.h" | 20 #include "views/view.h" |
21 #include "views/widget/widget.h" | 21 #include "views/widget/widget.h" |
22 #include "views/window/dialog_delegate.h" | 22 #include "views/window/dialog_delegate.h" |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const int kRightColumnWidth = 210; | 26 const int kRightColumnWidth = 210; |
27 const int kIconSize = 69; | 27 const int kIconSize = 69; |
28 | 28 |
29 class ExtensionUninstallDialogView : public views::DialogDelegateView { | 29 class ExtensionUninstallDialogDelegateView; |
| 30 |
| 31 // The ExtensionUninstallDialog implementation for the views framework. This |
| 32 // connects the ExtensionUninstallUI::Delegate to the actual widget, reconciling |
| 33 // the two life cycles. |
| 34 class ExtensionUninstallDialogViews : public ExtensionUninstallDialog { |
30 public: | 35 public: |
31 ExtensionUninstallDialogView(ExtensionUninstallDialog::Delegate* delegate, | 36 ExtensionUninstallDialogViews(Profile* profile, |
32 const Extension* extension, | 37 ExtensionUninstallUI::Delegate* delegate, |
33 SkBitmap* icon) | 38 const Extension* extension, |
34 : delegate_(delegate), | 39 SkBitmap* icon); |
35 icon_(NULL) { | 40 virtual ~ExtensionUninstallDialogViews(); |
36 // Scale down to icon size, but allow smaller icons (don't scale up). | 41 |
37 gfx::Size size(icon->width(), icon->height()); | 42 // Forwards the accept and cancels to the delegate. |
38 if (size.width() > kIconSize || size.height() > kIconSize) | 43 void ExtensionUninstallAccepted(); |
39 size = gfx::Size(kIconSize, kIconSize); | 44 void ExtensionUninstallCanceled(); |
40 icon_ = new views::ImageView(); | 45 |
41 icon_->SetImageSize(size); | 46 ExtensionUninstallDialogDelegateView* view() { return view_; } |
42 icon_->SetImage(*icon); | |
43 AddChildView(icon_); | |
44 | |
45 heading_ = new views::Label(UTF16ToWide( | |
46 l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, | |
47 UTF8ToUTF16(extension->name())))); | |
48 heading_->SetMultiLine(true); | |
49 heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | |
50 AddChildView(heading_); | |
51 } | |
52 | 47 |
53 private: | 48 private: |
| 49 ExtensionUninstallUI::Delegate* delegate_; |
| 50 ExtensionUninstallDialogDelegateView* view_; |
| 51 |
| 52 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogViews); |
| 53 }; |
| 54 |
| 55 // This class display the uninstall widget and is owned by the views framework. |
| 56 class ExtensionUninstallDialogDelegateView : public views::DialogDelegateView { |
| 57 public: |
| 58 ExtensionUninstallDialogDelegateView( |
| 59 ExtensionUninstallDialogViews* dialog_view, |
| 60 const Extension* extension, |
| 61 SkBitmap* icon); |
| 62 virtual ~ExtensionUninstallDialogDelegateView(); |
| 63 |
| 64 // Called when the dialog and delegate have been destroyed to make sure |
| 65 // that we don't callback to an invalid pointer. |
| 66 void DialogDestroyed() { dialog_ = NULL; } |
| 67 |
| 68 private: |
| 69 ExtensionUninstallDialogViews* dialog_; |
| 70 |
54 // views::DialogDelegate: | 71 // views::DialogDelegate: |
55 virtual std::wstring GetDialogButtonLabel( | 72 virtual std::wstring GetDialogButtonLabel( |
56 MessageBoxFlags::DialogButton button) const OVERRIDE { | 73 MessageBoxFlags::DialogButton button) const OVERRIDE; |
57 switch (button) { | |
58 case MessageBoxFlags::DIALOGBUTTON_OK: | |
59 return UTF16ToWide( | |
60 l10n_util::GetStringUTF16( | |
61 IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON)); | |
62 case MessageBoxFlags::DIALOGBUTTON_CANCEL: | |
63 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL)); | |
64 default: | |
65 NOTREACHED(); | |
66 return L""; | |
67 } | |
68 } | |
69 | 74 |
70 virtual int GetDefaultDialogButton() const OVERRIDE { | 75 virtual int GetDefaultDialogButton() const OVERRIDE { |
71 return MessageBoxFlags::DIALOGBUTTON_CANCEL; | 76 return MessageBoxFlags::DIALOGBUTTON_CANCEL; |
72 } | 77 } |
73 | 78 |
74 virtual bool Accept() OVERRIDE { | 79 virtual bool Accept() OVERRIDE; |
75 delegate_->ExtensionDialogAccepted(); | 80 virtual bool Cancel() OVERRIDE; |
76 return true; | |
77 } | |
78 | |
79 virtual bool Cancel() OVERRIDE { | |
80 delegate_->ExtensionDialogCanceled(); | |
81 return true; | |
82 } | |
83 | 81 |
84 // views::WindowDelegate: | 82 // views::WindowDelegate: |
85 virtual bool IsModal() const OVERRIDE { return true; } | 83 virtual bool IsModal() const OVERRIDE { return true; } |
86 virtual std::wstring GetWindowTitle() const OVERRIDE { | |
87 return UTF16ToWide( | |
88 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE)); | |
89 } | |
90 virtual views::View* GetContentsView() { return this; } | 84 virtual views::View* GetContentsView() { return this; } |
| 85 virtual std::wstring GetWindowTitle() const OVERRIDE; |
91 | 86 |
92 // views::View: | 87 // views::View: |
93 virtual gfx::Size GetPreferredSize() OVERRIDE { | 88 virtual gfx::Size GetPreferredSize() OVERRIDE; |
94 int width = kRightColumnWidth; | 89 |
95 width += kIconSize; | 90 virtual void Layout() OVERRIDE; |
96 width += views::kPanelHorizMargin * 3; | 91 |
97 | |
98 int height = views::kPanelVertMargin * 2; | |
99 height += heading_->GetHeightForWidth(kRightColumnWidth); | |
100 | |
101 return gfx::Size(width, | |
102 std::max(height, kIconSize + views::kPanelVertMargin * 2)); | |
103 } | |
104 | |
105 virtual void Layout() OVERRIDE { | |
106 int x = views::kPanelHorizMargin; | |
107 int y = views::kPanelVertMargin; | |
108 | |
109 heading_->SizeToFit(kRightColumnWidth); | |
110 | |
111 if (heading_->height() <= kIconSize) { | |
112 icon_->SetBounds(x, y, kIconSize, kIconSize); | |
113 x += kIconSize; | |
114 x += views::kPanelHorizMargin; | |
115 | |
116 heading_->SetX(x); | |
117 heading_->SetY(y + (kIconSize - heading_->height()) / 2); | |
118 } else { | |
119 icon_->SetBounds(x, | |
120 y + (heading_->height() - kIconSize) / 2, | |
121 kIconSize, | |
122 kIconSize); | |
123 x += kIconSize; | |
124 x += views::kPanelHorizMargin; | |
125 | |
126 heading_->SetX(x); | |
127 heading_->SetY(y); | |
128 } | |
129 } | |
130 | |
131 ExtensionUninstallDialog::Delegate* delegate_; | |
132 views::ImageView* icon_; | 92 views::ImageView* icon_; |
133 views::Label* heading_; | 93 views::Label* heading_; |
134 | 94 |
135 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogView); | 95 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogDelegateView); |
136 }; | 96 }; |
137 | 97 |
| 98 ExtensionUninstallDialogViews::ExtensionUninstallDialogViews( |
| 99 Profile* profile, |
| 100 ExtensionUninstallUI::Delegate* delegate, |
| 101 const Extension* extension, |
| 102 SkBitmap* icon) |
| 103 : delegate_(delegate), |
| 104 ExtensionUninstallDialog(profile, delegate, extension, icon) { |
| 105 view_ = new ExtensionUninstallDialogDelegateView(this, extension, icon); |
| 106 } |
| 107 |
| 108 ExtensionUninstallDialogViews::~ExtensionUninstallDialogViews() { |
| 109 // Close the widget. The views framework will delete views_. |
| 110 if (view_) { |
| 111 view_->DialogDestroyed(); |
| 112 view_->GetWidget()->CloseNow(); |
| 113 } |
| 114 } |
| 115 |
| 116 void ExtensionUninstallDialogViews::ExtensionUninstallAccepted() { |
| 117 // The widget gets destroyed when the dialog is accepted. |
| 118 view_ = NULL; |
| 119 |
| 120 delegate_->ExtensionUninstallAccepted(); |
| 121 } |
| 122 |
| 123 void ExtensionUninstallDialogViews::ExtensionUninstallCanceled() { |
| 124 // The widget gets destroyed when the dialog is canceled. |
| 125 view_ = NULL; |
| 126 |
| 127 delegate_->ExtensionUninstallCanceled(); |
| 128 } |
| 129 |
| 130 ExtensionUninstallDialogDelegateView::ExtensionUninstallDialogDelegateView( |
| 131 ExtensionUninstallDialogViews* dialog_view, |
| 132 const Extension* extension, |
| 133 SkBitmap* icon) |
| 134 : dialog_(dialog_view) { |
| 135 // Scale down to icon size, but allow smaller icons (don't scale up). |
| 136 gfx::Size size(icon->width(), icon->height()); |
| 137 if (size.width() > kIconSize || size.height() > kIconSize) |
| 138 size = gfx::Size(kIconSize, kIconSize); |
| 139 icon_ = new views::ImageView(); |
| 140 icon_->SetImageSize(size); |
| 141 icon_->SetImage(*icon); |
| 142 AddChildView(icon_); |
| 143 |
| 144 heading_ = new views::Label(UTF16ToWide( |
| 145 l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING, |
| 146 UTF8ToUTF16(extension->name())))); |
| 147 heading_->SetMultiLine(true); |
| 148 AddChildView(heading_); |
| 149 } |
| 150 |
| 151 ExtensionUninstallDialogDelegateView::~ExtensionUninstallDialogDelegateView() { |
| 152 } |
| 153 |
| 154 std::wstring ExtensionUninstallDialogDelegateView::GetDialogButtonLabel( |
| 155 MessageBoxFlags::DialogButton button) const { |
| 156 switch (button) { |
| 157 case MessageBoxFlags::DIALOGBUTTON_OK: |
| 158 return UTF16ToWide( |
| 159 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON)); |
| 160 case MessageBoxFlags::DIALOGBUTTON_CANCEL: |
| 161 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL)); |
| 162 default: |
| 163 NOTREACHED(); |
| 164 return L""; |
| 165 } |
| 166 } |
| 167 |
| 168 bool ExtensionUninstallDialogDelegateView::Accept() { |
| 169 if (dialog_) |
| 170 dialog_->ExtensionUninstallAccepted(); |
| 171 return true; |
| 172 } |
| 173 |
| 174 bool ExtensionUninstallDialogDelegateView::Cancel() { |
| 175 if (dialog_) |
| 176 dialog_->ExtensionUninstallCanceled(); |
| 177 return true; |
| 178 } |
| 179 |
| 180 std::wstring ExtensionUninstallDialogDelegateView::GetWindowTitle() const { |
| 181 return UTF16ToWide( |
| 182 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE)); |
| 183 } |
| 184 |
| 185 |
| 186 gfx::Size ExtensionUninstallDialogDelegateView::GetPreferredSize() { |
| 187 int width = kRightColumnWidth; |
| 188 width += kIconSize; |
| 189 width += views::kPanelHorizMargin * 3; |
| 190 |
| 191 int height = views::kPanelVertMargin * 2; |
| 192 height += heading_->GetHeightForWidth(kRightColumnWidth); |
| 193 |
| 194 return gfx::Size(width, |
| 195 std::max(height, kIconSize + views::kPanelVertMargin * 2)); |
| 196 } |
| 197 |
| 198 void ExtensionUninstallDialogDelegateView::Layout() { |
| 199 int x = views::kPanelHorizMargin; |
| 200 int y = views::kPanelVertMargin; |
| 201 |
| 202 heading_->SizeToFit(kRightColumnWidth); |
| 203 |
| 204 if (heading_->height() <= kIconSize) { |
| 205 icon_->SetBounds(x, y, kIconSize, kIconSize); |
| 206 x += kIconSize; |
| 207 x += views::kPanelHorizMargin; |
| 208 |
| 209 heading_->SetX(x); |
| 210 heading_->SetY(y + (kIconSize - heading_->height()) / 2); |
| 211 } else { |
| 212 icon_->SetBounds(x, |
| 213 y + (heading_->height() - kIconSize) / 2, |
| 214 kIconSize, |
| 215 kIconSize); |
| 216 x += kIconSize; |
| 217 x += views::kPanelHorizMargin; |
| 218 |
| 219 heading_->SetX(x); |
| 220 heading_->SetY(y); |
| 221 } |
| 222 } |
| 223 |
138 } // namespace | 224 } // namespace |
139 | 225 |
140 // static | 226 // static |
141 void ExtensionUninstallDialog::Show( | 227 void ExtensionUninstallUI::ShowDialog() { |
142 Profile* profile, | 228 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); |
143 ExtensionUninstallDialog::Delegate* delegate, | |
144 const Extension* extension, | |
145 SkBitmap* icon) { | |
146 Browser* browser = BrowserList::GetLastActiveWithProfile(profile); | |
147 if (!browser) { | 229 if (!browser) { |
148 delegate->ExtensionDialogCanceled(); | 230 delegate_->ExtensionUninstallCanceled(); |
149 return; | 231 return; |
150 } | 232 } |
151 | 233 |
152 BrowserWindow* window = browser->window(); | 234 BrowserWindow* window = browser->window(); |
153 if (!window) { | 235 if (!window) { |
154 delegate->ExtensionDialogCanceled(); | 236 delegate_->ExtensionUninstallCanceled(); |
155 return; | 237 return; |
156 } | 238 } |
157 | 239 |
158 browser::CreateViewsWindow(window->GetNativeHandle(), | 240 ExtensionUninstallDialogViews* dialog = new ExtensionUninstallDialogViews( |
159 new ExtensionUninstallDialogView(delegate, extension, icon))->Show(); | 241 profile_, delegate_, extension_, &icon_); |
160 } | 242 browser::CreateViewsWindow(window->GetNativeHandle(), dialog->view())->Show(); |
| 243 uninstall_dialog_.reset(dialog); |
| 244 } |
OLD | NEW |