昨日はここまでできた。
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 件のコメント:
コメントを投稿