| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/views/infobars/infobar_view.h" | 5 #include "chrome/browser/ui/views/infobars/infobar_view.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <shellapi.h> | 8 #include <shellapi.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| 11 #include <algorithm> | 11 #include <algorithm> |
| 12 | 12 |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "chrome/browser/infobars/infobar_delegate.h" | |
| 16 #include "chrome/browser/ui/views/infobars/infobar_background.h" | 15 #include "chrome/browser/ui/views/infobars/infobar_background.h" |
| 16 #include "components/infobars/core/infobar_delegate.h" |
| 17 #include "grit/generated_resources.h" | 17 #include "grit/generated_resources.h" |
| 18 #include "grit/theme_resources.h" | 18 #include "grit/theme_resources.h" |
| 19 #include "grit/ui_resources.h" | 19 #include "grit/ui_resources.h" |
| 20 #include "third_party/skia/include/effects/SkGradientShader.h" | 20 #include "third_party/skia/include/effects/SkGradientShader.h" |
| 21 #include "ui/accessibility/ax_view_state.h" | 21 #include "ui/accessibility/ax_view_state.h" |
| 22 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 23 #include "ui/base/resource/resource_bundle.h" |
| 24 #include "ui/gfx/canvas.h" | 24 #include "ui/gfx/canvas.h" |
| 25 #include "ui/gfx/image/image.h" | 25 #include "ui/gfx/image/image.h" |
| 26 #include "ui/views/controls/button/image_button.h" | 26 #include "ui/views/controls/button/image_button.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 50 return label_1->GetPreferredSize().width() > | 50 return label_1->GetPreferredSize().width() > |
| 51 label_2->GetPreferredSize().width(); | 51 label_2->GetPreferredSize().width(); |
| 52 } | 52 } |
| 53 | 53 |
| 54 } // namespace | 54 } // namespace |
| 55 | 55 |
| 56 | 56 |
| 57 // InfoBar -------------------------------------------------------------------- | 57 // InfoBar -------------------------------------------------------------------- |
| 58 | 58 |
| 59 // static | 59 // static |
| 60 const int InfoBar::kSeparatorLineHeight = | 60 const int infobars::InfoBar::kSeparatorLineHeight = |
| 61 views::NonClientFrameView::kClientEdgeThickness; | 61 views::NonClientFrameView::kClientEdgeThickness; |
| 62 const int InfoBar::kDefaultArrowTargetHeight = 9; | 62 const int infobars::InfoBar::kDefaultArrowTargetHeight = 9; |
| 63 const int InfoBar::kMaximumArrowTargetHeight = 24; | 63 const int infobars::InfoBar::kMaximumArrowTargetHeight = 24; |
| 64 const int InfoBar::kDefaultArrowTargetHalfWidth = kDefaultArrowTargetHeight; | 64 const int infobars::InfoBar::kDefaultArrowTargetHalfWidth = |
| 65 const int InfoBar::kMaximumArrowTargetHalfWidth = 14; | 65 kDefaultArrowTargetHeight; |
| 66 const int InfoBar::kDefaultBarTargetHeight = 36; | 66 const int infobars::InfoBar::kMaximumArrowTargetHalfWidth = 14; |
| 67 | 67 const int infobars::InfoBar::kDefaultBarTargetHeight = 36; |
| 68 | 68 |
| 69 // InfoBarView ---------------------------------------------------------------- | 69 // InfoBarView ---------------------------------------------------------------- |
| 70 | 70 |
| 71 // static | 71 // static |
| 72 const int InfoBarView::kButtonButtonSpacing = 10; | 72 const int InfoBarView::kButtonButtonSpacing = 10; |
| 73 const int InfoBarView::kEndOfLabelSpacing = 16; | 73 const int InfoBarView::kEndOfLabelSpacing = 16; |
| 74 const int InfoBarView::kHorizontalPadding = 6; | 74 const int InfoBarView::kHorizontalPadding = 6; |
| 75 const int InfoBarView::kCloseButtonSpacing = kEndOfLabelSpacing; | 75 const int InfoBarView::kCloseButtonSpacing = kEndOfLabelSpacing; |
| 76 | 76 |
| 77 InfoBarView::InfoBarView(scoped_ptr<InfoBarDelegate> delegate) | 77 InfoBarView::InfoBarView(scoped_ptr<infobars::InfoBarDelegate> delegate) |
| 78 : InfoBar(delegate.Pass()), | 78 : infobars::InfoBar(delegate.Pass()), |
| 79 views::ExternalFocusTracker(this, NULL), | 79 views::ExternalFocusTracker(this, NULL), |
| 80 icon_(NULL), | 80 icon_(NULL), |
| 81 close_button_(NULL) { | 81 close_button_(NULL) { |
| 82 set_owned_by_client(); // InfoBar deletes itself at the appropriate time. | 82 set_owned_by_client(); // InfoBar deletes itself at the appropriate time. |
| 83 set_background(new InfoBarBackground(InfoBar::delegate()->GetInfoBarType())); | 83 set_background( |
| 84 new InfoBarBackground(infobars::InfoBar::delegate()->GetInfoBarType())); |
| 84 } | 85 } |
| 85 | 86 |
| 86 InfoBarView::~InfoBarView() { | 87 InfoBarView::~InfoBarView() { |
| 87 // We should have closed any open menus in PlatformSpecificHide(), then | 88 // We should have closed any open menus in PlatformSpecificHide(), then |
| 88 // subclasses' RunMenu() functions should have prevented opening any new ones | 89 // subclasses' RunMenu() functions should have prevented opening any new ones |
| 89 // once we became unowned. | 90 // once we became unowned. |
| 90 DCHECK(!menu_runner_.get()); | 91 DCHECK(!menu_runner_.get()); |
| 91 } | 92 } |
| 92 | 93 |
| 93 views::Label* InfoBarView::CreateLabel(const base::string16& text) const { | 94 views::Label* InfoBarView::CreateLabel(const base::string16& text) const { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 std::sort(labels->begin(), labels->end(), SortLabelsByDecreasingWidth); | 207 std::sort(labels->begin(), labels->end(), SortLabelsByDecreasingWidth); |
| 207 AssignWidthsSorted(labels, available_width); | 208 AssignWidthsSorted(labels, available_width); |
| 208 } | 209 } |
| 209 | 210 |
| 210 void InfoBarView::Layout() { | 211 void InfoBarView::Layout() { |
| 211 // Calculate the fill and stroke paths. We do this here, rather than in | 212 // Calculate the fill and stroke paths. We do this here, rather than in |
| 212 // PlatformSpecificRecalculateHeight(), because this is also reached when our | 213 // PlatformSpecificRecalculateHeight(), because this is also reached when our |
| 213 // width is changed, which affects both paths. | 214 // width is changed, which affects both paths. |
| 214 stroke_path_.rewind(); | 215 stroke_path_.rewind(); |
| 215 fill_path_.rewind(); | 216 fill_path_.rewind(); |
| 216 const InfoBarContainer::Delegate* delegate = container_delegate(); | 217 const infobars::InfoBarContainer::Delegate* delegate = container_delegate(); |
| 217 if (delegate) { | 218 if (delegate) { |
| 218 static_cast<InfoBarBackground*>(background())->set_separator_color( | 219 static_cast<InfoBarBackground*>(background())->set_separator_color( |
| 219 delegate->GetInfoBarSeparatorColor()); | 220 delegate->GetInfoBarSeparatorColor()); |
| 220 int arrow_x; | 221 int arrow_x; |
| 221 SkScalar arrow_fill_height = | 222 SkScalar arrow_fill_height = |
| 222 SkIntToScalar(std::max(arrow_height() - kSeparatorLineHeight, 0)); | 223 SkIntToScalar(std::max(arrow_height() - kSeparatorLineHeight, 0)); |
| 223 SkScalar arrow_fill_half_width = SkIntToScalar(arrow_half_width()); | 224 SkScalar arrow_fill_half_width = SkIntToScalar(arrow_half_width()); |
| 224 SkScalar separator_height = SkIntToScalar(kSeparatorLineHeight); | 225 SkScalar separator_height = SkIntToScalar(kSeparatorLineHeight); |
| 225 if (delegate->DrawInfoBarArrows(&arrow_x) && arrow_fill_height) { | 226 if (delegate->DrawInfoBarArrows(&arrow_x) && arrow_fill_height) { |
| 226 // Skia pixel centers are at the half-values, so the arrow is horizontally | 227 // Skia pixel centers are at the half-values, so the arrow is horizontally |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 int InfoBarView::EndX() const { | 351 int InfoBarView::EndX() const { |
| 351 return close_button_->x() - kCloseButtonSpacing; | 352 return close_button_->x() - kCloseButtonSpacing; |
| 352 } | 353 } |
| 353 | 354 |
| 354 int InfoBarView::OffsetY(views::View* view) const { | 355 int InfoBarView::OffsetY(views::View* view) const { |
| 355 return arrow_height() + | 356 return arrow_height() + |
| 356 std::max((bar_target_height() - view->height()) / 2, 0) - | 357 std::max((bar_target_height() - view->height()) / 2, 0) - |
| 357 (bar_target_height() - bar_height()); | 358 (bar_target_height() - bar_height()); |
| 358 } | 359 } |
| 359 | 360 |
| 360 const InfoBarContainer::Delegate* InfoBarView::container_delegate() const { | 361 const infobars::InfoBarContainer::Delegate* InfoBarView::container_delegate() |
| 361 const InfoBarContainer* infobar_container = container(); | 362 const { |
| 363 const infobars::InfoBarContainer* infobar_container = container(); |
| 362 return infobar_container ? infobar_container->delegate() : NULL; | 364 return infobar_container ? infobar_container->delegate() : NULL; |
| 363 } | 365 } |
| 364 | 366 |
| 365 void InfoBarView::RunMenuAt(ui::MenuModel* menu_model, | 367 void InfoBarView::RunMenuAt(ui::MenuModel* menu_model, |
| 366 views::MenuButton* button, | 368 views::MenuButton* button, |
| 367 views::MenuItemView::AnchorPosition anchor) { | 369 views::MenuItemView::AnchorPosition anchor) { |
| 368 DCHECK(owner()); // We'd better not open any menus while we're closing. | 370 DCHECK(owner()); // We'd better not open any menus while we're closing. |
| 369 gfx::Point screen_point; | 371 gfx::Point screen_point; |
| 370 views::View::ConvertPointToScreen(button, &screen_point); | 372 views::View::ConvertPointToScreen(button, &screen_point); |
| 371 menu_runner_.reset(new views::MenuRunner(menu_model)); | 373 menu_runner_.reset(new views::MenuRunner(menu_model)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 } | 421 } |
| 420 | 422 |
| 421 void InfoBarView::PlatformSpecificOnHeightsRecalculated() { | 423 void InfoBarView::PlatformSpecificOnHeightsRecalculated() { |
| 422 // Ensure that notifying our container of our size change will result in a | 424 // Ensure that notifying our container of our size change will result in a |
| 423 // re-layout. | 425 // re-layout. |
| 424 InvalidateLayout(); | 426 InvalidateLayout(); |
| 425 } | 427 } |
| 426 | 428 |
| 427 void InfoBarView::GetAccessibleState(ui::AXViewState* state) { | 429 void InfoBarView::GetAccessibleState(ui::AXViewState* state) { |
| 428 state->name = l10n_util::GetStringUTF16( | 430 state->name = l10n_util::GetStringUTF16( |
| 429 (delegate()->GetInfoBarType() == InfoBarDelegate::WARNING_TYPE) ? | 431 (delegate()->GetInfoBarType() == |
| 432 infobars::InfoBarDelegate::WARNING_TYPE) ? |
| 430 IDS_ACCNAME_INFOBAR_WARNING : IDS_ACCNAME_INFOBAR_PAGE_ACTION); | 433 IDS_ACCNAME_INFOBAR_WARNING : IDS_ACCNAME_INFOBAR_PAGE_ACTION); |
| 431 state->role = ui::AX_ROLE_ALERT; | 434 state->role = ui::AX_ROLE_ALERT; |
| 432 } | 435 } |
| 433 | 436 |
| 434 gfx::Size InfoBarView::GetPreferredSize() { | 437 gfx::Size InfoBarView::GetPreferredSize() { |
| 435 return gfx::Size( | 438 return gfx::Size( |
| 436 kHorizontalPadding + (icon_ ? (icon_->width() + kHorizontalPadding) : 0) + | 439 kHorizontalPadding + (icon_ ? (icon_->width() + kHorizontalPadding) : 0) + |
| 437 ContentMinimumWidth() + kCloseButtonSpacing + close_button_->width() + | 440 ContentMinimumWidth() + kCloseButtonSpacing + close_button_->width() + |
| 438 kHorizontalPadding, | 441 kHorizontalPadding, |
| 439 total_height()); | 442 total_height()); |
| 440 } | 443 } |
| 441 | 444 |
| 442 void InfoBarView::OnWillChangeFocus(View* focused_before, View* focused_now) { | 445 void InfoBarView::OnWillChangeFocus(View* focused_before, View* focused_now) { |
| 443 views::ExternalFocusTracker::OnWillChangeFocus(focused_before, focused_now); | 446 views::ExternalFocusTracker::OnWillChangeFocus(focused_before, focused_now); |
| 444 | 447 |
| 445 // This will trigger some screen readers to read the entire contents of this | 448 // This will trigger some screen readers to read the entire contents of this |
| 446 // infobar. | 449 // infobar. |
| 447 if (focused_before && focused_now && !Contains(focused_before) && | 450 if (focused_before && focused_now && !Contains(focused_before) && |
| 448 Contains(focused_now)) { | 451 Contains(focused_now)) { |
| 449 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); | 452 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); |
| 450 } | 453 } |
| 451 } | 454 } |
| OLD | NEW |