15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_service.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 15e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch#include "ui/aura/window_tracker.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRightColumnWidth = 210; 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const int kIconSize = 64; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionUninstallDialogDelegateView; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Views implementation of the uninstall dialog. 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ExtensionUninstallDialogViews 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : public extensions::ExtensionUninstallDialog { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionUninstallDialogViews( 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Profile* profile, 39e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch aura::Window* parent, 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::ExtensionUninstallDialog::Delegate* delegate); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionUninstallDialogViews(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Called when the ExtensionUninstallDialogDelegate has been destroyed to make 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // sure we invalidate pointers. 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void DialogDelegateDestroyed() { view_ = NULL; } 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forwards the accept and cancels to the delegate. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExtensionUninstallAccepted(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExtensionUninstallCanceled(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Show() OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionUninstallDialogDelegateView* view_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch // The dialog's parent window. 57e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch aura::Window* parent_; 58e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch 59e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch // Tracks whether |parent_| got destroyed. 60e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch aura::WindowTracker parent_window_tracker_; 61e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogViews); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The dialog's view, owned by the views framework. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionUninstallDialogDelegateView : public views::DialogDelegateView { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionUninstallDialogDelegateView( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionUninstallDialogViews* dialog_view, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension, 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* triggering_extension, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::ImageSkia* image); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionUninstallDialogDelegateView(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the ExtensionUninstallDialog has been destroyed to make sure 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we invalidate pointers. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DialogDestroyed() { dialog_ = NULL; } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::DialogDelegate: 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetDialogButtonLabel( 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::DialogButton button) const OVERRIDE; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetDefaultDialogButton() const OVERRIDE { 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Default to accept when triggered via chrome://extensions page. 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return triggered_by_extension_ ? 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::DIALOG_BUTTON_CANCEL : ui::DIALOG_BUTTON_OK; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Accept() OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Cancel() OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::WidgetDelegate: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ui::ModalType GetModalType() const OVERRIDE { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::MODAL_TYPE_WINDOW; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetWindowTitle() const OVERRIDE; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::View: 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionUninstallDialogViews* dialog_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageView* icon_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* heading_; 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool triggered_by_extension_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogDelegateView); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogViews::ExtensionUninstallDialogViews( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 113e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch aura::Window* parent, 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::ExtensionUninstallDialog::Delegate* delegate) 115e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch : extensions::ExtensionUninstallDialog(profile, delegate), 116e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch view_(NULL), 117e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch parent_(parent) { 118e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch if (parent_) 119e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch parent_window_tracker_.Add(parent_); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogViews::~ExtensionUninstallDialogViews() { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the widget (the views framework will delete view_). 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->DialogDestroyed(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->GetWidget()->CloseNow(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogViews::Show() { 131e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch if (parent_ && !parent_window_tracker_.Contains(parent_)) { 132e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch delegate_->ExtensionUninstallCanceled(); 133e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch return; 134e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch } 135e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_ = new ExtensionUninstallDialogDelegateView( 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this, extension_, triggering_extension_, &icon_); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateBrowserModalDialogViews(view_, parent_)->Show(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogViews::ExtensionUninstallAccepted() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The widget gets destroyed when the dialog is accepted. 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view_->DialogDestroyed(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = NULL; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ExtensionUninstallAccepted(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogViews::ExtensionUninstallCanceled() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The widget gets destroyed when the dialog is canceled. 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view_->DialogDestroyed(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_ = NULL; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ExtensionUninstallCanceled(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogDelegateView::ExtensionUninstallDialogDelegateView( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionUninstallDialogViews* dialog_view, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension, 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* triggering_extension, 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::ImageSkia* image) 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : dialog_(dialog_view), 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch triggered_by_extension_(triggering_extension != NULL) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale down to icon size, but allow smaller icons (don't scale up). 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Size size(image->width(), image->height()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size.width() > kIconSize || size.height() > kIconSize) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = gfx::Size(kIconSize, kIconSize); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = new views::ImageView(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetImageSize(size); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) icon_->SetImage(*image); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon_); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) heading_ = new views::Label(base::UTF8ToUTF16(dialog_->GetHeadingText())); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SetMultiLine(true); 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) heading_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(heading_); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionUninstallDialogDelegateView::~ExtensionUninstallDialogDelegateView() { 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // If we're here, 2 things could have happened. Either the user closed the 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // dialog nicely and one of ExtensionUninstallAccepted or 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // ExtensionUninstallCanceled has been called (in which case dialog_ will be 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // NULL), *or* neither of them have been called and we are being forced closed 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // by our parent widget. In this case, we need to make sure to notify dialog_ 1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // not to call us again, since we're about to be freed by the Widget 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // framework. 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (dialog_) 1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dialog_->DialogDelegateDestroyed(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 ExtensionUninstallDialogDelegateView::GetDialogButtonLabel( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DialogButton button) const { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16((button == ui::DIALOG_BUTTON_OK) ? 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON : IDS_CANCEL); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionUninstallDialogDelegateView::Accept() { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dialog_) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_->ExtensionUninstallAccepted(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionUninstallDialogDelegateView::Cancel() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dialog_) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_->ExtensionUninstallCanceled(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 ExtensionUninstallDialogDelegateView::GetWindowTitle() const { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ExtensionUninstallDialogDelegateView::GetPreferredSize() const { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = kRightColumnWidth; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width += kIconSize; 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) width += views::kButtonHEdgeMarginNew * 2; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) width += views::kRelatedControlHorizontalSpacing; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = views::kPanelVertMargin * 2; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height += heading_->GetHeightForWidth(kRightColumnWidth); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(width, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(height, kIconSize + views::kPanelVertMargin * 2)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionUninstallDialogDelegateView::Layout() { 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int x = views::kButtonHEdgeMarginNew; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y = views::kPanelVertMargin; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SizeToFit(kRightColumnWidth); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (heading_->height() <= kIconSize) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetBounds(x, y, kIconSize, kIconSize); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += kIconSize; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x += views::kRelatedControlHorizontalSpacing; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SetX(x); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SetY(y + (kIconSize - heading_->height()) / 2); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetBounds(x, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) y + (heading_->height() - kIconSize) / 2, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kIconSize, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kIconSize); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x += kIconSize; 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x += views::kRelatedControlHorizontalSpacing; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SetX(x); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heading_->SetY(y); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)extensions::ExtensionUninstallDialog* 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)extensions::ExtensionUninstallDialog::Create(Profile* profile, 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::NativeWindow parent, 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Delegate* delegate) { 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return new ExtensionUninstallDialogViews(profile, parent, delegate); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 259