OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/views/page_info_bubble_view.h" | 5 #include "chrome/browser/views/page_info_bubble_view.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/browser_list.h" |
10 #include "chrome/browser/certificate_viewer.h" | 11 #include "chrome/browser/certificate_viewer.h" |
11 #include "chrome/browser/views/frame/browser_view.h" | 12 #include "chrome/browser/views/frame/browser_view.h" |
12 #include "chrome/browser/views/info_bubble.h" | 13 #include "chrome/browser/views/info_bubble.h" |
13 #include "chrome/browser/views/toolbar_view.h" | 14 #include "chrome/browser/views/toolbar_view.h" |
14 #include "grit/generated_resources.h" | 15 #include "grit/generated_resources.h" |
15 #include "grit/locale_settings.h" | 16 #include "grit/locale_settings.h" |
16 #include "grit/theme_resources.h" | 17 #include "grit/theme_resources.h" |
17 #include "views/controls/image_view.h" | 18 #include "views/controls/image_view.h" |
18 #include "views/controls/label.h" | 19 #include "views/controls/label.h" |
19 #include "views/controls/link.h" | |
20 #include "views/controls/separator.h" | 20 #include "views/controls/separator.h" |
21 #include "views/grid_layout.h" | 21 #include "views/grid_layout.h" |
22 #include "views/widget/widget.h" | 22 #include "views/widget/widget.h" |
23 #include "views/window/window.h" | 23 #include "views/window/window.h" |
24 | 24 |
25 namespace { | 25 namespace { |
26 | 26 |
27 // Layout constants. | 27 // Layout constants. |
28 const int kHGapToBorder = 11; | 28 const int kHGapToBorder = 11; |
29 const int kVGapToImage = 10; | 29 const int kVGapToImage = 10; |
30 const int kVGapToHeadline = 7; | 30 const int kVGapToHeadline = 7; |
31 const int kHGapImageToDescription = 6; | 31 const int kHGapImageToDescription = 6; |
32 const int kTextPaddingRight = 10; | 32 const int kTextPaddingRight = 10; |
33 const int kPaddingBelowSeparator = 4; | 33 const int kPaddingBelowSeparator = 4; |
34 const int kPaddingAboveSeparator = 13; | 34 const int kPaddingAboveSeparator = 13; |
35 const int kIconOffset = 28; | 35 const int kIconOffset = 28; |
36 | 36 |
37 // A section contains an image that shows a status (good or bad), a title, an | 37 // A section contains an image that shows a status (good or bad), a title, an |
38 // optional head-line (in bold) and a description. | 38 // optional head-line (in bold) and a description. |
39 class Section : public views::View, | 39 class Section : public views::View, |
40 public views::LinkController { | 40 public views::LinkController { |
41 public: | 41 public: |
42 Section(PageInfoBubbleView* owner, | 42 Section(PageInfoBubbleView* owner, |
43 const PageInfoModel::SectionInfo& section_info); | 43 const PageInfoModel::SectionInfo& section_info, |
| 44 bool show_cert); |
44 virtual ~Section(); | 45 virtual ~Section(); |
45 | 46 |
46 // views::View methods: | 47 // views::View methods: |
47 virtual int GetHeightForWidth(int w); | 48 virtual int GetHeightForWidth(int w); |
48 virtual void Layout(); | 49 virtual void Layout(); |
49 | 50 |
50 // views::LinkController methods: | 51 // views::LinkController methods: |
51 virtual void LinkActivated(views::Link* source, int event_flags); | 52 virtual void LinkActivated(views::Link* source, int event_flags); |
52 | 53 |
53 private: | 54 private: |
(...skipping 30 matching lines...) Expand all Loading... |
84 | 85 |
85 PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, | 86 PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, |
86 Profile* profile, | 87 Profile* profile, |
87 const GURL& url, | 88 const GURL& url, |
88 const NavigationEntry::SSLStatus& ssl, | 89 const NavigationEntry::SSLStatus& ssl, |
89 bool show_history) | 90 bool show_history) |
90 : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, | 91 : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, |
91 show_history, this)), | 92 show_history, this)), |
92 parent_window_(parent_window), | 93 parent_window_(parent_window), |
93 cert_id_(ssl.cert_id()), | 94 cert_id_(ssl.cert_id()), |
94 info_bubble_(NULL) { | 95 info_bubble_(NULL), |
| 96 help_center_link_(NULL) { |
95 LayoutSections(); | 97 LayoutSections(); |
96 } | 98 } |
97 | 99 |
98 PageInfoBubbleView::~PageInfoBubbleView() { | 100 PageInfoBubbleView::~PageInfoBubbleView() { |
99 } | 101 } |
100 | 102 |
101 void PageInfoBubbleView::ShowCertDialog() { | 103 void PageInfoBubbleView::ShowCertDialog() { |
102 ShowCertificateViewerByID(parent_window_, cert_id_); | 104 ShowCertificateViewerByID(parent_window_, cert_id_); |
103 } | 105 } |
104 | 106 |
(...skipping 10 matching lines...) Expand all Loading... |
115 views::GridLayout::USE_PREF, // Size type. | 117 views::GridLayout::USE_PREF, // Size type. |
116 0, // Ignored for USE_PREF. | 118 0, // Ignored for USE_PREF. |
117 0); // Minimum size. | 119 0); // Minimum size. |
118 | 120 |
119 int count = model_.GetSectionCount(); | 121 int count = model_.GetSectionCount(); |
120 for (int i = 0; i < count; ++i) { | 122 for (int i = 0; i < count; ++i) { |
121 PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); | 123 PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); |
122 layout->StartRow(0, 0); | 124 layout->StartRow(0, 0); |
123 // TODO(finnur): Remove title from the info struct, since it is | 125 // TODO(finnur): Remove title from the info struct, since it is |
124 // not used anymore. | 126 // not used anymore. |
125 layout->AddView(new Section(this, info)); | 127 layout->AddView(new Section(this, info, cert_id_ > 0)); |
126 | 128 |
127 // Add separator after all sections except the last. | 129 // Add separator after all sections. |
128 if (i < count - 1) { | 130 layout->AddPaddingRow(0, kPaddingAboveSeparator); |
129 layout->AddPaddingRow(0, kPaddingAboveSeparator); | 131 layout->StartRow(0, 0); |
130 layout->StartRow(0, 0); | 132 layout->AddView(new views::Separator()); |
131 layout->AddView(new views::Separator()); | 133 layout->AddPaddingRow(0, kPaddingBelowSeparator); |
132 layout->AddPaddingRow(0, kPaddingBelowSeparator); | |
133 } | |
134 } | 134 } |
| 135 |
| 136 // Then add the help center link at the bottom. |
| 137 layout->StartRow(0, 0); |
| 138 help_center_link_ = |
| 139 new views::Link(l10n_util::GetString(IDS_PAGE_INFO_HELP_CENTER_LINK)); |
| 140 help_center_link_->SetController(this); |
| 141 layout->AddView(help_center_link_); |
135 } | 142 } |
136 | 143 |
137 gfx::Size PageInfoBubbleView::GetPreferredSize() { | 144 gfx::Size PageInfoBubbleView::GetPreferredSize() { |
138 gfx::Size size(views::Window::GetLocalizedContentsSize( | 145 gfx::Size size(views::Window::GetLocalizedContentsSize( |
139 IDS_PAGEINFOBUBBLE_WIDTH_CHARS, IDS_PAGEINFOBUBBLE_HEIGHT_LINES)); | 146 IDS_PAGEINFOBUBBLE_WIDTH_CHARS, IDS_PAGEINFOBUBBLE_HEIGHT_LINES)); |
140 size.set_height(0); | 147 size.set_height(0); |
141 | 148 |
142 int count = model_.GetSectionCount(); | 149 int count = model_.GetSectionCount(); |
143 for (int i = 0; i < count; ++i) { | 150 for (int i = 0; i < count; ++i) { |
144 PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); | 151 PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); |
145 Section section(this, info); | 152 Section section(this, info, cert_id_ > 0); |
146 size.Enlarge(0, section.GetHeightForWidth(size.width())); | 153 size.Enlarge(0, section.GetHeightForWidth(size.width())); |
147 } | 154 } |
148 | 155 |
149 // Account for the separators and padding. | 156 // Calculate how much space the separators take up (with padding). |
150 views::Separator separator; | 157 views::Separator separator; |
151 gfx::Size separator_size = separator.GetPreferredSize(); | 158 gfx::Size separator_size = separator.GetPreferredSize(); |
152 size.Enlarge(0, (count - 1) * (separator_size.height() + | 159 gfx::Size separator_plus_padding(0, separator_size.height() + |
153 kPaddingAboveSeparator + | 160 kPaddingAboveSeparator + |
154 kPaddingBelowSeparator)); | 161 kPaddingBelowSeparator); |
| 162 |
| 163 // Account for the separators and padding within sections. |
| 164 size.Enlarge(0, (count - 1) * separator_plus_padding.height()); |
| 165 |
| 166 // Account for the Help Center link and the separator above it. |
| 167 gfx::Size link_size = help_center_link_->GetPreferredSize(); |
| 168 size.Enlarge(0, separator_plus_padding.height() + |
| 169 link_size.height()); |
| 170 |
155 return size; | 171 return size; |
156 } | 172 } |
157 | 173 |
158 void PageInfoBubbleView::ModelChanged() { | 174 void PageInfoBubbleView::ModelChanged() { |
159 LayoutSections(); | 175 LayoutSections(); |
160 info_bubble_->SizeToContents(); | 176 info_bubble_->SizeToContents(); |
161 } | 177 } |
162 | 178 |
| 179 void PageInfoBubbleView::LinkActivated(views::Link* source, int event_flags) { |
| 180 GURL url = GURL(l10n_util::GetStringUTF16(IDS_PAGE_INFO_HELP_CENTER)); |
| 181 Browser* browser = BrowserList::GetLastActive(); |
| 182 browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); |
| 183 } |
| 184 |
163 //////////////////////////////////////////////////////////////////////////////// | 185 //////////////////////////////////////////////////////////////////////////////// |
164 // Section | 186 // Section |
165 | 187 |
166 Section::Section(PageInfoBubbleView* owner, | 188 Section::Section(PageInfoBubbleView* owner, |
167 const PageInfoModel::SectionInfo& section_info) | 189 const PageInfoModel::SectionInfo& section_info, |
| 190 bool show_cert) |
168 : owner_(owner), | 191 : owner_(owner), |
169 info_(section_info) { | 192 info_(section_info), |
| 193 link_(NULL) { |
170 if (!good_state_icon_) { | 194 if (!good_state_icon_) { |
171 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 195 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
172 good_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_GOOD); | 196 good_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_GOOD); |
173 bad_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_BAD); | 197 bad_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_BAD); |
174 mixed_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_MIXED); | 198 mixed_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_MIXED); |
175 } | 199 } |
176 | 200 |
177 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY || | 201 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY || |
178 info_.type == PageInfoModel::SECTION_INFO_CONNECTION) { | 202 info_.type == PageInfoModel::SECTION_INFO_CONNECTION) { |
179 status_image_ = new views::ImageView(); | 203 status_image_ = new views::ImageView(); |
(...skipping 21 matching lines...) Expand all Loading... |
201 AddChildView(headline_label_); | 225 AddChildView(headline_label_); |
202 | 226 |
203 description_label_ = new views::Label(UTF16ToWideHack(info_.description)); | 227 description_label_ = new views::Label(UTF16ToWideHack(info_.description)); |
204 description_label_->SetMultiLine(true); | 228 description_label_->SetMultiLine(true); |
205 description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | 229 description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
206 // Allow linebreaking in the middle of words if necessary, so that extremely | 230 // Allow linebreaking in the middle of words if necessary, so that extremely |
207 // long hostnames (longer than one line) will still be completely shown. | 231 // long hostnames (longer than one line) will still be completely shown. |
208 description_label_->SetAllowCharacterBreak(true); | 232 description_label_->SetAllowCharacterBreak(true); |
209 AddChildView(description_label_); | 233 AddChildView(description_label_); |
210 | 234 |
211 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) { | 235 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && show_cert) { |
212 link_ = new views::Link( | 236 link_ = new views::Link( |
213 l10n_util::GetString(IDS_PAGEINFO_CERT_INFO_BUTTON)); | 237 l10n_util::GetString(IDS_PAGEINFO_CERT_INFO_BUTTON)); |
214 link_->SetController(this); | 238 link_->SetController(this); |
215 AddChildView(link_); | 239 AddChildView(link_); |
216 } | 240 } |
217 } | 241 } |
218 | 242 |
219 Section::~Section() { | 243 Section::~Section() { |
220 } | 244 } |
221 | 245 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 } | 282 } |
259 if (w > 0) { | 283 if (w > 0) { |
260 int height = description_label_->GetHeightForWidth(w); | 284 int height = description_label_->GetHeightForWidth(w); |
261 if (!compute_bounds_only) | 285 if (!compute_bounds_only) |
262 description_label_->SetBounds(x, y, w, height); | 286 description_label_->SetBounds(x, y, w, height); |
263 y += height; | 287 y += height; |
264 } else { | 288 } else { |
265 if (!compute_bounds_only) | 289 if (!compute_bounds_only) |
266 description_label_->SetBounds(x, y, 0, 0); | 290 description_label_->SetBounds(x, y, 0, 0); |
267 } | 291 } |
268 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) { | 292 if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && link_) { |
269 size = link_->GetPreferredSize(); | 293 size = link_->GetPreferredSize(); |
270 link_->SetBounds(x, y, size.width(), size.height()); | 294 link_->SetBounds(x, y, size.width(), size.height()); |
271 y += size.height(); | 295 y += size.height(); |
272 } | 296 } |
273 | 297 |
274 // Make sure the image is not truncated if the text doesn't contain much. | 298 // Make sure the image is not truncated if the text doesn't contain much. |
275 y = std::max(y, image_height); | 299 y = std::max(y, image_height); |
276 return gfx::Size(width, y); | 300 return gfx::Size(width, y); |
277 } | 301 } |
278 | 302 |
(...skipping 18 matching lines...) Expand all Loading... |
297 PageInfoBubbleView* page_info_bubble = | 321 PageInfoBubbleView* page_info_bubble = |
298 new PageInfoBubbleView(parent, profile, url, ssl, show_history); | 322 new PageInfoBubbleView(parent, profile, url, ssl, show_history); |
299 InfoBubble* info_bubble = | 323 InfoBubble* info_bubble = |
300 InfoBubble::Show(browser_view->GetWidget(), bounds, | 324 InfoBubble::Show(browser_view->GetWidget(), bounds, |
301 BubbleBorder::TOP_LEFT, | 325 BubbleBorder::TOP_LEFT, |
302 page_info_bubble, page_info_bubble); | 326 page_info_bubble, page_info_bubble); |
303 page_info_bubble->set_info_bubble(info_bubble); | 327 page_info_bubble->set_info_bubble(info_bubble); |
304 } | 328 } |
305 | 329 |
306 } | 330 } |
OLD | NEW |