ブックマークメニューを追加する

ブックマークメニューを追加する

ブラウザには、とうぜんブックマークがなくてはいけない。ここでは、ブックマークメニューを追加しよう。

11.1 WebKit とブックマーク

WebKit には、特にブックマークをサポートするための機構は無い。アプリケーショ ン側で、メニューなりアウトラインなりにブックマークを表示して、選択されたら WebView で開く、という構造を作らないといけないんだ。

ここでは、簡単にブックマークメニューを実現するために、Safari のブックマーク を読み込むことにしよう。Safari のブックマークは、 /Library/Safari/Boomark.plist にある。これを読み込んで、展開してメニューとし て表示するんだ。plist 形式のファイルだから、簡単に読み込むことができるぜ。

11.2 実装


■Bookmark メニューの追加

では、実装だ。まず、nib ファイルを編集しよう。

1. MyDocument.nib を開く。MyDocument.nib をダブルクリックして、InterfaceBuilder に移動しよう。

2. Bookmark メニューを追加する。MainMenu を開いて、メニューを追加してく れ。「Bookmark」という名前を付けよう。下に続くメニューのアイテムは、動的に追加するので、いらない。


menu.jpg
図11-1 Bookmark メニューの追加

3. Controller にアウトレットを追加する。Classes タブに移動して、Controller を選択する。そして、Bookmark メニューを指し示すためのアウトレット bookmarkMenu を追加してくれ。


outlets-3.jpg
図11-2 Controller のアウトレット

4. アウトレットを接続する。Instances タブに戻ってくれ。Controller のインスタン スを選択し、Ctrl キーを押しながらドラッグする。すると、線がのびてくるので、 Bookmark メニューにつないでくれ。ここでは、NSMenu につなげよう。インスペク タパネルに注意して、NSMenuItem ではなくて、NSMenu につなげるようにしてくれ。

ここまでできたら、Project Builder に戻ろう。

■ソースコードの編集

5. Controller.h を編集する。追加したアウトレットに対応するインスタンス変数 bookmarkMenu を追加しよう。

MyFirstBrowser/Controller.h

@interface Controller : NSObject
{
  IBOutlet id goMenu;
  IBOutlet id bookmarkMenu;
  IBOutlet id historySeparatorItem;
  IBOutlet id prefController;

  // 更新途中の HistoryItems を保持します
  NSMutableArray* suspendedHistoryItems;
}

6. Controller.m を編集する。ここでやらなくてはいけないことは、初期化のときに、Bookmark メニューを作ることだ。

そこで、_makeBookmarkMenu というBookmark を読み込むメソッドと、その補 助メソッドである_readBookmark:intoMenu: というメソッドを作った。ここで、 Safari のブックマークを読み込み、再帰的にメニューを構築するんだ。細かい実装 は、ソースコードを見てくれ。なお、この実装は、 NagaraBrowser のソースコードを参考にさせていただきました。

あとは、このメソッドを applicationDidFinishLaunching: から呼び出せばよろし。

あと、メニューが選択されたときに呼び出される、アクションメソッドを用意する必 要があるんだ。ここでは、bookmarkSeleced: という名前にしよう。このメソッドで は、次に説明するMyDocument のメソッド connectURLString: を呼び出すんだ。

MyFirstBrowser/Controller.m

- (void)bookmarkSelected:(id)sender
{
  // ブックマークを取得します
  NSDictionary* bookmark;
  bookmark = [sender representedObject];

  // URL を文字列で取得します
  NSString* urlString;
  urlString = [bookmark objectForKey:@"URLString"];

  // キーウィンドウを取得します
  NSWindow* keyWindow;
  keyWindow = [NSApp keyWindow];

  // MyDocument を取得します
  MyDocument* document;

  if (keyWindow) {
    // MyDocument を keyWindow から取得します
    document = [keyWindow delegate];
  }
  else {
    // キーウィンドウがないときは、MyDocument を新しく作成します
    document = [[NSDocumentController sharedDocumentController]
      openUntitledDocumentOfType:@"DocumentType" display:YES];
  }

  // 履歴に移動します
  [document connectURLString:urlString];
}


7. MyDocument.h を編集する。MyDocument では、文字列で指定したURL に移動 する、connectURLString: を実装する。次の宣言を追加してくれ。

MyFirstBrowser/MyDocument.h

- (void)connectURLString:(NSString*)urlString;


8. MyDocument.m を編集する。connectURLString: の実装を追加しよう。

MyFirstBrowser/MyDocument.m

- (void)connectURLString:(NSString*)urlString
{
  // NSURL を作成します
  NSURL* url;
  url = [NSURL URLWithString:urlString];

  // NSURLRequest を作成します
  NSURLRequest*  request;
  request = [NSURLRequest requestWithURL:url];

  // メインフレームで、URL を開きます
  [[webView mainFrame] loadRequest:request];
}


9. ビルドして実行する。

browser-7.jpg
図11-3 MyFirstBrowser8 動作図

これで、ブックマークメニューが追加されるぜ。

■ここまでのプロジェクト:
MyFirstBrowser8.zip