1 // Copyright (c) 2011 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.
5 #import "chrome/browser/ui/cocoa/styled_text_field.h"
7 #include "base/logging.h"
8 #import "chrome/browser/ui/cocoa/styled_text_field_cell.h"
10 @implementation StyledTextField
12 - (StyledTextFieldCell*)styledTextFieldCell {
13 DCHECK([[self cell] isKindOfClass:[StyledTextFieldCell class]]);
14 return static_cast<StyledTextFieldCell*>([self cell]);
17 // Cocoa text fields are edited by placing an NSTextView as subview,
18 // positioned by the cell's -editWithFrame:inView:... method. Using
19 // the standard -makeFirstResponder: machinery to reposition the field
20 // editor results in resetting the field editor's editing state, which
21 // OmniboxViewMac monitors. This causes problems because
22 // editing can require the field editor to be repositioned, which
23 // could disrupt editing. This code repositions the subview directly,
24 // which causes no editing-state changes.
25 - (void)resetFieldEditorFrameIfNeeded {
26 // No action if not editing.
27 NSText* editor = [self currentEditor];
32 // When editing, we should have exactly one subview, which is a
33 // clipview containing the editor (for purposes of scrolling).
34 NSArray* subviews = [self subviews];
35 DCHECK_EQ([subviews count], 1U);
36 DCHECK([editor isDescendantOf:self]);
37 if ([subviews count] == 0) {
41 // If the frame is already right, don't make any visible changes.
42 StyledTextFieldCell* cell = [self styledTextFieldCell];
43 const NSRect frame([cell drawingRectForBounds:[self bounds]]);
44 NSView* subview = [subviews objectAtIndex:0];
45 if (NSEqualRects(frame, [subview frame])) {
49 [subview setFrame:frame];
51 // Make sure the selection remains visible.
52 [editor scrollRangeToVisible:[editor selectedRange]];
55 - (CGFloat)availableDecorationWidth {
56 NSAttributedString* as = [self attributedStringValue];
57 const NSSize size([as size]);
58 const NSRect bounds([self bounds]);
59 return NSWidth(bounds) - size.width;
62 - (NSFocusRingType)focusRingType {
63 // This is taken care of by the custom drawing code in the cell.
64 return NSFocusRingTypeNone;
67 // Due to theming, parts of the field are transparent.