Chromium Code Reviews| Index: chrome/browser/ui/panels/about_panel_bubble.cc |
| =================================================================== |
| --- chrome/browser/ui/panels/about_panel_bubble.cc (revision 0) |
| +++ chrome/browser/ui/panels/about_panel_bubble.cc (revision 0) |
| @@ -0,0 +1,213 @@ |
| +// Copyright (c) 2011 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 "chrome/browser/ui/panels/about_panel_bubble.h" |
| + |
| +#include "base/i18n/time_formatting.h" |
| +#include "base/logging.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "chrome/browser/extensions/extension_prefs.h" |
| +#include "chrome/browser/extensions/extension_service.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/web_applications/web_app.h" |
| +#include "chrome/common/extensions/extension.h" |
| +#include "grit/generated_resources.h" |
| +#include "grit/locale_settings.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| +#include "ui/base/resource/resource_bundle.h" |
| +#include "views/controls/image_view.h" |
| +#include "views/controls/label.h" |
| +#include "views/controls/link.h" |
| +#include "views/controls/textfield/textfield.h" |
| +#include "views/window/window.h" |
| + |
| +namespace { |
| + |
| +// Extra padding to put around content over what the InfoBubble provides. |
| +const int kBubblePadding = 4; |
| + |
| +// Horizontal spacing between the icon and the contents. |
| +const int kIconHorizontalSpacing = 4; |
| + |
| +// Vertical spacing between two controls. |
| +const int kControlVerticalSpacing = 10; |
| + |
| +// Horizontal spacing between the text and the left/right of a description. |
| +const int kDescriptionHorizontalSpacing = 6; |
| + |
| +// Vertical spacing between the text and the top/bottom of a description. |
| +const int kDescriptionVertialSpacing = 4; |
| + |
| +// Horizontal spacing between two links. |
| +const int kLinksHorizontalSpacing = 20; |
| + |
| +// Text color of a description. |
| +const SkColor kDescriptionTextColor = SK_ColorBLACK; |
| + |
| +// Background color of a description. |
| +const SkColor kDescriptionBackgroundColor = 0xFFE8E8EE; |
| + |
| +} |
| + |
| +// AboutPanelBubbleView -------------------------------------------------------- |
| + |
| +AboutPanelBubble::AboutPanelBubbleView::AboutPanelBubbleView( |
| + SkBitmap icon, Browser* browser, const Extension* extension) |
| + : icon_(NULL), |
| + title_(NULL), |
| + install_date_(NULL), |
| + description_(NULL), |
| + uninstall_link_(NULL), |
| + report_abuse_link_(NULL) { |
| + const gfx::Font& font = |
| + ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont); |
| + |
| + icon_ = new views::ImageView(); |
| + icon_->SetImage(icon); |
| + AddChildView(icon_); |
| + |
| + title_ = new views::Label(UTF8ToWide(extension->name())); |
| + title_->SetFont(font.DeriveFont(0, gfx::Font::BOLD)); |
| + title_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| + AddChildView(title_); |
| + |
| + base::Time install_time = browser->GetProfile()->GetExtensionService()-> |
| + extension_prefs()->GetInstallTime(extension->id()); |
| + install_date_ = new views::Label(UTF16ToWide( |
| + l10n_util::GetStringFUTF16( |
| + IDS_ABOUT_PANEL_BUBBLE_EXTENSION_INSTALL_DATE, |
| + base::TimeFormatFriendlyDate(install_time)))); |
| + install_date_->SetMultiLine(true); |
| + install_date_->SetFont(font); |
| + install_date_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| + install_date_->SizeToFit(GetPreferredSize().width() - kBubblePadding * 2); |
| + AddChildView(install_date_); |
| + |
| + description_ = new views::Textfield(views::Textfield::STYLE_MULTILINE); |
| + description_->SetText(UTF8ToUTF16(extension->description())); |
| + description_->SetHeightInLines(2); |
| + description_->SetHorizontalMargins(kDescriptionHorizontalSpacing, |
| + kDescriptionHorizontalSpacing); |
| + description_->SetVerticalMargins(kDescriptionVertialSpacing, |
| + kDescriptionVertialSpacing); |
| + description_->SetFont(font); |
| + description_->SetTextColor(kDescriptionTextColor); |
| + description_->SetBackgroundColor(kDescriptionBackgroundColor); |
| + description_->RemoveBorder(); |
| + description_->SetReadOnly(true); |
| + AddChildView(description_); |
| + |
| + uninstall_link_ = new views::Link(UTF16ToWide( |
| + l10n_util::GetStringFUTF16(IDS_ABOUT_PANEL_BUBBLE_UNINSTALL_EXTENSION, |
| + UTF8ToUTF16(extension->name())))); |
| + AddChildView(uninstall_link_); |
| + |
| + report_abuse_link_ = new views::Link(UTF16ToWide( |
| + l10n_util::GetStringUTF16(IDS_ABOUT_PANEL_BUBBLE_REPORT_ABUSE))); |
| + AddChildView(report_abuse_link_); |
| +} |
| + |
| +void AboutPanelBubble::AboutPanelBubbleView::Layout() { |
| + gfx::Size icon_size = icon_->GetPreferredSize(); |
| + icon_->SetBounds(kBubblePadding, |
| + kBubblePadding, |
| + icon_size.width(), |
| + icon_size.height()); |
| + |
| + gfx::Size canvas = GetPreferredSize(); |
| + int start_x = kBubblePadding + icon_size.width() + kIconHorizontalSpacing; |
| + int width = canvas.width() - kBubblePadding * 2 - icon_size.width() - |
|
jennb
2011/05/24 22:50:29
Is this (canvas.width() - start_x - kBubblePadding
jianli
2011/05/24 23:56:57
Done.
|
| + kIconHorizontalSpacing; |
| + |
| + gfx::Size pref_size = title_->GetPreferredSize(); |
| + title_->SetBounds(start_x, |
| + kBubblePadding, |
| + width, |
| + pref_size.height()); |
| + |
| + int next_y = title_->bounds().bottom() + kControlVerticalSpacing; |
| + |
| + pref_size = install_date_->GetPreferredSize(); |
| + install_date_->SetBounds(start_x, |
| + next_y, |
| + width, |
| + pref_size.height()); |
| + |
| + next_y = install_date_->bounds().bottom() + kControlVerticalSpacing; |
| + |
| + pref_size = description_->GetPreferredSize(); |
| + description_->SetBounds( |
| + start_x, |
| + next_y, |
| + width, |
| + pref_size.height() + kDescriptionVertialSpacing * 2); |
| + |
| + next_y = description_->bounds().bottom() + kControlVerticalSpacing; |
| + |
| + pref_size = uninstall_link_->GetPreferredSize(); |
| + uninstall_link_->SetBounds(start_x, |
| + next_y, |
| + pref_size.width(), |
| + pref_size.height()); |
| + |
| + pref_size = report_abuse_link_->GetPreferredSize(); |
| + report_abuse_link_->SetBounds( |
| + start_x + uninstall_link_->width() + kLinksHorizontalSpacing, |
| + next_y, |
| + pref_size.width(), |
| + pref_size.height()); |
| +} |
| + |
| +gfx::Size AboutPanelBubble::AboutPanelBubbleView::GetPreferredSize() { |
| + return views::Window::GetLocalizedContentsSize( |
| + IDS_ABOUTPANELBUBBLE_WIDTH_CHARS, |
| + IDS_ABOUTPANELBUBBLE_HEIGHT_LINES); |
| +} |
| + |
| +void AboutPanelBubble::AboutPanelBubbleView::LinkClicked(views::Link* source, |
| + int event_flags) { |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +// AboutPanelBubble ------------------------------------------------------------ |
| + |
| +// static |
| +AboutPanelBubble* AboutPanelBubble::Show( |
| + views::Widget* parent, |
| + const gfx::Rect& position_relative_to, |
| + BubbleBorder::ArrowLocation arrow_location, |
| + SkBitmap icon, |
| + Browser* browser) { |
| + // Find the extension. When we create a panel from an extension, the extension |
| + // ID is passed as the app name to the Browser. |
| + ExtensionService* extension_service = |
| + browser->GetProfile()->GetExtensionService(); |
| + const Extension* extension = extension_service->GetExtensionById( |
| + web_app::GetExtensionIdFromApplicationName(browser->app_name()), false); |
| + if (!extension) |
| + return NULL; |
| + |
| + AboutPanelBubble* bubble = new AboutPanelBubble(); |
| + AboutPanelBubbleView* view = new AboutPanelBubbleView( |
| + icon, browser, extension); |
| + bubble->InitBubble( |
| + parent, position_relative_to, arrow_location, view, bubble); |
| + return bubble; |
| +} |
| + |
| +AboutPanelBubble::AboutPanelBubble() { |
| +} |
| + |
| +bool AboutPanelBubble::CloseOnEscape() { |
| + return true; |
| +} |
| + |
| +bool AboutPanelBubble::FadeInOnShow() { |
| + return false; |
| +} |
| + |
| +std::wstring AboutPanelBubble::accessible_name() { |
| + return L"AboutPanelBubble"; |
| +} |
| Property changes on: chrome\browser\ui\panels\about_panel_bubble.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |