JXA NSOpenPanel

JXA で「開く」ダイアログを使いたい。
Cocoa の NSOpenPanel というものを使うらしい。

OpenおよびSaveパネルの使用

手段はアッサリ見つかったけど、使うと以下が stderror に出力される。

objc[672]: Class FIFinderSyncExtensionHost is implemented in both /System/Library/PrivateFrameworks/FinderKit.framework/Versions/A/FinderKit (0x7fffb49ddb68) and /System/Library/PrivateFrameworks/FileProvider.framework/OverrideBundles/FinderSyncCollaborationFileProviderOverride.bundle/Contents/MacOS/FinderSyncCollaborationFileProviderOverride (0x109f37cd8). One of the two will be used. Which one is undefined.

どちらの kit を使うかはっきりせぇ!ということらしい。
調べると AppKit 版と sandbox 版があるらしい。
Overview の所を Google 翻訳にて。

NSOpenPanel – AppKit | Apple Developer Documentation

一応、sandbox については以下が解りやすい。
iOS アプリは全部コレだし。

新・OS X ハッキング!(37) これから必須のセキュリティモデル「サンドボックス」 | マイナビニュース

とにかくはっきりせぇ!と言われても手段がわからない。

App Sandbox in Depth

真ん中あたりの Open and Save Dialog Behavior with App Sandbox を見つける。
えっと、このコードだと sandbox で動かせないって警告なのかな。
って JXA はデフォルトにて sandbox で動いているの?
無効にしようと振り分け手段を探しても Xcode からの手段しか出てこない。。。。。

ってよく考えたら GUI アプリなら stderror 関係ないジャン!
以上 sandbox についてのお勉強でした、macOS メンドクサ!

ということで、無視することにして。

ObjC.registerSubclass({
    name: "MenuAction",
    methods: {
        "openFile:": {
            types: ["void", ["id"]],
            implementation: (sender)=> {
                let panel = $.NSOpenPanel.openPanel;
                panel.canChooseDirectories = true;
                //panel.message = $("指定すると TitleBar が現れる");
                panel.allowsMultipleSelection = false;
                panel.allowedFileTypes = $(["cbz","zip"]);
                // sandbox @ Error
                //panel.beginSheetModalForWindowCompletionHandler(window, (res)=> {
                panel.beginWithCompletionHandler( (res)=> {
                    if (res == $.NSFileHandlingPanelOKButton) {
                        let url = panel.URLs.objectAtIndex(0);
                        window.setPath(url.path.js);
                    }
                });
            }
        }
    }
});

これで動く。
上記 stderror を吐くけど気にしない!

beginSheetModalForWindowCompletionHandler は動かない。
sandbox なので NSWindow を参照できない、でいいのかな?
間違えていたらごめんチャイ。

動きました、筆者の凡ミスコードのせいだった。