• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
NSTextStorage subclassing questions
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

NSTextStorage subclassing questions


  • Subject: NSTextStorage subclassing questions
  • From: Jesse Grosjean <email@hidden>
  • Date: Mon, 24 Mar 2008 20:05:14 -0400

I have a basic NSTextStorage subclass that I've included at the end of this email. I have two questions. First what is the proper way to implement syntax highlighting in an NSTextStorage subclass. (I want to do it in the subclass, not in an NSTextStorage delegate). The basic pattern that I'm using is this:

- (void)processEditing {
	if ([self editedMask] & NSTextStorageEditedCharacters) {
		[self beginEditing];
		// perform syntax highlighting
		[self endEditing];
	}
	[super processEditing];
}

Is that the correct way to do it? Until recently I was calling [super processEditing] at the beginning of the method, but that seemed to cause problems if I added NSParagraphStyle attributes during the syntax highlighting while setAllowsNonContiguousLayout was turned on in the layout manager. That problem made me wonder if there was anything else subtle that I was missing? Is it neccessary to call [self beginEditing], [self endEditing] around the changes in this case? Any other tips for keeping things as fast and correct as possible?

Second in profiling my app most of the processingEditing time is spent in the fixAttributesInRange method? Generally I'm careful about only updating highlighting for regions of the text that need it, but often all the text in the view will get completely replaced with new text so there's not really a way to get around doing a full re-highlight sometimes, and that's when fixAttributesInRange starts to get a little noticeable.

Because of that I've been looking at NSTextStorages - (BOOL)fixesAttributesLazily method, but I can't really figure out how it works and how to support it. Is there any example code (or hints) on how to make a NSTextStorage subclass fix attributes lazily. I've tried turning it one, and adding [self ensureAttributesAreFixedInRange:NSMakeRange(index, 0)] to the attributesAtIndex:effectiveRange: method, but my app soon crashes after doing that.

Thanks,
Jesse

@implementation TPParagraphAliasStorage

#pragma mark Init

- (id)init {
	if (self = [super init]) {
		backingStore = [[NSMutableAttributedString alloc] init];
	}
	return self;
}

- (void)processEditing {
	if ([self editedMask] & NSTextStorageEditedCharacters) {
		[self beginEditing];
		// perform syntax highlighting
		[self endEditing];
	}
	[super processEditing];
}

- (NSString *)string {
	return [backingStore string];
}

- (NSDictionary *)attributesAtIndex:(NSUInteger)index effectiveRange: (NSRangePointer)aRange {
return [backingStore attributesAtIndex:index effectiveRange:aRange];
}


- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)aRange {
[backingStore setAttributes:attributes range:aRange];
[self edited:NSTextStorageEditedAttributes range:aRange changeInLength:0];
}


- (void)addAttribute:(NSString *)name value:(id)value range: (NSRange)aRange {
[backingStore addAttribute:name value:value range:aRange]; // cover bug listed in cocoadev
[self edited:NSTextStorageEditedAttributes range:aRange changeInLength:0];
}


- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString {
NSUInteger length = [aString length];
NSInteger changeInLength = length - aRange.length;
[backingStore replaceCharactersInRange:aRange withString:aString];
[self edited:NSTextStorageEditedCharacters range:aRange changeInLength:changeInLength];
}


@end
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Prev by Date: Re: NSLocale: "<city name> <zip code>" vs. "<zip code> <city name>"
  • Next by Date: Re: Communications between multiple NIB's
  • Previous by thread: Display artifacts in large (1600 row) table view
  • Next by thread: Source list using bindings?
  • Index(es):
    • Date
    • Thread