1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#import "chrome/browser/cocoa/styled_text_field_cell.h"
#include "base/scoped_nsobject.h"
#include "chrome/browser/cocoa/location_bar_view_mac.h"
class ExtensionAction;
// Holds a |LocationBarImageView| and its current rect. Do not keep references
// to this object, only use it directly after calling |-layedOutIcons:|.
// TODO(shess): This class is basically a helper for laying out the
// icons. Try to refactor it away. If that is not reasonable, at
// least split the image and label cases into subclasses once the
// Omnibox stuff is settled.
@interface AutocompleteTextFieldIcon : NSObject {
// YES to draw the label part of |view_|, otherwise draw the image
// part.
BOOL isLabel_;
// The frame rect of |view_|.
NSRect rect_;
// weak, owned by LocationBarViewMac.
LocationBarViewMac::LocationBarImageView* view_;
}
@property(assign, nonatomic) NSRect rect;
@property(assign, nonatomic) LocationBarViewMac::LocationBarImageView* view;
- (id)initImageWithView:(LocationBarViewMac::LocationBarImageView*)view;
- (id)initLabelWithView:(LocationBarViewMac::LocationBarImageView*)view;
// Position |view_| right-justified in |frame|.
- (void)positionInFrame:(NSRect)frame;
// Draw image or label of |view_| in |rect_| within |controlView|.
// Only call after |-positionInFrame:| has set |rect_| (or after an
// explicit |-setRect:|).
- (void)drawInView:(NSView*)controlView;
@end
// AutocompleteTextFieldCell extends StyledTextFieldCell to provide support for
// certain decorations to be applied to the field. These are the search hint
// ("Type to search" on the right-hand side), the keyword hint ("Press [Tab] to
// search Engine" on the right-hand side), and keyword mode ("Search Engine:" in
// a button-like token on the left-hand side).
@interface AutocompleteTextFieldCell : StyledTextFieldCell {
@private
// Set if there is a string to display in a rounded rect on the
// left-hand side of the field. Exclusive WRT |hintString_|.
scoped_nsobject<NSAttributedString> keywordString_;
// Set if there is a string to display as a hint on the right-hand
// side of the field. Exclusive WRT |keywordString_|;
scoped_nsobject<NSAttributedString> hintString_;
// The location icon sits at the left-hand side of the field.
// |keywordString_| overrides.
LocationBarViewMac::LocationIconView* locationIconView_;
// The star icon sits at the right-hand side of the field when an
// URL is being shown.
LocationBarViewMac::LocationBarImageView* starIconView_;
// The security label floats to the left of page actions at the
// right-hand side.
LocationBarViewMac::LocationBarImageView* securityLabelView_;
// List of views showing visible Page Actions. Owned by the location bar.
// Display is exclusive WRT the |hintString_| and |keywordString_|.
// This may be NULL during testing.
LocationBarViewMac::PageActionViewList* page_action_views_;
// List of content blocked icons. This may be NULL during testing.
LocationBarViewMac::ContentSettingViews* content_setting_views_;
}
// Chooses |partialString| if |width| won't fit |fullString|. Strings
// must be non-nil.
- (void)setKeywordString:(NSString*)fullString
partialString:(NSString*)partialString
availableWidth:(CGFloat)width;
// Chooses |anImage| only if all pieces won't fit w/in |width|.
// Inputs must be non-nil.
- (void)setKeywordHintPrefix:(NSString*)prefixString
image:(NSImage*)anImage
suffix:(NSString*)suffixString
availableWidth:(CGFloat)width;
// Suppresses hint entirely if |aString| won't fit w/in |width|.
// String must be non-nil.
- (void)setSearchHintString:(NSString*)aString
availableWidth:(CGFloat)width;
- (void)clearKeywordAndHint;
- (void)setLocationIconView:(LocationBarViewMac::LocationIconView*)view;
- (void)setStarIconView:(LocationBarViewMac::LocationBarImageView*)view;
- (void)setSecurityLabelView:(LocationBarViewMac::LocationBarImageView*)view;
- (void)setPageActionViewList:(LocationBarViewMac::PageActionViewList*)list;
- (void)setContentSettingViewsList:
(LocationBarViewMac::ContentSettingViews*)views;
// Returns the portion of the cell to use for displaying the location
// icon.
- (NSRect)locationIconFrameForFrame:(NSRect)cellFrame;
// Returns an array of the visible AutocompleteTextFieldIcon objects. Returns
// only visible icons.
- (NSArray*)layedOutIcons:(NSRect)cellFrame;
// Return the rectangle the star is being shown in, for purposes of
// positioning the bookmark bubble.
- (NSRect)starIconFrameForFrame:(NSRect)cellFrame;
// Returns the portion of the cell to use for displaying the Page
// Action icon at the given index. May be NSZeroRect if the index's
// action is not visible. This does a linear walk over all page
// actions, so do not call this in a loop to get the position of all
// page actions. Use |-layedOutIcons:| instead in that case.
- (NSRect)pageActionFrameForIndex:(size_t)index inFrame:(NSRect)cellFrame;
// Similar to |pageActionFrameForIndex:inFrame| but accepts an
// ExtensionAction for when the index is not known.
- (NSRect)pageActionFrameForExtensionAction:(ExtensionAction*)action
inFrame:(NSRect)cellFrame;
// Find the icon under the event. |nil| if |theEvent| is not over
// anything.
- (AutocompleteTextFieldIcon*)iconForEvent:(NSEvent*)theEvent
inRect:(NSRect)cellFrame
ofView:(AutocompleteTextField*)controlView;
// Return the appropriate menu for any page actions under event.
// Returns nil if no menu is present for the action, or if the event
// is not over an action.
- (NSMenu*)actionMenuForEvent:(NSEvent*)theEvent
inRect:(NSRect)cellFrame
ofView:(AutocompleteTextField*)controlView;
// Called by |AutocompleteTextField| to let page actions intercept
// clicks. Returns |YES| if the click has been intercepted.
- (BOOL)mouseDown:(NSEvent*)theEvent
inRect:(NSRect)cellFrame
ofView:(AutocompleteTextField*)controlView;
// If the location icon is draggable, return its drag pasteboard.
- (NSPasteboard*)locationDragPasteboard;
@end
// Internal methods here exposed for unit testing.
@interface AutocompleteTextFieldCell (UnitTesting)
@property(readonly) NSAttributedString* keywordString;
@property(readonly) NSAttributedString* hintString;
@property(readonly) NSAttributedString* hintIconLabel;
// Returns the total number of installed Page Actions, visible or not.
- (size_t)pageActionCount;
@end
|