diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 0dbb30bde..09ed728f4 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -684,7 +684,16 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // Select the text if the textfield became first responder through keyboard interaction if (!_willBecomeFirstResponderByClick) + { [self _selectText:self immediately:YES]; + } + else + { + var point = CGPointMake([self convertPointFromBase:[[CPApp currentEvent] locationInWindow]].x - [self currentValueForThemeAttribute:@"content-inset"].left, 0), + position = [CPPlatformString charPositionOfString:[self stringValue] withFont:[self font] forPoint:point]; + + [self setSelectedRange:CPMakeRange(position, 0)]; + } _willBecomeFirstResponderByClick = NO; diff --git a/AppKit/Platform/DOM/CPPlatformString.j b/AppKit/Platform/DOM/CPPlatformString.j index 1e520dd7f..dc97f0b82 100644 --- a/AppKit/Platform/DOM/CPPlatformString.j +++ b/AppKit/Platform/DOM/CPPlatformString.j @@ -129,6 +129,41 @@ var DOMFixedWidthSpanElement = nil, DOMMetricsDivElement.appendChild(DOMMetricsImgElement); } ++ (int)charPositionOfString:(CPString)aString withFont:(CPFont)aFont forPoint:(CGPoint)aPoint +{ + if (!aString) + return 0; + + var position = 0, + stringLength = aString.length, + currentString = ""; + + for (var i = 0; i < stringLength; i++) + { + var char = aString[i]; + + currentString += char; + + var sizeOfString = [self sizeOfString:currentString withFont:aFont forWidth:nil].width; + + if (sizeOfString < aPoint.x) + { + position++; + } + else + { + var sizeLastChar = [self sizeOfString:char withFont:aFont forWidth:nil].width; + + if (sizeOfString - sizeLastChar / 2 < aPoint.x) + position++; + + break; + } + } + + return position; +} + + (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth { if (!DOMFixedWidthSpanElement)