iPalmMemo 1.2.0 をリリースしたので、ちょっと気分を変えて以前少しだけ書いた QuickLook の作成方法を書いてみます。ただ、適当な作成方法なので雰囲気を知るくらいです。
Apple のドキュメントに Quick Look Programming と言うのが有りますが、私には読むのは無理なので適当にソースを見ながら作成します。大体サンプルとして Sketch と言うのが難しすぎます。記述自体は少ないのですが、元の Sketch のソースが膨大だし、そんなのを引っ張ってこられても「なんのこってすか?」状態になります。
まぁ愚痴はほどほどにして、まず Xcode で新規プロジェクトを作成します。タイプは「Standard Apple Plug-ins」の「Quick Look Plug-in」を指定します。
1.Info.plist の編集
<key>LSItemContentTypes を探し、その下の <array> を変更します。Sketch では2行になってますが、何故かは分からないので私の場合1行だけです。今回は iPalmMemo のメモファイル内容を表示するので iPalmMemo の保存ファイルの UTI である jp.queuesoft.ipalmmemo.ipmemo としました。CFBundleIdentifier はプロジェクトの設定で識別子を入力すると設定されるのでここではそのままです。後のパラメータは良く分からないのでそのままです。
2.GeneratePreviewForURL(GeneratePreviewForURL.m) で個々のファイルを表示する処理を書きます
この関数にはファイルの場所とタイプが引数に有るので、それを使用して内容を読み込みます。
NSData \*textData = [NSData dataWithContentsOfURL:(NSURL \*)url];
iPalmMemo の内容なのでタイプは必要なく単にファイルを読むだけです。
iPalmMemo は最初の12バイトに Palm で使用するデータが入っているのですが、今回は不要なので読み飛ばします。
int length = [textData length];
NSRange range;
range.location = 12;
range.length = length – 12;
NSData \*text = [textData subdataWithRange:range];
で、文字コードが SJIS なので NSString にエンコードを指定して取り込みます。
NSString \*memoString = [NSString stringWithCString:[text bytes] encoding:NSShiftJISStringEncoding];
さらに RTF 形式で有ればそのまま表示出来るらしいので変換します。
NSAttributedString \*one = [[NSAttributedString alloc] initWithString:memoString];
NSData \*theRTF = [one RTFFromRange:NSMakeRange(0,[one length]-1) documentAttributes:nil];
これで準備出来たので QuickLook で表示する処理を書きます。
QLPreviewRequestSetDataRepresentation(preview, (CFDataRef)theRTF, kUTTypeRTF,(CFDictionaryRef)pdict);
pdict なる物が指定されていますが、これはタイトルを指定しています。その他にも指定できる様です。これはヘチマさんのサイトで参考にさせてもらいました。
NSMutableDictionary\* pdict=[NSMutableDictionary dictionary];
[pdict setObject:titleString forKey:(NSString*)kQLPreviewPropertyDisplayNameKey];
もちろん、これは QLPreviewRequestSetDataRepresentation の前に処理します。
3.GenerateThumbnailForURL(GenerateThumbnailForURL.m) でサムネイル表示処理を書きます
ここは先ほどの様に RTF では駄目みたいでイメージとして出力する必要が有るようです。
なのでまず表示する大きさを決めます。
NSSize canvasSize = {300.0,300.0};
NSRect も必要なので作成しておきます。
NSRect canvasRect;
canvasRect.origin.z = 0;
canvasRect.origin.y = 0;
canvasRect.size = canvasSize;
後は先ほどと同様に表示する文字列及びタイトルを取得します。
サムネイルの場合表示領域が小さいのメモを全部表示すると、とても見えない、判別出来ないのでフォントの大きさを大きくしています。
NSFont \*font = [NSFont fontWithName:@”Helvetica” size:48.0];
NSDictionary *attrDic = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,nil];
CGContextRef cgContext = QLThumbnailRequestCreateContext(thumbnail, \*(CGSize \*)&canvasSize, false, (CFDictionaryRef)pdict);
if(cgContext) {
NSGraphicsContext\* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void \*)cgContext flipped:NO];
if(context) {
[NSGraphicsContext setCurrentContext:context];
NSColor \*bg = [NSColor yellowColor];
[bg set];
[NSBezierPath fillRect:canvasRect];
NSColor \*fg = [NSColor blackColor];
[fg set];
[memoString drawInRect:canvasRect withAttributes:attrDic];
}
QLThumbnailRequestFlushContext(thumbnail, cgContext);
CFRelease(cgContext);
}
NSGraphicsContext の flipped を NO にしていますが、これを YES にすると上下逆転してしまいます。
メモなので bg を黄色にしています。
今回は文字列の表示なので NSSTring の drawInRect を使っていますが、画像などの場合はそれを貼り付けて(描画して)下さい。
こんなもんで作成出来てしまいます。ただデバッグがやりにくかったです。異常終了するものを作成してしまった場合 Finder が Crash Report を出し続けてそうさ困難になってしまいます。
まぁ普通はいきなり動作させないですけど。qlmanage と言う便利なコマンドが有るので、通常はこれでデバッグして下さい。
以上、いい加減な作成方法でした。