diff options
-rw-r--r-- | cocoa/ScintillaView.h | 1 | ||||
-rw-r--r-- | cocoa/ScintillaView.mm | 30 |
2 files changed, 27 insertions, 4 deletions
diff --git a/cocoa/ScintillaView.h b/cocoa/ScintillaView.h index 079e42116..c397cad8d 100644 --- a/cocoa/ScintillaView.h +++ b/cocoa/ScintillaView.h @@ -142,6 +142,7 @@ extern NSString *const SCIUpdateUINotification; - (void) setEditable: (BOOL) editable; - (BOOL) isEditable; - (NSRange) selectedRange; +- (NSRange) selectedRangePositions; - (NSString*) selectedString; diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index 491aba572..83e8f5398 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -365,6 +365,10 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) - (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange { + const NSInteger lengthCharacters = self.accessibilityNumberOfCharacters; + if (aRange.location > lengthCharacters) { + return nil; + } const NSRange posRange = mOwner.backend->PositionsFromCharacters(aRange); // The backend validated aRange and may have removed characters beyond the end of the document. const NSRange charRange = mOwner.backend->CharactersFromPositions(posRange); @@ -505,9 +509,11 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) - (NSRange) selectedRange { - const long positionBegin = [mOwner message: SCI_GETSELECTIONSTART]; - const long positionEnd = [mOwner message: SCI_GETSELECTIONEND]; - NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin); + const NSRange posRangeSel = [mOwner selectedRangePositions]; + if (posRangeSel.length == 0) + { + return NSMakeRange(NSNotFound, 0); + } return mOwner.backend->CharactersFromPositions(posRangeSel); } @@ -571,7 +577,8 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) } // Ensure only a single selection. mOwner.backend->SelectOnlyMainSelection(); - replacementRange = [self selectedRange]; + const NSRange posRangeSel = [mOwner selectedRangePositions]; + replacementRange = mOwner.backend->CharactersFromPositions(posRangeSel); } } @@ -1993,6 +2000,21 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context //-------------------------------------------------------------------------------------------------- +/** + * Return the main selection as an NSRange of positions (not characters). + * Unlike selectedRange, this can return empty ranges inside the document. + */ + +- (NSRange) selectedRangePositions +{ + const sptr_t positionBegin = [self message: SCI_GETSELECTIONSTART]; + const sptr_t positionEnd = [self message: SCI_GETSELECTIONEND]; + return NSMakeRange(positionBegin, positionEnd-positionBegin); +} + + +//-------------------------------------------------------------------------------------------------- + - (void)insertText: (id) aString { if ([aString isKindOfClass:[NSString class]]) |