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_AUTOFILL_DIALOG_TYPES_H_
6#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_TYPES_H_
7
8#include <map>
9#include <vector>
10
11#include "base/callback_forward.h"
12#include "base/strings/string16.h"
13#include "base/time/time.h"
14#include "components/autofill/core/browser/autofill_metrics.h"
15#include "components/autofill/core/browser/field_types.h"
16#include "third_party/skia/include/core/SkColor.h"
17#include "ui/gfx/font_list.h"
18#include "ui/gfx/image/image.h"
19#include "ui/gfx/range/range.h"
20#include "ui/gfx/text_constants.h"
21#include "url/gurl.h"
22
23namespace autofill {
24
25class AutofillField;
26
27// This struct describes a single input control for the imperative autocomplete
28// dialog.
29struct DetailInput {
30  enum Length {
31    SHORT,      // Shares a line with other short inputs, like display: inline.
32    SHORT_EOL,  // Like SHORT but starts a new line directly afterward. Used to
33                // separate groups of short inputs into different lines.
34    LONG,       // Will be given its own full line, like display: block.
35    NONE,       // Input will not be shown.
36  };
37
38  // Returns whether this input can spread across multiple lines.
39  bool IsMultiline() const;
40
41  // Used to determine which inputs share lines when laying out.
42  Length length;
43
44  ServerFieldType type;
45
46  // Text shown when the input is at its default state (e.g. empty).
47  base::string16 placeholder_text;
48
49  // A number between 0 and 1.0 that describes how much of the horizontal space
50  // in the row should be allotted to this input. 0 is equivalent to 1.
51  float expand_weight;
52
53  // When non-empty, indicates the starting value for this input. This will be
54  // used when the user is editing existing data.
55  base::string16 initial_value;
56};
57
58// Sections of the dialog --- all fields that may be shown to the user fit under
59// one of these sections.
60enum DialogSection {
61  // Lower boundary value for looping over all sections.
62  SECTION_MIN,
63
64  // The Autofill-backed dialog uses separate CC and billing sections.
65  SECTION_CC = SECTION_MIN,
66  SECTION_BILLING,
67  // The wallet-backed dialog uses a combined CC and billing section.
68  SECTION_CC_BILLING,
69  SECTION_SHIPPING,
70
71  // Upper boundary value for looping over all sections.
72  SECTION_MAX = SECTION_SHIPPING,
73};
74
75// A notification to show in the autofill dialog. Ranges from information to
76// seriously scary security messages, and will give you the color it should be
77// displayed (if you ask it).
78class DialogNotification {
79 public:
80  enum Type {
81    NONE,
82    DEVELOPER_WARNING,
83    REQUIRED_ACTION,
84    SECURITY_WARNING,
85    WALLET_ERROR,
86    WALLET_USAGE_CONFIRMATION,
87  };
88
89  DialogNotification();
90  DialogNotification(Type type, const base::string16& display_text);
91  ~DialogNotification();
92
93  // Returns the appropriate background, border, or text color for the view's
94  // notification area based on |type_|.
95  SkColor GetBackgroundColor() const;
96  SkColor GetBorderColor() const;
97  SkColor GetTextColor() const;
98
99  // Whether this notification has an arrow pointing up at the account chooser.
100  bool HasArrow() const;
101
102  // Whether this notifications has the "Save details to wallet" checkbox.
103  bool HasCheckbox() const;
104
105  Type type() const { return type_; }
106  const base::string16& display_text() const { return display_text_; }
107
108  void set_link_url(const GURL& link_url) { link_url_ = link_url; }
109  const GURL& link_url() const { return link_url_; }
110
111  const gfx::Range& link_range() const { return link_range_; }
112
113  void set_tooltip_text(const base::string16& tooltip_text) {
114    tooltip_text_ = tooltip_text;
115  }
116  const base::string16& tooltip_text() const { return tooltip_text_; }
117
118  void set_checked(bool checked) { checked_ = checked; }
119  bool checked() const { return checked_; }
120
121 private:
122  Type type_;
123  base::string16 display_text_;
124
125  // If the notification includes a link, these describe the destination and
126  // which part of |display_text_| is the anchor text.
127  GURL link_url_;
128  gfx::Range link_range_;
129
130  // When non-empty, indicates that a tooltip should be shown on the end of
131  // the notification.
132  base::string16 tooltip_text_;
133
134  // Whether the dialog notification's checkbox should be checked. Only applies
135  // when |HasCheckbox()| is true.
136  bool checked_;
137};
138
139extern SkColor const kWarningColor;
140
141struct SuggestionState {
142  SuggestionState();
143  SuggestionState(bool visible,
144                  const base::string16& vertically_compact_text,
145                  const base::string16& horizontally_compact_text,
146                  const gfx::Image& icon,
147                  const base::string16& extra_text,
148                  const gfx::Image& extra_icon);
149  ~SuggestionState();
150
151  // Whether a suggestion should be shown.
152  bool visible;
153
154  // Text to be shown for the suggestion. This should be preferred over
155  // |horizontally_compact_text| when there's enough horizontal space available
156  // to display it. When there's not enough space, fall back to
157  // |horizontally_compact_text|.
158  base::string16 vertically_compact_text;
159  base::string16 horizontally_compact_text;
160
161  gfx::Image icon;
162  base::string16 extra_text;
163  gfx::Image extra_icon;
164};
165
166// A struct to describe a textual message within a dialog overlay.
167struct DialogOverlayString {
168  DialogOverlayString();
169  ~DialogOverlayString();
170
171  // Text content of the message.
172  base::string16 text;
173
174  // Font list to render the message's text in.
175  gfx::FontList font_list;
176};
177
178// A struct to describe a dialog overlay. If |image| is empty, no overlay should
179// be shown.
180struct DialogOverlayState {
181  DialogOverlayState();
182  ~DialogOverlayState();
183
184  // If empty, there should not be an overlay. If non-empty, an image that is
185  // more or less front and center.
186  gfx::Image image;
187
188  // Message to display.
189  DialogOverlayString string;
190};
191
192enum ValidationType {
193  VALIDATE_EDIT,   // Validate user edits. Allow for empty fields.
194  VALIDATE_FINAL,  // Full form validation. Required fields can't be empty.
195};
196
197typedef std::vector<DetailInput> DetailInputs;
198typedef std::map<ServerFieldType, base::string16> FieldValueMap;
199
200// A validity message for a single input field.
201struct ValidityMessage {
202  ValidityMessage(const base::string16& text, bool sure);
203  ~ValidityMessage();
204
205  // Message text. If not empty, error text. If empty, indicates valid field.
206  base::string16 text;
207
208  // If |sure| is true, always display message. If it is false,
209  // only display on final validation (i.e. after the user has attempted to
210  // submit).
211  bool sure;
212};
213
214// A mapping of field types to their corresponding ValidityMessage results.
215class ValidityMessages {
216 public:
217  ValidityMessages();
218  ~ValidityMessages();
219
220  // Sets the message for |field|, but will not overwrite a previous, invalid
221  // message.
222  void Set(ServerFieldType field, const ValidityMessage& message);
223  const ValidityMessage& GetMessageOrDefault(ServerFieldType field) const;
224
225  bool HasSureError(ServerFieldType field) const;
226  bool HasErrors() const;
227  bool HasSureErrors() const;
228
229 private:
230  typedef std::map<ServerFieldType, ValidityMessage> MessageMap;
231  MessageMap messages_;
232  ValidityMessage default_message_;
233};
234
235}  // namespace autofill
236
237#endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_DIALOG_TYPES_H_
238