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]]) | 
