ページ

2009年11月2日月曜日

Safari用独自プラグインを作る(14) - ツールバーを追加する #3

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: Safari用独自プラグインを作る(13) - ツールバーを追加する #2


さて今回は実際に Safariのツールバーへにボタンを追加してみる。

ボタンの追加・表示

まず  NSToolbarDelegate の toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: を実装する。

#define TOOLBAR_BUTTON_ID @"com.xcatsan.SafariPlugInStudy"
- (NSToolbarItem *)_sx_toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
NSToolbarItem* item;
if ([itemIdentifier isEqualToString:TOOLBAR_BUTTON_ID]) {
NSBundle* bundle = [NSBundle bundleForClass:[SXSafariToolbarSwizzler class]];
NSString* path = [bundle pathForResource:@"toolbar_icon" ofType:@"tiff"];
NSImage* image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease];

item = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];
[item setLabel:@"Take a screenshot"];
[item setImage:image];
[item setTarget:self];
[item setAction:@selector(takeScreenshot:)];
} else {
item = [self _sx_toolbar:toolbar
  itemForItemIdentifier:itemIdentifier
  willBeInsertedIntoToolbar:flag];
}
return item;
}

アイコン画像はプラグインのリソースフォルダに入っているので +[NSBundle bundleForClass:] を使いプラグインの NSBundle を取得し、そこからパスを得る。


次にツールバーへの追加。セットアップ時に表示中のSafariのウィンドウを NSDocumentController 経由で取得し、かたっぱしから追加してみる。


+ (void)setup
{
 :
 :
NSDocumentController* dc = [NSDocumentController sharedDocumentController];

for (NSDocument* doc in [dc documents]) {
for (NSWindowController* wc in [doc windowControllers]) {
NSWindow* win = [wc window];
[[win toolbar] insertItemWithItemIdentifier:TOOLBAR_BUTTON_ID atIndex:0];
}
}
}



Identifer(ツールバーアイテムの識別文字列)を追加しておくと、先ほどの toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: が自動的に呼び出される。


さて実行してみよう。

出ない。

が、しばらくすると出た。

待っていても出ない場合があって右クリックしてコンテキストメニューを出すと急に出てくることがある。これは Evernote プラグインでも同じ。今回採用しているプラグイン形式の場合、プラグインが読み込まれるタイミングは後回しになるようなので、このあたりはプラグイン側ではいかんともしがたい。

それにしても画像がボタン上に表示されない上、画像が拡大されて見た目が良くない。さらにディゼーブル状態となっている。このあたりイネーブルにした上で、見た目も背景となるボタンを自前で用意してサイズを調整する必要がある。


新規ウィンドウでもボタンが表示される

この後、新規ウィンドウを開いても画像が表示された。1つのウィンドウへ追加しておくとその情報が他のウィンドウでも使われるようだ(ちなみに NSToolbar のインスタンスはウィンドウ毎に異なることを確認済み)。



Evernote プラグインの問題

なお Evernote プラグインを入れていると今回追加したアイコンが一瞬表示された後、消えてしまった。Evernoteプラグインはその他、副作用があるようだ。
Safari 4でカスタマイズしたツールバーが元に戻ってしまうのはEvernoteが原因 : Safari Realized
Evernote 1.5.0 for Mac - コトハノオト

このあたり、開発サイドから見ると難しさ(面倒さ?)はよくわかるので仕方ない気もする。もちろん機能上は問題だが。今回の検証ではこのあたりの問題を回避するため Evernote プラグインを外して行った。しかし、Evernoteがこの問題を直してくれないとツールバーのボタンが共存できないので困るな..。


リソース

ソース:SafariPlugInStudy-3.zip