2011年3月18日金曜日

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

PDFView上の、現在のマウスカーソル下にある単語を取得する。
PDFSelection* sel=[page selectionForWordAtPoint:[self convertPoint:point toPage:page]];
pageは
PDFPage* page=[self currentPage];
pointは
NSPoint point=[self convertPointFromBase:[theEvent locationInWindow ]];

取得した単語の、page上の位置と大きさ(rect)を取得する。
NSRect selRect=[sel boundsForPage:page];

さて。ここから、selRectのoriginをscreen座標系に変換しないと辞書パネルが正しい位置に表示されない。泥臭く変換してみる。

まずpage上の座標をViewの座標へ。
NSPoint vPoint=[self convertPoint:selRect.origin fromPage:page];

さらにPDFViewのsuperViewであるNSSCrollViewの座標へ。
NSPoint p1=[[self superview] convertPoint:vPoint fromView:self];
それをさらにWindowの座標へ。
NSPoint p2=[[self superview] convertPointToBase:p1];
そしてやっとScreen座標へ。
NSPoint p3=[[self window] convertBaseToScreen:p2];

これでやっと、ほぼ望む位置に辞書パネルが表示されるようになった。

まず右クリックから「辞書で調べる」を選択した場合の画像。

次が現在作っているappで出した辞書パネル。

y方向に若干のずれがある・・・。どうしてそうなるのかよくわからない。ここまできたらもういいか、という素人独特の判断で、

point2.y=rect.size.height- screenPoint.y-3.0;

とやったらそれらしい表示ができたので満足とする。
なおscreenPointは上記の処理をいっぺんにやってみた結果。

NSPoint screenPoint=[[self window] convertBaseToScreen:[[self superview] convertPointToBase:[[self superview] convertPoint:vPoint fromView:self]]];

なんかむちゃ長い1行だ。(^^;)ま、いいか。

いちおう初期の目標はこれで達成。このままPDFビューワを作りこんでいくかどうか、ちょっと考えている。自分用のアプリとしても、しおり機能くらいはつけたい。でもそうすると、「読み込んだPDFごとのデータ保存」が必要になるからすごくめんどうな予感がする。どーしよー。

検索機能とかもいるよなあ。

Document Base のいい勉強になる気もするけど、どうしても作りたい、ということでもないので迷い中。

0 件のコメント:

コメントを投稿