アルファサード株式会社 代表取締役 野田 純生のブログ


(Xojo)ListBoxからFinderにドロップしたDragItem.FolderItemのパスを得る


公開日 : 2013-12-06 13:16:05


引き続きXojo(とMacOS)ネタ。

要するに、こういうことをやりたいとき、Dropされたアイテムのパスを得られないとどうしようもないのですが、DragItem.Destinationというプロパティでこれが実現できる、とあります(サポートに教えてもらった)。但しこれはMac OS限定ということでWindows、Linuxではダメらしい。今回はMac OS限定の開発なので、これでできると思いきや、Carbonでは動くがCocoaではこの値がとれない(現段階でサポートに確認中)。で、このためだけにCarbonにするのも悔しかったので、どうにかやってみようと。

アプリのリストボックスからアイテムをドラッグ&ドロップしたい

アプローチその1. エイリアスを作ってTimerで監視

MakeAliasというAppleScriptを作ってテンポラリ領域に作ったファイルのエイリアスを作り、Timerを使ってドラッグされた先のパスを見る。


on run (theOriginal)
    set theOriginal to POSIX file theOriginal
    set theOriginal to alias theOriginal
    tell application "Finder"
        set theFolder to folder of theOriginal
        make new alias file at theFolder to theOriginal returning theResult
        set theResult to theResult as string
    end tell
    --set theResult to POSIX path of theResult
    return theResult
end run

オリジナルのアイテムのパスを得るためにResolveAliasというAppleScriptを作る。

on run (theOriginal)
    set theOriginal to alias theOriginal
    tell application "Finder"
        set theResult to (original item of theOriginal) as alias
    end tell
    set theResult to POSIX path of theResult
    return theResult
end run

結論から言うと、これはNG。またもやCarbonで動くがCocoaでアウトなのでした。DragItem.FolderItemがMoveではなくCopyになってしまう。なので、オリジナルのパスはテンポラリ領域のファイルとなる(ただ、せっかくやったのでこうやって書いておくのだ。きっとどこかで誰かが、あるいは自分の役に立つので)。POSIX path というのが使えるのを学びましたよ(PathをUnixタイプのNative Pathに変換してくれる)。

アプローチその2. Spotlightを使ってTimerで監視

こちらは上手く行きました。ちょっとだけタイムラグが出るのが玉にきずですが。

Dim command As String = "mdfind -name " + DraggingItem
Dim Sh As New Shell
Sh.Execute( command )
Dim Res As String = Sh.ReadAll

要するに、存在しないファイル名(乱数から生成したMD5ハッシュ値とタイムスタンプとかから組み立てたファイル名)でテンポラリファイルを作り、不可視にしてDragさせる。同時にTimerを走らせる。If System.MouseDown = False Then (マウスが押されていない状態になった時)に上記を実行する(mdfindというコマンドがあって、こいつは Spotlight のコマンドラインツールなのです。

多少のタイムラグが出るものの、これでドラッグされた不可視アイテムのパスが得られるので、その親(フォルダ)に対して選択されたアイテムをダウンロードさせる、という方法。存在しないファイル名として作ったファイル名が本当に存在しないかどうかも同じコマンドで得られるので。

ただ、やっぱりちゃんと DragItem.Destination なりでサポートして欲しいと思ったのでした。とりあえずCocoa化はできた。Carbonはやっぱり速度とかLook & Feelが美しくないので、やっぱり作るならCocoaで作りたいよね。

カテゴリ


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ