Safari のブックマークを読み込む
Webkit をつかって Web View をアプリケーションに追加したときに、ブックマークがあると便利。
だけど、ブックマークの機能を位置から作るとなるとめんどくさい。まあ、まだ方法がわからない、と言った方がいいか。
だったら、他のブラウザから読み込んでしまえばいい、と。
木下誠さんの HDMT のサイトにある「はじめてのブラウザのつくり方」の「ブックマークメニューを追加する」に
Objective-C で Safari のブックマークを読み込む方法が説明してある。木下さんも他の人の実装を参考にしたそうだが、
その元のサイトは存在しないので、木下さんのサイトにあるソースコードを RubyCocoa にしてみた。
ここでは、コードと少しだけ自分のメモのために書いておくので、詳しいことが知りたい人は木下さんのサイトを参照。
はじめに Interface Builder で MainMenu.nib にあるメニューに Bookmark 用のメニューを追加する。そのとき、item は
スクリプトで追加するので空にしておく。そして、AppController(NSObject のサブクラス)の outlet をつくって、
このメニューにアクセスできるようにする。ここでは、bookmarkMenu としてある。この outlet をメニューに結びつけるんだけど、
結びつけるのは、Bookmark となっている Menu Item ではなく、Bookmark の Menu(Item 1 とか入っていたところ)に結びつける。
空っぽにしたので、細くなってしまっているが、間違えずにそこに結びつける。
次にスクリプト。まず、awakeFromNib で Safari のブックマークファイルを NSDictionary オブジェクトとして読み込む。
実際の処理は、makeBookmarkMenu で行うのでそれを呼び出してる。
def awakeFromNib
@fileManager = NSFileManager.defaultManager
bookmarkPath = "#{NSHomeDirectory()}/Library/Safari/Bookmarks.plist"
return if not @fileManager.fileExistsAtPath(bookmarkPath)
bookMark = NSDictionary.dictionaryWithContentsOfFile(bookmarkPath)
children = bookMark["Children"]
return if children.nil?
children.each do |child|
self.makeBookmarkMenu(child,@bookmarkMenu)
end
end
makeBookmarkMenu でブックマークを読み込んで Popup ボタンのアイテムに割り当てている。
このときに、gotoPage という ib_action を割り当てて、メニューアイテムが選ばれたときに
そのメソッドが実行されるようにする。
def makeBookmarkMenu(bookMark,parentMenu)
if bookMark["WebBookmarkType"] == "WebBookmarkTypeList"
title = bookMark["Title"]
return if title.nil?
menuItem = NSMenuItem.alloc.initWithTitle_action_keyEquivalent(title,nil,"")
menu = NSMenu.alloc.init
menuItem.setSubmenu(menu)
parentMenu.addItem(menuItem)
children = bookMark["Children"]
return if children.nil?
children.each do |obj|
self.makeBookmarkMenu(obj,menu)
end
elsif bookMark["WebBookmarkType"] == "WebBookmarkTypeLeaf"
title = bookMark["URIDictionary"]["title"]
return if title.nil?
menuItem = NSMenuItem.alloc.initWithTitle_action_keyEquivalent(title,:gotoPage,"")
menuItem.setTarget(self)
menuItem.setRepresentedObject(bookMark)
parentMenu.addItem(menuItem)
end
end
最後に、選ばれたブックマークの URL を Web View に表示するメソッドを作る。ここでは、webView という outlet を
表示させる Web View に結びつけてある。
def gotoPage(sender)
bookmark = sender.representedObject
url = bookmark["URLString"]
@webView.mainFrame.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(url)))
end
これをコピペすれば動くはず(動いてるのから取ったから)。ただし、include OSX を忘れないように。