AppleScript から Objective-C を利用できるなったのは、Mac OS X 10.6 の頃のことでした。
あまり、利用されていないような気もします。まぁ、敷居が高いですからね...。
今回はそんな AppleScript/Objective-C(略して ASOC)を AppleScript 2.3 で追加されたスクリプトライブラリで利用するお話。
といっても、そんな難しい話ではなく『AppleScript の新機能 (1) - ライブラリ - ASH Planning』と同じように、AppleScript のライブラリとなんら変わるものではありません。
それでは、Finder のファイルのアイコンを変更するライブラリを作ってみます。AppleScript から Finder 項目のアイコンの変更って以前は可能でしたが、今はできません。一方、NSWorkspace にはアイコンを設定するためのメソッドがあります。それを利用します。
以下の内容で新規スクリプトを作成します。
property NSWorkspace : class "NSWorkspace"
property NSImage : class "NSImage"
property NSString : class "NSString"
property NSURL : class "NSURL"
on setIcon(targetFile, imageFile)
(*
targetFile のアイコンを imageFile に設定します
*)
-- AppleScript の文字列を Objective-C の NSString に変換
set targetFile to NSString's stringWithString:targetFile
set imageFile to NSString's stringWithString:imageFile
-- 画像のファイルパスからファイルを読み込み NSImage を作成
set thisImage to NSImage's alloc()'s initWithContentsOfFile:imageFile
-- NSWorkspace の setIcon:forFile:options: を使ってアイコンを設定
-- 返り値は真偽値
return NSWorkspace's sharedWorkspace()'s setIcon:thisImage forFile:targetFile options:(current application's NSExclude10_4ElementsIconCreationOption)
end setIcon
これを Script Libraries に保存するのですが、Objective-C を利用するライブラリにするにはいくつか注意点があります。
- スクリプトバンドル(拡張子 scptd)で保存する
- 保存したバンドルファイルの Info.plist を変更する
とりあえず、このスクリプトを Finder Utilities.scptd という名前で Script Libraries に保存します。
バンドル形式で保存すると、AppleScript Editor でバンドルの内容を編集するためのドロワーを開くことができるようになります。
このドロワーに『AppleScript/Objective-C ライブラリ』というチェックボックスがあります。ここをチェックします。
チェックがないと Objective-C の利用はできません。また、ここにチェックを入れることでバンドル内の Info.plist に『OSAAppleScriptObjCEnabled』という項目が追加されます。バンドル内の Info.plist を開いて手動で追加することもできますが、AppleScript Editor を利用するのが簡単です。
ちなみに、通常のスクリプトでも Objective-C が利用できるのか?と思いきや、それは無理なようです。
新しいスクリプトを作成し、以下のようにして呼び出します。
on run
set targetFile to POSIX path of (choose file)
set imageFile to "/Library/User Pictures/Sports/Basketball.tif"
tell script "Finder Utilities"
setIcon(targetFile, imageFile)
end tell
end run
選択した Finder 項目のアイコンを /Library/User Pictures/Sports/Basketball.tif に変更します。
いくつか注意点はありますが、AppleScript ライブラリを利用するのとさほど変わらない手間で Objective-C が利用できました。実際、Cocoa フレームワークのメソッドを使っている以外は通常のハンドラです。
Objective-C のメソッドは、コロン(:)に続いて引数がきます。AppleScript では Objective-C のメソッドを呼び出すときにアンダースコア(_)で置き換えていたのですが、AppleScript 2.3 ではコロンの利用が可能なっています。というか、コンパイルすると勝手に置き換わってしまいます。違和感ありまくり。
クラスの参照ですが、
property NSString : class "NSString"
このような書き方と、
property NSString : a reference to current application's NSString
このような書き方があります。前者は古くからの書き方ですね(タイプが少なくてすむのでよく使ってます)。どちらも同じように動きます。違いがよく分かっていないという方が正しいけど。ですが、current application が必要なときが必ずあります。それは、クラスで定義されている enum や const を利用するときです。
先ほどのライブラリでいうなら、NSExclude10_4ElementsIconCreationOption を利用している部分です。
return NSWorkspace's sharedWorkspace()'s setIcon:thisImage forFile:targetFile options:(current application's NSExclude10_4ElementsIconCreationOption)
こういうとき current application がないとエラーになります。Objective-C の利用方法や Cocoa フレームワークの紹介なんかはいろんな情報源があるのでそちらを参照してみてください(冷たいねぇ)。
で、いろいろとある Cocoa フレームワークの AppleScript での利用方法ですが...これは次回にでも。
0 件のコメント :
コメントを投稿