| Line 144... |
Line 144... |
| 144 |
|
144 |
|
| 145 |
// disabled to get the current text range in textView safer
|
145 |
// disabled to get the current text range in textView safer
|
| 146 |
[[self layoutManager] setBackgroundLayoutEnabled:NO];
|
146 |
[[self layoutManager] setBackgroundLayoutEnabled:NO];
|
| 147 |
[[self layoutManager] replaceTextStorage:theTextStorage];
|
147 |
[[self layoutManager] replaceTextStorage:theTextStorage];
|
| 148 |
|
148 |
|
| 149 |
if(lineNumberingEnabled) {
|
- |
|
| 150 |
|
- |
|
| 151 |
SLog(@"RScriptEditorTextView: set up line numbering <%@>", self);
|
- |
|
| 152 |
|
- |
|
| 153 |
NoodleLineNumberView *theRulerView = [[NoodleLineNumberView alloc] initWithScrollView:scrollView];
|
- |
|
| 154 |
[scrollView setVerticalRulerView:theRulerView];
|
- |
|
| 155 |
[scrollView setHasHorizontalRuler:NO];
|
- |
|
| 156 |
[scrollView setHasVerticalRuler:YES];
|
- |
|
| 157 |
[scrollView setRulersVisible:YES];
|
- |
|
| 158 |
[theRulerView release];
|
- |
|
| 159 |
[self display];
|
- |
|
| 160 |
}
|
- |
|
| 161 |
|
- |
|
| 162 |
|
- |
|
| 163 |
isSyntaxHighlighting = NO;
|
149 |
isSyntaxHighlighting = NO;
|
| 164 |
|
150 |
|
| 165 |
if([prefs objectForKey:highlightCurrentLine] == nil) [prefs setBool:YES forKey:highlightCurrentLine];
|
151 |
if([prefs objectForKey:highlightCurrentLine] == nil) [prefs setBool:YES forKey:highlightCurrentLine];
|
| 166 |
if([prefs objectForKey:indentNewLines] == nil) [prefs setBool:YES forKey:indentNewLines];
|
152 |
if([prefs objectForKey:indentNewLines] == nil) [prefs setBool:YES forKey:indentNewLines];
|
| 167 |
|
153 |
|
| Line 510... |
Line 496... |
| 510 |
[self cut:nil];
|
496 |
[self cut:nil];
|
| 511 |
[self paste:nil];
|
497 |
[self paste:nil];
|
| 512 |
[[self undoManager] enableUndoRegistration];
|
498 |
[[self undoManager] enableUndoRegistration];
|
| 513 |
}
|
499 |
}
|
| 514 |
[[self textContainer] setHeightTracksTextView:NO];
|
500 |
[[self textContainer] setHeightTracksTextView:NO];
|
| - |
|
501 |
|
| 515 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
502 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
| 516 |
|
503 |
|
| 517 |
}
|
504 |
}
|
| 518 |
|
505 |
|
| 519 |
- (void)drawRect:(NSRect)rect
|
506 |
- (void)drawRect:(NSRect)rect
|
| Line 565... |
Line 552... |
| 565 |
// Cancel calling doSyntaxHighlighting
|
552 |
// Cancel calling doSyntaxHighlighting
|
| 566 |
[NSObject cancelPreviousPerformRequestsWithTarget:self
|
553 |
[NSObject cancelPreviousPerformRequestsWithTarget:self
|
| 567 |
selector:@selector(doSyntaxHighlighting)
|
554 |
selector:@selector(doSyntaxHighlighting)
|
| 568 |
object:nil];
|
555 |
object:nil];
|
| 569 |
|
556 |
|
| 570 |
[self performSelector:@selector(doSyntaxHighlighting) withObject:nil afterDelay:0.001f];
|
557 |
[self performSelector:@selector(doSyntaxHighlighting) withObject:nil afterDelay:0.01f];
|
| 571 |
|
558 |
|
| 572 |
// Cancel setting undo break point
|
559 |
// Cancel setting undo break point
|
| 573 |
[NSObject cancelPreviousPerformRequestsWithTarget:self
|
560 |
[NSObject cancelPreviousPerformRequestsWithTarget:self
|
| 574 |
selector:@selector(breakUndoCoalescing)
|
561 |
selector:@selector(breakUndoCoalescing)
|
| 575 |
object:nil];
|
562 |
object:nil];
|
| Line 950... |
Line 937... |
| 950 |
- (void)foldSelectedLines:(id)sender
|
937 |
- (void)foldSelectedLines:(id)sender
|
| 951 |
{
|
938 |
{
|
| 952 |
|
939 |
|
| 953 |
NSRange r = [self selectedRange];
|
940 |
NSRange r = [self selectedRange];
|
| 954 |
|
941 |
|
| - |
|
942 |
if(r.length < 4) return;
|
| - |
|
943 |
|
| - |
|
944 |
unichar s = [[self string] characterAtIndex:r.location];
|
| - |
|
945 |
unichar e = [[self string] characterAtIndex:NSMaxRange(r)-1];
|
| - |
|
946 |
|
| - |
|
947 |
BOOL wrapCheck = NO;
|
| - |
|
948 |
|
| - |
|
949 |
if(s == '{' && e == '}') {
|
| - |
|
950 |
r.location++;
|
| - |
|
951 |
r.length -= 2;
|
| - |
|
952 |
wrapCheck = YES;
|
| - |
|
953 |
} else if(s == '(' && e == ')') {
|
| - |
|
954 |
r.location++;
|
| - |
|
955 |
r.length -= 2;
|
| - |
|
956 |
wrapCheck = YES;
|
| - |
|
957 |
} else if(s == '[' && e == ']') {
|
| - |
|
958 |
r.location++;
|
| - |
|
959 |
r.length -= 2;
|
| - |
|
960 |
wrapCheck = YES;
|
| - |
|
961 |
}
|
| - |
|
962 |
|
| 955 |
if(!r.length) return;
|
963 |
if(!r.length) return;
|
| 956 |
|
964 |
|
| 957 |
if([[self string] characterAtIndex:NSMaxRange(r)-1] == '\n')
|
965 |
if(!wrapCheck && [[self string] characterAtIndex:NSMaxRange(r)-1] == '\n')
|
| 958 |
r.length--;
|
966 |
r.length--;
|
| 959 |
|
967 |
|
| 960 |
if(!r.length) return;
|
968 |
if(!r.length) return;
|
| 961 |
|
969 |
|
| - |
|
970 |
NSString *tooltip = nil;
|
| - |
|
971 |
if(r.length < 300)
|
| - |
|
972 |
tooltip = [[self string] substringWithRange:r];
|
| - |
|
973 |
else
|
| - |
|
974 |
tooltip = [[[self string] substringWithRange:NSMakeRange(r.location, 300)] stringByAppendingString:@"\n…"];
|
| - |
|
975 |
|
| 962 |
[theTextStorage beginEditing];
|
976 |
[theTextStorage beginEditing];
|
| 963 |
[theTextStorage addAttribute:foldingAttributeName value:[NSNumber numberWithBool:YES] range:r];
|
977 |
[theTextStorage addAttribute:foldingAttributeName value:[NSNumber numberWithBool:YES] range:r];
|
| - |
|
978 |
[theTextStorage addAttribute:NSCursorAttributeName value:[NSCursor arrowCursor] range:r];
|
| - |
|
979 |
[theTextStorage addAttribute:NSToolTipAttributeName value:tooltip range:r];
|
| 964 |
[theTextStorage endEditing];
|
980 |
[theTextStorage endEditing];
|
| 965 |
|
981 |
|
| 966 |
[self didChangeText];
|
982 |
[self didChangeText];
|
| 967 |
if(lineNumberingEnabled)
|
983 |
if(lineNumberingEnabled)
|
| 968 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
984 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
| Line 979... |
Line 995... |
| 979 |
NSRange range;
|
995 |
NSRange range;
|
| 980 |
NSNumber *value = [textStorage attribute:foldingAttributeName atIndex:charIndex longestEffectiveRange:&range inRange:NSMakeRange(0, [textStorage length])];
|
996 |
NSNumber *value = [textStorage attribute:foldingAttributeName atIndex:charIndex longestEffectiveRange:&range inRange:NSMakeRange(0, [textStorage length])];
|
| 981 |
|
997 |
|
| 982 |
if (value && [value boolValue] && [self shouldChangeTextInRange:range replacementString:nil]) {
|
998 |
if (value && [value boolValue] && [self shouldChangeTextInRange:range replacementString:nil]) {
|
| 983 |
[textStorage removeAttribute:foldingAttributeName range:range];
|
999 |
[textStorage removeAttribute:foldingAttributeName range:range];
|
| - |
|
1000 |
[textStorage removeAttribute:NSCursorAttributeName range:range];
|
| - |
|
1001 |
[textStorage removeAttribute:NSToolTipAttributeName range:range];
|
| 984 |
[self didChangeText];
|
1002 |
[self didChangeText];
|
| 985 |
[self setSelectedRange:NSMakeRange(NSMaxRange(range), 0)];
|
1003 |
[self setSelectedRange:NSMakeRange(NSMaxRange(range), 0)];
|
| 986 |
if(lineNumberingEnabled)
|
1004 |
if(lineNumberingEnabled)
|
| 987 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
1005 |
[[[self enclosingScrollView] verticalRulerView] performSelector:@selector(refresh) withObject:nil afterDelay:0.0f];
|
| 988 |
[self scrollRangeToVisible:[self selectedRange]];
|
1006 |
[self scrollRangeToVisible:[self selectedRange]];
|
| 989 |
return YES;
|
1007 |
return YES;
|
| 990 |
}
|
1008 |
}
|
| 991 |
return NO;
|
1009 |
return NO;
|
| 992 |
}
|
1010 |
}
|
| 993 |
|
1011 |
|
| - |
|
1012 |
- (void)mouseDown:(NSEvent *)event
|
| - |
|
1013 |
{
|
| - |
|
1014 |
|
| 994 |
// <TODO> enable for folding
|
1015 |
// <TODO> enable for folding
|
| 995 |
// - (void)mouseDown:(NSEvent *)event
|
1016 |
[super mouseDown:event];
|
| 996 |
// {
|
- |
|
| 997 |
//
|
1017 |
|
| 998 |
// if(![theTextStorage isKindOfClass:[RScriptEditorTextStorage class]]) [super mouseDown:event];
|
1018 |
// if(![theTextStorage isKindOfClass:[RScriptEditorTextStorage class]]) [super mouseDown:event];
|
| 999 |
//
|
1019 |
//
|
| 1000 |
// NSUInteger glyphIndex = [layoutManager glyphIndexForPoint:[self convertPointFromBase:[event locationInWindow]] inTextContainer:[self textContainer]];
|
- |
|
| 1001 |
// RScriptEditorLayoutManager *layoutManager = (RScriptEditorLayoutManager*)[self layoutManager];
|
1020 |
// RScriptEditorLayoutManager *layoutManager = (RScriptEditorLayoutManager*)[self layoutManager];
|
| - |
|
1021 |
// NSUInteger glyphIndex = [layoutManager glyphIndexForPoint:[self convertPointFromBase:[event locationInWindow]] inTextContainer:[self textContainer]];
|
| 1002 |
//
|
1022 |
//
|
| 1003 |
// [theTextStorage setLineFoldingEnabled:YES];
|
1023 |
// [theTextStorage setLineFoldingEnabled:YES];
|
| 1004 |
//
|
1024 |
//
|
| 1005 |
// // trigger unfolding if inside foldingAttachmentCell
|
1025 |
// // trigger unfolding if inside foldingAttachmentCell
|
| 1006 |
// if (glyphIndex < [layoutManager numberOfGlyphs]) {
|
1026 |
// if (glyphIndex < [layoutManager numberOfGlyphs]) {
|
| Line 1034... |
Line 1054... |
| 1034 |
//
|
1054 |
//
|
| 1035 |
// [theTextStorage setLineFoldingEnabled:NO];
|
1055 |
// [theTextStorage setLineFoldingEnabled:NO];
|
| 1036 |
//
|
1056 |
//
|
| 1037 |
// [super mouseDown:event];
|
1057 |
// [super mouseDown:event];
|
| 1038 |
// }
|
1058 |
// }
|
| - |
|
1059 |
//
|
| - |
|
1060 |
// - (void)setSelectedRanges:(NSArray *)ranges affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag
|
| - |
|
1061 |
// {
|
| - |
|
1062 |
//
|
| - |
|
1063 |
// if(!stillSelectingFlag) {
|
| - |
|
1064 |
//
|
| - |
|
1065 |
// if([ranges count] > 0) {
|
| - |
|
1066 |
//
|
| - |
|
1067 |
// // Adjust range for folded text chunks; additional checks will be made in
|
| - |
|
1068 |
// // the self's delegate [RDocumentWinCtrl:textViewDidChangeSelection:]
|
| - |
|
1069 |
//
|
| - |
|
1070 |
// NSRange range = [[ranges objectAtIndex:0] rangeValue];
|
| - |
|
1071 |
//
|
| - |
|
1072 |
// if(!range.length) {
|
| - |
|
1073 |
// [super setSelectedRanges:ranges affinity:affinity stillSelecting:stillSelectingFlag];
|
| - |
|
1074 |
// return;
|
| - |
|
1075 |
// }
|
| - |
|
1076 |
//
|
| - |
|
1077 |
// NSRange glyphRange = [[self layoutManager] glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
| - |
|
1078 |
//
|
| - |
|
1079 |
// if(glyphRange.location != range.location || glyphRange.length != range.length) {
|
| - |
|
1080 |
//
|
| - |
|
1081 |
// if([ranges count] == 2)
|
| - |
|
1082 |
// glyphRange.length += [[ranges objectAtIndex:1] rangeValue].length;
|
| - |
|
1083 |
//
|
| - |
|
1084 |
// SLog(@"RScriptEditorTextView:setSelectedRanges: adjust range via glyph range from %@ to %@", NSStringFromRange(range), NSStringFromRange(glyphRange));
|
| - |
|
1085 |
//
|
| - |
|
1086 |
// [super setSelectedRange:glyphRange];
|
| - |
|
1087 |
// return;
|
| - |
|
1088 |
//
|
| - |
|
1089 |
// }
|
| - |
|
1090 |
// }
|
| - |
|
1091 |
// }
|
| - |
|
1092 |
//
|
| - |
|
1093 |
// [super setSelectedRanges:ranges affinity:affinity stillSelecting:stillSelectingFlag];
|
| - |
|
1094 |
|
| - |
|
1095 |
}
|
| - |
|
1096 |
|
| 1039 |
|
1097 |
|
| 1040 |
- (void)setTypingAttributes:(NSDictionary *)attrs
|
1098 |
- (void)setTypingAttributes:(NSDictionary *)attrs
|
| 1041 |
{
|
1099 |
{
|
| 1042 |
// we don't want to store foldingAttributeName as a typing attribute
|
1100 |
// we don't want to store foldingAttributeName as a typing attribute
|
| 1043 |
if ([attrs objectForKey:foldingAttributeName]) {
|
1101 |
if ([attrs objectForKey:foldingAttributeName]) {
|