Home | History | Annotate | Download | only in extensions
      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
      3 // found in the LICENSE file.
      4 
      5 #include "base/basictypes.h"
      6 #include "base/compiler_specific.h"
      7 #include "base/string_util.h"
      8 #include "base/utf_string_conversions.h"
      9 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "chrome/browser/ui/browser_list.h"
     12 #include "chrome/browser/ui/browser_window.h"
     13 #include "chrome/browser/ui/views/window.h"
     14 #include "chrome/common/extensions/extension.h"
     15 #include "grit/generated_resources.h"
     16 #include "ui/base/l10n/l10n_util.h"
     17 #include "views/controls/button/checkbox.h"
     18 #include "views/controls/image_view.h"
     19 #include "views/controls/label.h"
     20 #include "views/controls/link.h"
     21 #include "views/layout/layout_constants.h"
     22 #include "views/view.h"
     23 #include "views/window/dialog_delegate.h"
     24 #include "views/window/window.h"
     25 
     26 namespace {
     27 
     28 const int kRightColumnWidth = 210;
     29 const int kIconSize = 69;
     30 
     31 class ExtensionUninstallDialogView : public views::View,
     32                                      public views::DialogDelegate {
     33  public:
     34   ExtensionUninstallDialogView(ExtensionUninstallDialog::Delegate* delegate,
     35                                const Extension* extension,
     36                                SkBitmap* icon)
     37         : delegate_(delegate),
     38           icon_(NULL) {
     39     // Scale down to icon size, but allow smaller icons (don't scale up).
     40     gfx::Size size(icon->width(), icon->height());
     41     if (size.width() > kIconSize || size.height() > kIconSize)
     42       size = gfx::Size(kIconSize, kIconSize);
     43     icon_ = new views::ImageView();
     44     icon_->SetImageSize(size);
     45     icon_->SetImage(*icon);
     46     AddChildView(icon_);
     47 
     48     heading_ = new views::Label(UTF16ToWide(
     49         l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING,
     50                                    UTF8ToUTF16(extension->name()))));
     51     heading_->SetMultiLine(true);
     52     heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
     53     AddChildView(heading_);
     54   }
     55 
     56  private:
     57   // views::DialogDelegate:
     58   virtual std::wstring GetDialogButtonLabel(
     59       MessageBoxFlags::DialogButton button) const OVERRIDE {
     60     switch (button) {
     61       case MessageBoxFlags::DIALOGBUTTON_OK:
     62         return UTF16ToWide(
     63             l10n_util::GetStringUTF16(
     64                 IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
     65       case MessageBoxFlags::DIALOGBUTTON_CANCEL:
     66         return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL));
     67       default:
     68         NOTREACHED();
     69         return L"";
     70     }
     71   }
     72 
     73   virtual int GetDefaultDialogButton() const OVERRIDE {
     74     return MessageBoxFlags::DIALOGBUTTON_CANCEL;
     75   }
     76 
     77   virtual bool Accept() OVERRIDE {
     78     delegate_->ExtensionDialogAccepted();
     79     return true;
     80   }
     81 
     82   virtual bool Cancel() OVERRIDE {
     83     delegate_->ExtensionDialogCanceled();
     84     return true;
     85   }
     86 
     87   // views::WindowDelegate:
     88   virtual bool IsModal() const OVERRIDE { return true; }
     89   virtual std::wstring GetWindowTitle() const OVERRIDE {
     90     return UTF16ToWide(
     91         l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE));
     92   }
     93   virtual views::View* GetContentsView() { return this; }
     94 
     95   // views::View:
     96   virtual gfx::Size GetPreferredSize() OVERRIDE {
     97     int width = kRightColumnWidth;
     98     width += kIconSize;
     99     width += views::kPanelHorizMargin * 3;
    100 
    101     int height = views::kPanelVertMargin * 2;
    102     height += heading_->GetHeightForWidth(kRightColumnWidth);
    103 
    104     return gfx::Size(width,
    105                      std::max(height, kIconSize + views::kPanelVertMargin * 2));
    106   }
    107 
    108   virtual void Layout() OVERRIDE {
    109     int x = views::kPanelHorizMargin;
    110     int y = views::kPanelVertMargin;
    111 
    112     heading_->SizeToFit(kRightColumnWidth);
    113 
    114     if (heading_->height() <= kIconSize) {
    115       icon_->SetBounds(x, y, kIconSize, kIconSize);
    116       x += kIconSize;
    117       x += views::kPanelHorizMargin;
    118 
    119       heading_->SetX(x);
    120       heading_->SetY(y + (kIconSize - heading_->height()) / 2);
    121     } else {
    122       icon_->SetBounds(x,
    123                        y + (heading_->height() - kIconSize) / 2,
    124                        kIconSize,
    125                        kIconSize);
    126       x += kIconSize;
    127       x += views::kPanelHorizMargin;
    128 
    129       heading_->SetX(x);
    130       heading_->SetY(y);
    131     }
    132   }
    133 
    134   ExtensionUninstallDialog::Delegate* delegate_;
    135   views::ImageView* icon_;
    136   views::Label* heading_;
    137 
    138   DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogView);
    139 };
    140 
    141 }  // namespace
    142 
    143 // static
    144 void ExtensionUninstallDialog::Show(
    145     Profile* profile,
    146     ExtensionUninstallDialog::Delegate* delegate,
    147     const Extension* extension,
    148     SkBitmap* icon) {
    149   Browser* browser = BrowserList::GetLastActiveWithProfile(profile);
    150   if (!browser) {
    151     delegate->ExtensionDialogCanceled();
    152     return;
    153   }
    154 
    155   BrowserWindow* window = browser->window();
    156   if (!window) {
    157     delegate->ExtensionDialogCanceled();
    158     return;
    159   }
    160 
    161   browser::CreateViewsWindow(window->GetNativeHandle(), gfx::Rect(),
    162       new ExtensionUninstallDialogView(delegate, extension, icon))->Show();
    163 }
    164