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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/autofill/autofill_dialog_models.h"
6
7 #include "base/bind.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h"
13 #include "chrome/common/pref_names.h"
14 #include "components/autofill/core/browser/autofill_country.h"
15 #include "grit/generated_resources.h"
16 #include "grit/theme_resources.h"
17 #include "ui/base/l10n/l10n_util.h"
18 #include "ui/base/resource/resource_bundle.h"
19
20 namespace autofill {
21
~SuggestionsMenuModelDelegate()22 SuggestionsMenuModelDelegate::~SuggestionsMenuModelDelegate() {}
23
24 // SuggestionsMenuModel ----------------------------------------------------
25
SuggestionsMenuModel(SuggestionsMenuModelDelegate * delegate)26 SuggestionsMenuModel::SuggestionsMenuModel(
27 SuggestionsMenuModelDelegate* delegate)
28 : ui::SimpleMenuModel(this),
29 delegate_(delegate),
30 checked_item_(0) {}
31
~SuggestionsMenuModel()32 SuggestionsMenuModel::~SuggestionsMenuModel() {}
33
AddKeyedItem(const std::string & key,const base::string16 & display_label)34 void SuggestionsMenuModel::AddKeyedItem(
35 const std::string& key, const base::string16& display_label) {
36 Item item = { key, true };
37 items_.push_back(item);
38 AddCheckItem(items_.size() - 1, display_label);
39 }
40
AddKeyedItemWithIcon(const std::string & key,const base::string16 & display_label,const gfx::Image & icon)41 void SuggestionsMenuModel::AddKeyedItemWithIcon(
42 const std::string& key,
43 const base::string16& display_label,
44 const gfx::Image& icon) {
45 AddKeyedItem(key, display_label);
46 SetIcon(items_.size() - 1, icon);
47 }
48
AddKeyedItemWithMinorText(const std::string & key,const base::string16 & display_label,const base::string16 & display_minor_text)49 void SuggestionsMenuModel::AddKeyedItemWithMinorText(
50 const std::string& key,
51 const base::string16& display_label,
52 const base::string16& display_minor_text) {
53 AddKeyedItem(key, display_label);
54 SetMinorText(items_.size() - 1, display_minor_text);
55 }
56
AddKeyedItemWithMinorTextAndIcon(const std::string & key,const base::string16 & display_label,const base::string16 & display_minor_text,const gfx::Image & icon)57 void SuggestionsMenuModel::AddKeyedItemWithMinorTextAndIcon(
58 const std::string& key,
59 const base::string16& display_label,
60 const base::string16& display_minor_text,
61 const gfx::Image& icon) {
62 AddKeyedItemWithIcon(key, display_label, icon);
63 SetMinorText(items_.size() - 1, display_minor_text);
64 }
65
Reset()66 void SuggestionsMenuModel::Reset() {
67 checked_item_ = 0;
68 items_.clear();
69 Clear();
70 }
71
GetItemKeyAt(int index) const72 std::string SuggestionsMenuModel::GetItemKeyAt(int index) const {
73 return items_[index].key;
74 }
75
GetItemKeyForCheckedItem() const76 std::string SuggestionsMenuModel::GetItemKeyForCheckedItem() const {
77 if (items_.empty())
78 return std::string();
79
80 return items_[checked_item_].key;
81 }
82
SetCheckedItem(const std::string & item_key)83 void SuggestionsMenuModel::SetCheckedItem(const std::string& item_key) {
84 for (size_t i = 0; i < items_.size(); ++i) {
85 if (items_[i].key == item_key) {
86 if (IsEnabledAt(i))
87 checked_item_ = i;
88 break;
89 }
90 }
91 }
92
SetCheckedIndex(size_t index)93 void SuggestionsMenuModel::SetCheckedIndex(size_t index) {
94 DCHECK_LT(index, items_.size());
95 checked_item_ = index;
96 }
97
SetEnabled(const std::string & item_key,bool enabled)98 void SuggestionsMenuModel::SetEnabled(const std::string& item_key,
99 bool enabled) {
100 items_[GetItemIndex(item_key)].enabled = enabled;
101 }
102
IsCommandIdChecked(int command_id) const103 bool SuggestionsMenuModel::IsCommandIdChecked(
104 int command_id) const {
105 return checked_item_ == command_id;
106 }
107
IsCommandIdEnabled(int command_id) const108 bool SuggestionsMenuModel::IsCommandIdEnabled(
109 int command_id) const {
110 // Please note: command_id is same as the 0-based index in |items_|.
111 DCHECK_GE(command_id, 0);
112 DCHECK_LT(static_cast<size_t>(command_id), items_.size());
113 return items_[command_id].enabled;
114 }
115
GetAcceleratorForCommandId(int command_id,ui::Accelerator * accelerator)116 bool SuggestionsMenuModel::GetAcceleratorForCommandId(
117 int command_id,
118 ui::Accelerator* accelerator) {
119 return false;
120 }
121
ExecuteCommand(int command_id,int event_flags)122 void SuggestionsMenuModel::ExecuteCommand(int command_id, int event_flags) {
123 delegate_->SuggestionItemSelected(this, command_id);
124 }
125
GetItemIndex(const std::string & item_key)126 size_t SuggestionsMenuModel::GetItemIndex(const std::string& item_key) {
127 for (size_t i = 0; i < items_.size(); ++i) {
128 if (items_[i].key == item_key)
129 return i;
130 }
131
132 NOTREACHED();
133 return 0;
134 }
135
136 // MonthComboboxModel ----------------------------------------------------------
137
MonthComboboxModel()138 MonthComboboxModel::MonthComboboxModel() {}
139
~MonthComboboxModel()140 MonthComboboxModel::~MonthComboboxModel() {}
141
GetItemCount() const142 int MonthComboboxModel::GetItemCount() const {
143 // 12 months plus the empty entry.
144 return 13;
145 }
146
147 // static
FormatMonth(int index)148 base::string16 MonthComboboxModel::FormatMonth(int index) {
149 return base::ASCIIToUTF16(base::StringPrintf("%.2d", index));
150 }
151
GetItemAt(int index)152 base::string16 MonthComboboxModel::GetItemAt(int index) {
153 return index == 0 ?
154 l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH) :
155 FormatMonth(index);
156 }
157
158 // YearComboboxModel -----------------------------------------------------------
159
YearComboboxModel()160 YearComboboxModel::YearComboboxModel() : this_year_(0) {
161 base::Time time = base::Time::Now();
162 base::Time::Exploded exploded;
163 time.LocalExplode(&exploded);
164 this_year_ = exploded.year;
165 }
166
~YearComboboxModel()167 YearComboboxModel::~YearComboboxModel() {}
168
GetItemCount() const169 int YearComboboxModel::GetItemCount() const {
170 // 10 years plus the empty entry.
171 return 11;
172 }
173
GetItemAt(int index)174 base::string16 YearComboboxModel::GetItemAt(int index) {
175 if (index == 0) {
176 return l10n_util::GetStringUTF16(
177 IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR);
178 }
179
180 return base::IntToString16(this_year_ + index - 1);
181 }
182
183 } // namespace autofill
184