diff --git a/ChangeLog b/ChangeLog index 93bbea0d6..fcc07f8b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,10 +3,14 @@ * Source/NSAttributedString.m: ([-doubleClickAtIndex:]), Fixed infinite loop. Added code to cope with double click on the space between words. + * Source/GSSimpleLayoutManager.m: Implemented + ([-glyphIndexForPoint:inTextContainer:fractionOfDistanceThroughGlyph:]) * Source/NSTextView.m: ([-selectionRangeForProposedRange:granularity]) Re-implemented word selection using ([-doubleClickAtIndex:]) ([-mouseDown:]) creatre proposed range for selection by merging old - selectin range with new location. + selection range with new location. + Modified ([-characterIndexForPoint:]) to take into account where the + character/glyph was clicked on. 2000-12-24 Fred Kiefer diff --git a/Source/GSSimpleLayoutManager.m b/Source/GSSimpleLayoutManager.m index 9dd37b39f..b22f57976 100644 --- a/Source/GSSimpleLayoutManager.m +++ b/Source/GSSimpleLayoutManager.m @@ -195,8 +195,9 @@ static NSCharacterSet *invSelectionWordGranularitySet; return NSZeroRect; } -- (unsigned)glyphIndexForPoint:(NSPoint)point - inTextContainer:(NSTextContainer *)aTextContainer +- (unsigned) glyphIndexForPoint: (NSPoint)point + inTextContainer: (NSTextContainer*)aTextContainer + fractionOfDistanceThroughGlyph: (float*)partialFraction { _GNULineLayoutInfo *currentInfo = [_lineLayoutInformation objectAtIndex: @@ -211,12 +212,22 @@ static NSCharacterSet *invSelectionWordGranularitySet; float fmax = NSMaxX(rect); float w1, w2; + if (partialFraction != 0) + { + *partialFraction = 0.0; + } if (x <= fmin) - return MAX(0, min - 1); + { + return MAX(0, min - 1); + } if (x >= fmax) - return MAX(0, max); + { + return MAX(0, max); + } if (range.length == 1) - return min; + { + return min; + } // this should give a good starting index for binary search i = (int)((max - min) * (x - fmin) / (fmax - fmin)) + min; @@ -244,6 +255,10 @@ static NSCharacterSet *invSelectionWordGranularitySet; i = (max + min) / 2; continue; } + if (w1 > x) + { + *partialFraction = 1.0 - (w1 - x)/(w1 - w2); + } return MAX(0, i-1); } return MAX(0, min - 1); diff --git a/Source/NSTextView.m b/Source/NSTextView.m index 9c2008aaa..211b10087 100644 --- a/Source/NSTextView.m +++ b/Source/NSTextView.m @@ -3114,12 +3114,19 @@ other than copy/paste or dragging. */ - (unsigned) characterIndexForPoint: (NSPoint) point { - unsigned glyphIndex; + unsigned index; + float fraction; - glyphIndex = [_layoutManager glyphIndexForPoint: point - inTextContainer: _textContainer]; + index = [_layoutManager glyphIndexForPoint: point + inTextContainer: _textContainer + fractionOfDistanceThroughGlyph: &fraction]; - return [_layoutManager characterIndexForGlyphAtIndex: glyphIndex]; + index = [_layoutManager characterIndexForGlyphAtIndex: index]; + if (fraction > 0.5) + { + index++; + } + return index; } - (NSRect) rectForCharacterIndex: (unsigned)index