summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/styled_text_field.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/styled_text_field.mm')
-rw-r--r--chrome/browser/ui/cocoa/styled_text_field.mm61
1 files changed, 61 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/styled_text_field.mm b/chrome/browser/ui/cocoa/styled_text_field.mm
new file mode 100644
index 0000000..31dd3a7
--- /dev/null
+++ b/chrome/browser/ui/cocoa/styled_text_field.mm
@@ -0,0 +1,61 @@
+// Copyright (c) 2009 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 "chrome/browser/ui/cocoa/styled_text_field.h"
+
+#include "base/logging.h"
+#import "chrome/browser/ui/cocoa/styled_text_field_cell.h"
+
+@implementation StyledTextField
+
+- (StyledTextFieldCell*)styledTextFieldCell {
+ DCHECK([[self cell] isKindOfClass:[StyledTextFieldCell class]]);
+ return static_cast<StyledTextFieldCell*>([self cell]);
+}
+
+// Cocoa text fields are edited by placing an NSTextView as subview,
+// positioned by the cell's -editWithFrame:inView:... method. Using
+// the standard -makeFirstResponder: machinery to reposition the field
+// editor results in resetting the field editor's editing state, which
+// AutocompleteEditViewMac monitors. This causes problems because
+// editing can require the field editor to be repositioned, which
+// could disrupt editing. This code repositions the subview directly,
+// which causes no editing-state changes.
+- (void)resetFieldEditorFrameIfNeeded {
+ // No action if not editing.
+ NSText* editor = [self currentEditor];
+ if (!editor) {
+ return;
+ }
+
+ // When editing, we should have exactly one subview, which is a
+ // clipview containing the editor (for purposes of scrolling).
+ NSArray* subviews = [self subviews];
+ DCHECK_EQ([subviews count], 1U);
+ DCHECK([editor isDescendantOf:self]);
+ if ([subviews count] == 0) {
+ return;
+ }
+
+ // If the frame is already right, don't make any visible changes.
+ StyledTextFieldCell* cell = [self styledTextFieldCell];
+ const NSRect frame([cell drawingRectForBounds:[self bounds]]);
+ NSView* subview = [subviews objectAtIndex:0];
+ if (NSEqualRects(frame, [subview frame])) {
+ return;
+ }
+
+ [subview setFrame:frame];
+
+ // Make sure the selection remains visible.
+ [editor scrollRangeToVisible:[editor selectedRange]];
+}
+
+- (CGFloat)availableDecorationWidth {
+ NSAttributedString* as = [self attributedStringValue];
+ const NSSize size([as size]);
+ const NSRect bounds([self bounds]);
+ return NSWidth(bounds) - size.width;
+}
+@end