2011年3月24日木曜日

PDFkit 検索(2)

検索そのものはPDFDocumentクラスのfindStringで行う。で、見つかった検索結果はPDFSelectionの配列で戻ってくる。

これをどうやってViewで表示するか・・・当然Viewにそういうメソッドがあるだろう、ということでデベロッパドキュメントを探す。PDFViewのselection関連のメソッドは

– currentSelection
– setCurrentSelection:
– selectAll:
– clearSelection
– copy:
– scrollSelectionToVisible:
– setCurrentSelection:animate:
– setHighlightedSelections:
– highlightedSelections

・・・そのものずばり、– setHighlightedSelections:が求めるメソッドだった。引数はPDFSelectionの配列だから、findStringの戻り値をそのまま渡せばいい、という簡単さ。

    NSArray* seledted=[[pdfView document] findString:[sender stringValue] withOptions:NSCaseInsensitiveSearch];

    [pdfView setHighlightedSelections:seledted];
これだけでPDFドキュメント内の検索ヒット文字列が全て選択状態になる。便利じゃのお。しかしここままだと、最初の検索ヒット文字列にまでViewが勝手に動いてくれるわけではない。そこで、最初の検索ヒット文字列をcurrentSelectionに指定して、そこまでスクロールするコードを加える。

    [pdfView setCurrentSelection:[seledted objectAtIndex:0] ];
    [pdfView scrollSelectionToVisible:self];

というわけで「検索→すべての検索結果を選択状態→最初の検索ヒット文字列を表示」が実現できた。

さらにsetHighlightedSelections:のドキュメントには「通常の選択文字列とは違う背景色で表示することを勧める」とあるので、選択文字列の背景色を変えてみる。

これはPDFSelectionに「setColor」というメソッドがあったことを覚えていたのでそれを使う。
しかし[[seledted objectAtIndex:0] setColor:[NSColor yellowColor]としてみたら、最初の選択文字列だけ背景色が黄色くなってしまった。全部のPDFSelectionオブジェクトでsetColorする必要があるのか。

ま、

for (PDFSelection* selection in seledted) {
        [selection setColor:[NSColor yellowColor]];
    }
と書き加えるだけだから簡単なんだけど。

これで次のように表示できるようになった。


ふむふむ、次はサイドビューを表示できるようにして、そこで検索がヒットしたページを並べる、という処理かなあ。プレビュー.appに準ずるくらいの機能をつけられたいいな、と思っている。できるかな。

0 件のコメント:

コメントを投稿