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