Home | History | Annotate | Download | only in autofill
      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 
     18 namespace autofill {
     19 
     20 SuggestionsMenuModelDelegate::~SuggestionsMenuModelDelegate() {}
     21 
     22 // SuggestionsMenuModel ----------------------------------------------------
     23 
     24 SuggestionsMenuModel::SuggestionsMenuModel(
     25     SuggestionsMenuModelDelegate* delegate)
     26     : ui::SimpleMenuModel(this),
     27       delegate_(delegate),
     28       checked_item_(0) {}
     29 
     30 SuggestionsMenuModel::~SuggestionsMenuModel() {}
     31 
     32 void 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 
     39 void 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 
     47 void 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 
     55 void 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 
     64 void SuggestionsMenuModel::Reset() {
     65   checked_item_ = 0;
     66   items_.clear();
     67   Clear();
     68 }
     69 
     70 std::string SuggestionsMenuModel::GetItemKeyAt(int index) const {
     71   return items_[index].key;
     72 }
     73 
     74 std::string SuggestionsMenuModel::GetItemKeyForCheckedItem() const {
     75   if (items_.empty())
     76     return std::string();
     77 
     78   return items_[checked_item_].key;
     79 }
     80 
     81 void 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 
     91 void SuggestionsMenuModel::SetCheckedIndex(size_t index) {
     92   DCHECK_LT(index, items_.size());
     93   checked_item_ = index;
     94 }
     95 
     96 void SuggestionsMenuModel::SetEnabled(const std::string& item_key,
     97                                       bool enabled) {
     98   items_[GetItemIndex(item_key)].enabled = enabled;
     99 }
    100 
    101 bool SuggestionsMenuModel::IsCommandIdChecked(
    102     int command_id) const {
    103   return checked_item_ == command_id;
    104 }
    105 
    106 bool 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 
    114 bool SuggestionsMenuModel::GetAcceleratorForCommandId(
    115     int command_id,
    116     ui::Accelerator* accelerator) {
    117   return false;
    118 }
    119 
    120 void SuggestionsMenuModel::ExecuteCommand(int command_id, int event_flags) {
    121   delegate_->SuggestionItemSelected(this, command_id);
    122 }
    123 
    124 size_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 
    136 MonthComboboxModel::MonthComboboxModel() {}
    137 
    138 MonthComboboxModel::~MonthComboboxModel() {}
    139 
    140 int MonthComboboxModel::GetItemCount() const {
    141   // 12 months plus the empty entry.
    142   return 13;
    143 }
    144 
    145 // static
    146 base::string16 MonthComboboxModel::FormatMonth(int index) {
    147   return base::ASCIIToUTF16(base::StringPrintf("%.2d", index));
    148 }
    149 
    150 base::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 
    158 YearComboboxModel::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 
    165 YearComboboxModel::~YearComboboxModel() {}
    166 
    167 int YearComboboxModel::GetItemCount() const {
    168   // 10 years plus the empty entry.
    169   return 11;
    170 }
    171 
    172 base::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