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/autofill/autofill_popup_controller_impl.h" | 5 #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 // Used to indicate that no line is currently selected by the user. | 36 // Used to indicate that no line is currently selected by the user. |
37 const int kNoSelection = -1; | 37 const int kNoSelection = -1; |
38 | 38 |
39 // The vertical height of each row in pixels. | 39 // The vertical height of each row in pixels. |
40 const size_t kRowHeight = 24; | 40 const size_t kRowHeight = 24; |
41 | 41 |
42 // The vertical height of a separator in pixels. | 42 // The vertical height of a separator in pixels. |
43 const size_t kSeparatorHeight = 1; | 43 const size_t kSeparatorHeight = 1; |
44 | 44 |
45 #if !defined(OS_ANDROID) | 45 #if !BUILDFLAG(ANDROID_JAVA_UI) |
46 // Size difference between name and label in pixels. | 46 // Size difference between name and label in pixels. |
47 const int kLabelFontSizeDelta = -2; | 47 const int kLabelFontSizeDelta = -2; |
48 | 48 |
49 const size_t kNamePadding = AutofillPopupView::kNamePadding; | 49 const size_t kNamePadding = AutofillPopupView::kNamePadding; |
50 const size_t kIconPadding = AutofillPopupView::kIconPadding; | 50 const size_t kIconPadding = AutofillPopupView::kIconPadding; |
51 const size_t kEndPadding = AutofillPopupView::kEndPadding; | 51 const size_t kEndPadding = AutofillPopupView::kEndPadding; |
52 #endif | 52 #endif |
53 | 53 |
54 struct DataResource { | 54 struct DataResource { |
55 const char* name; | 55 const char* name; |
56 int id; | 56 int id; |
57 }; | 57 }; |
58 | 58 |
59 const DataResource kDataResources[] = { | 59 const DataResource kDataResources[] = { |
60 { "americanExpressCC", IDR_AUTOFILL_CC_AMEX }, | 60 { "americanExpressCC", IDR_AUTOFILL_CC_AMEX }, |
61 { "dinersCC", IDR_AUTOFILL_CC_GENERIC }, | 61 { "dinersCC", IDR_AUTOFILL_CC_GENERIC }, |
62 { "discoverCC", IDR_AUTOFILL_CC_DISCOVER }, | 62 { "discoverCC", IDR_AUTOFILL_CC_DISCOVER }, |
63 { "genericCC", IDR_AUTOFILL_CC_GENERIC }, | 63 { "genericCC", IDR_AUTOFILL_CC_GENERIC }, |
64 { "jcbCC", IDR_AUTOFILL_CC_GENERIC }, | 64 { "jcbCC", IDR_AUTOFILL_CC_GENERIC }, |
65 { "masterCardCC", IDR_AUTOFILL_CC_MASTERCARD }, | 65 { "masterCardCC", IDR_AUTOFILL_CC_MASTERCARD }, |
66 { "visaCC", IDR_AUTOFILL_CC_VISA }, | 66 { "visaCC", IDR_AUTOFILL_CC_VISA }, |
67 #if defined(OS_ANDROID) | 67 #if BUILDFLAG(ANDROID_JAVA_UI) |
68 { "scanCreditCardIcon", IDR_AUTOFILL_CC_SCAN_NEW }, | 68 { "scanCreditCardIcon", IDR_AUTOFILL_CC_SCAN_NEW }, |
69 { "settings", IDR_AUTOFILL_SETTINGS }, | 69 { "settings", IDR_AUTOFILL_SETTINGS }, |
70 #endif | 70 #endif |
71 }; | 71 }; |
72 | 72 |
73 } // namespace | 73 } // namespace |
74 | 74 |
75 // static | 75 // static |
76 WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetOrCreate( | 76 WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetOrCreate( |
77 WeakPtr<AutofillPopupControllerImpl> previous, | 77 WeakPtr<AutofillPopupControllerImpl> previous, |
(...skipping 30 matching lines...) Expand all Loading... |
108 text_direction, | 108 text_direction, |
109 container_view, | 109 container_view, |
110 web_contents)), | 110 web_contents)), |
111 view_(NULL), | 111 view_(NULL), |
112 delegate_(delegate), | 112 delegate_(delegate), |
113 weak_ptr_factory_(this) { | 113 weak_ptr_factory_(this) { |
114 ClearState(); | 114 ClearState(); |
115 controller_common_->SetKeyPressCallback( | 115 controller_common_->SetKeyPressCallback( |
116 base::Bind(&AutofillPopupControllerImpl::HandleKeyPressEvent, | 116 base::Bind(&AutofillPopupControllerImpl::HandleKeyPressEvent, |
117 base::Unretained(this))); | 117 base::Unretained(this))); |
118 #if !defined(OS_ANDROID) | 118 #if !BUILDFLAG(ANDROID_JAVA_UI) |
119 label_font_list_ = value_font_list_.DeriveWithSizeDelta(kLabelFontSizeDelta); | 119 label_font_list_ = value_font_list_.DeriveWithSizeDelta(kLabelFontSizeDelta); |
120 title_font_list_ = value_font_list_.DeriveWithStyle(gfx::Font::BOLD); | 120 title_font_list_ = value_font_list_.DeriveWithStyle(gfx::Font::BOLD); |
121 #if defined(OS_MACOSX) | 121 #if defined(OS_MACOSX) |
122 // There is no italic version of the system font. | 122 // There is no italic version of the system font. |
123 warning_font_list_ = value_font_list_; | 123 warning_font_list_ = value_font_list_; |
124 #else | 124 #else |
125 warning_font_list_ = value_font_list_.DeriveWithStyle(gfx::Font::ITALIC); | 125 warning_font_list_ = value_font_list_.DeriveWithStyle(gfx::Font::ITALIC); |
126 #endif | 126 #endif |
127 #endif | 127 #endif |
128 } | 128 } |
129 | 129 |
130 AutofillPopupControllerImpl::~AutofillPopupControllerImpl() {} | 130 AutofillPopupControllerImpl::~AutofillPopupControllerImpl() {} |
131 | 131 |
132 void AutofillPopupControllerImpl::Show( | 132 void AutofillPopupControllerImpl::Show( |
133 const std::vector<autofill::Suggestion>& suggestions) { | 133 const std::vector<autofill::Suggestion>& suggestions) { |
134 SetValues(suggestions); | 134 SetValues(suggestions); |
135 DCHECK_EQ(suggestions_.size(), elided_values_.size()); | 135 DCHECK_EQ(suggestions_.size(), elided_values_.size()); |
136 DCHECK_EQ(suggestions_.size(), elided_labels_.size()); | 136 DCHECK_EQ(suggestions_.size(), elided_labels_.size()); |
137 | 137 |
138 #if !defined(OS_ANDROID) | 138 #if !BUILDFLAG(ANDROID_JAVA_UI) |
139 // Android displays the long text with ellipsis using the view attributes. | 139 // Android displays the long text with ellipsis using the view attributes. |
140 | 140 |
141 UpdatePopupBounds(); | 141 UpdatePopupBounds(); |
142 int popup_width = popup_bounds().width(); | 142 int popup_width = popup_bounds().width(); |
143 | 143 |
144 // Elide the name and label strings so that the popup fits in the available | 144 // Elide the name and label strings so that the popup fits in the available |
145 // space. | 145 // space. |
146 for (size_t i = 0; i < suggestions_.size(); ++i) { | 146 for (size_t i = 0; i < suggestions_.size(); ++i) { |
147 int value_width = | 147 int value_width = |
148 gfx::GetStringWidth(suggestions_[i].value, GetValueFontListForRow(i)); | 148 gfx::GetStringWidth(suggestions_[i].value, GetValueFontListForRow(i)); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 AcceptSelectedLine(); | 305 AcceptSelectedLine(); |
306 return false; | 306 return false; |
307 case ui::VKEY_RETURN: | 307 case ui::VKEY_RETURN: |
308 return AcceptSelectedLine(); | 308 return AcceptSelectedLine(); |
309 default: | 309 default: |
310 return false; | 310 return false; |
311 } | 311 } |
312 } | 312 } |
313 | 313 |
314 void AutofillPopupControllerImpl::UpdateBoundsAndRedrawPopup() { | 314 void AutofillPopupControllerImpl::UpdateBoundsAndRedrawPopup() { |
315 #if !defined(OS_ANDROID) | 315 #if !BUILDFLAG(ANDROID_JAVA_UI) |
316 // TODO(csharp): Since UpdatePopupBounds can change the position of the popup, | 316 // TODO(csharp): Since UpdatePopupBounds can change the position of the popup, |
317 // the popup could end up jumping from above the element to below it. | 317 // the popup could end up jumping from above the element to below it. |
318 // It is unclear if it is better to keep the popup where it was, or if it | 318 // It is unclear if it is better to keep the popup where it was, or if it |
319 // should try and move to its desired position. | 319 // should try and move to its desired position. |
320 UpdatePopupBounds(); | 320 UpdatePopupBounds(); |
321 #endif | 321 #endif |
322 | 322 |
323 view_->UpdateBoundsAndRedrawPopup(); | 323 view_->UpdateBoundsAndRedrawPopup(); |
324 } | 324 } |
325 | 325 |
(...skipping 28 matching lines...) Expand all Loading... |
354 int AutofillPopupControllerImpl::GetIconResourceID( | 354 int AutofillPopupControllerImpl::GetIconResourceID( |
355 const base::string16& resource_name) const { | 355 const base::string16& resource_name) const { |
356 int result = -1; | 356 int result = -1; |
357 for (size_t i = 0; i < arraysize(kDataResources); ++i) { | 357 for (size_t i = 0; i < arraysize(kDataResources); ++i) { |
358 if (resource_name == base::ASCIIToUTF16(kDataResources[i].name)) { | 358 if (resource_name == base::ASCIIToUTF16(kDataResources[i].name)) { |
359 result = kDataResources[i].id; | 359 result = kDataResources[i].id; |
360 break; | 360 break; |
361 } | 361 } |
362 } | 362 } |
363 | 363 |
364 #if defined(OS_ANDROID) | 364 #if BUILDFLAG(ANDROID_JAVA_UI) |
365 if (result == IDR_AUTOFILL_CC_SCAN_NEW && IsKeyboardAccessoryEnabled()) | 365 if (result == IDR_AUTOFILL_CC_SCAN_NEW && IsKeyboardAccessoryEnabled()) |
366 result = IDR_AUTOFILL_CC_SCAN_NEW_KEYBOARD_ACCESSORY; | 366 result = IDR_AUTOFILL_CC_SCAN_NEW_KEYBOARD_ACCESSORY; |
367 #endif // OS_ANDROID | 367 #endif |
368 | 368 |
369 return result; | 369 return result; |
370 } | 370 } |
371 | 371 |
372 bool AutofillPopupControllerImpl::IsWarning(size_t index) const { | 372 bool AutofillPopupControllerImpl::IsWarning(size_t index) const { |
373 return suggestions_[index].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE; | 373 return suggestions_[index].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE; |
374 } | 374 } |
375 | 375 |
376 gfx::Rect AutofillPopupControllerImpl::GetRowBounds(size_t index) { | 376 gfx::Rect AutofillPopupControllerImpl::GetRowBounds(size_t index) { |
377 int top = kPopupBorderThickness; | 377 int top = kPopupBorderThickness; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 if (HasSuggestions()) { | 450 if (HasSuggestions()) { |
451 delegate_->ClearPreviewedForm(); | 451 delegate_->ClearPreviewedForm(); |
452 UpdateBoundsAndRedrawPopup(); | 452 UpdateBoundsAndRedrawPopup(); |
453 } else { | 453 } else { |
454 Hide(); | 454 Hide(); |
455 } | 455 } |
456 | 456 |
457 return true; | 457 return true; |
458 } | 458 } |
459 | 459 |
460 #if !defined(OS_ANDROID) | 460 #if !BUILDFLAG(ANDROID_JAVA_UI) |
461 const gfx::FontList& AutofillPopupControllerImpl::GetValueFontListForRow( | 461 const gfx::FontList& AutofillPopupControllerImpl::GetValueFontListForRow( |
462 size_t index) const { | 462 size_t index) const { |
463 if (suggestions_[index].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE) | 463 if (suggestions_[index].frontend_id == POPUP_ITEM_ID_WARNING_MESSAGE) |
464 return warning_font_list_; | 464 return warning_font_list_; |
465 | 465 |
466 if (suggestions_[index].frontend_id == POPUP_ITEM_ID_TITLE) | 466 if (suggestions_[index].frontend_id == POPUP_ITEM_ID_TITLE) |
467 return title_font_list_; | 467 return title_font_list_; |
468 | 468 |
469 return value_font_list_; | 469 return value_font_list_; |
470 } | 470 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 void AutofillPopupControllerImpl::ShowView() { | 593 void AutofillPopupControllerImpl::ShowView() { |
594 view_->Show(); | 594 view_->Show(); |
595 } | 595 } |
596 | 596 |
597 void AutofillPopupControllerImpl::InvalidateRow(size_t row) { | 597 void AutofillPopupControllerImpl::InvalidateRow(size_t row) { |
598 DCHECK(0 <= row); | 598 DCHECK(0 <= row); |
599 DCHECK(row < suggestions_.size()); | 599 DCHECK(row < suggestions_.size()); |
600 view_->InvalidateRow(row); | 600 view_->InvalidateRow(row); |
601 } | 601 } |
602 | 602 |
603 #if !defined(OS_ANDROID) | 603 #if !BUILDFLAG(ANDROID_JAVA_UI) |
604 int AutofillPopupControllerImpl::GetDesiredPopupWidth() const { | 604 int AutofillPopupControllerImpl::GetDesiredPopupWidth() const { |
605 int popup_width = controller_common_->RoundedElementBounds().width(); | 605 int popup_width = controller_common_->RoundedElementBounds().width(); |
606 for (size_t i = 0; i < GetLineCount(); ++i) { | 606 for (size_t i = 0; i < GetLineCount(); ++i) { |
607 int row_size = | 607 int row_size = |
608 gfx::GetStringWidth(GetElidedValueAt(i), value_font_list_) + | 608 gfx::GetStringWidth(GetElidedValueAt(i), value_font_list_) + |
609 gfx::GetStringWidth(GetElidedLabelAt(i), label_font_list_) + | 609 gfx::GetStringWidth(GetElidedLabelAt(i), label_font_list_) + |
610 RowWidthWithoutText(i); | 610 RowWidthWithoutText(i); |
611 | 611 |
612 popup_width = std::max(popup_width, row_size); | 612 popup_width = std::max(popup_width, row_size); |
613 } | 613 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 647 |
648 return row_size; | 648 return row_size; |
649 } | 649 } |
650 | 650 |
651 void AutofillPopupControllerImpl::UpdatePopupBounds() { | 651 void AutofillPopupControllerImpl::UpdatePopupBounds() { |
652 int popup_width = GetDesiredPopupWidth(); | 652 int popup_width = GetDesiredPopupWidth(); |
653 int popup_height = GetDesiredPopupHeight(); | 653 int popup_height = GetDesiredPopupHeight(); |
654 | 654 |
655 popup_bounds_ = controller_common_->GetPopupBounds(popup_width, popup_height); | 655 popup_bounds_ = controller_common_->GetPopupBounds(popup_width, popup_height); |
656 } | 656 } |
657 #endif // !defined(OS_ANDROID) | 657 #endif |
658 | 658 |
659 WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetWeakPtr() { | 659 WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetWeakPtr() { |
660 return weak_ptr_factory_.GetWeakPtr(); | 660 return weak_ptr_factory_.GetWeakPtr(); |
661 } | 661 } |
662 | 662 |
663 void AutofillPopupControllerImpl::ClearState() { | 663 void AutofillPopupControllerImpl::ClearState() { |
664 // Don't clear view_, because otherwise the popup will have to get regenerated | 664 // Don't clear view_, because otherwise the popup will have to get regenerated |
665 // and this will cause flickering. | 665 // and this will cause flickering. |
666 | 666 |
667 popup_bounds_ = gfx::Rect(); | 667 popup_bounds_ = gfx::Rect(); |
668 | 668 |
669 suggestions_.clear(); | 669 suggestions_.clear(); |
670 elided_values_.clear(); | 670 elided_values_.clear(); |
671 elided_labels_.clear(); | 671 elided_labels_.clear(); |
672 | 672 |
673 selected_line_ = kNoSelection; | 673 selected_line_ = kNoSelection; |
674 } | 674 } |
675 | 675 |
676 } // namespace autofill | 676 } // namespace autofill |
OLD | NEW |