diff options
Diffstat (limited to 'chrome/browser/ui/views/extensions/extension_install_prompt.cc')
-rw-r--r-- | chrome/browser/ui/views/extensions/extension_install_prompt.cc | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/extensions/extension_install_prompt.cc b/chrome/browser/ui/views/extensions/extension_install_prompt.cc new file mode 100644 index 0000000..1e1ea37 --- /dev/null +++ b/chrome/browser/ui/views/extensions/extension_install_prompt.cc @@ -0,0 +1,166 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "app/l10n_util.h" +#include "base/file_util.h" +#include "base/string_util.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/browser_window.h" +#include "chrome/browser/extensions/extension_install_ui.h" +#include "chrome/browser/views/window.h" +#include "chrome/common/extensions/extension.h" +#include "grit/generated_resources.h" +#include "views/controls/button/checkbox.h" +#include "views/controls/image_view.h" +#include "views/controls/label.h" +#include "views/controls/link.h" +#include "views/standard_layout.h" +#include "views/view.h" +#include "views/window/dialog_delegate.h" +#include "views/window/window.h" + +#if defined(OS_WIN) +#include "app/win_util.h" +#endif + +class Profile; + +namespace { + +const int kRightColumnWidth = 210; +const int kIconSize = 69; + +// Implements the extension installation prompt for Windows. +class InstallDialogContent : public views::View, public views::DialogDelegate { + public: + InstallDialogContent(ExtensionInstallUI::Delegate* delegate, + const Extension* extension, + SkBitmap* icon, + ExtensionInstallUI::PromptType type) + : delegate_(delegate), icon_(NULL), type_(type) { + // Scale down to icon size, but allow smaller icons (don't scale up). + gfx::Size size(icon->width(), icon->height()); + if (size.width() > kIconSize || size.height() > kIconSize) + size = gfx::Size(kIconSize, kIconSize); + icon_ = new views::ImageView(); + icon_->SetImageSize(size); + icon_->SetImage(*icon); + AddChildView(icon_); + + heading_ = new views::Label( + l10n_util::GetStringF(ExtensionInstallUI::kHeadingIds[type_], + UTF8ToWide(extension->name()))); + heading_->SetMultiLine(true); + heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + AddChildView(heading_); + } + + private: + // DialogDelegate + virtual std::wstring GetDialogButtonLabel( + MessageBoxFlags::DialogButton button) const { + switch (button) { + case MessageBoxFlags::DIALOGBUTTON_OK: + return l10n_util::GetString(ExtensionInstallUI::kButtonIds[type_]); + case MessageBoxFlags::DIALOGBUTTON_CANCEL: + return l10n_util::GetString(IDS_CANCEL); + default: + NOTREACHED(); + return L""; + } + } + + virtual int GetDefaultDialogButton() const { + return MessageBoxFlags::DIALOGBUTTON_CANCEL; + } + + virtual bool Accept() { + delegate_->InstallUIProceed(); + return true; + } + + virtual bool Cancel() { + delegate_->InstallUIAbort(); + return true; + } + + // WindowDelegate + virtual bool IsModal() const { return true; } + virtual std::wstring GetWindowTitle() const { + return l10n_util::GetString(ExtensionInstallUI::kTitleIds[type_]); + } + virtual views::View* GetContentsView() { return this; } + + // View + virtual gfx::Size GetPreferredSize() { + int width = kRightColumnWidth; + width += kIconSize; + width += kPanelHorizMargin * 3; + + int height = kPanelVertMargin * 2; + height += heading_->GetHeightForWidth(kRightColumnWidth); + + return gfx::Size(width, std::max(height, kIconSize + kPanelVertMargin * 2)); + } + + virtual void Layout() { + int x = kPanelHorizMargin; + int y = kPanelVertMargin; + + heading_->SizeToFit(kRightColumnWidth); + + if (heading_->height() <= kIconSize) { + icon_->SetBounds(x, y, kIconSize, kIconSize); + x += kIconSize; + x += kPanelHorizMargin; + + heading_->SetX(x); + heading_->SetY(y + (kIconSize - heading_->height()) / 2); + } else { + icon_->SetBounds(x, + y + (heading_->height() - kIconSize) / 2, + kIconSize, + kIconSize); + x += kIconSize; + x += kPanelHorizMargin; + + heading_->SetX(x); + heading_->SetY(y); + } + } + + ExtensionInstallUI::Delegate* delegate_; + views::ImageView* icon_; + views::Label* heading_; + ExtensionInstallUI::PromptType type_; + + DISALLOW_COPY_AND_ASSIGN(InstallDialogContent); +}; + +} // namespace + +// static +void ExtensionInstallUI::ShowExtensionInstallUIPromptImpl( + Profile* profile, + Delegate* delegate, + const Extension* extension, + SkBitmap* icon, + PromptType type) { + Browser* browser = BrowserList::GetLastActiveWithProfile(profile); + if (!browser) { + delegate->InstallUIAbort(); + return; + } + + BrowserWindow* window = browser->window(); + if (!window) { + delegate->InstallUIAbort(); + return; + } + + browser::CreateViewsWindow(window->GetNativeHandle(), gfx::Rect(), + new InstallDialogContent(delegate, extension, icon, + type))->Show(); +} |