2011年3月17日木曜日

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

HIDictionaryWindowShowの引数は次のようになっている。

void HIDictionaryWindowShow( DCSDictionaryRef dictionary,
CFTypeRef textString,
CFRange selectionRange,
CTFontRef textFont,
CGPoint textOrigin,
Boolean verticalText,
const CGAffineTransform *viewTransform );
DCSDictionaryRef dictionaryはNULL指定、CFTypeRef textStringは検索する文字列(検索して結果が0だと何も表示されません)、 CFRange selectionRangeはDCSGetTermRangeInStringの戻り値で選択文字が何文字か、という数値が入っている模様、CTFontRef textFontはパネル表示した時のタイトルFont、検索文字列をCFStringで指定した場合は必須(指定しないとアプリが落ちますな)、CGPoint textOriginが要は辞書パネルの表示開始位置。

辞書パネルの表示がずれているのはどう考えてもtextOriginのせいなわけで、ここに[NSEvent mouseLocation]を入れてみたらうまくいった。

コードは相変わらずとりあえず動けばいい状態の恥ずかしいものだけどこうなっている。

-(void)mouseDown:(NSEvent *)theEvent{
   
        PDFPage* page=[self currentPage];
        NSPoint point=[self convertPointFromBase:[theEvent locationInWindow ]];
                    
        PDFSelection* sel=[page selectionForWordAtPoint:[self convertPoint:point toPage:page]];
    if ([[sel string] length]>0 ) {
        CFRange rang=DCSGetTermRangeInString(NULL, (CFStringRef)[sel string], 0);
        NSPoint p=[NSEvent mouseLocation];
        CGPoint point2;
        point2.x=p.x;
        NSRect rect= [[NSScreen mainScreen] frame];
        point2.y=rect.size.height- p.y;
        CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), 0.0, NULL);
        HIDictionaryWindowShow(NULL, [sel string], rang, font, point2 , FALSE, NULL);
    }

}

辞書パネルの表示位置はスクリーン座標が必要、ということらしい。


しかしまだうまくいかないというか、すっきりしないところがある。「mouseDownイベントが起きたスクリーン座標」だけだと、たとえば単語の途中をクリックするとこうなってしまう。


かなり単語の先頭からずれた場所に辞書パネルがでる、と。
これは「選択された文字列のPDFview内のRect」をなんとかスクリーン座標まで変換しないと解決できないようだ。

PDFPage→View→Window→Screenという段階で変換しないといけないようで、こんがらがってしまう。焼酎をちびちびやりながらコーディング、というわけにはいかないので明日以降調べる、と。

0 件のコメント:

コメントを投稿