2011年3月16日水曜日

PDFkit(その3)辞書.appで辞書を引く

昨日の続き。PDFファイルを表示して、マウスクリックで単語を拾って辞書.appで辞書を引く。
昨日はここまでできた。


mouseDownの中で
    [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
    [pb setString:[sel string] forType:NSPasteboardTypeString];

    NSPerformService(@"Look Up in Dictionary" , pb);
 
とすると上の画像のように辞書.appが起動する。うーん、こうじゃなくて、Ctrl+Command+Dした時のように、パネルで辞書.appを表示したいんだけど・・・。

もう一つ、プログラム内から辞書.appを使う方法が
dict://
だということは知っていたので使い方を調べる。そして書いたのが次のコード。

    NSString *str=[[NSString alloc] initWithFormat:@"dict://%@",[sel string]];
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:str]];

しかしこれも


辞書.appのウィンドウが開いてしまう。なぜウィンドウが開くとだめかというと、いちいちウィンドウのフォーカスが変わってしまうのが不便だから。辞書がパネル表示されるとその辺が便利。

上の方法を調べているうちに、デベロッパドキュメント内で

Dictionary Services Reference
に行き当たった。苦労して英文を読んでみると、
HIDictionaryWindowShow
がまさに希望する機能を実現するメソッドらしい。

というわけで、Carbonなので生なCの関数にびくびくしながら次のような、いい加減なコードを書いてみる。

    CFRange rang=DCSGetTermRangeInString(NULL, (CFStringRef)[sel string], 0);
    CGPoint point2;
    point2.x=point.x;
    NSRect rect= [[NSScreen mainScreen] frame];
    point2.y=rect.size.height- point.y;
    CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), 0.0, NULL);
    HIDictionaryWindowShow(NULL, [sel string], rang, font, point2 , FALSE, NULL);
NSScreen系とCGWindow系の座標変換、とか、CTFontRefの作り方、とか、そりゃもうググリまくりですよ。

これで実行してみると


出た。パネル表示の辞書。しかし位置がずれている。うーん、座標系の変換でまだやることがあるみたい。

でもいちおう、考えていたことができるとわかったのでうれしい。

0 件のコメント:

コメントを投稿