Rev 6128 | Rev 6238 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** R.app : a Cocoa front end to: "R A Computer Language for Statistical Data Analysis"** R.app Copyright notes:* Copyright (C) 2004-12 The R Foundation* written by Stefano M. Iacus and Simon Urbanek*** R Copyright notes:* Copyright (C) 1995-1996 Robert Gentleman and Ross Ihaka* Copyright (C) 1998-2001 The R Development Core Team* Copyright (C) 2002-2004 The R Foundation** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** A copy of the GNU General Public License is available via WWW at* http://www.gnu.org/copyleft/gpl.html. You can also obtain it by* writing to the Free Software Foundation, Inc., 59 Temple Place,* Suite 330, Boston, MA 02111-1307 USA.** RScriptEditorLayoutManager.m** Created by Hans-J. Bibiko on 01/03/2012.**/#import "RScriptEditorLayoutManager.h"#import "RScriptEditorTypeSetter.h"#import "RScriptEditorGlyphGenerator.h"#import "RScriptEditorTextStorage.h"#import "PreferenceKeys.h"@implementation RScriptEditorLayoutManager- (id)init{self = [super init];if (nil == self) return nil;// Setup LineFoldingTypesetterRScriptEditorTypeSetter *typesetter = [[RScriptEditorTypeSetter alloc] init];[self setTypesetter:typesetter];[typesetter release];// Setup LineFoldingGlyphGeneratorRScriptEditorGlyphGenerator *glyphGenerator = [[RScriptEditorGlyphGenerator alloc] init];[self setGlyphGenerator:glyphGenerator];[glyphGenerator release];[self setBackgroundLayoutEnabled:YES];return self;}- (void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(NSPoint)origin{// <SPEED>NSTextStorage *textStorage = [self textStorage];[(RScriptEditorTextStorage *)textStorage setLineFoldingEnabled:YES];[super drawGlyphsForGlyphRange:glyphsToShow atPoint:origin];[(RScriptEditorTextStorage *)textStorage setLineFoldingEnabled:NO];}- (void)textStorage:(NSTextStorage *)str edited:(NSUInteger)editedMask range:(NSRange)newCharRange changeInLength:(NSInteger)delta invalidatedRange:(NSRange)invalidatedCharRange{NSUInteger length = [str length];NSNumber *value;NSRange effectiveRange, range;// it's at the end. check if the last char is in foldingAttributeNameif ((invalidatedCharRange.location == length) && (invalidatedCharRange.location != 0)) {value = [str attribute:foldingAttributeName atIndex:invalidatedCharRange.location - 1 effectiveRange:&effectiveRange];if (value && [value boolValue]) invalidatedCharRange = NSUnionRange(invalidatedCharRange, effectiveRange);}if (invalidatedCharRange.location < length) {NSString *string = [str string];NSUInteger start, end;if (delta > 0) {NSUInteger contentsEnd;[string getParagraphStart:NULL end:&end contentsEnd:&contentsEnd forRange:newCharRange];if ((contentsEnd != end) && (invalidatedCharRange.location > 0)&& (NSMaxRange(newCharRange) == end)) {// there was para sep insertion. extend to both sidesif (newCharRange.location <= invalidatedCharRange.location) {invalidatedCharRange.length = (NSMaxRange(invalidatedCharRange) - (newCharRange.location - 1));invalidatedCharRange.location = (newCharRange.location - 1);}if ((end < length) && (NSMaxRange(invalidatedCharRange) <= end)) {invalidatedCharRange.length = ((end + 1) - invalidatedCharRange.location);}}}range = invalidatedCharRange;while ((range.location > 0) || (NSMaxRange(range) < length)) {[string getParagraphStart:&start end:&end contentsEnd:NULL forRange:range];range.location = start;range.length = (end - start);// Extend backwardvalue = [str attribute:foldingAttributeName atIndex:range.location longestEffectiveRange:&effectiveRange inRange:NSMakeRange(0, range.location + 1)];if (value && [value boolValue] && (effectiveRange.location < range.location)) {range.length += (range.location - effectiveRange.location);range.location = effectiveRange.location;}// Extend forwardif (NSMaxRange(range) < length) {value = [str attribute:foldingAttributeName atIndex:NSMaxRange(range) longestEffectiveRange:&effectiveRange inRange:NSMakeRange(NSMaxRange(range), length - NSMaxRange(range))];if (value && [value boolValue] && (NSMaxRange(effectiveRange) > NSMaxRange(range))) {range.length = NSMaxRange(effectiveRange) - range.location;}}if (NSEqualRanges(range, invalidatedCharRange)) break;invalidatedCharRange = range;}}[super textStorage:str edited:editedMask range:newCharRange changeInLength:delta invalidatedRange:invalidatedCharRange];}@end