Okay, I think I have this kind of sorted (courtesy of this source and, of
course, Google) - so if anyone else needs to do this in the future, they can
do it with this code:

To save position:

NSPoint containerOrigin = [textViewLarge textContainerOrigin];
NSRect visibleRect = [textViewLarge visibleRect];
visibleRect.origin.x -= containerOrigin.x; // convert from view coordinates
to container coordinates
visibleRect.origin.y -= containerOrigin.y;
NSRange visibleGlyphs = [[textViewLarge layoutManager]
glyphRangeForBoundingRect:visibleRect

inTextContainer:[textViewLarge textContainer]];

return visibleGlyphs;


To retrieve position:

[textViewLarge scrollRangeToVisible:scrollRange];


In these 'examples', of course, the NSTextView being considered is called
textViewLarge.

I do have one proviso though - and that is that this isn't perfect.  If you
can guarantee that your NSTextView will always be the same size (x&y) and
that the size (or font) of the text will never change, then this should work
without problems.  If, however, you cannot guarantee those things then it'll
be a little unreliable.  Unreliable isn't good, but I don't have any better
ideas so it'll have to do.  After all, a bookmark within a few pages of the
page you actually want marking is better than no bookmark at all.

On Fri, Dec 4, 2009 at 6:02 PM, Douglas Davidson <[email protected]> wrote:

>
> On Dec 4, 2009, at 9:30 AM, Pascal Harris wrote:
>
>  I am writing an application which, amongst other things, can be used to
>> read text files.  These text files are rather long (could be more than 1MB),
>> which isn't convenient for anyone to read in one sitting.  The text files
>> are not editable.  I would like to be able to save the position in the text
>> file so that a reader can come back to file at a later time and not have to
>> hunt for the last sentence that they read.
>>
>> My research shows that I can do half of what I need using NSRange - using
>> scrollRangeToVisible it seems that I can scroll to a given range (allowing
>> the reader to resume where they left off).  Sadly, I can't work out how I
>> can save a range without the reader selecting text in the window first
>> (hardly user friendly!).  I need this to work invisibly - i.e. the user
>> closes the window, or the app, and when the window is reopened Presto!  the
>> window contains the same view of the text as it did previously.
>>
>
> If I understand correctly, what you want to be able to determine is the
> range of text that is currently visible.  This can be a bit tricky, since
> depending on the arrangement of text, the visible text might not be a single
> contiguous range in the document, but one way to do this is to get the text
> view's visibleRect, convert it into container coordinates (by subtracting
> the textContainerOrigin), ask the layout manager for
> glyphRangeForBoundingRect:inTextContainer:, and convert the resulting glyph
> range to a character range.
>
> Douglas Davidson
>
>
_______________________________________________

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