まずはドキュメントを読む

Pasteboard Programming Guideによれば、10.5以前と10.6以降でAPI群が違うらしい。
NicoLiveAlertは10.6以降用のコーディングなので、まずは10.6以降用のリファレンスを読み進める。

Property List Programming Guideへ寄り道

Pasteboard Programming Guideを読もうとすると、いきなり囲み記事でproperty listの知識が必要ですよ。知らない人は、Property List Programmingを先に読んで、理解してからにして下さい。と書かれているので、しょんぼりしながらこちらのドキュメントを読むことにする。
第一章のQuick Start for Property Listは、ファイルーメモリ間でのやりとりの具体例以外は大体解る。
第二章のAbout Property Listは、メジャーなNSXxx型のクラスが.plistでどういうエレメント名で示されるか?なので、まあ解る。
第三章のCreating Property Lists Programmaticallyで、プログラムの中で、何階層にも及ぶプロパティリストのプログラム内での作り方が解説されているようだ。
Cocoa BaseとCoreFoundation Baseでのプロパティリストの作り方をそれをファイルにシリアライズした例が示されていた。
第四章のUnderstanding XML Property Listsはテキスト化されたProperty Listの例が示されているだけ。
第五章のSerializing Property ListはCocoaとCore Foundationからメモリ内のXMLデータをシリアライズして、Property Listへ書き出すコーディングの例
第六章のReading and Writing Property List Dataは NSXMLのシリアライズとデシリアライズが解ってればOK
と、いうわけで、一応理解してることばっかりでした。
急がば回れが飛んだ回り道に(笑)

もう一回回り道(UTI)

今度は、Uniform Type Identifiers Overviewを読めと。 内容はすっ飛ばすけれど、Mac OSはUTIというルールで各ドキュメントの種類を判別しているぞ。
独自UTIを定義するには、アルファベットと"."、"-"しか使っちゃ駄目よ。
ってな事が書かれていた。

今度こそPasteboard

これも、順番に読んでいく。PasteboardはNSImageNSImageRepresentationの関係のように、1つのアイテムが複数のRepresentationを持つことが出来る。
これは、一つのアイテムに複数のプレゼンテーションを用意しておき、同じイメージのjpegイメージと、透過TIFF/PNGイメージや、スタイルドテキストとプレーンテキストを受け取るアプリケーションが受け取り可能なプレゼンテーションを選択できるようにするための仕組みらしい。
更に、ペーストボードにはアイテム1にイメージ、アイテム2にテキスト・・・の様に、複数の異なるUTIのアイテムを同時に格納できるようだ。
そのために、NSPasteboardに登録するためには、NSPasteboardWritingプロトコルを実装してなければならない。
とりあえず、標準でCocoaが提供しているクラスで、このプロトコルを実装しているクラスは、NSStringNSImageNSURLNSColorNSAttributedStringそして、NSPasteboardItemがあるらしい。
逆に言えば、これら以外のクラスをPasteboardに追加するには、カスタムUTIを定義した、NSPasteboardWritingプロトコルを実装したクラスを作らないと駄目って事だね。
Copying to a PasteboardとReading from Pasteboardは、先に述べた、NSPasteboardWritingプロトコルを実装したクラスをペーストボードに書き込んだり、ペーストボードから読み込んだりする方法が述べられているので、これは覚えておいた方が良い。

ペーストボードに対応したカスタムクラスを作るには?

そろそろ、本題が近くなってきたようだ。Custom Dataの章にカスタムデータをpasteboardに登録する方法が書かれている。
それによると、カスタムクラスをPasteboardに登録するには、NSPasteboardWritingプロトコルと、NSPasteboardReadingプロトコルの両方を実装するか、NSPasteboardItemクラスにデータを登録するかのいずれかが必要で、そのコーディングサンプルが記載されている。これは大事だ。しっかり覚えておこう。
NSPasteboardWriting/Readingプロトコルの基本は、自分がrepresentできる形式のUTIの配列を返す、受け取る事と、NSArchiverでデータをシリアライズして登録したり、NSUnarchiverでデータを、デシリアライズして復元したりすれば良いようだ。
具体的には、
NSPasteboardWritingプロトコルの実装は
pasteboardPropertyListForType:で、Type:で指定されたUTI形式のデータを返す(指定されたUTIを返せないときはnilを返す)メソッドを実装し、
writableTypesForPasteboard:で、そのカスタムクラスが返すことが出来るUTI形式の名前の配列を返すメソッドを実装する。
この2つは必ず実装する必要がある。
NSPasteboardReadingプロトコルの実装は
initWithPasteboardPropertyList:ofType:で、Pasteboardから受け取るデータのインスタンス変数を初期化するメソッドを実装する。
更に、何故ClassMethodになっているのか解らないけれど、
readableTypesForPasteboard:で、引数のPasteboardから読み出せるUTI形式名の配列を返すメソッドと
readingOptionsForType:pasteboard:で、引数のPasteboadから、引数のUTI形式を読み出すときのオプションを返すクラスメソッドも実装できる。
上記2つのクラスメソッドはrequiredでは無いようなので、どうしても必要で無ければ実装しなくても良さそうだ。
それ以外にも、NSPasteboardItemクラスを使ってPasteboradにデータを登録したり、読み出したりするサンプルがある。こっちも参考になる。
これは、NSPasteboardItemalloc, initして、setData:forType:NSArchverでシリアライズしたデータを、独自型UTI名と一緒に渡せば一つのPasteboardアイテムのできあがりなので、データーが複数のRepresentationを持たなければ、こっちの方が楽かもしれない。

複数アイテムをペーストボードに書き込む

画像データーを複数枚など、複数個のアイテムをPasteboardに書き込みたいケースは結構頻繁に現れると思う。
そういう時は、setData:forType:を順次繰り返しても、最新のデータでPasteboardが上書きされていくだけなので、配列を準備し、アイテムを配列に入れていく、これをwriteObjects:で一気に登録すればオッケーだ。これで複数個の画像や、複数個のファイル(名)など、をまとめて個別にPasteboadに登録できる。
Pasteboadから複数個のアイテムを逐次取り出したいときは、pasteboardItemsメソッドで、PasteboardItemのインスタンスの配列が取り出せるので、後はfor 文等で個別に処理していけばいい。

後回しにするけれど

次の章に、OS X 10.5でも動くようにコーディングするにはどうしたら良いか?が書かれているので、Charlestonの様な10.5サポートアプリケーションでカスタムクラスをコピー&ペーストする時に改めて読もうと思う。
大体こんな感じ。