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 件のコメント:
コメントを投稿