Text View ちょっと応用
Text View のところでは、基本的によく使うコマンドの羅列になってしまったので、ここではそちらで触れなかったものも含めて、
それも使いつつ応用的なものを書いていく。
リンクの扱い
Text View で Rich Text を使えるようにしてあると、リンクを追加できる。Rich Text を使えるようにする一番簡単な方法は、Interface Builder の Inspector で Rich Text にチェックを入れる。もしくは、スクリプトで setRIchText(true/false) という Text View のメソッドを使う。
@textView.setRichText(true)
これで、Text View で Rich Text を扱えるので、リンクも追加できる。
リンクを追加するのに一番簡単な方法は、Link Panel を表示して、ユーザーにリンクを追加してもらう方法。Text View には orderFrontLinkPanel(sender) というメソッドがあるので、それを ib_action で実行させるメソッドに入れて、ボタンやらメニューアイテムやらに割り当てる。
def showLinkPanel(sender)
@textView.orderFrontLinkPanel(nil)
end
ib_action :showLinkPanel
これで、実行されると、Text View のある Window から Link Panel が現れる。こんなやつ。
標準では、リンクは青色で下線付きの文字になる。これを変えたい場合は、setLinkTextAttributes(attributes) という NSTextView のメソッドを使う。たとえば、青色の下線付き文字で文字の上にカーソルが来た場合によく見る手の形をしたポインタにしたい場合は、次のようにする。属性については、文字列に属性を付加するを参照してください。
@textView.setLinkTextAttributes({NSCursorAttributeName => NSCursor.pointingHandCursor,NSForegroundColorAttributeName => NSColor.blueColor,NSUnderlineStyleAttributeName => true})
ちょっと長くなって切れてるかもしれないので、別の方法で。
attributes = Hash.new
attributes[NSCursorAttributeName] = NSCursor.pointingHandCursor
attributes[NSForegroundColorAttributeName] = NSColor.blueColor
attributes[NSUnderlineStyleAttributeName] = true
@textView.setLinkTextAttributes(attributes)
NSCursorAttributeName では、ポインタの形を、NSForegroundColorAttributeName では文字の色を、NSUnderlineStyleAttributeName では下線を追加するかどうかを指定している。
スクリプトでリンクを入れる場合は、リンク付きのテキストを Attributed String で作って、それを insertText(text) で Text View に挿入する。Attribute String は NSAttributedString オブジェクトを initWithString_attributes(string,attributes) で作る。attributes は NSDictionary のオブジェクトだけど、Ruby の Hash でいける。attributes で指定するのは、一番大事なのが NSLinkAttributeName でリンクの URL。これで、テキストにリンクがついて青い文字になって下線が引かれる。ただ、標準ではカーソルが普通の文字挿入場所を指定するものになるだけなので、NSCursorAttributeName でNSCursor.pointingHandCursor を指定して、よく見るリンクを指差すものにする。これ以外の属性を付けたい場合は文字列に属性を付加するを参照してください。
こんな感じなスクリプトになる。
link = "http://www.apple.com/"
attributes = {NSLinkAttributeName => link, NSCursorAttributeName => NSCursor.pointingHandCursor}
linkText = NSAttributedString.alloc.initWithString_attributes("Apple",attributes)
@textView.insertText(linkText)
ただ、これらの方法で作ったリンクは、否応無しにブラウザが立ち上がりそこでリンクを開こうとする。場合によっては、リンクの情報をアプリケーション内で捕まえて何らかの処理をさせたい、なんていう場合には、Text View をオーバーライドしてリンクがクリックされたという情報を捕まえるしかない。Text View のオーバーライドについては、キー入力のオーバーライドのところに設定の仕方をメモしたのでそちらを参照。
それで、Text View のサブクラスで clickedOnLink_atIndex(link,index) というメソッドをオーバーライドする。ここで、link はリンク先の URL もしくは AttributedString に加えた LinkName で、index はリンクのテキストの開始位置。ただ、すべて捕まえてしまうと、普通のリンクの場合にも処理されなくなるので、条件で捕まえたいものだけ捕まえたら、あとは super_clickedOnLink_atIndex(link,index) で通常のリンク処理をさせる。このとき、リンクがクリックされたText View の対して処理をしたいときは、self がその Text View なので、それに対して処理をする。
def clickedOnLink_atIndex(link,index)
if (リンクを捕まえるための条件) (リンクを捕まえたときの処理) else super_clickedOnLink_atIndex(link,index) end end