On May 26, 2012, at 2:42 AM, Peter wrote:

> One more half-baked technology from Apple (as is the new pasteboard API in 
> its current implementation even if it looks very elegant on the surface - I 
> guess quite a good deal of people will be bitten by it if it becomes 
> compulsory, since it prevents you from doing some simple things possible with 
> the current API; see my inquiry on this list a couple of weeks ago).

This led me to look up your earlier messages, quoted below:

On February 27, 2012, at 2:44 AM, Peter wrote:

> I am still very much puzzled by the issue I described below, so I still hope 
> to find a taker for it.
> 
> While the OS 10.5 API cleanly separated pasteboard types, the 10.6 API 
> converts NSURL data to strings and adds it to any existing string data - i.e. 
> when pasting the data into e.g. a text view in 10.6 I get
> 
> file://localhost/Users/peterjhartmann/Desktop/Eigene Bilder/jan.jpg
> file://localhost/Users/peterjhartmann/Desktop/Eigene Bilder/Nob.jpg
> jan
> Nob
> 
> instead of
> 
> jan
> Nob
> 
> which is the result using the 10.5 API. As described, this happens no matter 
> wether I use writeObjects: or setString: and no matter wether I write the 
> URLs before or after the strings.
> 
> I consider this to be a bug. Am I wrong? If so, what am I doing wrong?
> 
> Does anybody use the 10.6 pasteboard API? Judging from my web searches it 
> seems that almost nobody does.
> 
> One member contacted my privately stating ...
> 
> > Not sure if you've fixed this or had any other replies, but in reading it 
> > through, I notice you're not declaring the pasteboard type ([pb 
> > declareTypes:...]) within this block.  Does this explain the symptoms?
> 
> but declareTypes belongs to the old API. Mixing this with the new API is 
> discouraged on p. 33 of Apple's PasteboardGuide106.pdf.
> 
> I'd be very happy about any pointers into the right direction.
> 
> My original post is here:
> 
> Am 19.02.2012 um 21:24 schrieb Peter:
> 
> > I am using the following code:
> >
> >      NSPasteboard *pb = [NSPasteboard generalPasteboard];
> >
> >      if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_5) {
> >         //linesArray contains file paths as NSStrings
> >         //namesArray contains file names as NSStrings
> >         [pb declareTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, 
> > NSStringPboardType, nil] owner:nil];
> >         [pb setPropertyList:linesArray forType:NSFilenamesPboardType];
> >         [pb setString:[namesArray componentsJoinedByString:@"\n"] 
> > forType:NSStringPboardType];
> >      }
> >      else { // >= 10.6
> >         //linesArray contains NSURLs
> >         //namesArray contains file names as NSStrings
> >         [pb clearContents];
> >         [pb setString:[namesArray componentsJoinedByString:@"\n"] 
> > forType:NSPasteboardTypeString];
> >       //[pb writeObjects:namesArray];
> >         [pb writeObjects:linesArray]; // write the URLs
> >     }

I think you are failing to understand the nature of the change introduced with 
10.6.  Prior to 10.6, there was always a single pasteboard item.  It could have 
multiple types/representations.

Since it is clearly sometimes desirable to have multiple things on the 
pasteboard, there was a hack.  Some of the types were "plural", like 
NSFilenamesPboardType.  So, with your 10.5 code path, there's a single item.  
One of its types/representations is an array of filenames, the other is a 
string (which you've constructed by joining multiple strings with newlines).

From 10.6, the pasteboard supports multiple items.  _Each_ item can have 
multiple types/representations.  Because of that, it's no longer necessary to 
use plural types like NSFilenamesPboardType.  You can just add an array of 
NSURLs.

However, if you add NSURLs and you add strings, you have established that _all_ 
of those items are on the pasteboard _individually_.  Given how you've done it, 
the URLs and the strings are not alternative representations of the same items, 
they are all separate items on the pasteboard.  It is not a bug for TextEdit to 
paste them all; it would be a bug for it to not do so.

If what you want is a number of items, where each item has two 
types/representations – a URL or a string – then that's what you have to put on 
the pasteboard.  Create an NSPasteboardItem for each item.  For each item, for 
each type/representation, set the data.  So, if an item is supposed to have an 
NSURL representation and a string representation, do something like:

    for (NSString* type in [someURL writableTypesForPasteboard:pb])
        [item setPropertyList:[someURL pasteboardPropertyListForType:type] 
forType:type];
    [item setString:someString forType:NSPasteboardTypeString];

Put all of the pasteboard items constructed in this manner into an array and 
write that array to the pasteboard using -writeObject:. Then you will have set 
up the pasteboard in a manner that's analogous to what you were doing with the 
10.5 API.

Regards,
Ken


_______________________________________________

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

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

Reply via email to