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. 4 5 #import "chrome/browser/ui/cocoa/styled_text_field.h" 6 7 #include "base/logging.h" 8 #import "chrome/browser/ui/cocoa/styled_text_field_cell.h" 9 10 @implementation StyledTextField 11 12 - (StyledTextFieldCell*)styledTextFieldCell { 13 DCHECK([[self cell] isKindOfClass:[StyledTextFieldCell class]]); 14 return static_cast<StyledTextFieldCell*>([self cell]); 15 } 16 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]; 28 if (!editor) { 29 return; 30 } 31 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) { 38 return; 39 } 40 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])) { 46 return; 47 } 48 49 [subview setFrame:frame]; 50 51 // Make sure the selection remains visible. 52 [editor scrollRangeToVisible:[editor selectedRange]]; 53 } 54 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; 60 } 61 62 - (NSFocusRingType)focusRingType { 63 // This is taken care of by the custom drawing code in the cell. 64 return NSFocusRingTypeNone; 65 } 66 67 // Due to theming, parts of the field are transparent. 68 - (BOOL)isOpaque { 69 return NO; 70 } 71 72 @end 73