Re: App-specific URLs and the pasteboard. Need help.
Re: App-specific URLs and the pasteboard. Need help.
- Subject: Re: App-specific URLs and the pasteboard. Need help.
- From: Duncan Champney <email@hidden>
- Date: Tue, 22 Jan 2008 15:44:52 -0500
Hmm. Curiouser and curiouser.
My app creates custom URLs to encode the settings for fractal plots.
Then, when the user clicks a link, my app launches, parses the
parameters out of the URL, and recreates the plot.
Based on Alastair's advice (copied below), my app now creates an
NSAttributedString and uses it to create RTF data, which I copy to the
clipboard. In general, it works well.
However, some of the URLs my program creates are really long. (the URL
encodes 20 or more parameters for every plot, plus 18 parameters for
each of an arbitrary number of color gradients).
The URL shows up as correct in the clipboard when I look at it using
the Clipboard viewer (thanks to Jonathon Mah for that suggestion!)
However, when I paste the URL into TextEdit or Mail, it gets truncated
at slightly less than 1000 characters. (The exact count seems to vary
by a few bytes, but seems to be around 988 to 992 characters for the
actual URL text.)
Is there a limitation on how big an URL can be in an RTF tag? These
long URLs work if my app copies them to the clipboard and then reads
them back from the clipboard, so I know they are well formatted.
Further, if the length of the URL is short enough, the clickable link
in TextEdit or mail works perfectly. It's only when the length of the
URL approaches 1000 characters that there's a problem.
Duncan
---
On Jan 19, 2008, at 7:59 AM, Duncan Champney wrote:
On Jan 18, 2008, at 11:05 AM, Alastair Houghton wrote:
On 18 Jan 2008, at 15:27, Duncan Champney wrote:
I build my URL string in the variable theURLString, then add it to
the general pasteboard using the following code:
theFW_URL = [NSURL URLWithString:theURLString];
[theFW_URL writeToPasteboard: thePasteBoard];
NSString* theURLName = [NSString stringWithFormat:
NSLocalizedString(@FW_URL_PREFIX ,nil), theDocumentName];
success = [thePasteBoard setString:theURLName forType:
NSStringPboardType];
Have you tried NSURLPboardType?
Or NSHTMLPboardType with HTML containing a link?
Or, for that matter, NSRTFPboardType, which I think you'll find can
hold links too; you can make RTF fairly easily from an
NSAttributedString, and if that string happened to contain a link
(hint: see NSLinkAttributeName), I think you'll get the behaviour
you want.
At present, I think you're relying on the end application to parse
your text into a link, which won't work in many cases.
Kind regards,
Alastair.
--
http://alastairs-place.net
Alastair,
I was using NSURLPboardType, but I don't think I was using it
correctly.
Based on your advice, I tried using NSHTMLPboardType. That worked
better, but still not ideally.
As you say, NSRTFPboardType seems to work with the widest variety of
applications. What I do now is to write RTF to the pasteboard, and
also write some HTML as a string. The HTML string is useful for
posting links to websites. Here's the code I came up with:
NSArray* types = [NSArray arrayWithObjects: NSRTFPboardType,
NSStringPboardType, nil];
[thePasteBoard declareTypes:types owner: nil];
theFW_URL = [NSURL URLWithString:theURLString]; //theURLString
contains the text of the URL
[theFW_URL writeToPasteboard: thePasteBoard];
//Create string "Fractalworks plot <theDocumentName>
NSString* theURLName = [NSString stringWithFormat:
NSLocalizedString(@FW_URL_PREFIX ,nil), theDocumentName];
theFW_URL = [NSURL URLWithString:theURLString];
//Create an NSAttributedString to hold the RTF description
of the URL.
theStringRange.location = 0;
theStringRange.length = [theURLName length];
theAttributesDict = [NSDictionary dictionaryWithObject:
theFW_URL forKey: NSLinkAttributeName];
theRTF_string= [[NSAttributedString alloc] initWithString:
theURLName attributes:theAttributesDict];
NSData* the_RTF_data = [theRTF_string RTFFromRange:
theStringRange documentAttributes: nil];
success = [thePasteBoard setData:the_RTF_data forType:
NSRTFPboardType];
//Also write a string with HTML text into the pasterboard,
for apps that can't deal with the RTF data.
theURLString = [NSString stringWithFormat: @"<u><a href=\"%@
\">%@</a></u>", theURLString, theURLName];
success = [thePasteBoard setString:theURLString forType:
NSStringPboardType];
Older Carbon apps like Appleworks don't seem to work with this code,
though. They take the "vanilla" text from the RTF, rather than using
the NSStringPboardType like you'd expect.
I have a preference to "write application URLS as text" and in that
case, I write just the NSStringPboardType data containing the URL to
the pasteboard. (That code isn't shown for the sake of brevity.)
Thanks again for your help.
Duncan
=
_______________________________________________
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