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 <[email protected]> wrote:

> From: Martin Wierschin <[email protected]>
> Subject: Re: NSLayoutManager and best override point for temporary attributes
> To: "Keith Blount" <[email protected]>
> Cc: [email protected]
> 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 ([email protected])

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 [email protected]

Reply via email to