aboutsummaryrefslogtreecommitdiffhomepage
path: root/cocoa/ScintillaView.mm
diff options
context:
space:
mode:
Diffstat (limited to 'cocoa/ScintillaView.mm')
-rw-r--r--cocoa/ScintillaView.mm2494
1 files changed, 1146 insertions, 1348 deletions
diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm
index df03add5f..ea6f6f510 100644
--- a/cocoa/ScintillaView.mm
+++ b/cocoa/ScintillaView.mm
@@ -17,221 +17,201 @@ using namespace Scintilla;
// Add backend property to ScintillaView as a private category.
// Specified here as backend accessed by SCIMarginView and SCIContentView.
-@interface ScintillaView ()
-@property (nonatomic, readonly) Scintilla::ScintillaCocoa* backend;
+@interface ScintillaView()
+@property(nonatomic, readonly) Scintilla::ScintillaCocoa *backend;
@end
// Two additional cursors we need, which aren't provided by Cocoa.
-static NSCursor* reverseArrowCursor;
-static NSCursor* waitCursor;
+static NSCursor *reverseArrowCursor;
+static NSCursor *waitCursor;
NSString *const SCIUpdateUINotification = @"SCIUpdateUI";
/**
* Provide an NSCursor object that matches the Window::Cursor enumeration.
*/
-static NSCursor *cursorFromEnum(Window::Cursor cursor)
-{
- switch (cursor)
- {
- case Window::cursorText:
- return [NSCursor IBeamCursor];
- case Window::cursorArrow:
- return [NSCursor arrowCursor];
- case Window::cursorWait:
- return waitCursor;
- case Window::cursorHoriz:
- return [NSCursor resizeLeftRightCursor];
- case Window::cursorVert:
- return [NSCursor resizeUpDownCursor];
- case Window::cursorReverseArrow:
- return reverseArrowCursor;
- case Window::cursorUp:
- default:
- return [NSCursor arrowCursor];
- }
+static NSCursor *cursorFromEnum(Window::Cursor cursor) {
+ switch (cursor) {
+ case Window::cursorText:
+ return [NSCursor IBeamCursor];
+ case Window::cursorArrow:
+ return [NSCursor arrowCursor];
+ case Window::cursorWait:
+ return waitCursor;
+ case Window::cursorHoriz:
+ return [NSCursor resizeLeftRightCursor];
+ case Window::cursorVert:
+ return [NSCursor resizeUpDownCursor];
+ case Window::cursorReverseArrow:
+ return reverseArrowCursor;
+ case Window::cursorUp:
+ default:
+ return [NSCursor arrowCursor];
+ }
}
// Add marginWidth and owner properties as a private category.
-@interface SCIMarginView ()
-@property (assign) int marginWidth;
-@property (nonatomic, weak) ScintillaView* owner;
+@interface SCIMarginView()
+@property(assign) int marginWidth;
+@property(nonatomic, weak) ScintillaView *owner;
@end
@implementation SCIMarginView {
- int marginWidth;
- ScintillaView *__weak owner;
- NSMutableArray *currentCursors;
+ int marginWidth;
+ ScintillaView *__weak owner;
+ NSMutableArray *currentCursors;
}
@synthesize marginWidth, owner;
-- (instancetype)initWithScrollView:(NSScrollView *)aScrollView
-{
- self = [super initWithScrollView:aScrollView orientation:NSVerticalRuler];
- if (self != nil)
- {
- owner = nil;
- marginWidth = 20;
- currentCursors = [NSMutableArray arrayWithCapacity:0];
- for (size_t i=0; i<=SC_MAX_MARGIN; i++)
- {
- [currentCursors addObject: reverseArrowCursor];
- }
- self.clientView = aScrollView.documentView;
- if ([self respondsToSelector: @selector(setAccessibilityLabel:)])
- self.accessibilityLabel = @"Scintilla Margin";
- }
- return self;
+- (instancetype) initWithScrollView: (NSScrollView *) aScrollView {
+ self = [super initWithScrollView: aScrollView orientation: NSVerticalRuler];
+ if (self != nil) {
+ owner = nil;
+ marginWidth = 20;
+ currentCursors = [NSMutableArray arrayWithCapacity: 0];
+ for (size_t i=0; i<=SC_MAX_MARGIN; i++) {
+ [currentCursors addObject: reverseArrowCursor];
+ }
+ self.clientView = aScrollView.documentView;
+ if ([self respondsToSelector: @selector(setAccessibilityLabel:)])
+ self.accessibilityLabel = @"Scintilla Margin";
+ }
+ return self;
}
-- (void) setFrame: (NSRect) frame
-{
- super.frame = frame;
+- (void) setFrame: (NSRect) frame {
+ super.frame = frame;
- [self.window invalidateCursorRectsForView: self];
+ [self.window invalidateCursorRectsForView: self];
}
-- (CGFloat)requiredThickness
-{
- return marginWidth;
+- (CGFloat) requiredThickness {
+ return marginWidth;
}
-- (void)drawHashMarksAndLabelsInRect:(NSRect)aRect
-{
- if (owner) {
- NSRect contentRect = self.scrollView.contentView.bounds;
- NSRect marginRect = self.bounds;
- // Ensure paint to bottom of view to avoid glitches
- if (marginRect.size.height > contentRect.size.height) {
- // Legacy scroll bar mode leaves a poorly painted corner
- aRect = marginRect;
- }
- owner.backend->PaintMargin(aRect);
- }
+- (void) drawHashMarksAndLabelsInRect: (NSRect) aRect {
+ if (owner) {
+ NSRect contentRect = self.scrollView.contentView.bounds;
+ NSRect marginRect = self.bounds;
+ // Ensure paint to bottom of view to avoid glitches
+ if (marginRect.size.height > contentRect.size.height) {
+ // Legacy scroll bar mode leaves a poorly painted corner
+ aRect = marginRect;
+ }
+ owner.backend->PaintMargin(aRect);
+ }
}
/**
* Called by the framework if it wants to show a context menu for the margin.
*/
-- (NSMenu*) menuForEvent: (NSEvent*) theEvent
-{
- NSMenu *menu = [owner menuForEvent: theEvent];
- if (menu) {
- return menu;
- } else if (owner.backend->ShouldDisplayPopupOnMargin()) {
- return owner.backend->CreateContextMenu(theEvent);
- } else {
- return nil;
- }
+- (NSMenu *) menuForEvent: (NSEvent *) theEvent {
+ NSMenu *menu = [owner menuForEvent: theEvent];
+ if (menu) {
+ return menu;
+ } else if (owner.backend->ShouldDisplayPopupOnMargin()) {
+ return owner.backend->CreateContextMenu(theEvent);
+ } else {
+ return nil;
+ }
}
-- (void) mouseDown: (NSEvent *) theEvent
-{
- NSClipView *textView = self.scrollView.contentView;
- [textView.window makeFirstResponder:textView];
- owner.backend->MouseDown(theEvent);
+- (void) mouseDown: (NSEvent *) theEvent {
+ NSClipView *textView = self.scrollView.contentView;
+ [textView.window makeFirstResponder: textView];
+ owner.backend->MouseDown(theEvent);
}
-- (void) rightMouseDown: (NSEvent *) theEvent
-{
- [NSMenu popUpContextMenu:[self menuForEvent: theEvent] withEvent:theEvent forView:self];
+- (void) rightMouseDown: (NSEvent *) theEvent {
+ [NSMenu popUpContextMenu: [self menuForEvent: theEvent] withEvent: theEvent forView: self];
- owner.backend->RightMouseDown(theEvent);
+ owner.backend->RightMouseDown(theEvent);
}
-- (void) mouseDragged: (NSEvent *) theEvent
-{
- owner.backend->MouseMove(theEvent);
+- (void) mouseDragged: (NSEvent *) theEvent {
+ owner.backend->MouseMove(theEvent);
}
-- (void) mouseMoved: (NSEvent *) theEvent
-{
- owner.backend->MouseMove(theEvent);
+- (void) mouseMoved: (NSEvent *) theEvent {
+ owner.backend->MouseMove(theEvent);
}
-- (void) mouseUp: (NSEvent *) theEvent
-{
- owner.backend->MouseUp(theEvent);
+- (void) mouseUp: (NSEvent *) theEvent {
+ owner.backend->MouseUp(theEvent);
}
// Not a simple button so return failure
-- (BOOL)accessibilityPerformPress
-{
- return NO;
+- (BOOL) accessibilityPerformPress {
+ return NO;
}
/**
* This method is called to give us the opportunity to define our mouse sensitive rectangle.
*/
-- (void) resetCursorRects
-{
- [super resetCursorRects];
-
- int x = 0;
- NSRect marginRect = self.bounds;
- size_t co = currentCursors.count;
- for (size_t i=0; i<co; i++)
- {
- long cursType = owner.backend->WndProc(SCI_GETMARGINCURSORN, i, 0);
- long width =owner.backend->WndProc(SCI_GETMARGINWIDTHN, i, 0);
- NSCursor *cc = cursorFromEnum(static_cast<Window::Cursor>(cursType));
- currentCursors[i] = cc;
- marginRect.origin.x = x;
- marginRect.size.width = width;
- [self addCursorRect: marginRect cursor: cc];
- [cc setOnMouseEntered: YES];
- x += width;
- }
+- (void) resetCursorRects {
+ [super resetCursorRects];
+
+ int x = 0;
+ NSRect marginRect = self.bounds;
+ size_t co = currentCursors.count;
+ for (size_t i=0; i<co; i++) {
+ long cursType = owner.backend->WndProc(SCI_GETMARGINCURSORN, i, 0);
+ long width =owner.backend->WndProc(SCI_GETMARGINWIDTHN, i, 0);
+ NSCursor *cc = cursorFromEnum(static_cast<Window::Cursor>(cursType));
+ currentCursors[i] = cc;
+ marginRect.origin.x = x;
+ marginRect.size.width = width;
+ [self addCursorRect: marginRect cursor: cc];
+ [cc setOnMouseEntered: YES];
+ x += width;
+ }
}
@end
// Add owner property as a private category.
-@interface SCIContentView ()
-@property (nonatomic, weak) ScintillaView* owner;
+@interface SCIContentView()
+@property(nonatomic, weak) ScintillaView *owner;
@end
@implementation SCIContentView {
- ScintillaView* __weak mOwner;
- NSCursor* mCurrentCursor;
- NSTrackingArea *trackingArea;
+ ScintillaView *__weak mOwner;
+ NSCursor *mCurrentCursor;
+ NSTrackingArea *trackingArea;
- // Set when we are in composition mode and partial input is displayed.
- NSRange mMarkedTextRange;
+ // Set when we are in composition mode and partial input is displayed.
+ NSRange mMarkedTextRange;
}
@synthesize owner = mOwner;
//--------------------------------------------------------------------------------------------------
-- (NSView*) initWithFrame: (NSRect) frame
-{
- self = [super initWithFrame: frame];
+- (NSView *) initWithFrame: (NSRect) frame {
+ self = [super initWithFrame: frame];
- if (self != nil)
- {
- // Some initialization for our view.
- mCurrentCursor = [NSCursor arrowCursor];
- trackingArea = nil;
- mMarkedTextRange = NSMakeRange(NSNotFound, 0);
+ if (self != nil) {
+ // Some initialization for our view.
+ mCurrentCursor = [NSCursor arrowCursor];
+ trackingArea = nil;
+ mMarkedTextRange = NSMakeRange(NSNotFound, 0);
- [self registerForDraggedTypes: @[NSStringPboardType, ScintillaRecPboardType, NSFilenamesPboardType]];
+ [self registerForDraggedTypes: @[NSStringPboardType, ScintillaRecPboardType, NSFilenamesPboardType]];
- // Set up accessibility in the text role
- if ([self respondsToSelector: @selector(setAccessibilityElement:)])
- {
- self.accessibilityElement = TRUE;
- self.accessibilityEnabled = TRUE;
- self.accessibilityLabel = NSLocalizedString(@"Scintilla", nil); // No real localization
- self.accessibilityRoleDescription = @"source code editor";
- self.accessibilityRole = NSAccessibilityTextAreaRole;
- self.accessibilityIdentifier = @"Scintilla";
- }
- }
+ // Set up accessibility in the text role
+ if ([self respondsToSelector: @selector(setAccessibilityElement:)]) {
+ self.accessibilityElement = TRUE;
+ self.accessibilityEnabled = TRUE;
+ self.accessibilityLabel = NSLocalizedString(@"Scintilla", nil); // No real localization
+ self.accessibilityRoleDescription = @"source code editor";
+ self.accessibilityRole = NSAccessibilityTextAreaRole;
+ self.accessibilityIdentifier = @"Scintilla";
+ }
+ }
- return self;
+ return self;
}
//--------------------------------------------------------------------------------------------------
@@ -239,20 +219,18 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* When the view is resized or scrolled we need to update our tracking area.
*/
-- (void) updateTrackingAreas
-{
- if (trackingArea)
- {
- [self removeTrackingArea:trackingArea];
- }
+- (void) updateTrackingAreas {
+ if (trackingArea) {
+ [self removeTrackingArea: trackingArea];
+ }
- int opts = (NSTrackingActiveAlways | NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
- trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
- options:opts
- owner:self
- userInfo:nil];
- [self addTrackingArea: trackingArea];
- [super updateTrackingAreas];
+ int opts = (NSTrackingActiveAlways | NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
+ trackingArea = [[NSTrackingArea alloc] initWithRect: self.bounds
+ options: opts
+ owner: self
+ userInfo: nil];
+ [self addTrackingArea: trackingArea];
+ [super updateTrackingAreas];
}
//--------------------------------------------------------------------------------------------------
@@ -260,11 +238,10 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* When the view is resized we need to let the backend know.
*/
-- (void) setFrame: (NSRect) frame
-{
- super.frame = frame;
+- (void) setFrame: (NSRect) frame {
+ super.frame = frame;
- mOwner.backend->Resize();
+ mOwner.backend->Resize();
}
//--------------------------------------------------------------------------------------------------
@@ -272,14 +249,13 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Called by the backend if a new cursor must be set for the view.
*/
-- (void) setCursor: (int) cursor
-{
- Window::Cursor eCursor = (Window::Cursor)cursor;
- mCurrentCursor = cursorFromEnum(eCursor);
+- (void) setCursor: (int) cursor {
+ Window::Cursor eCursor = (Window::Cursor)cursor;
+ mCurrentCursor = cursorFromEnum(eCursor);
- // Trigger recreation of the cursor rectangle(s).
- [self.window invalidateCursorRectsForView: self];
- [mOwner updateMarginCursors];
+ // Trigger recreation of the cursor rectangle(s).
+ [self.window invalidateCursorRectsForView: self];
+ [mOwner updateMarginCursors];
}
//--------------------------------------------------------------------------------------------------
@@ -287,14 +263,13 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* This method is called to give us the opportunity to define our mouse sensitive rectangle.
*/
-- (void) resetCursorRects
-{
- [super resetCursorRects];
+- (void) resetCursorRects {
+ [super resetCursorRects];
- // We only have one cursor rect: our bounds.
- const NSRect visibleBounds = mOwner.backend->GetBounds();
- [self addCursorRect: visibleBounds cursor: mCurrentCursor];
- [mCurrentCursor setOnMouseEntered: YES];
+ // We only have one cursor rect: our bounds.
+ const NSRect visibleBounds = mOwner.backend->GetBounds();
+ [self addCursorRect: visibleBounds cursor: mCurrentCursor];
+ [mCurrentCursor setOnMouseEntered: YES];
}
//--------------------------------------------------------------------------------------------------
@@ -302,24 +277,23 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Called before repainting.
*/
-- (void) viewWillDraw
-{
- if (!mOwner) {
- [super viewWillDraw];
- return;
- }
+- (void) viewWillDraw {
+ if (!mOwner) {
+ [super viewWillDraw];
+ return;
+ }
- const NSRect *rects;
- NSInteger nRects = 0;
- [self getRectsBeingDrawn:&rects count:&nRects];
- if (nRects > 0) {
- NSRect rectUnion = rects[0];
- for (int i=0;i<nRects;i++) {
- rectUnion = NSUnionRect(rectUnion, rects[i]);
- }
- mOwner.backend->WillDraw(rectUnion);
- }
- [super viewWillDraw];
+ const NSRect *rects;
+ NSInteger nRects = 0;
+ [self getRectsBeingDrawn: &rects count: &nRects];
+ if (nRects > 0) {
+ NSRect rectUnion = rects[0];
+ for (int i=0; i<nRects; i++) {
+ rectUnion = NSUnionRect(rectUnion, rects[i]);
+ }
+ mOwner.backend->WillDraw(rectUnion);
+ }
+ [super viewWillDraw];
}
//--------------------------------------------------------------------------------------------------
@@ -327,12 +301,11 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Called before responsive scrolling overdraw.
*/
-- (void) prepareContentInRect: (NSRect) rect
-{
- if (mOwner)
- mOwner.backend->WillDraw(rect);
+- (void) prepareContentInRect: (NSRect) rect {
+ if (mOwner)
+ mOwner.backend->WillDraw(rect);
#if MAC_OS_X_VERSION_MAX_ALLOWED > 1080
- [super prepareContentInRect: rect];
+ [super prepareContentInRect: rect];
#endif
}
@@ -341,15 +314,14 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Gets called by the runtime when the view needs repainting.
*/
-- (void) drawRect: (NSRect) rect
-{
- CGContextRef context = (CGContextRef) [NSGraphicsContext currentContext].graphicsPort;
+- (void) drawRect: (NSRect) rect {
+ CGContextRef context = (CGContextRef) [NSGraphicsContext currentContext].graphicsPort;
- if (!mOwner.backend->Draw(rect, context)) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self setNeedsDisplay:YES];
- });
- }
+ if (!mOwner.backend->Draw(rect, context)) {
+ dispatch_async(dispatch_get_main_queue(), ^ {
+ [self setNeedsDisplay: YES];
+ });
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -361,16 +333,14 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* Note that because of returning YES here most coordinates we use now (e.g. for painting,
* invalidating rectangles etc.) are given with +Y pointing down!
*/
-- (BOOL) isFlipped
-{
- return YES;
+- (BOOL) isFlipped {
+ return YES;
}
//--------------------------------------------------------------------------------------------------
-- (BOOL) isOpaque
-{
- return YES;
+- (BOOL) isOpaque {
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -378,10 +348,9 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Implement the "click through" behavior by telling the caller we accept the first mouse event too.
*/
-- (BOOL) acceptsFirstMouse: (NSEvent *) theEvent
-{
+- (BOOL) acceptsFirstMouse: (NSEvent *) theEvent {
#pragma unused(theEvent)
- return YES;
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -389,9 +358,8 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Make this view accepting events as first responder.
*/
-- (BOOL) acceptsFirstResponder
-{
- return YES;
+- (BOOL) acceptsFirstResponder {
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -399,115 +367,105 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Called by the framework if it wants to show a context menu for the editor.
*/
-- (NSMenu*) menuForEvent: (NSEvent*) theEvent
-{
- NSMenu *menu = [mOwner menuForEvent: theEvent];
- if (menu) {
- return menu;
- } else if (mOwner.backend->ShouldDisplayPopupOnText()) {
- return mOwner.backend->CreateContextMenu(theEvent);
- } else {
- return nil;
- }
+- (NSMenu *) menuForEvent: (NSEvent *) theEvent {
+ NSMenu *menu = [mOwner menuForEvent: theEvent];
+ if (menu) {
+ return menu;
+ } else if (mOwner.backend->ShouldDisplayPopupOnText()) {
+ return mOwner.backend->CreateContextMenu(theEvent);
+ } else {
+ return nil;
+ }
}
//--------------------------------------------------------------------------------------------------
// Adoption of NSTextInputClient protocol.
-- (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);
- if (!NSEqualRanges(aRange, charRange))
- {
- *actualRange = charRange;
- }
-
- [mOwner message: SCI_SETTARGETRANGE wParam: posRange.location lParam: NSMaxRange(posRange)];
- std::string text([mOwner message: SCI_TARGETASUTF8] + 1, 0);
- [mOwner message: SCI_TARGETASUTF8 wParam: 0 lParam: reinterpret_cast<sptr_t>(&text[0])];
- text = FixInvalidUTF8(text);
- NSString *result = @(text.c_str());
- NSMutableAttributedString *asResult = [[NSMutableAttributedString alloc] initWithString:result];
-
- const NSRange rangeAS = NSMakeRange(0, asResult.length);
- // SCI_GETSTYLEAT reports a signed byte but want an unsigned to index into styles
- const char styleByte = static_cast<char>([mOwner message: SCI_GETSTYLEAT wParam:posRange.location]);
- const long style = static_cast<unsigned char>(styleByte);
- std::string fontName([mOwner message: SCI_STYLEGETFONT wParam:style lParam:0] + 1, 0);
- [mOwner message: SCI_STYLEGETFONT wParam:style lParam:(sptr_t)&fontName[0]];
- const CGFloat fontSize = [mOwner message: SCI_STYLEGETSIZEFRACTIONAL wParam:style] / 100.0f;
- NSString *sFontName = @(fontName.c_str());
- NSFont *font = [NSFont fontWithName:sFontName size:fontSize];
- [asResult addAttribute:NSFontAttributeName value:font range:rangeAS];
-
- return asResult;
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (NSUInteger) characterIndexForPoint: (NSPoint) point
-{
- const NSRect rectPoint = {point, NSZeroSize};
- const NSRect rectInWindow = [self.window convertRectFromScreen:rectPoint];
- const NSRect rectLocal = [self.superview.superview convertRect:rectInWindow fromView:nil];
-
- const long position = [mOwner message: SCI_CHARPOSITIONFROMPOINT
- wParam: rectLocal.origin.x
- lParam: rectLocal.origin.y];
- if (position == INVALID_POSITION)
- {
- return NSNotFound;
- }
- else
- {
- const NSRange index = mOwner.backend->CharactersFromPositions(NSMakeRange(position, 0));
- return index.location;
- }
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (void) doCommandBySelector: (SEL) selector
-{
+- (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);
+ if (!NSEqualRanges(aRange, charRange)) {
+ *actualRange = charRange;
+ }
+
+ [mOwner message: SCI_SETTARGETRANGE wParam: posRange.location lParam: NSMaxRange(posRange)];
+ std::string text([mOwner message: SCI_TARGETASUTF8] + 1, 0);
+ [mOwner message: SCI_TARGETASUTF8 wParam: 0 lParam: reinterpret_cast<sptr_t>(&text[0])];
+ text = FixInvalidUTF8(text);
+ NSString *result = @(text.c_str());
+ NSMutableAttributedString *asResult = [[NSMutableAttributedString alloc] initWithString: result];
+
+ const NSRange rangeAS = NSMakeRange(0, asResult.length);
+ // SCI_GETSTYLEAT reports a signed byte but want an unsigned to index into styles
+ const char styleByte = static_cast<char>([mOwner message: SCI_GETSTYLEAT wParam: posRange.location]);
+ const long style = static_cast<unsigned char>(styleByte);
+ std::string fontName([mOwner message: SCI_STYLEGETFONT wParam: style lParam: 0] + 1, 0);
+ [mOwner message: SCI_STYLEGETFONT wParam: style lParam: (sptr_t)&fontName[0]];
+ const CGFloat fontSize = [mOwner message: SCI_STYLEGETSIZEFRACTIONAL wParam: style] / 100.0f;
+ NSString *sFontName = @(fontName.c_str());
+ NSFont *font = [NSFont fontWithName: sFontName size: fontSize];
+ [asResult addAttribute: NSFontAttributeName value: font range: rangeAS];
+
+ return asResult;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (NSUInteger) characterIndexForPoint: (NSPoint) point {
+ const NSRect rectPoint = {point, NSZeroSize};
+ const NSRect rectInWindow = [self.window convertRectFromScreen: rectPoint];
+ const NSRect rectLocal = [self.superview.superview convertRect: rectInWindow fromView: nil];
+
+ const long position = [mOwner message: SCI_CHARPOSITIONFROMPOINT
+ wParam: rectLocal.origin.x
+ lParam: rectLocal.origin.y];
+ if (position == INVALID_POSITION) {
+ return NSNotFound;
+ } else {
+ const NSRange index = mOwner.backend->CharactersFromPositions(NSMakeRange(position, 0));
+ return index.location;
+ }
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (void) doCommandBySelector: (SEL) selector {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- if ([self respondsToSelector: @selector(selector)])
- [self performSelector: selector withObject: nil];
+ if ([self respondsToSelector: @selector(selector)])
+ [self performSelector: selector withObject: nil];
#pragma clang diagnostic pop
}
//--------------------------------------------------------------------------------------------------
-- (NSRect) firstRectForCharacterRange: (NSRange) aRange actualRange: (NSRangePointer) actualRange
-{
+- (NSRect) firstRectForCharacterRange: (NSRange) aRange actualRange: (NSRangePointer) actualRange {
#pragma unused(actualRange)
- const NSRange posRange = mOwner.backend->PositionsFromCharacters(aRange);
+ const NSRange posRange = mOwner.backend->PositionsFromCharacters(aRange);
- NSRect rect;
- rect.origin.x = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: posRange.location];
- rect.origin.y = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: posRange.location];
- const NSUInteger rangeEnd = NSMaxRange(posRange);
- rect.size.width = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: rangeEnd] - rect.origin.x;
- rect.size.height = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: rangeEnd] - rect.origin.y;
- rect.size.height += [mOwner message: SCI_TEXTHEIGHT wParam: 0 lParam: 0];
- const NSRect rectInWindow = [self.superview.superview convertRect:rect toView:nil];
- const NSRect rectScreen = [self.window convertRectToScreen:rectInWindow];
+ NSRect rect;
+ rect.origin.x = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: posRange.location];
+ rect.origin.y = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: posRange.location];
+ const NSUInteger rangeEnd = NSMaxRange(posRange);
+ rect.size.width = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: rangeEnd] - rect.origin.x;
+ rect.size.height = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: rangeEnd] - rect.origin.y;
+ rect.size.height += [mOwner message: SCI_TEXTHEIGHT wParam: 0 lParam: 0];
+ const NSRect rectInWindow = [self.superview.superview convertRect: rect toView: nil];
+ const NSRect rectScreen = [self.window convertRectToScreen: rectInWindow];
- return rectScreen;
+ return rectScreen;
}
//--------------------------------------------------------------------------------------------------
-- (BOOL) hasMarkedText
-{
- return mMarkedTextRange.length > 0;
+- (BOOL) hasMarkedText {
+ return mMarkedTextRange.length > 0;
}
//--------------------------------------------------------------------------------------------------
@@ -517,17 +475,14 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* selection if there is any.
* First removes the replacementRange.
*/
-- (void) insertText: (id) aString replacementRange: (NSRange) replacementRange
-{
- if ((mMarkedTextRange.location != NSNotFound) && (replacementRange.location != NSNotFound))
- {
+- (void) insertText: (id) aString replacementRange: (NSRange) replacementRange {
+ if ((mMarkedTextRange.location != NSNotFound) && (replacementRange.location != NSNotFound)) {
NSLog(@"Trying to insertText when there is both a marked range and a replacement range");
}
// Remove any previously marked text first.
mOwner.backend->CompositionUndo();
- if (mMarkedTextRange.location != NSNotFound)
- {
+ if (mMarkedTextRange.location != NSNotFound) {
const NSRange posRangeMark = mOwner.backend->PositionsFromCharacters(mMarkedTextRange);
[mOwner message: SCI_SETEMPTYSELECTION wParam: posRangeMark.location];
}
@@ -538,8 +493,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
// Its replacing a non-existent position so do nothing.
return;
- if (replacementRange.location != NSNotFound)
- {
+ if (replacementRange.location != NSNotFound) {
const NSRange posRangeReplacement = mOwner.backend->PositionsFromCharacters(replacementRange);
[mOwner message: SCI_DELETERANGE
wParam: posRangeReplacement.location
@@ -547,42 +501,38 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
[mOwner message: SCI_SETEMPTYSELECTION wParam: posRangeReplacement.location];
}
- NSString* newText = @"";
- if ([aString isKindOfClass:[NSString class]])
- newText = (NSString*) aString;
- else if ([aString isKindOfClass:[NSAttributedString class]])
- newText = (NSString*) [aString string];
+ NSString *newText = @"";
+ if ([aString isKindOfClass: [NSString class]])
+ newText = (NSString *) aString;
+ else if ([aString isKindOfClass: [NSAttributedString class]])
+ newText = (NSString *) [aString string];
mOwner.backend->InsertText(newText);
}
//--------------------------------------------------------------------------------------------------
-- (NSRange) markedRange
-{
- return mMarkedTextRange;
+- (NSRange) markedRange {
+ return mMarkedTextRange;
}
//--------------------------------------------------------------------------------------------------
-- (NSRange) selectedRange
-{
- const NSRange posRangeSel = [mOwner selectedRangePositions];
- if (posRangeSel.length == 0)
- {
- NSTextInputContext *tic = [NSTextInputContext currentInputContext];
- // Chinese input causes malloc crash when empty selection returned with actual
- // position so return NSNotFound.
- // If this is applied to European input, it stops the accented character
- // chooser from appearing.
- // May need to add more input source names.
- if ([tic.selectedKeyboardInputSource
- isEqualToString:@"com.apple.inputmethod.TCIM.Cangjie"])
- {
- return NSMakeRange(NSNotFound, 0);
- }
- }
- return mOwner.backend->CharactersFromPositions(posRangeSel);
+- (NSRange) selectedRange {
+ const NSRange posRangeSel = [mOwner selectedRangePositions];
+ if (posRangeSel.length == 0) {
+ NSTextInputContext *tic = [NSTextInputContext currentInputContext];
+ // Chinese input causes malloc crash when empty selection returned with actual
+ // position so return NSNotFound.
+ // If this is applied to European input, it stops the accented character
+ // chooser from appearing.
+ // May need to add more input source names.
+ if ([tic.selectedKeyboardInputSource
+ isEqualToString: @"com.apple.inputmethod.TCIM.Cangjie"]) {
+ return NSMakeRange(NSNotFound, 0);
+ }
+ }
+ return mOwner.backend->CharactersFromPositions(posRangeSel);
}
//--------------------------------------------------------------------------------------------------
@@ -596,114 +546,96 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* @param range The range of the new text to select (given relative to the insertion point of the new text).
* @param replacementRange The range to remove before insertion.
*/
-- (void) setMarkedText: (id) aString selectedRange: (NSRange)range replacementRange: (NSRange)replacementRange
-{
- NSString* newText = @"";
- if ([aString isKindOfClass:[NSString class]])
- newText = (NSString*) aString;
- else
- if ([aString isKindOfClass:[NSAttributedString class]])
- newText = (NSString*) [aString string];
-
- // Replace marked text if there is one.
- if (mMarkedTextRange.length > 0)
- {
- mOwner.backend->CompositionUndo();
- if (replacementRange.location != NSNotFound)
- {
- // This situation makes no sense and has not occurred in practice.
- NSLog(@"Can not handle a replacement range when there is also a marked range");
- }
- else
- {
- replacementRange = mMarkedTextRange;
- const NSRange posRangeMark = mOwner.backend->PositionsFromCharacters(mMarkedTextRange);
- [mOwner message: SCI_SETEMPTYSELECTION wParam: posRangeMark.location];
- }
- }
- else
- {
- // Must perform deletion before entering composition mode or else
- // both document and undo history will not contain the deleted text
- // leading to an inaccurate and unusable undo history.
-
- // Convert selection virtual space into real space
- mOwner.backend->ConvertSelectionVirtualSpace();
-
- if (replacementRange.location != NSNotFound)
- {
- const NSRange posRangeReplacement = mOwner.backend->PositionsFromCharacters(replacementRange);
- [mOwner message: SCI_DELETERANGE
- wParam: posRangeReplacement.location
- lParam: posRangeReplacement.length];
- }
- else // No marked or replacement range, so replace selection
- {
- if (!mOwner.backend->ScintillaCocoa::ClearAllSelections()) {
- // Some of the selection is protected so can not perform composition here
- return;
- }
- // Ensure only a single selection.
- mOwner.backend->SelectOnlyMainSelection();
- const NSRange posRangeSel = [mOwner selectedRangePositions];
- replacementRange = mOwner.backend->CharactersFromPositions(posRangeSel);
- }
- }
-
- // To support IME input to multiple selections, the following code would
- // need to insert newText at each selection, mark each piece of new text and then
- // select range relative to each insertion.
-
- if (newText.length)
- {
- // Switching into composition.
- mOwner.backend->CompositionStart();
-
- NSRange posRangeCurrent = mOwner.backend->PositionsFromCharacters(NSMakeRange(replacementRange.location, 0));
- // Note: Scintilla internally works almost always with bytes instead chars, so we need to take
- // this into account when determining selection ranges and such.
- int lengthInserted = mOwner.backend->InsertText(newText);
- posRangeCurrent.length = lengthInserted;
- mMarkedTextRange = mOwner.backend->CharactersFromPositions(posRangeCurrent);
- // Mark the just inserted text. Keep the marked range for later reset.
- [mOwner setGeneralProperty: SCI_SETINDICATORCURRENT value: INDIC_IME];
- [mOwner setGeneralProperty: SCI_INDICATORFILLRANGE
- parameter: posRangeCurrent.location
- value: posRangeCurrent.length];
- }
- else
- {
- mMarkedTextRange = NSMakeRange(NSNotFound, 0);
- // Re-enable undo action collection if composition ended (indicated by an empty mark string).
- mOwner.backend->CompositionCommit();
- }
-
- // Select the part which is indicated in the given range. It does not scroll the caret into view.
- if (range.length > 0)
- {
- // range is in characters so convert to bytes for selection.
- range.location += replacementRange.location;
- NSRange posRangeSelect = mOwner.backend->PositionsFromCharacters(range);
- [mOwner setGeneralProperty: SCI_SETSELECTION parameter: NSMaxRange(posRangeSelect) value: posRangeSelect.location];
- }
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (void) unmarkText
-{
- if (mMarkedTextRange.length > 0)
- {
- mOwner.backend->CompositionCommit();
- mMarkedTextRange = NSMakeRange(NSNotFound, 0);
- }
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (NSArray*) validAttributesForMarkedText
-{
- return @[];
+- (void) setMarkedText: (id) aString selectedRange: (NSRange) range replacementRange: (NSRange) replacementRange {
+ NSString *newText = @"";
+ if ([aString isKindOfClass: [NSString class]])
+ newText = (NSString *) aString;
+ else if ([aString isKindOfClass: [NSAttributedString class]])
+ newText = (NSString *) [aString string];
+
+ // Replace marked text if there is one.
+ if (mMarkedTextRange.length > 0) {
+ mOwner.backend->CompositionUndo();
+ if (replacementRange.location != NSNotFound) {
+ // This situation makes no sense and has not occurred in practice.
+ NSLog(@"Can not handle a replacement range when there is also a marked range");
+ } else {
+ replacementRange = mMarkedTextRange;
+ const NSRange posRangeMark = mOwner.backend->PositionsFromCharacters(mMarkedTextRange);
+ [mOwner message: SCI_SETEMPTYSELECTION wParam: posRangeMark.location];
+ }
+ } else {
+ // Must perform deletion before entering composition mode or else
+ // both document and undo history will not contain the deleted text
+ // leading to an inaccurate and unusable undo history.
+
+ // Convert selection virtual space into real space
+ mOwner.backend->ConvertSelectionVirtualSpace();
+
+ if (replacementRange.location != NSNotFound) {
+ const NSRange posRangeReplacement = mOwner.backend->PositionsFromCharacters(replacementRange);
+ [mOwner message: SCI_DELETERANGE
+ wParam: posRangeReplacement.location
+ lParam: posRangeReplacement.length];
+ } else { // No marked or replacement range, so replace selection
+ if (!mOwner.backend->ScintillaCocoa::ClearAllSelections()) {
+ // Some of the selection is protected so can not perform composition here
+ return;
+ }
+ // Ensure only a single selection.
+ mOwner.backend->SelectOnlyMainSelection();
+ const NSRange posRangeSel = [mOwner selectedRangePositions];
+ replacementRange = mOwner.backend->CharactersFromPositions(posRangeSel);
+ }
+ }
+
+ // To support IME input to multiple selections, the following code would
+ // need to insert newText at each selection, mark each piece of new text and then
+ // select range relative to each insertion.
+
+ if (newText.length) {
+ // Switching into composition.
+ mOwner.backend->CompositionStart();
+
+ NSRange posRangeCurrent = mOwner.backend->PositionsFromCharacters(NSMakeRange(replacementRange.location, 0));
+ // Note: Scintilla internally works almost always with bytes instead chars, so we need to take
+ // this into account when determining selection ranges and such.
+ int lengthInserted = mOwner.backend->InsertText(newText);
+ posRangeCurrent.length = lengthInserted;
+ mMarkedTextRange = mOwner.backend->CharactersFromPositions(posRangeCurrent);
+ // Mark the just inserted text. Keep the marked range for later reset.
+ [mOwner setGeneralProperty: SCI_SETINDICATORCURRENT value: INDIC_IME];
+ [mOwner setGeneralProperty: SCI_INDICATORFILLRANGE
+ parameter: posRangeCurrent.location
+ value: posRangeCurrent.length];
+ } else {
+ mMarkedTextRange = NSMakeRange(NSNotFound, 0);
+ // Re-enable undo action collection if composition ended (indicated by an empty mark string).
+ mOwner.backend->CompositionCommit();
+ }
+
+ // Select the part which is indicated in the given range. It does not scroll the caret into view.
+ if (range.length > 0) {
+ // range is in characters so convert to bytes for selection.
+ range.location += replacementRange.location;
+ NSRange posRangeSelect = mOwner.backend->PositionsFromCharacters(range);
+ [mOwner setGeneralProperty: SCI_SETSELECTION parameter: NSMaxRange(posRangeSelect) value: posRangeSelect.location];
+ }
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (void) unmarkText {
+ if (mMarkedTextRange.length > 0) {
+ mOwner.backend->CompositionCommit();
+ mMarkedTextRange = NSMakeRange(NSNotFound, 0);
+ }
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (NSArray *) validAttributesForMarkedText {
+ return @[];
}
// End of the NSTextInputClient protocol adoption.
@@ -715,54 +647,47 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* handles shortcuts. The input is then forwarded to the Cocoa text input system, which in turn does
* its own input handling (character composition via NSTextInputClient protocol):
*/
-- (void) keyDown: (NSEvent *) theEvent
-{
- if (mMarkedTextRange.length == 0)
- mOwner.backend->KeyboardInput(theEvent);
- NSArray* events = @[theEvent];
- [self interpretKeyEvents: events];
+- (void) keyDown: (NSEvent *) theEvent {
+ if (mMarkedTextRange.length == 0)
+ mOwner.backend->KeyboardInput(theEvent);
+ NSArray *events = @[theEvent];
+ [self interpretKeyEvents: events];
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseDown: (NSEvent *) theEvent
-{
- mOwner.backend->MouseDown(theEvent);
+- (void) mouseDown: (NSEvent *) theEvent {
+ mOwner.backend->MouseDown(theEvent);
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseDragged: (NSEvent *) theEvent
-{
- mOwner.backend->MouseMove(theEvent);
+- (void) mouseDragged: (NSEvent *) theEvent {
+ mOwner.backend->MouseMove(theEvent);
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseUp: (NSEvent *) theEvent
-{
- mOwner.backend->MouseUp(theEvent);
+- (void) mouseUp: (NSEvent *) theEvent {
+ mOwner.backend->MouseUp(theEvent);
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseMoved: (NSEvent *) theEvent
-{
- mOwner.backend->MouseMove(theEvent);
+- (void) mouseMoved: (NSEvent *) theEvent {
+ mOwner.backend->MouseMove(theEvent);
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseEntered: (NSEvent *) theEvent
-{
- mOwner.backend->MouseEntered(theEvent);
+- (void) mouseEntered: (NSEvent *) theEvent {
+ mOwner.backend->MouseEntered(theEvent);
}
//--------------------------------------------------------------------------------------------------
-- (void) mouseExited: (NSEvent *) theEvent
-{
- mOwner.backend->MouseExited(theEvent);
+- (void) mouseExited: (NSEvent *) theEvent {
+ mOwner.backend->MouseExited(theEvent);
}
//--------------------------------------------------------------------------------------------------
@@ -774,13 +699,12 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* Pinch gestures and key commands can be used for magnification.
*/
#ifdef SCROLL_WHEEL_MAGNIFICATION
-- (void) scrollWheel: (NSEvent *) theEvent
-{
- if (([theEvent modifierFlags] & NSCommandKeyMask) != 0) {
- mOwner.backend->MouseWheel(theEvent);
- } else {
- [super scrollWheel:theEvent];
- }
+- (void) scrollWheel: (NSEvent *) theEvent {
+ if (([theEvent modifierFlags] & NSCommandKeyMask) != 0) {
+ mOwner.backend->MouseWheel(theEvent);
+ } else {
+ [super scrollWheel: theEvent];
+ }
}
#endif
@@ -789,20 +713,19 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* Ensure scrolling is aligned to whole lines instead of starting part-way through a line
*/
-- (NSRect)adjustScroll:(NSRect)proposedVisibleRect
-{
- if (!mOwner)
- return proposedVisibleRect;
- NSRect rc = proposedVisibleRect;
- // Snap to lines
- NSRect contentRect = self.bounds;
- if ((rc.origin.y > 0) && (NSMaxY(rc) < contentRect.size.height)) {
- // Only snap for positions inside the document - allow outside
- // for overshoot.
- long lineHeight = mOwner.backend->WndProc(SCI_TEXTHEIGHT, 0, 0);
- rc.origin.y = roundf(static_cast<XYPOSITION>(rc.origin.y) / lineHeight) * lineHeight;
- }
- return rc;
+- (NSRect) adjustScroll: (NSRect) proposedVisibleRect {
+ if (!mOwner)
+ return proposedVisibleRect;
+ NSRect rc = proposedVisibleRect;
+ // Snap to lines
+ NSRect contentRect = self.bounds;
+ if ((rc.origin.y > 0) && (NSMaxY(rc) < contentRect.size.height)) {
+ // Only snap for positions inside the document - allow outside
+ // for overshoot.
+ long lineHeight = mOwner.backend->WndProc(SCI_TEXTHEIGHT, 0, 0);
+ rc.origin.y = roundf(static_cast<XYPOSITION>(rc.origin.y) / lineHeight) * lineHeight;
+ }
+ return rc;
}
//--------------------------------------------------------------------------------------------------
@@ -810,10 +733,9 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* The editor is getting the foreground control (the one getting the input focus).
*/
-- (BOOL) becomeFirstResponder
-{
- mOwner.backend->WndProc(SCI_SETFOCUS, 1, 0);
- return YES;
+- (BOOL) becomeFirstResponder {
+ mOwner.backend->WndProc(SCI_SETFOCUS, 1, 0);
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -821,10 +743,9 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
/**
* The editor is losing the input focus.
*/
-- (BOOL) resignFirstResponder
-{
- mOwner.backend->WndProc(SCI_SETFOCUS, 0, 0);
- return YES;
+- (BOOL) resignFirstResponder {
+ mOwner.backend->WndProc(SCI_SETFOCUS, 0, 0);
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -833,36 +754,31 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor)
* Implement NSDraggingSource.
*/
-- (NSDragOperation)draggingSession: (NSDraggingSession *) session
-sourceOperationMaskForDraggingContext: (NSDraggingContext) context
-{
+- (NSDragOperation) draggingSession: (NSDraggingSession *) session
+ sourceOperationMaskForDraggingContext: (NSDraggingContext) context {
#pragma unused(session)
- switch(context)
- {
- case NSDraggingContextOutsideApplication:
- return NSDragOperationCopy | NSDragOperationMove | NSDragOperationDelete;
+ switch (context) {
+ case NSDraggingContextOutsideApplication:
+ return NSDragOperationCopy | NSDragOperationMove | NSDragOperationDelete;
- case NSDraggingContextWithinApplication:
- default:
- return NSDragOperationCopy | NSDragOperationMove | NSDragOperationDelete;
- }
+ case NSDraggingContextWithinApplication:
+ default:
+ return NSDragOperationCopy | NSDragOperationMove | NSDragOperationDelete;
+ }
}
-- (void)draggingSession:(NSDraggingSession *)session
- movedToPoint:(NSPoint)screenPoint
-{
+- (void) draggingSession: (NSDraggingSession *) session
+ movedToPoint: (NSPoint) screenPoint {
#pragma unused(session, screenPoint)
}
-- (void)draggingSession:(NSDraggingSession *)session
- endedAtPoint:(NSPoint)screenPoint
- operation:(NSDragOperation)operation
-{
+- (void) draggingSession: (NSDraggingSession *) session
+ endedAtPoint: (NSPoint) screenPoint
+ operation: (NSDragOperation) operation {
#pragma unused(session, screenPoint)
- if (operation == NSDragOperationDelete)
- {
- mOwner.backend->WndProc(SCI_CLEAR, 0, 0);
- }
+ if (operation == NSDragOperationDelete) {
+ mOwner.backend->WndProc(SCI_CLEAR, 0, 0);
+ }
}
/**
@@ -874,9 +790,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Called when an external drag operation enters the view.
*/
-- (NSDragOperation) draggingEntered: (id <NSDraggingInfo>) sender
-{
- return mOwner.backend->DraggingEntered(sender);
+- (NSDragOperation) draggingEntered: (id <NSDraggingInfo>) sender {
+ return mOwner.backend->DraggingEntered(sender);
}
//--------------------------------------------------------------------------------------------------
@@ -884,9 +799,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Called frequently during an external drag operation if we are the target.
*/
-- (NSDragOperation) draggingUpdated: (id <NSDraggingInfo>) sender
-{
- return mOwner.backend->DraggingUpdated(sender);
+- (NSDragOperation) draggingUpdated: (id <NSDraggingInfo>) sender {
+ return mOwner.backend->DraggingUpdated(sender);
}
//--------------------------------------------------------------------------------------------------
@@ -894,24 +808,21 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Drag image left the view. Clean up if necessary.
*/
-- (void) draggingExited: (id <NSDraggingInfo>) sender
-{
- mOwner.backend->DraggingExited(sender);
+- (void) draggingExited: (id <NSDraggingInfo>) sender {
+ mOwner.backend->DraggingExited(sender);
}
//--------------------------------------------------------------------------------------------------
-- (BOOL) prepareForDragOperation: (id <NSDraggingInfo>) sender
-{
+- (BOOL) prepareForDragOperation: (id <NSDraggingInfo>) sender {
#pragma unused(sender)
- return YES;
+ return YES;
}
//--------------------------------------------------------------------------------------------------
-- (BOOL) performDragOperation: (id <NSDraggingInfo>) sender
-{
- return mOwner.backend->PerformDragOperation(sender);
+- (BOOL) performDragOperation: (id <NSDraggingInfo>) sender {
+ return mOwner.backend->PerformDragOperation(sender);
}
//--------------------------------------------------------------------------------------------------
@@ -919,106 +830,88 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Drag operation is done. Notify editor.
*/
-- (void) concludeDragOperation: (id <NSDraggingInfo>) sender
-{
- // Clean up is the same as if we are no longer the drag target.
- mOwner.backend->DraggingExited(sender);
+- (void) concludeDragOperation: (id <NSDraggingInfo>) sender {
+ // Clean up is the same as if we are no longer the drag target.
+ mOwner.backend->DraggingExited(sender);
}
//--------------------------------------------------------------------------------------------------
// NSResponder actions.
-- (void) selectAll: (id) sender
-{
+- (void) selectAll: (id) sender {
#pragma unused(sender)
- mOwner.backend->SelectAll();
+ mOwner.backend->SelectAll();
}
-- (void) deleteBackward: (id) sender
-{
+- (void) deleteBackward: (id) sender {
#pragma unused(sender)
- mOwner.backend->DeleteBackward();
+ mOwner.backend->DeleteBackward();
}
-- (void) cut: (id) sender
-{
+- (void) cut: (id) sender {
#pragma unused(sender)
- mOwner.backend->Cut();
+ mOwner.backend->Cut();
}
-- (void) copy: (id) sender
-{
+- (void) copy: (id) sender {
#pragma unused(sender)
- mOwner.backend->Copy();
+ mOwner.backend->Copy();
}
-- (void) paste: (id) sender
-{
+- (void) paste: (id) sender {
#pragma unused(sender)
- if (mMarkedTextRange.location != NSNotFound)
- {
- [[NSTextInputContext currentInputContext] discardMarkedText];
- mOwner.backend->CompositionCommit();
- mMarkedTextRange = NSMakeRange(NSNotFound, 0);
- }
- mOwner.backend->Paste();
+ if (mMarkedTextRange.location != NSNotFound) {
+ [[NSTextInputContext currentInputContext] discardMarkedText];
+ mOwner.backend->CompositionCommit();
+ mMarkedTextRange = NSMakeRange(NSNotFound, 0);
+ }
+ mOwner.backend->Paste();
}
-- (void) undo: (id) sender
-{
+- (void) undo: (id) sender {
#pragma unused(sender)
- if (mMarkedTextRange.location != NSNotFound)
- {
- [[NSTextInputContext currentInputContext] discardMarkedText];
- mOwner.backend->CompositionCommit();
- mMarkedTextRange = NSMakeRange(NSNotFound, 0);
- }
- mOwner.backend->Undo();
+ if (mMarkedTextRange.location != NSNotFound) {
+ [[NSTextInputContext currentInputContext] discardMarkedText];
+ mOwner.backend->CompositionCommit();
+ mMarkedTextRange = NSMakeRange(NSNotFound, 0);
+ }
+ mOwner.backend->Undo();
}
-- (void) redo: (id) sender
-{
+- (void) redo: (id) sender {
#pragma unused(sender)
- mOwner.backend->Redo();
+ mOwner.backend->Redo();
}
-- (BOOL) canUndo
-{
- return mOwner.backend->CanUndo() && (mMarkedTextRange.location == NSNotFound);
+- (BOOL) canUndo {
+ return mOwner.backend->CanUndo() && (mMarkedTextRange.location == NSNotFound);
}
-- (BOOL) canRedo
-{
- return mOwner.backend->CanRedo();
+- (BOOL) canRedo {
+ return mOwner.backend->CanRedo();
}
-- (BOOL) validateUserInterfaceItem: (id <NSValidatedUserInterfaceItem>) anItem
-{
- SEL action = anItem.action;
- if (action==@selector(undo:)) {
- return [self canUndo];
- }
- else if (action==@selector(redo:)) {
- return [self canRedo];
- }
- else if (action==@selector(cut:) || action==@selector(copy:) || action==@selector(clear:)) {
- return mOwner.backend->HasSelection();
- }
- else if (action==@selector(paste:)) {
- return mOwner.backend->CanPaste();
- }
- return YES;
+- (BOOL) validateUserInterfaceItem: (id <NSValidatedUserInterfaceItem>) anItem {
+ SEL action = anItem.action;
+ if (action==@selector(undo:)) {
+ return [self canUndo];
+ } else if (action==@selector(redo:)) {
+ return [self canRedo];
+ } else if (action==@selector(cut:) || action==@selector(copy:) || action==@selector(clear:)) {
+ return mOwner.backend->HasSelection();
+ } else if (action==@selector(paste:)) {
+ return mOwner.backend->CanPaste();
+ }
+ return YES;
}
-- (void) clear: (id) sender
-{
- [self deleteBackward:sender];
+- (void) clear: (id) sender {
+ [self deleteBackward: sender];
}
-- (BOOL) isEditable
-{
- return mOwner.backend->WndProc(SCI_GETREADONLY, 0, 0) == 0;
+- (BOOL) isEditable {
+ return mOwner.backend->WndProc(SCI_GETREADONLY, 0, 0) == 0;
}
#pragma mark - NSAccessibility
@@ -1037,8 +930,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : Text of the whole document as a string.
*/
- (id) accessibilityValue {
- const sptr_t length = [mOwner message: SCI_GETLENGTH];
- return mOwner.backend->RangeTextAsString(NSMakeRange(0,static_cast<int>(length)));
+ const sptr_t length = [mOwner message: SCI_GETLENGTH];
+ return mOwner.backend->RangeTextAsString(NSMakeRange(0, static_cast<int>(length)));
}
//--------------------------------------------------------------------------------------------------
@@ -1047,9 +940,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : Line of the caret.
*/
- (NSInteger) accessibilityInsertionPointLineNumber {
- const int caret = static_cast<int>([mOwner message: SCI_GETCURRENTPOS]);
- const NSRange rangeCharactersCaret = mOwner.backend->CharactersFromPositions(NSMakeRange(caret, 0));
- return mOwner.backend->VisibleLineForIndex(rangeCharactersCaret.location);
+ const int caret = static_cast<int>([mOwner message: SCI_GETCURRENTPOS]);
+ const NSRange rangeCharactersCaret = mOwner.backend->CharactersFromPositions(NSMakeRange(caret, 0));
+ return mOwner.backend->VisibleLineForIndex(rangeCharactersCaret.location);
}
//--------------------------------------------------------------------------------------------------
@@ -1057,8 +950,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* NSAccessibility : Not implemented and not called by VoiceOver.
*/
-- (NSRange)accessibilityRangeForPosition:(NSPoint)point {
- return NSMakeRange(0,0);
+- (NSRange) accessibilityRangeForPosition: (NSPoint) point {
+ return NSMakeRange(0, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1067,9 +960,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : Number of characters in the whole document.
*/
- (NSInteger) accessibilityNumberOfCharacters {
- sptr_t length = [mOwner message: SCI_GETLENGTH];
- const NSRange posRange = mOwner.backend->CharactersFromPositions(NSMakeRange(length, 0));
- return posRange.location;
+ sptr_t length = [mOwner message: SCI_GETLENGTH];
+ const NSRange posRange = mOwner.backend->CharactersFromPositions(NSMakeRange(length, 0));
+ return posRange.location;
}
//--------------------------------------------------------------------------------------------------
@@ -1078,10 +971,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : The selection text as a string.
*/
- (NSString *) accessibilitySelectedText {
- const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
- const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
- const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
- return mOwner.backend->RangeTextAsString(posRangeSel);
+ const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
+ const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
+ const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
+ return mOwner.backend->RangeTextAsString(posRangeSel);
}
//--------------------------------------------------------------------------------------------------
@@ -1090,10 +983,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : The character range of the main selection.
*/
- (NSRange) accessibilitySelectedTextRange {
- const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
- const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
- const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
- return mOwner.backend->CharactersFromPositions(posRangeSel);
+ const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
+ const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
+ const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
+ return mOwner.backend->CharactersFromPositions(posRangeSel);
}
//--------------------------------------------------------------------------------------------------
@@ -1103,8 +996,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* This method is the only setter required for reasonable VoiceOver behaviour.
*/
- (void) setAccessibilitySelectedTextRange: (NSRange) range {
- NSRange rangePositions = mOwner.backend->PositionsFromCharacters(range);
- [mOwner message: SCI_SETSELECTION wParam: rangePositions.location lParam:NSMaxRange(rangePositions)];
+ NSRange rangePositions = mOwner.backend->PositionsFromCharacters(range);
+ [mOwner message: SCI_SETSELECTION wParam: rangePositions.location lParam: NSMaxRange(rangePositions)];
}
//--------------------------------------------------------------------------------------------------
@@ -1113,14 +1006,14 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : Range of the glyph at a character index.
* Currently doesn't try to handle composite characters.
*/
-- (NSRange) accessibilityRangeForIndex: (NSInteger)index {
- sptr_t length = [mOwner message: SCI_GETLENGTH];
- const NSRange rangeLength = mOwner.backend->CharactersFromPositions(NSMakeRange(length, 0));
- NSRange rangePositions = NSMakeRange(length, 0);
- if (index < rangeLength.location) {
- rangePositions = mOwner.backend->PositionsFromCharacters(NSMakeRange(index, 1));
- }
- return mOwner.backend->CharactersFromPositions(rangePositions);
+- (NSRange) accessibilityRangeForIndex: (NSInteger) index {
+ sptr_t length = [mOwner message: SCI_GETLENGTH];
+ const NSRange rangeLength = mOwner.backend->CharactersFromPositions(NSMakeRange(length, 0));
+ NSRange rangePositions = NSMakeRange(length, 0);
+ if (index < rangeLength.location) {
+ rangePositions = mOwner.backend->PositionsFromCharacters(NSMakeRange(index, 1));
+ }
+ return mOwner.backend->CharactersFromPositions(rangePositions);
}
//--------------------------------------------------------------------------------------------------
@@ -1129,13 +1022,13 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : All the text ranges.
* Currently only returns the main selection.
*/
-- (NSArray<NSValue *>*) accessibilitySelectedTextRanges {
- const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
- const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
- const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
- NSRange rangeCharacters = mOwner.backend->CharactersFromPositions(posRangeSel);
- NSValue *valueRange = [NSValue valueWithRange:(NSRange)rangeCharacters];
- return @[valueRange];
+- (NSArray<NSValue *> *) accessibilitySelectedTextRanges {
+ const sptr_t positionBegin = [mOwner message: SCI_GETSELECTIONSTART];
+ const sptr_t positionEnd = [mOwner message: SCI_GETSELECTIONEND];
+ const NSRange posRangeSel = NSMakeRange(positionBegin, positionEnd-positionBegin);
+ NSRange rangeCharacters = mOwner.backend->CharactersFromPositions(posRangeSel);
+ NSValue *valueRange = [NSValue valueWithRange: (NSRange)rangeCharacters];
+ return @[valueRange];
}
//--------------------------------------------------------------------------------------------------
@@ -1144,14 +1037,14 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : Character range currently visible.
*/
- (NSRange) accessibilityVisibleCharacterRange {
- const sptr_t lineTopVisible = [mOwner message: SCI_GETFIRSTVISIBLELINE];
- const sptr_t lineTop = [mOwner message:SCI_DOCLINEFROMVISIBLE wParam:lineTopVisible];
- const sptr_t lineEndVisible = lineTopVisible + [mOwner message: SCI_LINESONSCREEN] - 1;
- const sptr_t lineEnd = [mOwner message:SCI_DOCLINEFROMVISIBLE wParam:lineEndVisible];
- const sptr_t posStartView = [mOwner message: SCI_POSITIONFROMLINE wParam: lineTop];
- const sptr_t posEndView = [mOwner message: SCI_GETLINEENDPOSITION wParam: lineEnd];
- const NSRange posRangeSel = NSMakeRange(posStartView, posEndView-posStartView);
- return mOwner.backend->CharactersFromPositions(posRangeSel);
+ const sptr_t lineTopVisible = [mOwner message: SCI_GETFIRSTVISIBLELINE];
+ const sptr_t lineTop = [mOwner message: SCI_DOCLINEFROMVISIBLE wParam: lineTopVisible];
+ const sptr_t lineEndVisible = lineTopVisible + [mOwner message: SCI_LINESONSCREEN] - 1;
+ const sptr_t lineEnd = [mOwner message: SCI_DOCLINEFROMVISIBLE wParam: lineEndVisible];
+ const sptr_t posStartView = [mOwner message: SCI_POSITIONFROMLINE wParam: lineTop];
+ const sptr_t posEndView = [mOwner message: SCI_GETLINEENDPOSITION wParam: lineEnd];
+ const NSRange posRangeSel = NSMakeRange(posStartView, posEndView-posStartView);
+ return mOwner.backend->CharactersFromPositions(posRangeSel);
}
//--------------------------------------------------------------------------------------------------
@@ -1159,8 +1052,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* NSAccessibility : Character range of a line.
*/
-- (NSRange)accessibilityRangeForLine:(NSInteger)line {
- return mOwner.backend->RangeForVisibleLine(line);
+- (NSRange) accessibilityRangeForLine: (NSInteger) line {
+ return mOwner.backend->RangeForVisibleLine(line);
}
//--------------------------------------------------------------------------------------------------
@@ -1168,8 +1061,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* NSAccessibility : Line number of a text position in characters.
*/
-- (NSInteger)accessibilityLineForIndex:(NSInteger)index {
- return mOwner.backend->VisibleLineForIndex(index);
+- (NSInteger) accessibilityLineForIndex: (NSInteger) index {
+ return mOwner.backend->VisibleLineForIndex(index);
}
//--------------------------------------------------------------------------------------------------
@@ -1180,10 +1073,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Producing a nice rectangle is a little tricky particularly when including new
* lines. Needs to improve the case where parts of two lines are included.
*/
-- (NSRect)accessibilityFrameForRange:(NSRange)range {
- const NSRect rectInView = mOwner.backend->FrameForRange(range);
- const NSRect rectInWindow = [self.superview.superview convertRect:rectInView toView:nil];
- return [self.window convertRectToScreen:rectInWindow];
+- (NSRect) accessibilityFrameForRange: (NSRange) range {
+ const NSRect rectInView = mOwner.backend->FrameForRange(range);
+ const NSRect rectInWindow = [self.superview.superview convertRect: rectInView toView: nil];
+ return [self.window convertRectToScreen: rectInWindow];
}
//--------------------------------------------------------------------------------------------------
@@ -1191,9 +1084,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* NSAccessibility : A range of text as a string.
*/
-- (NSString *) accessibilityStringForRange:(NSRange)range {
- const NSRange posRange = mOwner.backend->PositionsFromCharacters(range);
- return mOwner.backend->RangeTextAsString(posRange);
+- (NSString *) accessibilityStringForRange: (NSRange) range {
+ const NSRange posRange = mOwner.backend->PositionsFromCharacters(range);
+ return mOwner.backend->RangeTextAsString(posRange);
}
//--------------------------------------------------------------------------------------------------
@@ -1202,10 +1095,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* NSAccessibility : A range of text as an attributed string.
* Currently no attributes are set.
*/
-- (NSAttributedString *) accessibilityAttributedStringForRange:(NSRange)range {
- const NSRange posRange = mOwner.backend->PositionsFromCharacters(range);
- NSString *result = mOwner.backend->RangeTextAsString(posRange);
- return [[NSMutableAttributedString alloc] initWithString:result];
+- (NSAttributedString *) accessibilityAttributedStringForRange: (NSRange) range {
+ const NSRange posRange = mOwner.backend->PositionsFromCharacters(range);
+ NSString *result = mOwner.backend->RangeTextAsString(posRange);
+ return [[NSMutableAttributedString alloc] initWithString: result];
}
//--------------------------------------------------------------------------------------------------
@@ -1213,28 +1106,28 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* NSAccessibility : Show the context menu at the caret.
*/
-- (BOOL)accessibilityPerformShowMenu {
- const sptr_t caret = [mOwner message: SCI_GETCURRENTPOS];
- NSRect rect;
- rect.origin.x = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: caret];
- rect.origin.y = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: caret];
- rect.origin.y += [mOwner message: SCI_TEXTHEIGHT wParam: 0 lParam: 0];
- rect.size.width = 1.0;
- rect.size.height = 1.0;
- NSRect rectInWindow = [self.superview.superview convertRect:rect toView:nil];
- NSPoint pt = rectInWindow.origin;
- NSEvent *event = [NSEvent mouseEventWithType: NSRightMouseDown
- location: pt
- modifierFlags: 0
- timestamp: 0
- windowNumber: self.window.windowNumber
- context: nil
- eventNumber: 0
- clickCount: 1
- pressure: 0.0];
- NSMenu *menu = mOwner.backend->CreateContextMenu(event);
- [NSMenu popUpContextMenu:menu withEvent:event forView:self];
- return YES;
+- (BOOL) accessibilityPerformShowMenu {
+ const sptr_t caret = [mOwner message: SCI_GETCURRENTPOS];
+ NSRect rect;
+ rect.origin.x = [mOwner message: SCI_POINTXFROMPOSITION wParam: 0 lParam: caret];
+ rect.origin.y = [mOwner message: SCI_POINTYFROMPOSITION wParam: 0 lParam: caret];
+ rect.origin.y += [mOwner message: SCI_TEXTHEIGHT wParam: 0 lParam: 0];
+ rect.size.width = 1.0;
+ rect.size.height = 1.0;
+ NSRect rectInWindow = [self.superview.superview convertRect: rect toView: nil];
+ NSPoint pt = rectInWindow.origin;
+ NSEvent *event = [NSEvent mouseEventWithType: NSRightMouseDown
+ location: pt
+ modifierFlags: 0
+ timestamp: 0
+ windowNumber: self.window.windowNumber
+ context: nil
+ eventNumber: 0
+ clickCount: 1
+ pressure: 0.0];
+ NSMenu *menu = mOwner.backend->CreateContextMenu(event);
+ [NSMenu popUpContextMenu: menu withEvent: event forView: self];
+ return YES;
}
//--------------------------------------------------------------------------------------------------
@@ -1245,23 +1138,23 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
//--------------------------------------------------------------------------------------------------
@implementation ScintillaView {
- // The back end is kind of a controller and model in one.
- // It uses the content view for display.
- Scintilla::ScintillaCocoa* mBackend;
+ // The back end is kind of a controller and model in one.
+ // It uses the content view for display.
+ Scintilla::ScintillaCocoa *mBackend;
- // This is the actual content to which the backend renders itself.
- SCIContentView* mContent;
+ // This is the actual content to which the backend renders itself.
+ SCIContentView *mContent;
- NSScrollView *scrollView;
- SCIMarginView *marginView;
+ NSScrollView *scrollView;
+ SCIMarginView *marginView;
- CGFloat zoomDelta;
+ CGFloat zoomDelta;
- // Area to display additional controls (e.g. zoom info, caret position, status info).
- NSView <InfoBarCommunicator>* mInfoBar;
- BOOL mInfoBarAtTop;
+ // Area to display additional controls (e.g. zoom info, caret position, status info).
+ NSView <InfoBarCommunicator> *mInfoBar;
+ BOOL mInfoBarAtTop;
- id<ScintillaNotificationProtocol> __unsafe_unretained mDelegate;
+ id<ScintillaNotificationProtocol> __unsafe_unretained mDelegate;
}
@synthesize backend = mBackend;
@@ -1279,20 +1172,18 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Initialize custom cursor.
*/
-+ (void) initialize
-{
- if (self == [ScintillaView class])
- {
- NSBundle* bundle = [NSBundle bundleForClass: [ScintillaView class]];
++ (void) initialize {
+ if (self == [ScintillaView class]) {
+ NSBundle *bundle = [NSBundle bundleForClass: [ScintillaView class]];
- NSString* path = [bundle pathForResource: @"mac_cursor_busy" ofType: @"tiff" inDirectory: nil];
- NSImage* image = [[NSImage alloc] initWithContentsOfFile: path];
- waitCursor = [[NSCursor alloc] initWithImage: image hotSpot: NSMakePoint(2, 2)];
+ NSString *path = [bundle pathForResource: @"mac_cursor_busy" ofType: @"tiff" inDirectory: nil];
+ NSImage *image = [[NSImage alloc] initWithContentsOfFile: path];
+ waitCursor = [[NSCursor alloc] initWithImage: image hotSpot: NSMakePoint(2, 2)];
- path = [bundle pathForResource: @"mac_cursor_flipped" ofType: @"tiff" inDirectory: nil];
- image = [[NSImage alloc] initWithContentsOfFile: path];
- reverseArrowCursor = [[NSCursor alloc] initWithImage: image hotSpot: NSMakePoint(12, 2)];
- }
+ path = [bundle pathForResource: @"mac_cursor_flipped" ofType: @"tiff" inDirectory: nil];
+ image = [[NSImage alloc] initWithContentsOfFile: path];
+ reverseArrowCursor = [[NSCursor alloc] initWithImage: image hotSpot: NSMakePoint(12, 2)];
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1301,9 +1192,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Specify the SCIContentView class. Can be overridden in a subclass to provide an SCIContentView subclass.
*/
-+ (Class) contentViewClass
-{
- return [SCIContentView class];
++ (Class) contentViewClass {
+ return [SCIContentView class];
}
//--------------------------------------------------------------------------------------------------
@@ -1311,24 +1201,22 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Receives zoom messages, for example when a "pinch zoom" is performed on the trackpad.
*/
-- (void) magnifyWithEvent: (NSEvent *) event
-{
+- (void) magnifyWithEvent: (NSEvent *) event {
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
- zoomDelta += event.magnification * 10.0;
+ zoomDelta += event.magnification * 10.0;
- if (fabs(zoomDelta)>=1.0) {
- long zoomFactor = static_cast<long>([self getGeneralProperty: SCI_GETZOOM] + zoomDelta);
- [self setGeneralProperty: SCI_SETZOOM parameter: zoomFactor value:0];
- zoomDelta = 0.0;
- }
+ if (fabs(zoomDelta)>=1.0) {
+ long zoomFactor = static_cast<long>([self getGeneralProperty: SCI_GETZOOM] + zoomDelta);
+ [self setGeneralProperty: SCI_SETZOOM parameter: zoomFactor value: 0];
+ zoomDelta = 0.0;
+ }
#endif
}
-- (void) beginGestureWithEvent: (NSEvent *) event
-{
+- (void) beginGestureWithEvent: (NSEvent *) event {
// Scintilla is only interested in this event as the starft of a zoom
#pragma unused(event)
- zoomDelta = 0.0;
+ zoomDelta = 0.0;
}
//--------------------------------------------------------------------------------------------------
@@ -1336,10 +1224,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Sends a new notification of the given type to the default notification center.
*/
-- (void) sendNotification: (NSString*) notificationName
-{
- NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
- [center postNotificationName: notificationName object: self];
+- (void) sendNotification: (NSString *) notificationName {
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ [center postNotificationName: notificationName object: self];
}
//--------------------------------------------------------------------------------------------------
@@ -1352,31 +1239,27 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* @param location Carries the new location (e.g. caret) if the type is a caret change or similar type.
* @param value Carries the new zoom value if the type is a zoom change.
*/
-- (void) notify: (NotificationType) type message: (NSString*) message location: (NSPoint) location
- value: (float) value
-{
+- (void) notify: (NotificationType) type message: (NSString *) message location: (NSPoint) location
+ value: (float) value {
// These parameters are just to conform to the protocol
#pragma unused(message)
#pragma unused(location)
- switch (type)
- {
- case IBNZoomChanged:
- {
- // Compute point increase/decrease based on default font size.
- long fontSize = [self getGeneralProperty: SCI_STYLEGETSIZE parameter: STYLE_DEFAULT];
- int zoom = (int) (fontSize * (value - 1));
- [self setGeneralProperty: SCI_SETZOOM value: zoom];
- break;
- }
- default:
- break;
- };
+ switch (type) {
+ case IBNZoomChanged: {
+ // Compute point increase/decrease based on default font size.
+ long fontSize = [self getGeneralProperty: SCI_STYLEGETSIZE parameter: STYLE_DEFAULT];
+ int zoom = (int)(fontSize * (value - 1));
+ [self setGeneralProperty: SCI_SETZOOM value: zoom];
+ break;
+ }
+ default:
+ break;
+ };
}
//--------------------------------------------------------------------------------------------------
-- (void) setCallback: (id <InfoBarCommunicator>) callback
-{
+- (void) setCallback: (id <InfoBarCommunicator>) callback {
// Not used. Only here to satisfy protocol.
#pragma unused(callback)
}
@@ -1387,12 +1270,11 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Prevents drawing of the inner view to avoid flickering when doing many visual updates
* (like clearing all marks and setting new ones etc.).
*/
-- (void) suspendDrawing: (BOOL) suspend
-{
- if (suspend)
- [self.window disableFlushWindow];
- else
- [self.window enableFlushWindow];
+- (void) suspendDrawing: (BOOL) suspend {
+ if (suspend)
+ [self.window disableFlushWindow];
+ else
+ [self.window enableFlushWindow];
}
//--------------------------------------------------------------------------------------------------
@@ -1403,65 +1285,56 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* A delegate can be set to receive all notifications. If set no handling takes place here, except
* for action pertaining to internal stuff (like the info bar).
*/
-- (void) notification: (SCNotification*)scn
-{
- // Parent notification. Details are passed as SCNotification structure.
-
- if (mDelegate != nil)
- {
- [mDelegate notification: scn];
- if (scn->nmhdr.code != SCN_ZOOM && scn->nmhdr.code != SCN_UPDATEUI)
- return;
- }
-
- switch (scn->nmhdr.code)
- {
- case SCN_MARGINCLICK:
- {
- if (scn->margin == 2)
- {
- // Click on the folder margin. Toggle the current line if possible.
- long line = [self getGeneralProperty: SCI_LINEFROMPOSITION parameter: scn->position];
- [self setGeneralProperty: SCI_TOGGLEFOLD value: line];
- }
- break;
- };
- case SCN_MODIFIED:
- {
- // Decide depending on the modification type what to do.
- // There can be more than one modification carried by one notification.
- if (scn->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT))
- [self sendNotification: NSTextDidChangeNotification];
- break;
- }
- case SCN_ZOOM:
- {
- // A zoom change happened. Notify info bar if there is one.
- float zoom = [self getGeneralProperty: SCI_GETZOOM parameter: 0];
- long fontSize = [self getGeneralProperty: SCI_STYLEGETSIZE parameter: STYLE_DEFAULT];
- float factor = (zoom / fontSize) + 1;
- [mInfoBar notify: IBNZoomChanged message: nil location: NSZeroPoint value: factor];
- break;
- }
- case SCN_UPDATEUI:
- {
- // Triggered whenever changes in the UI state need to be reflected.
- // These can be: caret changes, selection changes etc.
- NSPoint caretPosition = mBackend->GetCaretPosition();
- [mInfoBar notify: IBNCaretChanged message: nil location: caretPosition value: 0];
- [self sendNotification: SCIUpdateUINotification];
- if (scn->updated & (SC_UPDATE_SELECTION | SC_UPDATE_CONTENT))
- {
- [self sendNotification: NSTextViewDidChangeSelectionNotification];
- }
- break;
- }
- case SCN_FOCUSOUT:
- [self sendNotification: NSTextDidEndEditingNotification];
- break;
- case SCN_FOCUSIN: // Nothing to do for now.
- break;
- }
+- (void) notification: (SCNotification *) scn {
+ // Parent notification. Details are passed as SCNotification structure.
+
+ if (mDelegate != nil) {
+ [mDelegate notification: scn];
+ if (scn->nmhdr.code != SCN_ZOOM && scn->nmhdr.code != SCN_UPDATEUI)
+ return;
+ }
+
+ switch (scn->nmhdr.code) {
+ case SCN_MARGINCLICK: {
+ if (scn->margin == 2) {
+ // Click on the folder margin. Toggle the current line if possible.
+ long line = [self getGeneralProperty: SCI_LINEFROMPOSITION parameter: scn->position];
+ [self setGeneralProperty: SCI_TOGGLEFOLD value: line];
+ }
+ break;
+ };
+ case SCN_MODIFIED: {
+ // Decide depending on the modification type what to do.
+ // There can be more than one modification carried by one notification.
+ if (scn->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT))
+ [self sendNotification: NSTextDidChangeNotification];
+ break;
+ }
+ case SCN_ZOOM: {
+ // A zoom change happened. Notify info bar if there is one.
+ float zoom = [self getGeneralProperty: SCI_GETZOOM parameter: 0];
+ long fontSize = [self getGeneralProperty: SCI_STYLEGETSIZE parameter: STYLE_DEFAULT];
+ float factor = (zoom / fontSize) + 1;
+ [mInfoBar notify: IBNZoomChanged message: nil location: NSZeroPoint value: factor];
+ break;
+ }
+ case SCN_UPDATEUI: {
+ // Triggered whenever changes in the UI state need to be reflected.
+ // These can be: caret changes, selection changes etc.
+ NSPoint caretPosition = mBackend->GetCaretPosition();
+ [mInfoBar notify: IBNCaretChanged message: nil location: caretPosition value: 0];
+ [self sendNotification: SCIUpdateUINotification];
+ if (scn->updated & (SC_UPDATE_SELECTION | SC_UPDATE_CONTENT)) {
+ [self sendNotification: NSTextViewDidChangeSelectionNotification];
+ }
+ break;
+ }
+ case SCN_FOCUSOUT:
+ [self sendNotification: NSTextDidEndEditingNotification];
+ break;
+ case SCN_FOCUSIN: // Nothing to do for now.
+ break;
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1470,13 +1343,12 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Setup a special indicator used in the editor to provide visual feedback for
* input composition, depending on language, keyboard etc.
*/
-- (void) updateIndicatorIME
-{
- [self setColorProperty: SCI_INDICSETFORE parameter: INDIC_IME fromHTML: @"#FF0000"];
- const bool drawInBackground = [self message: SCI_GETPHASESDRAW] != 0;
- [self setGeneralProperty: SCI_INDICSETUNDER parameter: INDIC_IME value: drawInBackground];
- [self setGeneralProperty: SCI_INDICSETSTYLE parameter: INDIC_IME value: INDIC_PLAIN];
- [self setGeneralProperty: SCI_INDICSETALPHA parameter: INDIC_IME value: 100];
+- (void) updateIndicatorIME {
+ [self setColorProperty: SCI_INDICSETFORE parameter: INDIC_IME fromHTML: @"#FF0000"];
+ const bool drawInBackground = [self message: SCI_GETPHASESDRAW] != 0;
+ [self setGeneralProperty: SCI_INDICSETUNDER parameter: INDIC_IME value: drawInBackground];
+ [self setGeneralProperty: SCI_INDICSETSTYLE parameter: INDIC_IME value: INDIC_PLAIN];
+ [self setGeneralProperty: SCI_INDICSETALPHA parameter: INDIC_IME value: 100];
}
//--------------------------------------------------------------------------------------------------
@@ -1484,113 +1356,109 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Initialization of the view. Used to setup a few other things we need.
*/
-- (instancetype) initWithFrame: (NSRect) frame
-{
- self = [super initWithFrame:frame];
- if (self)
- {
- mContent = [[[[self class] contentViewClass] alloc] initWithFrame:NSZeroRect];
- mContent.owner = self;
-
- // Initialize the scrollers but don't show them yet.
- // Pick an arbitrary size, just to make NSScroller selecting the proper scroller direction
- // (horizontal or vertical).
- NSRect scrollerRect = NSMakeRect(0, 0, 100, 10);
- scrollView = [[NSScrollView alloc] initWithFrame: scrollerRect];
- scrollView.documentView = mContent;
- [scrollView setHasVerticalScroller:YES];
- [scrollView setHasHorizontalScroller:YES];
- scrollView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
- //[scrollView setScrollerStyle:NSScrollerStyleLegacy];
- //[scrollView setScrollerKnobStyle:NSScrollerKnobStyleDark];
- //[scrollView setHorizontalScrollElasticity:NSScrollElasticityNone];
- [self addSubview: scrollView];
-
- marginView = [[SCIMarginView alloc] initWithScrollView:scrollView];
- marginView.owner = self;
- marginView.ruleThickness = marginView.requiredThickness;
- scrollView.verticalRulerView = marginView;
- [scrollView setHasHorizontalRuler:NO];
- [scrollView setHasVerticalRuler:YES];
- [scrollView setRulersVisible:YES];
-
- mBackend = new ScintillaCocoa(self, mContent, marginView);
-
- // Establish a connection from the back end to this container so we can handle situations
- // which require our attention.
- mBackend->SetDelegate(self);
-
- [self updateIndicatorIME];
-
- NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
- [center addObserver:self
- selector:@selector(applicationDidResignActive:)
- name:NSApplicationDidResignActiveNotification
- object:nil];
-
- [center addObserver:self
- selector:@selector(applicationDidBecomeActive:)
- name:NSApplicationDidBecomeActiveNotification
- object:nil];
-
- [center addObserver:self
- selector:@selector(windowWillMove:)
- name:NSWindowWillMoveNotification
- object:self.window];
-
- [scrollView.contentView setPostsBoundsChangedNotifications:YES];
- [center addObserver:self
- selector:@selector(scrollerAction:)
- name:NSViewBoundsDidChangeNotification
- object:scrollView.contentView];
- }
- return self;
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (void) dealloc
-{
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- mBackend->Finalise();
- delete mBackend;
- mBackend = NULL;
- mContent.owner = nil;
- [marginView setClientView:nil];
- [scrollView removeFromSuperview];
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (void) applicationDidResignActive: (NSNotification *)note {
+- (instancetype) initWithFrame: (NSRect) frame {
+ self = [super initWithFrame: frame];
+ if (self) {
+ mContent = [[[[self class] contentViewClass] alloc] initWithFrame: NSZeroRect];
+ mContent.owner = self;
+
+ // Initialize the scrollers but don't show them yet.
+ // Pick an arbitrary size, just to make NSScroller selecting the proper scroller direction
+ // (horizontal or vertical).
+ NSRect scrollerRect = NSMakeRect(0, 0, 100, 10);
+ scrollView = [[NSScrollView alloc] initWithFrame: scrollerRect];
+ scrollView.documentView = mContent;
+ [scrollView setHasVerticalScroller: YES];
+ [scrollView setHasHorizontalScroller: YES];
+ scrollView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
+ //[scrollView setScrollerStyle:NSScrollerStyleLegacy];
+ //[scrollView setScrollerKnobStyle:NSScrollerKnobStyleDark];
+ //[scrollView setHorizontalScrollElasticity:NSScrollElasticityNone];
+ [self addSubview: scrollView];
+
+ marginView = [[SCIMarginView alloc] initWithScrollView: scrollView];
+ marginView.owner = self;
+ marginView.ruleThickness = marginView.requiredThickness;
+ scrollView.verticalRulerView = marginView;
+ [scrollView setHasHorizontalRuler: NO];
+ [scrollView setHasVerticalRuler: YES];
+ [scrollView setRulersVisible: YES];
+
+ mBackend = new ScintillaCocoa(self, mContent, marginView);
+
+ // Establish a connection from the back end to this container so we can handle situations
+ // which require our attention.
+ mBackend->SetDelegate(self);
+
+ [self updateIndicatorIME];
+
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ [center addObserver: self
+ selector: @selector(applicationDidResignActive:)
+ name: NSApplicationDidResignActiveNotification
+ object: nil];
+
+ [center addObserver: self
+ selector: @selector(applicationDidBecomeActive:)
+ name: NSApplicationDidBecomeActiveNotification
+ object: nil];
+
+ [center addObserver: self
+ selector: @selector(windowWillMove:)
+ name: NSWindowWillMoveNotification
+ object: self.window];
+
+ [scrollView.contentView setPostsBoundsChangedNotifications: YES];
+ [center addObserver: self
+ selector: @selector(scrollerAction:)
+ name: NSViewBoundsDidChangeNotification
+ object: scrollView.contentView];
+ }
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (void) dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver: self];
+ mBackend->Finalise();
+ delete mBackend;
+ mBackend = NULL;
+ mContent.owner = nil;
+ [marginView setClientView: nil];
+ [scrollView removeFromSuperview];
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (void) applicationDidResignActive: (NSNotification *) note {
#pragma unused(note)
- mBackend->ActiveStateChanged(false);
+ mBackend->ActiveStateChanged(false);
}
//--------------------------------------------------------------------------------------------------
-- (void) applicationDidBecomeActive: (NSNotification *)note {
+- (void) applicationDidBecomeActive: (NSNotification *) note {
#pragma unused(note)
- mBackend->ActiveStateChanged(true);
+ mBackend->ActiveStateChanged(true);
}
//--------------------------------------------------------------------------------------------------
-- (void) windowWillMove: (NSNotification *)note {
+- (void) windowWillMove: (NSNotification *) note {
#pragma unused(note)
- mBackend->WindowWillMove();
+ mBackend->WindowWillMove();
}
//--------------------------------------------------------------------------------------------------
-- (void) viewDidMoveToWindow
-{
- [super viewDidMoveToWindow];
+- (void) viewDidMoveToWindow {
+ [super viewDidMoveToWindow];
- [self positionSubViews];
+ [self positionSubViews];
- // Enable also mouse move events for our window (and so this view).
- [self.window setAcceptsMouseMovedEvents: YES];
+ // Enable also mouse move events for our window (and so this view).
+ [self.window setAcceptsMouseMovedEvents: YES];
}
//--------------------------------------------------------------------------------------------------
@@ -1598,38 +1466,35 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Used to position and size the parts of the editor (content, scrollers, info bar).
*/
-- (void) positionSubViews
-{
- CGFloat scrollerWidth = [NSScroller scrollerWidthForControlSize:NSRegularControlSize
- scrollerStyle:NSScrollerStyleLegacy];
-
- NSSize size = self.frame.size;
- NSRect barFrame = {{0, size.height - scrollerWidth}, {size.width, scrollerWidth}};
- BOOL infoBarVisible = mInfoBar != nil && !mInfoBar.hidden;
-
- // Horizontal offset of the content. Almost always 0 unless the vertical scroller
- // is on the left side.
- CGFloat contentX = 0;
- NSRect scrollRect = {{contentX, 0}, {size.width, size.height}};
-
- // Info bar frame.
- if (infoBarVisible)
- {
- scrollRect.size.height -= scrollerWidth;
- // Initial value already is as if the bar is at top.
- if (!mInfoBarAtTop)
- {
- scrollRect.origin.y += scrollerWidth;
- barFrame.origin.y = 0;
- }
- }
+- (void) positionSubViews {
+ CGFloat scrollerWidth = [NSScroller scrollerWidthForControlSize: NSRegularControlSize
+ scrollerStyle: NSScrollerStyleLegacy];
+
+ NSSize size = self.frame.size;
+ NSRect barFrame = {{0, size.height - scrollerWidth}, {size.width, scrollerWidth}};
+ BOOL infoBarVisible = mInfoBar != nil && !mInfoBar.hidden;
+
+ // Horizontal offset of the content. Almost always 0 unless the vertical scroller
+ // is on the left side.
+ CGFloat contentX = 0;
+ NSRect scrollRect = {{contentX, 0}, {size.width, size.height}};
+
+ // Info bar frame.
+ if (infoBarVisible) {
+ scrollRect.size.height -= scrollerWidth;
+ // Initial value already is as if the bar is at top.
+ if (!mInfoBarAtTop) {
+ scrollRect.origin.y += scrollerWidth;
+ barFrame.origin.y = 0;
+ }
+ }
- if (!NSEqualRects(scrollView.frame, scrollRect)) {
- scrollView.frame = scrollRect;
- }
+ if (!NSEqualRects(scrollView.frame, scrollRect)) {
+ scrollView.frame = scrollRect;
+ }
- if (infoBarVisible)
- mInfoBar.frame = barFrame;
+ if (infoBarVisible)
+ mInfoBar.frame = barFrame;
}
//--------------------------------------------------------------------------------------------------
@@ -1637,13 +1502,11 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Set the width of the margin.
*/
-- (void) setMarginWidth: (int) width
-{
- if (marginView.ruleThickness != width)
- {
- marginView.marginWidth = width;
- marginView.ruleThickness = marginView.requiredThickness;
- }
+- (void) setMarginWidth: (int) width {
+ if (marginView.ruleThickness != width) {
+ marginView.marginWidth = width;
+ marginView.ruleThickness = marginView.requiredThickness;
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1652,10 +1515,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Triggered by one of the scrollers when it gets manipulated by the user. Notify the backend
* about the change.
*/
-- (void) scrollerAction: (id) sender
-{
+- (void) scrollerAction: (id) sender {
#pragma unused(sender)
- mBackend->UpdateForScroll();
+ mBackend->UpdateForScroll();
}
//--------------------------------------------------------------------------------------------------
@@ -1663,14 +1525,13 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Used to reposition our content depending on the size of the view.
*/
-- (void) setFrame: (NSRect) newFrame
-{
- NSRect previousFrame = self.frame;
- super.frame = newFrame;
- [self positionSubViews];
- if (!NSEqualRects(previousFrame, newFrame)) {
- mBackend->Resize();
- }
+- (void) setFrame: (NSRect) newFrame {
+ NSRect previousFrame = self.frame;
+ super.frame = newFrame;
+ [self positionSubViews];
+ if (!NSEqualRects(previousFrame, newFrame)) {
+ mBackend->Resize();
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1679,26 +1540,21 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Getter for the currently selected text in raw form (no formatting information included).
* If there is no text available an empty string is returned.
*/
-- (NSString*) selectedString
-{
- NSString *result = @"";
+- (NSString *) selectedString {
+ NSString *result = @"";
- const long length = mBackend->WndProc(SCI_GETSELTEXT, 0, 0);
- if (length > 0)
- {
- std::string buffer(length + 1, '\0');
- try
- {
- mBackend->WndProc(SCI_GETSELTEXT, length + 1, (sptr_t) &buffer[0]);
+ const long length = mBackend->WndProc(SCI_GETSELTEXT, 0, 0);
+ if (length > 0) {
+ std::string buffer(length + 1, '\0');
+ try {
+ mBackend->WndProc(SCI_GETSELTEXT, length + 1, (sptr_t) &buffer[0]);
- result = @(buffer.c_str());
- }
- catch (...)
- {
- }
- }
+ result = @(buffer.c_str());
+ } catch (...) {
+ }
+ }
- return result;
+ return result;
}
//--------------------------------------------------------------------------------------------------
@@ -1706,13 +1562,11 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Delete a range from the document.
*/
-- (void) deleteRange: (NSRange) aRange
-{
- if (aRange.length > 0)
- {
- NSRange posRange = mBackend->PositionsFromCharacters(aRange);
- [self message: SCI_DELETERANGE wParam: posRange.location lParam: posRange.length];
- }
+- (void) deleteRange: (NSRange) aRange {
+ if (aRange.length > 0) {
+ NSRange posRange = mBackend->PositionsFromCharacters(aRange);
+ [self message: SCI_DELETERANGE wParam: posRange.location lParam: posRange.length];
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1721,26 +1575,21 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Getter for the current text in raw form (no formatting information included).
* If there is no text available an empty string is returned.
*/
-- (NSString*) string
-{
- NSString *result = @"";
+- (NSString *) string {
+ NSString *result = @"";
- const long length = mBackend->WndProc(SCI_GETLENGTH, 0, 0);
- if (length > 0)
- {
- std::string buffer(length + 1, '\0');
- try
- {
- mBackend->WndProc(SCI_GETTEXT, length + 1, (sptr_t) &buffer[0]);
+ const long length = mBackend->WndProc(SCI_GETLENGTH, 0, 0);
+ if (length > 0) {
+ std::string buffer(length + 1, '\0');
+ try {
+ mBackend->WndProc(SCI_GETTEXT, length + 1, (sptr_t) &buffer[0]);
- result = @(buffer.c_str());
- }
- catch (...)
- {
- }
- }
+ result = @(buffer.c_str());
+ } catch (...) {
+ }
+ }
- return result;
+ return result;
}
//--------------------------------------------------------------------------------------------------
@@ -1748,45 +1597,40 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Setter for the current text (no formatting included).
*/
-- (void) setString: (NSString*) aString
-{
- const char* text = aString.UTF8String;
- mBackend->WndProc(SCI_SETTEXT, 0, (long) text);
+- (void) setString: (NSString *) aString {
+ const char *text = aString.UTF8String;
+ mBackend->WndProc(SCI_SETTEXT, 0, (long) text);
}
//--------------------------------------------------------------------------------------------------
-- (void) insertString: (NSString*) aString atOffset: (int)offset
-{
- const char* text = aString.UTF8String;
- mBackend->WndProc(SCI_ADDTEXT, offset, (long) text);
+- (void) insertString: (NSString *) aString atOffset: (int) offset {
+ const char *text = aString.UTF8String;
+ mBackend->WndProc(SCI_ADDTEXT, offset, (long) text);
}
//--------------------------------------------------------------------------------------------------
-- (void) setEditable: (BOOL) editable
-{
- mBackend->WndProc(SCI_SETREADONLY, editable ? 0 : 1, 0);
+- (void) setEditable: (BOOL) editable {
+ mBackend->WndProc(SCI_SETREADONLY, editable ? 0 : 1, 0);
}
//--------------------------------------------------------------------------------------------------
-- (BOOL) isEditable
-{
- return mBackend->WndProc(SCI_GETREADONLY, 0, 0) == 0;
+- (BOOL) isEditable {
+ return mBackend->WndProc(SCI_GETREADONLY, 0, 0) == 0;
}
//--------------------------------------------------------------------------------------------------
-- (SCIContentView*) content
-{
- return mContent;
+- (SCIContentView *) content {
+ return mContent;
}
//--------------------------------------------------------------------------------------------------
- (void) updateMarginCursors {
- [self.window invalidateCursorRectsForView: marginView];
+ [self.window invalidateCursorRectsForView: marginView];
}
//--------------------------------------------------------------------------------------------------
@@ -1796,26 +1640,22 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* the result heavily depend on the message that is used for the call. Refer to the Scintilla
* documentation to learn what can be used here.
*/
-+ (sptr_t) directCall: (ScintillaView*) sender message: (unsigned int) message wParam: (uptr_t) wParam
- lParam: (sptr_t) lParam
-{
- return ScintillaCocoa::DirectFunction(
- reinterpret_cast<sptr_t>(sender->mBackend), message, wParam, lParam);
++ (sptr_t) directCall: (ScintillaView *) sender message: (unsigned int) message wParam: (uptr_t) wParam
+ lParam: (sptr_t) lParam {
+ return ScintillaCocoa::DirectFunction(
+ reinterpret_cast<sptr_t>(sender->mBackend), message, wParam, lParam);
}
-- (sptr_t) message: (unsigned int) message wParam: (uptr_t) wParam lParam: (sptr_t) lParam
-{
- return mBackend->WndProc(message, wParam, lParam);
+- (sptr_t) message: (unsigned int) message wParam: (uptr_t) wParam lParam: (sptr_t) lParam {
+ return mBackend->WndProc(message, wParam, lParam);
}
-- (sptr_t) message: (unsigned int) message wParam: (uptr_t) wParam
-{
- return mBackend->WndProc(message, wParam, 0);
+- (sptr_t) message: (unsigned int) message wParam: (uptr_t) wParam {
+ return mBackend->WndProc(message, wParam, 0);
}
-- (sptr_t) message: (unsigned int) message
-{
- return mBackend->WndProc(message, 0, 0);
+- (sptr_t) message: (unsigned int) message {
+ return mBackend->WndProc(message, 0, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1827,9 +1667,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* @param parameter Additional info for this property like a parameter or index.
* @param value The actual value. It depends on the property what this parameter means.
*/
-- (void) setGeneralProperty: (int) property parameter: (long) parameter value: (long) value
-{
- mBackend->WndProc(property, parameter, value);
+- (void) setGeneralProperty: (int) property parameter: (long) parameter value: (long) value {
+ mBackend->WndProc(property, parameter, value);
}
//--------------------------------------------------------------------------------------------------
@@ -1840,9 +1679,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* @param property Main property like SCI_STYLESETFORE for which a value is to be set.
* @param value The actual value. It depends on the property what this parameter means.
*/
-- (void) setGeneralProperty: (int) property value: (long) value
-{
- mBackend->WndProc(property, value, 0);
+- (void) setGeneralProperty: (int) property value: (long) value {
+ mBackend->WndProc(property, value, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1855,9 +1693,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* @param extra Yet another parameter if needed.
* @result A generic value which must be interpreted depending on the property queried.
*/
-- (long) getGeneralProperty: (int) property parameter: (long) parameter extra: (long) extra
-{
- return mBackend->WndProc(property, parameter, extra);
+- (long) getGeneralProperty: (int) property parameter: (long) parameter extra: (long) extra {
+ return mBackend->WndProc(property, parameter, extra);
}
//--------------------------------------------------------------------------------------------------
@@ -1865,9 +1702,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Convenience function to avoid unneeded extra parameter.
*/
-- (long) getGeneralProperty: (int) property parameter: (long) parameter
-{
- return mBackend->WndProc(property, parameter, 0);
+- (long) getGeneralProperty: (int) property parameter: (long) parameter {
+ return mBackend->WndProc(property, parameter, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1875,9 +1711,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Convenience function to avoid unneeded parameters.
*/
-- (long) getGeneralProperty: (int) property
-{
- return mBackend->WndProc(property, 0, 0);
+- (long) getGeneralProperty: (int) property {
+ return mBackend->WndProc(property, 0, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1885,9 +1720,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Use this variant if you have to pass in a reference to something (e.g. a text range).
*/
-- (long) getGeneralProperty: (int) property ref: (const void*) ref
-{
- return mBackend->WndProc(property, 0, (sptr_t) ref);
+- (long) getGeneralProperty: (int) property ref: (const void *) ref {
+ return mBackend->WndProc(property, 0, (sptr_t) ref);
}
//--------------------------------------------------------------------------------------------------
@@ -1895,16 +1729,15 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property setter for colors.
*/
-- (void) setColorProperty: (int) property parameter: (long) parameter value: (NSColor*) value
-{
- if (value.colorSpaceName != NSDeviceRGBColorSpace)
- value = [value colorUsingColorSpaceName: NSDeviceRGBColorSpace];
- long red = static_cast<long>(value.redComponent * 255);
- long green = static_cast<long>(value.greenComponent * 255);
- long blue = static_cast<long>(value.blueComponent * 255);
+- (void) setColorProperty: (int) property parameter: (long) parameter value: (NSColor *) value {
+ if (value.colorSpaceName != NSDeviceRGBColorSpace)
+ value = [value colorUsingColorSpaceName: NSDeviceRGBColorSpace];
+ long red = static_cast<long>(value.redComponent * 255);
+ long green = static_cast<long>(value.greenComponent * 255);
+ long blue = static_cast<long>(value.blueComponent * 255);
- long color = (blue << 16) + (green << 8) + red;
- mBackend->WndProc(property, parameter, color);
+ long color = (blue << 16) + (green << 8) + red;
+ mBackend->WndProc(property, parameter, color);
}
//--------------------------------------------------------------------------------------------------
@@ -1913,44 +1746,42 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Another color property setting, which allows to specify the color as string like in HTML
* documents (i.e. with leading # and either 3 hex digits or 6).
*/
-- (void) setColorProperty: (int) property parameter: (long) parameter fromHTML: (NSString*) fromHTML
-{
- if (fromHTML.length > 3 && [fromHTML characterAtIndex: 0] == '#')
- {
- bool longVersion = fromHTML.length > 6;
- int index = 1;
-
- char value[3] = {0, 0, 0};
- value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
- if (longVersion)
- value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
- else
- value[1] = value[0];
-
- unsigned rawRed;
- [[NSScanner scannerWithString: @(value)] scanHexInt: &rawRed];
-
- value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
- if (longVersion)
- value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
- else
- value[1] = value[0];
-
- unsigned rawGreen;
- [[NSScanner scannerWithString: @(value)] scanHexInt: &rawGreen];
-
- value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
- if (longVersion)
- value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
- else
- value[1] = value[0];
-
- unsigned rawBlue;
- [[NSScanner scannerWithString: @(value)] scanHexInt: &rawBlue];
-
- long color = (rawBlue << 16) + (rawGreen << 8) + rawRed;
- mBackend->WndProc(property, parameter, color);
- }
+- (void) setColorProperty: (int) property parameter: (long) parameter fromHTML: (NSString *) fromHTML {
+ if (fromHTML.length > 3 && [fromHTML characterAtIndex: 0] == '#') {
+ bool longVersion = fromHTML.length > 6;
+ int index = 1;
+
+ char value[3] = {0, 0, 0};
+ value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ if (longVersion)
+ value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ else
+ value[1] = value[0];
+
+ unsigned rawRed;
+ [[NSScanner scannerWithString: @(value)] scanHexInt: &rawRed];
+
+ value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ if (longVersion)
+ value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ else
+ value[1] = value[0];
+
+ unsigned rawGreen;
+ [[NSScanner scannerWithString: @(value)] scanHexInt: &rawGreen];
+
+ value[0] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ if (longVersion)
+ value[1] = static_cast<char>([fromHTML characterAtIndex: index++]);
+ else
+ value[1] = value[0];
+
+ unsigned rawBlue;
+ [[NSScanner scannerWithString: @(value)] scanHexInt: &rawBlue];
+
+ long color = (rawBlue << 16) + (rawGreen << 8) + rawRed;
+ mBackend->WndProc(property, parameter, color);
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -1958,14 +1789,13 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property getter for colors.
*/
-- (NSColor*) getColorProperty: (int) property parameter: (long) parameter
-{
- long color = mBackend->WndProc(property, parameter, 0);
- CGFloat red = (color & 0xFF) / 255.0;
- CGFloat green = ((color >> 8) & 0xFF) / 255.0;
- CGFloat blue = ((color >> 16) & 0xFF) / 255.0;
- NSColor* result = [NSColor colorWithDeviceRed: red green: green blue: blue alpha: 1];
- return result;
+- (NSColor *) getColorProperty: (int) property parameter: (long) parameter {
+ long color = mBackend->WndProc(property, parameter, 0);
+ CGFloat red = (color & 0xFF) / 255.0;
+ CGFloat green = ((color >> 8) & 0xFF) / 255.0;
+ CGFloat blue = ((color >> 16) & 0xFF) / 255.0;
+ NSColor *result = [NSColor colorWithDeviceRed: red green: green blue: blue alpha: 1];
+ return result;
}
//--------------------------------------------------------------------------------------------------
@@ -1973,9 +1803,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property setter for references (pointers, addresses).
*/
-- (void) setReferenceProperty: (int) property parameter: (long) parameter value: (const void*) value
-{
- mBackend->WndProc(property, parameter, (sptr_t) value);
+- (void) setReferenceProperty: (int) property parameter: (long) parameter value: (const void *) value {
+ mBackend->WndProc(property, parameter, (sptr_t) value);
}
//--------------------------------------------------------------------------------------------------
@@ -1983,9 +1812,8 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property getter for references (pointers, addresses).
*/
-- (const void*) getReferenceProperty: (int) property parameter: (long) parameter
-{
- return (const void*) mBackend->WndProc(property, parameter, 0);
+- (const void *) getReferenceProperty: (int) property parameter: (long) parameter {
+ return (const void *) mBackend->WndProc(property, parameter, 0);
}
//--------------------------------------------------------------------------------------------------
@@ -1993,10 +1821,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property setter for string values.
*/
-- (void) setStringProperty: (int) property parameter: (long) parameter value: (NSString*) value
-{
- const char* rawValue = value.UTF8String;
- mBackend->WndProc(property, parameter, (sptr_t) rawValue);
+- (void) setStringProperty: (int) property parameter: (long) parameter value: (NSString *) value {
+ const char *rawValue = value.UTF8String;
+ mBackend->WndProc(property, parameter, (sptr_t) rawValue);
}
@@ -2005,10 +1832,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property getter for string values.
*/
-- (NSString*) getStringProperty: (int) property parameter: (long) parameter
-{
- const char* rawValue = (const char*) mBackend->WndProc(property, parameter, 0);
- return @(rawValue);
+- (NSString *) getStringProperty: (int) property parameter: (long) parameter {
+ const char *rawValue = (const char *) mBackend->WndProc(property, parameter, 0);
+ return @(rawValue);
}
//--------------------------------------------------------------------------------------------------
@@ -2016,11 +1842,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property setter for lexer properties, which are commonly passed as strings.
*/
-- (void) setLexerProperty: (NSString*) name value: (NSString*) value
-{
- const char* rawName = name.UTF8String;
- const char* rawValue = value.UTF8String;
- mBackend->WndProc(SCI_SETPROPERTY, (sptr_t) rawName, (sptr_t) rawValue);
+- (void) setLexerProperty: (NSString *) name value: (NSString *) value {
+ const char *rawName = name.UTF8String;
+ const char *rawValue = value.UTF8String;
+ mBackend->WndProc(SCI_SETPROPERTY, (sptr_t) rawName, (sptr_t) rawValue);
}
//--------------------------------------------------------------------------------------------------
@@ -2028,11 +1853,10 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Specialized property getter for references (pointers, addresses).
*/
-- (NSString*) getLexerProperty: (NSString*) name
-{
- const char* rawName = name.UTF8String;
- const char* result = (const char*) mBackend->WndProc(SCI_SETPROPERTY, (sptr_t) rawName, 0);
- return @(result);
+- (NSString *) getLexerProperty: (NSString *) name {
+ const char *rawName = name.UTF8String;
+ const char *result = (const char *) mBackend->WndProc(SCI_SETPROPERTY, (sptr_t) rawName, 0);
+ return @(result);
}
//--------------------------------------------------------------------------------------------------
@@ -2040,8 +1864,7 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Sets the notification callback
*/
-- (void) registerNotifyCallback: (intptr_t) windowid value: (SciNotifyFunc) callback
-{
+- (void) registerNotifyCallback: (intptr_t) windowid value: (SciNotifyFunc) callback {
mBackend->RegisterNotifyCallback(windowid, callback);
}
@@ -2053,22 +1876,19 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* Set newBar to nil if you want to hide the bar again.
* The info bar's height is set to the height of the scrollbar.
*/
-- (void) setInfoBar: (NSView <InfoBarCommunicator>*) newBar top: (BOOL) top
-{
- if (mInfoBar != newBar)
- {
- [mInfoBar removeFromSuperview];
+- (void) setInfoBar: (NSView <InfoBarCommunicator> *) newBar top: (BOOL) top {
+ if (mInfoBar != newBar) {
+ [mInfoBar removeFromSuperview];
- mInfoBar = newBar;
- mInfoBarAtTop = top;
- if (mInfoBar != nil)
- {
- [self addSubview: mInfoBar];
- [mInfoBar setCallback: self];
- }
+ mInfoBar = newBar;
+ mInfoBarAtTop = top;
+ if (mInfoBar != nil) {
+ [self addSubview: mInfoBar];
+ [mInfoBar setCallback: self];
+ }
- [self positionSubViews];
- }
+ [self positionSubViews];
+ }
}
//--------------------------------------------------------------------------------------------------
@@ -2076,17 +1896,15 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* Sets the edit's info bar status message. This call only has an effect if there is an info bar.
*/
-- (void) setStatusText: (NSString*) text
-{
- if (mInfoBar != nil)
- [mInfoBar notify: IBNStatusChanged message: text location: NSZeroPoint value: 0];
+- (void) setStatusText: (NSString *) text {
+ if (mInfoBar != nil)
+ [mInfoBar notify: IBNStatusChanged message: text location: NSZeroPoint value: 0];
}
//--------------------------------------------------------------------------------------------------
-- (NSRange) selectedRange
-{
- return [mContent selectedRange];
+- (NSRange) selectedRange {
+ return [mContent selectedRange];
}
//--------------------------------------------------------------------------------------------------
@@ -2096,22 +1914,20 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
* 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);
+- (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]])
- mBackend->InsertText(aString);
- else if ([aString isKindOfClass:[NSAttributedString class]])
- mBackend->InsertText([aString string]);
+- (void) insertText: (id) aString {
+ if ([aString isKindOfClass: [NSString class]])
+ mBackend->InsertText(aString);
+ else if ([aString isKindOfClass: [NSAttributedString class]])
+ mBackend->InsertText([aString string]);
}
//--------------------------------------------------------------------------------------------------
@@ -2119,18 +1935,17 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
/**
* For backwards compatibility.
*/
-- (BOOL) findAndHighlightText: (NSString*) searchText
- matchCase: (BOOL) matchCase
- wholeWord: (BOOL) wholeWord
- scrollTo: (BOOL) scrollTo
- wrap: (BOOL) wrap
-{
- return [self findAndHighlightText: searchText
- matchCase: matchCase
- wholeWord: wholeWord
- scrollTo: scrollTo
- wrap: wrap
- backwards: NO];
+- (BOOL) findAndHighlightText: (NSString *) searchText
+ matchCase: (BOOL) matchCase
+ wholeWord: (BOOL) wholeWord
+ scrollTo: (BOOL) scrollTo
+ wrap: (BOOL) wrap {
+ return [self findAndHighlightText: searchText
+ matchCase: matchCase
+ wholeWord: wholeWord
+ scrollTo: scrollTo
+ wrap: wrap
+ backwards: NO];
}
//--------------------------------------------------------------------------------------------------
@@ -2140,82 +1955,73 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
*
* @result YES if something was found, NO otherwise.
*/
-- (BOOL) findAndHighlightText: (NSString*) searchText
- matchCase: (BOOL) matchCase
- wholeWord: (BOOL) wholeWord
- scrollTo: (BOOL) scrollTo
- wrap: (BOOL) wrap
- backwards: (BOOL) backwards
-{
- int searchFlags= 0;
- if (matchCase)
- searchFlags |= SCFIND_MATCHCASE;
- if (wholeWord)
- searchFlags |= SCFIND_WHOLEWORD;
-
- long selectionStart = [self getGeneralProperty: SCI_GETSELECTIONSTART parameter: 0];
- long selectionEnd = [self getGeneralProperty: SCI_GETSELECTIONEND parameter: 0];
-
- // Sets the start point for the coming search to the beginning of the current selection.
- // For forward searches we have therefore to set the selection start to the current selection end
- // for proper incremental search. This does not harm as we either get a new selection if something
- // is found or the previous selection is restored.
- if (!backwards)
- [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: selectionEnd];
- [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
- sptr_t result;
- const char* textToSearch = searchText.UTF8String;
-
- // The following call will also set the selection if something was found.
- if (backwards)
- {
- result = [ScintillaView directCall: self
- message: SCI_SEARCHPREV
- wParam: searchFlags
- lParam: (sptr_t) textToSearch];
- if (result < 0 && wrap)
- {
- // Try again from the end of the document if nothing could be found so far and
- // wrapped search is set.
- [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: [self getGeneralProperty: SCI_GETTEXTLENGTH parameter: 0]];
- [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
- result = [ScintillaView directCall: self
- message: SCI_SEARCHNEXT
- wParam: searchFlags
- lParam: (sptr_t) textToSearch];
- }
- }
- else
- {
- result = [ScintillaView directCall: self
- message: SCI_SEARCHNEXT
- wParam: searchFlags
- lParam: (sptr_t) textToSearch];
- if (result < 0 && wrap)
- {
- // Try again from the start of the document if nothing could be found so far and
- // wrapped search is set.
- [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: 0];
- [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
- result = [ScintillaView directCall: self
- message: SCI_SEARCHNEXT
- wParam: searchFlags
- lParam: (sptr_t) textToSearch];
- }
- }
-
- if (result >= 0)
- {
- if (scrollTo)
- [self setGeneralProperty: SCI_SCROLLCARET value: 0];
- }
- else
- {
- // Restore the former selection if we did not find anything.
- [self setGeneralProperty: SCI_SETSELECTIONSTART value: selectionStart];
- [self setGeneralProperty: SCI_SETSELECTIONEND value: selectionEnd];
- }
- return (result >= 0) ? YES : NO;
+- (BOOL) findAndHighlightText: (NSString *) searchText
+ matchCase: (BOOL) matchCase
+ wholeWord: (BOOL) wholeWord
+ scrollTo: (BOOL) scrollTo
+ wrap: (BOOL) wrap
+ backwards: (BOOL) backwards {
+ int searchFlags= 0;
+ if (matchCase)
+ searchFlags |= SCFIND_MATCHCASE;
+ if (wholeWord)
+ searchFlags |= SCFIND_WHOLEWORD;
+
+ long selectionStart = [self getGeneralProperty: SCI_GETSELECTIONSTART parameter: 0];
+ long selectionEnd = [self getGeneralProperty: SCI_GETSELECTIONEND parameter: 0];
+
+ // Sets the start point for the coming search to the beginning of the current selection.
+ // For forward searches we have therefore to set the selection start to the current selection end
+ // for proper incremental search. This does not harm as we either get a new selection if something
+ // is found or the previous selection is restored.
+ if (!backwards)
+ [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: selectionEnd];
+ [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
+ sptr_t result;
+ const char *textToSearch = searchText.UTF8String;
+
+ // The following call will also set the selection if something was found.
+ if (backwards) {
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHPREV
+ wParam: searchFlags
+ lParam: (sptr_t) textToSearch];
+ if (result < 0 && wrap) {
+ // Try again from the end of the document if nothing could be found so far and
+ // wrapped search is set.
+ [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: [self getGeneralProperty: SCI_GETTEXTLENGTH parameter: 0]];
+ [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHNEXT
+ wParam: searchFlags
+ lParam: (sptr_t) textToSearch];
+ }
+ } else {
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHNEXT
+ wParam: searchFlags
+ lParam: (sptr_t) textToSearch];
+ if (result < 0 && wrap) {
+ // Try again from the start of the document if nothing could be found so far and
+ // wrapped search is set.
+ [self getGeneralProperty: SCI_SETSELECTIONSTART parameter: 0];
+ [self setGeneralProperty: SCI_SEARCHANCHOR value: 0];
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHNEXT
+ wParam: searchFlags
+ lParam: (sptr_t) textToSearch];
+ }
+ }
+
+ if (result >= 0) {
+ if (scrollTo)
+ [self setGeneralProperty: SCI_SCROLLCARET value: 0];
+ } else {
+ // Restore the former selection if we did not find anything.
+ [self setGeneralProperty: SCI_SETSELECTIONSTART value: selectionStart];
+ [self setGeneralProperty: SCI_SETSELECTIONEND value: selectionEnd];
+ }
+ return (result >= 0) ? YES : NO;
}
//--------------------------------------------------------------------------------------------------
@@ -2225,108 +2031,100 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context
*
* @result Number of entries replaced, 0 if none.
*/
-- (int) findAndReplaceText: (NSString*) searchText
- byText: (NSString*) newText
- matchCase: (BOOL) matchCase
- wholeWord: (BOOL) wholeWord
- doAll: (BOOL) doAll
-{
- // The current position is where we start searching for single occurrences. Otherwise we start at
- // the beginning of the document.
- long startPosition;
- if (doAll)
- startPosition = 0; // Start at the beginning of the text if we replace all occurrences.
- else
- // For a single replacement we start at the current caret position.
- startPosition = [self getGeneralProperty: SCI_GETCURRENTPOS];
- long endPosition = [self getGeneralProperty: SCI_GETTEXTLENGTH];
-
- int searchFlags= 0;
- if (matchCase)
- searchFlags |= SCFIND_MATCHCASE;
- if (wholeWord)
- searchFlags |= SCFIND_WHOLEWORD;
- [self setGeneralProperty: SCI_SETSEARCHFLAGS value: searchFlags];
- [self setGeneralProperty: SCI_SETTARGETSTART value: startPosition];
- [self setGeneralProperty: SCI_SETTARGETEND value: endPosition];
-
- const char* textToSearch = searchText.UTF8String;
- long sourceLength = strlen(textToSearch); // Length in bytes.
- const char* replacement = newText.UTF8String;
- long targetLength = strlen(replacement); // Length in bytes.
- sptr_t result;
-
- int replaceCount = 0;
- if (doAll)
- {
- while (true)
- {
- result = [ScintillaView directCall: self
- message: SCI_SEARCHINTARGET
- wParam: sourceLength
- lParam: (sptr_t) textToSearch];
- if (result < 0)
- break;
-
- replaceCount++;
- [ScintillaView directCall: self
- message: SCI_REPLACETARGET
- wParam: targetLength
- lParam: (sptr_t) replacement];
-
- // The replacement changes the target range to the replaced text. Continue after that till the end.
- // The text length might be changed by the replacement so make sure the target end is the actual
- // text end.
- [self setGeneralProperty: SCI_SETTARGETSTART value: [self getGeneralProperty: SCI_GETTARGETEND]];
- [self setGeneralProperty: SCI_SETTARGETEND value: [self getGeneralProperty: SCI_GETTEXTLENGTH]];
- }
- }
- else
- {
- result = [ScintillaView directCall: self
- message: SCI_SEARCHINTARGET
- wParam: sourceLength
- lParam: (sptr_t) textToSearch];
- replaceCount = (result < 0) ? 0 : 1;
-
- if (replaceCount > 0)
- {
- [ScintillaView directCall: self
- message: SCI_REPLACETARGET
- wParam: targetLength
- lParam: (sptr_t) replacement];
-
- // For a single replace we set the new selection to the replaced text.
- [self setGeneralProperty: SCI_SETSELECTIONSTART value: [self getGeneralProperty: SCI_GETTARGETSTART]];
- [self setGeneralProperty: SCI_SETSELECTIONEND value: [self getGeneralProperty: SCI_GETTARGETEND]];
- }
- }
-
- return replaceCount;
-}
-
-//--------------------------------------------------------------------------------------------------
-
-- (void) setFontName: (NSString*) font
- size: (int) size
- bold: (BOOL) bold
- italic: (BOOL) italic
-{
- for (int i = 0; i < 128; i++)
- {
- [self setGeneralProperty: SCI_STYLESETFONT
- parameter: i
- value: (sptr_t)font.UTF8String];
- [self setGeneralProperty: SCI_STYLESETSIZE
- parameter: i
- value: size];
- [self setGeneralProperty: SCI_STYLESETBOLD
- parameter: i
- value: bold];
- [self setGeneralProperty: SCI_STYLESETITALIC
- parameter: i
- value: italic];
- }
+- (int) findAndReplaceText: (NSString *) searchText
+ byText: (NSString *) newText
+ matchCase: (BOOL) matchCase
+ wholeWord: (BOOL) wholeWord
+ doAll: (BOOL) doAll {
+ // The current position is where we start searching for single occurrences. Otherwise we start at
+ // the beginning of the document.
+ long startPosition;
+ if (doAll)
+ startPosition = 0; // Start at the beginning of the text if we replace all occurrences.
+ else
+ // For a single replacement we start at the current caret position.
+ startPosition = [self getGeneralProperty: SCI_GETCURRENTPOS];
+ long endPosition = [self getGeneralProperty: SCI_GETTEXTLENGTH];
+
+ int searchFlags= 0;
+ if (matchCase)
+ searchFlags |= SCFIND_MATCHCASE;
+ if (wholeWord)
+ searchFlags |= SCFIND_WHOLEWORD;
+ [self setGeneralProperty: SCI_SETSEARCHFLAGS value: searchFlags];
+ [self setGeneralProperty: SCI_SETTARGETSTART value: startPosition];
+ [self setGeneralProperty: SCI_SETTARGETEND value: endPosition];
+
+ const char *textToSearch = searchText.UTF8String;
+ long sourceLength = strlen(textToSearch); // Length in bytes.
+ const char *replacement = newText.UTF8String;
+ long targetLength = strlen(replacement); // Length in bytes.
+ sptr_t result;
+
+ int replaceCount = 0;
+ if (doAll) {
+ while (true) {
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHINTARGET
+ wParam: sourceLength
+ lParam: (sptr_t) textToSearch];
+ if (result < 0)
+ break;
+
+ replaceCount++;
+ [ScintillaView directCall: self
+ message: SCI_REPLACETARGET
+ wParam: targetLength
+ lParam: (sptr_t) replacement];
+
+ // The replacement changes the target range to the replaced text. Continue after that till the end.
+ // The text length might be changed by the replacement so make sure the target end is the actual
+ // text end.
+ [self setGeneralProperty: SCI_SETTARGETSTART value: [self getGeneralProperty: SCI_GETTARGETEND]];
+ [self setGeneralProperty: SCI_SETTARGETEND value: [self getGeneralProperty: SCI_GETTEXTLENGTH]];
+ }
+ } else {
+ result = [ScintillaView directCall: self
+ message: SCI_SEARCHINTARGET
+ wParam: sourceLength
+ lParam: (sptr_t) textToSearch];
+ replaceCount = (result < 0) ? 0 : 1;
+
+ if (replaceCount > 0) {
+ [ScintillaView directCall: self
+ message: SCI_REPLACETARGET
+ wParam: targetLength
+ lParam: (sptr_t) replacement];
+
+ // For a single replace we set the new selection to the replaced text.
+ [self setGeneralProperty: SCI_SETSELECTIONSTART value: [self getGeneralProperty: SCI_GETTARGETSTART]];
+ [self setGeneralProperty: SCI_SETSELECTIONEND value: [self getGeneralProperty: SCI_GETTARGETEND]];
+ }
+ }
+
+ return replaceCount;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+- (void) setFontName: (NSString *) font
+ size: (int) size
+ bold: (BOOL) bold
+ italic: (BOOL) italic {
+ for (int i = 0; i < 128; i++) {
+ [self setGeneralProperty: SCI_STYLESETFONT
+ parameter: i
+ value: (sptr_t)font.UTF8String];
+ [self setGeneralProperty: SCI_STYLESETSIZE
+ parameter: i
+ value: size];
+ [self setGeneralProperty: SCI_STYLESETBOLD
+ parameter: i
+ value: bold];
+ [self setGeneralProperty: SCI_STYLESETITALIC
+ parameter: i
+ value: italic];
+ }
}
//--------------------------------------------------------------------------------------------------