data_model_wrapper.h revision f2477e01787aa58f445919b809d89e252beef54f
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#ifndef CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
6#define CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
7
8#include "base/compiler_specific.h"
9#include "base/strings/string16.h"
10#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
11#include "components/autofill/content/browser/wallet/wallet_items.h"
12#include "components/autofill/core/browser/field_types.h"
13
14namespace gfx {
15class Image;
16}
17
18namespace autofill {
19
20class AutofillDataModel;
21class AutofillProfile;
22class AutofillType;
23class CreditCard;
24class FormStructure;
25
26namespace wallet {
27class Address;
28class FullWallet;
29}
30
31// A glue class that allows uniform interactions with autocomplete data sources,
32// regardless of their type. Implementations are intended to be lightweight and
33// copyable, only holding weak references to their backing model.
34class DataModelWrapper {
35 public:
36  virtual ~DataModelWrapper();
37
38  // Fills in |inputs| with the data that this model contains (|inputs| is an
39  // out-param).
40  void FillInputs(DetailInputs* inputs);
41
42  // Returns the data for a specific autocomplete type in a format for filling
43  // into a web form.
44  virtual base::string16 GetInfo(const AutofillType& type) const = 0;
45
46  // Returns the data for a specified type in a format optimized for displaying
47  // to the user.
48  virtual base::string16 GetInfoForDisplay(const AutofillType& type) const;
49
50  // Returns the icon, if any, that represents this model.
51  virtual gfx::Image GetIcon();
52
53  // Gets text to display to the user to summarize this data source. The
54  // default implementation assumes this is an address. Both params are required
55  // to be non-NULL and will be filled in with text that is vertically compact
56  // (but may take up a lot of horizontal space) and horizontally compact (but
57  // may take up a lot of vertical space) respectively. The return value will
58  // be true and the outparams will be filled in only if the data represented is
59  // complete and valid.
60  virtual bool GetDisplayText(base::string16* vertically_compact,
61                              base::string16* horizontally_compact);
62
63  // Fills in |form_structure| with the data that this model contains. |inputs|
64  // and |comparator| are used to determine whether each field in the
65  // FormStructure should be filled in or left alone. Returns whether any fields
66  // in |form_structure| were found to be matching.
67  bool FillFormStructure(
68      const DetailInputs& inputs,
69      const InputFieldComparator& compare,
70      FormStructure* form_structure) const;
71
72 protected:
73  DataModelWrapper();
74
75 private:
76  // Formats address data into a single string using |separator| between
77  // fields.
78  base::string16 GetAddressDisplayText(const base::string16& separator);
79
80  DISALLOW_COPY_AND_ASSIGN(DataModelWrapper);
81};
82
83// A DataModelWrapper that does not hold data and does nothing when told to
84// fill in a form.
85class EmptyDataModelWrapper : public DataModelWrapper {
86 public:
87  EmptyDataModelWrapper();
88  virtual ~EmptyDataModelWrapper();
89
90  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
91
92 protected:
93  DISALLOW_COPY_AND_ASSIGN(EmptyDataModelWrapper);
94};
95
96// A DataModelWrapper for Autofill profiles.
97class AutofillProfileWrapper : public DataModelWrapper {
98 public:
99  explicit AutofillProfileWrapper(const AutofillProfile* profile);
100  AutofillProfileWrapper(const AutofillProfile* profile,
101                         const AutofillType& variant_type,
102                         size_t variant);
103  virtual ~AutofillProfileWrapper();
104
105  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
106  virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
107      OVERRIDE;
108
109 protected:
110  // Returns the variant that should be used when dealing with an element that
111  // has the given |type|.
112  size_t GetVariantForType(const AutofillType& type) const;
113
114 private:
115  const AutofillProfile* profile_;
116
117  // The profile variant. |variant_| describes which variant of |variant_group_|
118  // to use in the profile.
119  FieldTypeGroup variant_group_;
120  size_t variant_;
121
122  DISALLOW_COPY_AND_ASSIGN(AutofillProfileWrapper);
123};
124
125// A DataModelWrapper specifically for shipping address profiles.
126class AutofillShippingAddressWrapper : public AutofillProfileWrapper {
127 public:
128  explicit AutofillShippingAddressWrapper(const AutofillProfile* profile);
129  virtual ~AutofillShippingAddressWrapper();
130
131  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
132
133 private:
134  DISALLOW_COPY_AND_ASSIGN(AutofillShippingAddressWrapper);
135};
136
137// A DataModelWrapper specifically for Autofill CreditCard data.
138class AutofillCreditCardWrapper : public DataModelWrapper {
139 public:
140  explicit AutofillCreditCardWrapper(const CreditCard* card);
141  virtual ~AutofillCreditCardWrapper();
142
143  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
144  virtual gfx::Image GetIcon() OVERRIDE;
145  virtual bool GetDisplayText(base::string16* vertically_compact,
146                              base::string16* horizontally_compact) OVERRIDE;
147
148 private:
149  const CreditCard* card_;
150
151  DISALLOW_COPY_AND_ASSIGN(AutofillCreditCardWrapper);
152};
153
154// A DataModelWrapper for Wallet addresses.
155class WalletAddressWrapper : public DataModelWrapper {
156 public:
157  explicit WalletAddressWrapper(const wallet::Address* address);
158  virtual ~WalletAddressWrapper();
159
160  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
161  virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
162      OVERRIDE;
163  virtual bool GetDisplayText(base::string16* vertically_compact,
164                              base::string16* horizontally_compact) OVERRIDE;
165
166 private:
167  const wallet::Address* address_;
168
169  DISALLOW_COPY_AND_ASSIGN(WalletAddressWrapper);
170};
171
172// A DataModelWrapper for Wallet instruments.
173class WalletInstrumentWrapper : public DataModelWrapper {
174 public:
175  explicit WalletInstrumentWrapper(
176      const wallet::WalletItems::MaskedInstrument* instrument);
177  virtual ~WalletInstrumentWrapper();
178
179  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
180  virtual base::string16 GetInfoForDisplay(const AutofillType& type) const
181      OVERRIDE;
182  virtual gfx::Image GetIcon() OVERRIDE;
183  virtual bool GetDisplayText(base::string16* vertically_compact,
184                              base::string16* horizontally_compact) OVERRIDE;
185
186 private:
187  const wallet::WalletItems::MaskedInstrument* instrument_;
188
189  DISALLOW_COPY_AND_ASSIGN(WalletInstrumentWrapper);
190};
191
192// A DataModelWrapper for FullWallet billing data.
193class FullWalletBillingWrapper : public DataModelWrapper {
194 public:
195  explicit FullWalletBillingWrapper(wallet::FullWallet* full_wallet);
196  virtual ~FullWalletBillingWrapper();
197
198  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
199  virtual bool GetDisplayText(base::string16* vertically_compact,
200                              base::string16* horizontally_compact) OVERRIDE;
201
202 private:
203  wallet::FullWallet* full_wallet_;
204
205  DISALLOW_COPY_AND_ASSIGN(FullWalletBillingWrapper);
206};
207
208// A DataModelWrapper for FullWallet shipping data.
209class FullWalletShippingWrapper : public DataModelWrapper {
210 public:
211  explicit FullWalletShippingWrapper(wallet::FullWallet* full_wallet);
212  virtual ~FullWalletShippingWrapper();
213
214  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
215
216 private:
217  wallet::FullWallet* full_wallet_;
218
219  DISALLOW_COPY_AND_ASSIGN(FullWalletShippingWrapper);
220};
221
222// A DataModelWrapper to copy the output of one section to the input of another.
223class FieldMapWrapper : public DataModelWrapper {
224 public:
225  explicit FieldMapWrapper(const FieldValueMap& field_map);
226  virtual ~FieldMapWrapper();
227
228  virtual base::string16 GetInfo(const AutofillType& type) const OVERRIDE;
229
230 private:
231  const FieldValueMap& field_map_;
232
233  DISALLOW_COPY_AND_ASSIGN(FieldMapWrapper);
234};
235
236}  // namespace autofill
237
238#endif  // CHROME_BROWSER_UI_AUTOFILL_DATA_MODEL_WRAPPER_H_
239