1// Copyright (c) 2013 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_COCOA_AUTOFILL_AUTOFILL_SECTION_CONTAINER_H_
6#define CHROME_BROWSER_UI_COCOA_AUTOFILL_AUTOFILL_SECTION_CONTAINER_H_
7
8#import <Cocoa/Cocoa.h>
9
10#include "base/mac/scoped_nsobject.h"
11#include "base/memory/scoped_ptr.h"
12#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
13#import "chrome/browser/ui/cocoa/autofill/autofill_input_field.h"
14#import "chrome/browser/ui/cocoa/autofill/autofill_layout.h"
15
16namespace autofill {
17class AutofillDialogViewDelegate;
18}
19
20@class AutofillSectionView;
21@class AutofillSuggestionContainer;
22@class AutofillTextField;
23@class AutofillTooltipController;
24@class LayoutView;
25@class MenuButton;
26@class MenuController;
27
28// Delegate to handle display of validation messages.
29@protocol AutofillValidationDisplay
30
31// Updates the validation message for a given field.
32- (void)updateMessageForField:(NSControl<AutofillInputField>*)field;
33
34// Hides the validation error bubble.
35- (void)hideErrorBubble;
36
37@end
38
39
40// View delegate for a section of the payment details. Contains a label
41// describing the section as well as associated inputs and controls. Built
42// dynamically based on data retrieved from AutofillDialogViewDelegate.
43@interface AutofillSectionContainer :
44    NSViewController<AutofillLayout, AutofillInputDelegate> {
45 @private
46  base::scoped_nsobject<LayoutView> inputs_;
47  base::scoped_nsobject<MenuButton> suggestButton_;
48  base::scoped_nsobject<AutofillSuggestionContainer> suggestContainer_;
49  base::scoped_nsobject<NSTextField> label_;
50
51  // The view for the container.
52  base::scoped_nsobject<AutofillSectionView> view_;
53
54  // Some sections need to show an icon with an associated tooltip. This is the
55  // controller for such an icon. There is at most one such icon per section.
56  base::scoped_nsobject<AutofillTooltipController> tooltipController_;
57
58  // The logical superview for the tooltip icon. Weak pointer, owned by
59  // |inputs_|.
60  AutofillTextField* tooltipField_;
61
62  // List of weak pointers, which constitute unique field IDs.
63  std::vector<const autofill::DetailInput*> detailInputs_;
64
65  // A delegate to handle display of validation messages. Not owned.
66  id<AutofillValidationDisplay> validationDelegate_;
67
68  // Indicate whether the dialog should show suggestions or manual inputs when
69  // performLayout is triggered.
70  BOOL showSuggestions_;
71
72  base::scoped_nsobject<MenuController> menuController_;
73  autofill::DialogSection section_;
74  autofill::AutofillDialogViewDelegate* delegate_;  // Not owned.
75}
76
77@property(readonly, nonatomic) autofill::DialogSection section;
78@property(assign, nonatomic) id<AutofillValidationDisplay> validationDelegate;
79
80// Designated initializer. Queries |delegate| for the list of desired input
81// fields for |section|.
82- (id)initWithDelegate:(autofill::AutofillDialogViewDelegate*)delegate
83            forSection:(autofill::DialogSection)section;
84
85// Populates |output| with mappings from field identification to input value.
86- (void)getInputs:(autofill::FieldValueMap*)output;
87
88// Called when the delegate-maintained suggestions model has changed.
89- (void)modelChanged;
90
91// Called when the contents of a section have changed.
92- (void)update;
93
94// Fills the section with Autofill data that was triggered by a user
95// interaction with the originating |type|.
96- (void)fillForType:(const autofill::ServerFieldType)type;
97
98// Validate this section. Validation rules depend on |validationType|.
99- (BOOL)validateFor:(autofill::ValidationType)validationType;
100
101// Returns the value of the |suggestContainer_|'s input field, or nil if no
102// suggestion is currently showing.
103- (NSString*)suggestionText;
104
105// Collects all input fields (direct & suggestions) into the given |array|.
106- (void)addInputsToArray:(NSMutableArray*)array;
107
108@end
109
110@interface AutofillSectionContainer (ForTesting)
111
112// Retrieve the field associated with the given type.
113- (NSControl<AutofillInputField>*)getField:(autofill::ServerFieldType)type;
114
115// Sets the value for the field matching |type|. Does nothing if the field is
116// not part of this section.
117- (void)setFieldValue:(NSString*)text
118              forType:(autofill::ServerFieldType)type;
119
120// Sets the value for the suggestion text field.
121- (void)setSuggestionFieldValue:(NSString*)text;
122
123// Activates a given input field, determined by |type|. Does nothing if the
124// field is not part of this section.
125- (void)activateFieldForType:(autofill::ServerFieldType)type;
126
127@end
128
129#endif  // CHROME_BROWSER_UI_COCOA_AUTOFILL_AUTOFILL_SECTION_CONTAINER_H_
130