autocomplete_text_field.h revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2010 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_AUTOCOMPLETE_TEXT_FIELD_H_
6#define CHROME_BROWSER_UI_COCOA_AUTOCOMPLETE_TEXT_FIELD_H_
7#pragma once
8
9#import <Cocoa/Cocoa.h>
10
11#import "base/mac/cocoa_protocols.h"
12#include "base/scoped_nsobject.h"
13#import "chrome/browser/ui/cocoa/styled_text_field.h"
14#import "chrome/browser/ui/cocoa/url_drop_target.h"
15
16@class AutocompleteTextFieldCell;
17
18// AutocompleteTextField intercepts UI actions for forwarding to
19// AutocompleteEditViewMac (*), and provides a custom look.  It works
20// together with AutocompleteTextFieldEditor (mostly for intercepting
21// user actions) and AutocompleteTextFieldCell (mostly for custom
22// drawing).
23//
24// For historical reasons, chrome/browser/autocomplete is the core
25// implementation of the Omnibox.  Chrome code seems to vary between
26// autocomplete and Omnibox in describing this.
27//
28// (*) AutocompleteEditViewMac is a view in the MVC sense for the
29// Chrome internals, though it's really more of a mish-mash of model,
30// view, and controller.
31
32// Provides a hook so that we can call directly down to
33// AutocompleteEditViewMac rather than traversing the delegate chain.
34class AutocompleteTextFieldObserver {
35 public:
36  // Called before changing the selected range of the field.
37  virtual NSRange SelectionRangeForProposedRange(NSRange proposed_range) = 0;
38
39  // Called when the control-key state changes while the field is
40  // first responder.
41  virtual void OnControlKeyChanged(bool pressed) = 0;
42
43  // Called when the user pastes into the field.
44  virtual void OnPaste() = 0;
45
46  // Return |true| if there is a selection to copy.
47  virtual bool CanCopy() = 0;
48
49  // Clears the |pboard| and adds the field's current selection.
50  // Called when the user does a copy or drag.
51  virtual void CopyToPasteboard(NSPasteboard* pboard) = 0;
52
53  // Returns true if the current clipboard text supports paste and go
54  // (or paste and search).
55  virtual bool CanPasteAndGo() = 0;
56
57  // Returns the appropriate "Paste and Go" or "Paste and Search"
58  // context menu string, depending on what is currently in the
59  // clipboard.  Must not be called unless CanPasteAndGo() returns
60  // true.
61  virtual int GetPasteActionStringId() = 0;
62
63  // Called when the user initiates a "paste and go" or "paste and
64  // search" into the field.
65  virtual void OnPasteAndGo() = 0;
66
67  // Called when the field's frame changes.
68  virtual void OnFrameChanged() = 0;
69
70  // Called when the popup is no longer appropriate, such as when the
71  // field's window loses focus or a page action is clicked.
72  virtual void ClosePopup() = 0;
73
74  // Called when the user begins editing the field, for every edit,
75  // and when the user is done editing the field.
76  virtual void OnDidBeginEditing() = 0;
77  virtual void OnBeforeChange() = 0;
78  virtual void OnDidChange() = 0;
79  virtual void OnDidEndEditing() = 0;
80
81  // Called before input methods sets composition text in the field.
82  virtual void OnStartingIME() = 0;
83
84  // NSResponder translates certain keyboard actions into selectors
85  // passed to -doCommandBySelector:.  The selector is forwarded here,
86  // return true if |cmd| is handled, false if the caller should
87  // handle it.
88  // TODO(shess): For now, I think having the code which makes these
89  // decisions closer to the other autocomplete code is worthwhile,
90  // since it calls a wide variety of methods which otherwise aren't
91  // clearly relevent to expose here.  But consider pulling more of
92  // the AutocompleteEditViewMac calls up to here.
93  virtual bool OnDoCommandBySelector(SEL cmd) = 0;
94
95  // Called whenever the autocomplete text field gets focused.
96  virtual void OnSetFocus(bool control_down) = 0;
97
98  // Called whenever the autocomplete text field is losing focus.
99  virtual void OnKillFocus() = 0;
100
101 protected:
102  virtual ~AutocompleteTextFieldObserver() {}
103};
104
105@interface AutocompleteTextField : StyledTextField<NSTextViewDelegate,
106                                                   URLDropTarget> {
107 @private
108  // Undo manager for this text field.  We use a specific instance rather than
109  // the standard undo manager in order to let us clear the undo stack at will.
110  scoped_nsobject<NSUndoManager> undoManager_;
111
112  AutocompleteTextFieldObserver* observer_;  // weak, owned by location bar.
113
114  // Handles being a drag-and-drop target.
115  scoped_nsobject<URLDropTargetHandler> dropHandler_;
116
117  // Holds current tooltip strings, to keep them from being dealloced.
118  scoped_nsobject<NSMutableArray> currentToolTips_;
119}
120
121@property(nonatomic) AutocompleteTextFieldObserver* observer;
122
123// Convenience method to return the cell, casted appropriately.
124- (AutocompleteTextFieldCell*)cell;
125
126// Superclass aborts editing before changing the string, which causes
127// problems for undo.  This version modifies the field editor's
128// contents if the control is already being edited.
129- (void)setAttributedStringValue:(NSAttributedString*)aString;
130
131// Clears the undo chain for this text field.
132- (void)clearUndoChain;
133
134// Updates cursor and tooltip rects depending on the contents of the text field
135// e.g. the security icon should have a default pointer shown on hover instead
136// of an I-beam.
137- (void)updateCursorAndToolTipRects;
138
139// Return the appropriate menu for any decoration under |event|.
140- (NSMenu*)decorationMenuForEvent:(NSEvent*)event;
141
142// Retains |tooltip| (in |currentToolTips_|) and adds this tooltip
143// via -[NSView addToolTipRect:owner:userData:].
144- (void)addToolTip:(NSString*)tooltip forRect:(NSRect)aRect;
145
146@end
147
148#endif  // CHROME_BROWSER_UI_COCOA_AUTOCOMPLETE_TEXT_FIELD_H_
149