| Index: chrome/browser/views/page_info_bubble_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/page_info_bubble_view.cc (revision 57314)
|
| +++ chrome/browser/views/page_info_bubble_view.cc (working copy)
|
| @@ -4,20 +4,26 @@
|
|
|
| #include "chrome/browser/views/page_info_bubble_view.h"
|
|
|
| +#include "app/l10n_util.h"
|
| #include "app/resource_bundle.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/certificate_viewer.h"
|
| #include "chrome/browser/views/frame/browser_view.h"
|
| #include "chrome/browser/views/info_bubble.h"
|
| #include "chrome/browser/views/toolbar_view.h"
|
| +#include "grit/generated_resources.h"
|
| #include "grit/locale_settings.h"
|
| #include "grit/theme_resources.h"
|
| #include "views/controls/image_view.h"
|
| #include "views/controls/label.h"
|
| +#include "views/controls/link.h"
|
| #include "views/controls/separator.h"
|
| #include "views/grid_layout.h"
|
| #include "views/widget/widget_win.h"
|
| #include "views/window/window.h"
|
|
|
| +namespace {
|
| +
|
| // Layout constants.
|
| const int kHGapToBorder = 11;
|
| const int kVGapToImage = 10;
|
| @@ -30,35 +36,37 @@
|
|
|
| // A section contains an image that shows a status (good or bad), a title, an
|
| // optional head-line (in bold) and a description.
|
| -class Section : public views::View {
|
| +class Section : public views::View,
|
| + public views::LinkController {
|
| public:
|
| - Section(bool state,
|
| - const string16& headline,
|
| - const string16& description);
|
| + Section(PageInfoBubbleView* owner,
|
| + const PageInfoModel::SectionInfo& section_info);
|
| virtual ~Section();
|
|
|
| + // views::View methods:
|
| virtual int GetHeightForWidth(int w);
|
| virtual void Layout();
|
|
|
| + // views::LinkController methods:
|
| + virtual void LinkActivated(views::Link* source, int event_flags);
|
| +
|
| private:
|
| // Calculate the layout if |compute_bounds_only|, otherwise does Layout also.
|
| gfx::Size LayoutItems(bool compute_bounds_only, int width);
|
|
|
| - // Whether to show the good/bad icon.
|
| - bool state_;
|
| + // The view that owns this Section object.
|
| + PageInfoBubbleView* owner_;
|
|
|
| - // The first line of the description, show in bold.
|
| - string16 headline_;
|
| + // The information this view represents.
|
| + PageInfoModel::SectionInfo info_;
|
|
|
| - // The description, displayed below the head line.
|
| - string16 description_;
|
| -
|
| static SkBitmap* good_state_icon_;
|
| static SkBitmap* bad_state_icon_;
|
|
|
| views::ImageView* status_image_;
|
| views::Label* headline_label_;
|
| views::Label* description_label_;
|
| + views::Link* link_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Section);
|
| };
|
| @@ -67,15 +75,19 @@
|
| SkBitmap* Section::good_state_icon_ = NULL;
|
| SkBitmap* Section::bad_state_icon_ = NULL;
|
|
|
| +} // namespace
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // PageInfoBubbleView
|
|
|
| -PageInfoBubbleView::PageInfoBubbleView(Profile* profile,
|
| +PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window,
|
| + Profile* profile,
|
| const GURL& url,
|
| const NavigationEntry::SSLStatus& ssl,
|
| bool show_history)
|
| : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl,
|
| show_history, this)),
|
| + parent_window_(parent_window),
|
| cert_id_(ssl.cert_id()),
|
| info_bubble_(NULL) {
|
| LayoutSections();
|
| @@ -84,6 +96,10 @@
|
| PageInfoBubbleView::~PageInfoBubbleView() {
|
| }
|
|
|
| +void PageInfoBubbleView::ShowCertDialog() {
|
| + ShowCertificateViewerByID(parent_window_, cert_id_);
|
| +}
|
| +
|
| void PageInfoBubbleView::LayoutSections() {
|
| // Remove all the existing sections.
|
| RemoveAllChildViews(true);
|
| @@ -104,7 +120,7 @@
|
| layout->StartRow(0, 0);
|
| // TODO(finnur): Remove title from the info struct, since it is
|
| // not used anymore.
|
| - layout->AddView(new Section(info.state, info.head_line, info.description));
|
| + layout->AddView(new Section(this, info));
|
|
|
| // Add separator after all sections except the last.
|
| if (i < count - 1) {
|
| @@ -124,7 +140,7 @@
|
| int count = model_.GetSectionCount();
|
| for (int i = 0; i < count; ++i) {
|
| PageInfoModel::SectionInfo info = model_.GetSectionInfo(i);
|
| - Section section(info.state, info.head_line, info.description);
|
| + Section section(this, info);
|
| size.Enlarge(0, section.GetHeightForWidth(size.width()));
|
| }
|
|
|
| @@ -145,35 +161,43 @@
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // Section
|
|
|
| -Section::Section(bool state,
|
| - const string16& headline,
|
| - const string16& description)
|
| - : state_(state),
|
| - headline_(headline),
|
| - description_(description) {
|
| +Section::Section(PageInfoBubbleView* owner,
|
| + const PageInfoModel::SectionInfo& section_info)
|
| + : owner_(owner),
|
| + info_(section_info) {
|
| if (!good_state_icon_) {
|
| ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| good_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_GOOD);
|
| bad_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_BAD);
|
| }
|
|
|
| - status_image_ = new views::ImageView();
|
| - status_image_->SetImage(state ? good_state_icon_ : bad_state_icon_);
|
| - AddChildView(status_image_);
|
| + if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY ||
|
| + info_.type == PageInfoModel::SECTION_INFO_CONNECTION) {
|
| + status_image_ = new views::ImageView();
|
| + status_image_->SetImage(info_.state ? good_state_icon_ : bad_state_icon_);
|
| + AddChildView(status_image_);
|
| + }
|
|
|
| - headline_label_ = new views::Label(UTF16ToWideHack(headline));
|
| + headline_label_ = new views::Label(UTF16ToWideHack(info_.headline));
|
| headline_label_->SetFont(
|
| headline_label_->font().DeriveFont(0, gfx::Font::BOLD));
|
| headline_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| AddChildView(headline_label_);
|
|
|
| - description_label_ = new views::Label(UTF16ToWideHack(description));
|
| + description_label_ = new views::Label(UTF16ToWideHack(info_.description));
|
| description_label_->SetMultiLine(true);
|
| description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
|
| // Allow linebreaking in the middle of words if necessary, so that extremely
|
| // long hostnames (longer than one line) will still be completely shown.
|
| description_label_->SetAllowCharacterBreak(true);
|
| AddChildView(description_label_);
|
| +
|
| + if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) {
|
| + link_ = new views::Link(
|
| + l10n_util::GetStringUTF16(IDS_PAGEINFO_CERT_INFO_BUTTON));
|
| + link_->SetController(this);
|
| + AddChildView(link_);
|
| + }
|
| }
|
|
|
| Section::~Section() {
|
| @@ -187,14 +211,22 @@
|
| LayoutItems(false, width());
|
| }
|
|
|
| +void Section::LinkActivated(views::Link* source, int event_flags) {
|
| + owner_->ShowCertDialog();
|
| +}
|
| +
|
| gfx::Size Section::LayoutItems(bool compute_bounds_only, int width) {
|
| int x = kHGapToBorder;
|
| int y = kVGapToImage;
|
|
|
| // Layout the image, head-line and description.
|
| - gfx::Size size = status_image_->GetPreferredSize();
|
| - if (!compute_bounds_only)
|
| - status_image_->SetBounds(x, y, size.width(), size.height());
|
| + gfx::Size size;
|
| + if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY ||
|
| + info_.type == PageInfoModel::SECTION_INFO_CONNECTION) {
|
| + size = status_image_->GetPreferredSize();
|
| + if (!compute_bounds_only)
|
| + status_image_->SetBounds(x, y, size.width(), size.height());
|
| + }
|
| int image_height = y + size.height();
|
| x += size.width() + kHGapImageToDescription;
|
| int w = width - x - kTextPaddingRight;
|
| @@ -217,6 +249,11 @@
|
| if (!compute_bounds_only)
|
| description_label_->SetBounds(x, y, 0, 0);
|
| }
|
| + if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) {
|
| + size = link_->GetPreferredSize();
|
| + link_->SetBounds(x, y, size.width(), size.height());
|
| + y += size.height();
|
| + }
|
|
|
| // Make sure the image is not truncated if the text doesn't contain much.
|
| y = std::max(y, image_height);
|
| @@ -242,7 +279,7 @@
|
|
|
| // Show the bubble.
|
| PageInfoBubbleView* page_info_bubble =
|
| - new PageInfoBubbleView(profile, url, ssl, show_history);
|
| + new PageInfoBubbleView(parent, profile, url, ssl, show_history);
|
| InfoBubble* info_bubble =
|
| InfoBubble::Show(browser_view->GetWidget(), bounds,
|
| BubbleBorder::TOP_LEFT,
|
|
|