Hi,

Looking at this again, would NSLayoutManager's

-textStorage:edited:range:changeInLength:invalidatedRange:

method be a good candidate for overriding to add temporary attributes? The text 
storage calls this whenever it's edited and provides it with the new range of 
characters. So it seems that I could add any temporary attributes to the range 
that gets passed in here, checking that changeInLength > 0.

Or, what if in the -addAttribute:..., -setAttributes:... and 
removeAttribute:... methods of my NSTextStorage, I called through to all of the 
text storage's layout managers to ask them to add the temporary attribute if 
necessary, after -edited:range:changeInLength: gets called?

Many thanks again!

All the best,
Keith

--- On Thu, 10/1/09, Martin Wierschin <mar...@nisus.com> wrote:

> From: Martin Wierschin <mar...@nisus.com>
> Subject: Re: NSLayoutManager and best override point for temporary attributes
> To: "Keith Blount" <keithblo...@yahoo.com>
> Cc: cocoa-dev@lists.apple.com
> Date: Thursday, October 1, 2009, 1:50 AM
> Hi Keith,
> 
> > I have certain custom text attributes that are used in
> my NSTextStorage to which I would like to add temporary
> attributes via the NSLayoutManager.
> 
> What version of OSX are you testing under? Under Leopard
> there's a bug in -[NSLayoutManager
> temporaryAttribute:atCharacterIndex:longestEffectiveRange:inRange:]
> that calculates effective ranges that are too short. For
> specific test cases this caused big inefficiencies in the
> text system. I believe this bug is fixed in Snow Leopard.
> 
> > more recently I have taken to overriding
> NSLayoutManager's
> -temporaryAttributesAtCharacterIndex:effectiveRange:
> 
> If this is too slow, then I'd look to using some kind of
> cache for your calculations. But really, NSLayoutManager's
> temporary attributes are already a cache; one likely to be
> specifically designed for high performance index/run access.
> I think your original idea of setting temporary attributes
> whenever text changes would be the most efficient.
> 
> Perhaps you're recalculating too much, too often? I don't
> know the access patterns for temporary attributes, but I
> would guess they are only queried when associated text is
> displayed on screen. If that's the case, you could fix them
> up lazily, eg: whenever text changes just note down that the
> attributes are dirty in that range. Your temporary attribute
> methods in your NSLayoutManager subclass can then ensure
> that temporary attributes are not dirty before they are
> returned.
> 
> If none of that is efficient enough, you could rig up a
> NSTextStorage subclass that has two sets of attributes: one
> set for private use and another derived set which only the
> layout system sees.
> 
> Hopefully some of that helps,
> 
> ~Martin
> 
> 


      
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to