autofill_dialog_models.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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
20namespace autofill {
21
22SuggestionsMenuModelDelegate::~SuggestionsMenuModelDelegate() {}
23
24// SuggestionsMenuModel ----------------------------------------------------
25
26SuggestionsMenuModel::SuggestionsMenuModel(
27    SuggestionsMenuModelDelegate* delegate)
28    : ui::SimpleMenuModel(this),
29      delegate_(delegate),
30      checked_item_(0) {}
31
32SuggestionsMenuModel::~SuggestionsMenuModel() {}
33
34void 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
41void 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
49void 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
57void 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
66void SuggestionsMenuModel::Reset() {
67  checked_item_ = 0;
68  items_.clear();
69  Clear();
70}
71
72std::string SuggestionsMenuModel::GetItemKeyAt(int index) const {
73  return items_[index].key;
74}
75
76std::string SuggestionsMenuModel::GetItemKeyForCheckedItem() const {
77  if (items_.empty())
78    return std::string();
79
80  return items_[checked_item_].key;
81}
82
83void 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
93void SuggestionsMenuModel::SetCheckedIndex(size_t index) {
94  DCHECK_LT(index, items_.size());
95  checked_item_ = index;
96}
97
98void SuggestionsMenuModel::SetEnabled(const std::string& item_key,
99                                      bool enabled) {
100  items_[GetItemIndex(item_key)].enabled = enabled;
101}
102
103void SuggestionsMenuModel::MenuWillShow() {
104  ui::SimpleMenuModel::MenuWillShow();
105}
106
107bool SuggestionsMenuModel::IsCommandIdChecked(
108    int command_id) const {
109  return checked_item_ == command_id;
110}
111
112bool SuggestionsMenuModel::IsCommandIdEnabled(
113    int command_id) const {
114  // Please note: command_id is same as the 0-based index in |items_|.
115  DCHECK_GE(command_id, 0);
116  DCHECK_LT(static_cast<size_t>(command_id), items_.size());
117  return items_[command_id].enabled;
118}
119
120bool SuggestionsMenuModel::GetAcceleratorForCommandId(
121    int command_id,
122    ui::Accelerator* accelerator) {
123  return false;
124}
125
126void SuggestionsMenuModel::ExecuteCommand(int command_id, int event_flags) {
127  delegate_->SuggestionItemSelected(this, command_id);
128}
129
130void SuggestionsMenuModel::MenuWillShow(ui::SimpleMenuModel* source) {
131  delegate_->SuggestionsMenuWillShow();
132}
133
134size_t SuggestionsMenuModel::GetItemIndex(const std::string& item_key) {
135  for (size_t i = 0; i < items_.size(); ++i) {
136    if (items_[i].key == item_key)
137      return i;
138  }
139
140  NOTREACHED();
141  return 0;
142}
143
144// MonthComboboxModel ----------------------------------------------------------
145
146MonthComboboxModel::MonthComboboxModel() {}
147
148MonthComboboxModel::~MonthComboboxModel() {}
149
150int MonthComboboxModel::GetItemCount() const {
151  // 12 months plus the empty entry.
152  return 13;
153}
154
155// static
156base::string16 MonthComboboxModel::FormatMonth(int index) {
157  return base::ASCIIToUTF16(base::StringPrintf("%.2d", index));
158}
159
160base::string16 MonthComboboxModel::GetItemAt(int index) {
161  return index == 0 ?
162      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH) :
163      FormatMonth(index);
164}
165
166// YearComboboxModel -----------------------------------------------------------
167
168YearComboboxModel::YearComboboxModel() : this_year_(0) {
169  base::Time time = base::Time::Now();
170  base::Time::Exploded exploded;
171  time.LocalExplode(&exploded);
172  this_year_ = exploded.year;
173}
174
175YearComboboxModel::~YearComboboxModel() {}
176
177int YearComboboxModel::GetItemCount() const {
178  // 10 years plus the empty entry.
179  return 11;
180}
181
182base::string16 YearComboboxModel::GetItemAt(int index) {
183  if (index == 0) {
184    return l10n_util::GetStringUTF16(
185        IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR);
186  }
187
188  return base::IntToString16(this_year_ + index - 1);
189}
190
191}  // namespace autofill
192