12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_models.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModelDelegate::~SuggestionsMenuModelDelegate() {}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModel ----------------------------------------------------
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel::SuggestionsMenuModel(
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SuggestionsMenuModelDelegate* delegate)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ui::SimpleMenuModel(this),
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(delegate),
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      checked_item_(0) {}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel::~SuggestionsMenuModel() {}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SuggestionsMenuModel::AddKeyedItem(
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& key, const base::string16& display_label) {
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Item item = { key, true };
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  items_.push_back(item);
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddCheckItem(items_.size() - 1, display_label);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SuggestionsMenuModel::AddKeyedItemWithIcon(
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& key,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_label,
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const gfx::Image& icon) {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddKeyedItem(key, display_label);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetIcon(items_.size() - 1, icon);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SuggestionsMenuModel::AddKeyedItemWithMinorText(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& key,
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_label,
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_minor_text) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddKeyedItem(key, display_label);
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetMinorText(items_.size() - 1, display_minor_text);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SuggestionsMenuModel::AddKeyedItemWithMinorTextAndIcon(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& key,
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_label,
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_minor_text,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Image& icon) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddKeyedItemWithIcon(key, display_label, icon);
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetMinorText(items_.size() - 1, display_minor_text);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SuggestionsMenuModel::Reset() {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  checked_item_ = 0;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items_.clear();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Clear();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string SuggestionsMenuModel::GetItemKeyAt(int index) const {
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return items_[index].key;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string SuggestionsMenuModel::GetItemKeyForCheckedItem() const {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (items_.empty())
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return items_[checked_item_].key;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SuggestionsMenuModel::SetCheckedItem(const std::string& item_key) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < items_.size(); ++i) {
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (items_[i].key == item_key) {
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (IsEnabledAt(i))
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        checked_item_ = i;
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SuggestionsMenuModel::SetCheckedIndex(size_t index) {
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK_LT(index, items_.size());
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  checked_item_ = index;
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SuggestionsMenuModel::SetEnabled(const std::string& item_key,
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      bool enabled) {
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  items_[GetItemIndex(item_key)].enabled = enabled;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SuggestionsMenuModel::IsCommandIdChecked(
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int command_id) const {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return checked_item_ == command_id;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SuggestionsMenuModel::IsCommandIdEnabled(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int command_id) const {
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Please note: command_id is same as the 0-based index in |items_|.
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_GE(command_id, 0);
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_LT(static_cast<size_t>(command_id), items_.size());
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return items_[command_id].enabled;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SuggestionsMenuModel::GetAcceleratorForCommandId(
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int command_id,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::Accelerator* accelerator) {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SuggestionsMenuModel::ExecuteCommand(int command_id, int event_flags) {
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->SuggestionItemSelected(this, command_id);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)size_t SuggestionsMenuModel::GetItemIndex(const std::string& item_key) {
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < items_.size(); ++i) {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (items_[i].key == item_key)
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return i;
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTREACHED();
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return 0;
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// MonthComboboxModel ----------------------------------------------------------
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MonthComboboxModel::MonthComboboxModel() {}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MonthComboboxModel::~MonthComboboxModel() {}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int MonthComboboxModel::GetItemCount() const {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 12 months plus the empty entry.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 13;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MonthComboboxModel::FormatMonth(int index) {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::ASCIIToUTF16(base::StringPrintf("%.2d", index));
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MonthComboboxModel::GetItemAt(int index) {
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return index == 0 ?
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH) :
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      FormatMonth(index);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// YearComboboxModel -----------------------------------------------------------
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)YearComboboxModel::YearComboboxModel() : this_year_(0) {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time time = base::Time::Now();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time::Exploded exploded;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  time.LocalExplode(&exploded);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this_year_ = exploded.year;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)YearComboboxModel::~YearComboboxModel() {}
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int YearComboboxModel::GetItemCount() const {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 10 years plus the empty entry.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return 11;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 YearComboboxModel::GetItemAt(int index) {
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (index == 0) {
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return l10n_util::GetStringUTF16(
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR);
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::IntToString16(this_year_ + index - 1);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
182