• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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