Re: NSLayoutManager and best override point for temporary attributes
Re: NSLayoutManager and best override point for temporary attributes
- Subject: Re: NSLayoutManager and best override point for temporary attributes
- From: Keith Blount <email@hidden>
- Date: Fri, 2 Oct 2009 07:04:02 -0700 (PDT)
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@hidden> wrote:
> From: Martin Wierschin <email@hidden>
> Subject: Re: NSLayoutManager and best override point for temporary attributes
> To: "Keith Blount" <email@hidden>
> Cc: email@hidden
> 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@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