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