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