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 content_left_margin = |
+ kBubblePadding + icon_size.width() + kIconHorizontalSpacing; |
+ int content_width = canvas.width() - kBubblePadding - content_left_margin; |
+ |
+ gfx::Size pref_size = title_->GetPreferredSize(); |
+ title_->SetBounds(content_left_margin, |
+ kBubblePadding, |
+ content_width, |
+ pref_size.height()); |
+ |
+ int next_y = title_->bounds().bottom() + kControlVerticalSpacing; |
+ |
+ pref_size = install_date_->GetPreferredSize(); |
+ install_date_->SetBounds(content_left_margin, |
+ next_y, |
+ content_width, |
+ pref_size.height()); |
+ |
+ next_y = install_date_->bounds().bottom() + kControlVerticalSpacing; |
+ |
+ pref_size = description_->GetPreferredSize(); |
+ description_->SetBounds( |
+ content_left_margin, |
+ next_y, |
+ content_width, |
+ pref_size.height() + kDescriptionVertialSpacing * 2); |
+ |
+ next_y = description_->bounds().bottom() + kControlVerticalSpacing; |
+ |
+ pref_size = uninstall_link_->GetPreferredSize(); |
+ uninstall_link_->SetBounds(content_left_margin, |
+ next_y, |
+ pref_size.width(), |
+ pref_size.height()); |
+ |
+ pref_size = report_abuse_link_->GetPreferredSize(); |
+ report_abuse_link_->SetBounds( |
+ content_left_margin + 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 |