タイトル今から始めるCocoaプログラミング》ドラッグ&ドロップでファイルを開く(2)オープン処理の組み込み(続き)カテゴリーProjectBuilder/Interface Builder, Cocoa, 今から始めるCocoaプログラミング
作成日2001/5/1 16:51:21作成者新居雅行
続いていよいよDelegateする設定を行う。MainMenu.nibのウインドウのInstancesのウインドウで、controlキーを押しながら、File’s Ownerから、定義したDocOpenHandlerに向かってドラッグを行う。すると、ドラッグもとからドラッグ先に向かって線が引かれると同時に、インスペクタがConnectionsの設定を表示するように開く。ここではOutletsとしてはdelegateだけが選択されているはずなので、それを確認してインスペクタのConnectボタンをクリックする。そうすると、File’s Owner、つまりNSApplicationをインスタンス化したオブジェクトのdelegateを、DocOpenHandlerに設定するということになる。

□File’s OwnerからDocOpenHandlerに向かってドラッグ

□Outletのdelegateを接続する


つまり、NSApplicationクラスでは、delegateというOutletが定義されているのである。そのOutletを特定のインスタンスに結びつけることで、結びつけられたインスタンスがイベントなどが発生したときに呼び出されるというわけだ。
Interface Builderでの作業はとりあえずここまでなので、Command+Sなどによって文書を保存しておこう。

Project Builderのほうに移動すると、DocOpenHandler.javaというソースファイルが作成されていること分かる。File’s OwnerからこのクラスのインスタンスにDelegateされているのだから、規定のメソッドの呼び出しが発生するはずだ。具体的にどのようなイベントでの呼び出しが発生するのかは、NSApplicationクラスの解説文書の最後の方に書かれている。

◇NSApplication(Java)
 http://developer.apple.com/techpubs/macosx/Cocoa/Reference/ApplicationKit/Java/Classes/NSApplication.html

ここではかなりたくさんのイベントに対応したメソッドが利用できることが分かるが、これらはすべて定義する必要はなく、使う必要のあるイベントに対応したものだけをメソッドとして定義すれば良い。Finderなどでファイルをドラッグ&ドロップしたときに呼び出されるのは、applicationOpenFileというメソッドなので、そのメソッドをDocOpenHandler.javaの中に定義する。引数は、NSApplicationのドキュメントに記載されているように2つを指定する。たとえば、ドラッグしてきたファイルのパスを標準出力に出力するようなアプリケーションとしては、図のようなプログラムを作成すればよい。

□メソッドapplicationOpenFileを追加する


こうしてアプリケーションを実際にビルドして起動する。Dockに起動したアプリケーションのアイコンが表示されるはずだ。そのアイコンに対して、何でもいいので適当にファイルをドラッグ&ドロップしてみよう。ただ、そのままだとアプリケーションのアイコンは反応しないので、Command+optionを押しながらアイコンにドラッグすることで、強制的に反応させることができ、アプリケーションアイコンは黒く選択されるはずだ。すると、Project Builderの標準出力の部分にドラッグしてきたファイルのパスが表示されているはずである。

□アプリケーションのアイコンにドラッグ&ドロップしたファイルのパスが見えている


アプリケーションは、Command+Qなどで通常通り終了できる。こうした基本的な処理はテンプレートあるいはフレームワークで定義されているので、何もしなくても機能が組み込まれた状態になっている。

いずれにしても、DelegateされたクラスのapplicationOpenFileというメソッドが、ドラッグ&ドロップによって呼び出される。applicationOpenFileメソッドの中では、引数にあるようにNSApplicationクラスへの参照がまず得られる。また、ドラッグしたファイルのパスをStringクラスで得られる。つまり、フルパス名が文字列として得られるのである。ファイルの中身を開くなどの処理は、たとえばjava.io.Fileクラスを利用するなどして処理を組み立てていけばいいということになる。いずれにしても、こうしてCocoaのアプリケーションにFinderのドラッグ&ドロップを受け付けるメソッドを記述することができるようになるということである。

ところで、以上のように自分で定義したクラス(ここではDocOpenHandler)にメソッドを追加するのであれば、Interface BuilderでDocOpenHandlerクラスにActionなどを定義した方がいいのではないかと考えるところかもしれない。だが、Actionを指定しても、引数などの指定を変更しなければならず、メソッド名しか引き継がれないので、手間の上ではかえってInterface Builderでの余分な作業が増えるのではないだろうか。それに、applicationOpenFileメソッドをActionとして定義しても、そのActionに対して結合を行うわけではない。NSApplicationのdelegateというOutletを、クラスのインスタンスに対して結合をするので、applicationOpenFileはActionとして存在している必要は特にないのである。だから、applicationOpenFileメソッドはソースファイルでいきなり書くことで問題はないだろう。

次回は、ダブルクリックして起動したときと、ドラッグ&ドロップで起動したときで処理を分ける方法など、NSApplictaionでのほかのイベントやNotificationについて説明をしよう。
関連リンク