タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(2)Application Kitの機能カテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2001/12/13 17:21:14作成者新居雅行
Cocoaフレームワークの大きな特徴である、文書ファイルを伴うアプリケーションを作成する機能についての解説にさっそく入ろう。文書ファイル、たとえばテキストエディタとか、画像編集ソフトのように、アプリケーションとは別にデータをファイルに保存し、そのファイルをウインドウに開いて編集するという形式のアプリケーションは、もはや定番というのもおかしなくらい、パソコンでは当たり前になっている。そうしたアプリケーションを作るためには、オブジェクト指向以前(その意味では現在のCarbonも含む)のAPIでは、ウインドウを画面に出すだけでもけっこうなプログラミングが必要であった。10年くらい前のマックのプログラミング本だと、延々とプログラミングを行って、やっとシンプルなテキストエディタができました…という感じであった。
しかしながら、オブジェクト指向が一般的になったことで、差分だけを与えるというやり方がうまく機能するようになった。つまり、どのアプリケーションにも共通するような機能については、あらかじめフレームワークで作り込んでおく。たとえば、ウインドウを表示し、ウインドウの大きさを変えたりウインドウの位置を変更するといった動作は、ワープロでも画像ソフトでもほぼ共通だ。そうした機能はすでにフレームワークで用意しましょうというわけである。そして、ウインドウに表示する中身は、アプリケーションごとに作って下さいという具合である。もちろん、その中身を作る上でもオブジェクト指向によって部品が容易に使えてさらにはカスタマイズもできるなど、フレームワークの機能はふんだんに利用できる。そして、ウインドウといったコンポーネントだけでなく、「文書ファイルを扱うアプリケーション」という機能もフレームワークに含まれることが多い。いくらか複雑な仕組みになってしまうのであるが、それでもこうした機能を使えば、従来のやり方に比べて遥かに容易にアプリケーションができてしまうのである。なお、PowerPlantでも文書ファイルを扱うクラスは存在している。一方、SwingなどのPure Javaでは明確には存在していない。その意味では、Mac OS Xのネイティブ環境であるCocoaで対応があるということは、Cocoaの魅力であると言ってもいいだろう。ちなみに、Cocoaではこうした種類のアプリケーションを「Document Based Application」と呼んでいるので、以下「ドキュメントベースのアプリケーション」などと呼ぶことにする。

Cocoaでドキュメントベースのアプリケーションを実現するために、いくつかのクラスが用意されているが、その中心となるのはNSDocumentである。最低限、このクラスのサブクラスを定義するということが必要になる。それ以外のクラスについては、基本的には特にいじらなくてもとりあえずはアプリケーションは作成できる。しかしながら、フレームワークで定義されている機能を変更したりあるいは追加したいとなると、そうしたクラスを自分で作り直したりといったこともできるようになっている。今回は、NSDocumentクラスだけを詳しく説明するが、その他のクラスは名前と動作の概要だけはとりあえず理解しておきたいところだ。
このNSDocumentを利用する上では、nibファイルの動作を理解しておきたい。nibファイルはInterface Builderで作成できるもので、そこには、ウインドウやその中のボタン、メニューといったユーザインタフェース要素、そしてクラスの定義やそのインスタンスの定義、インスタンス間でのリンクといった参照関係の定義など、さまざまな情報が記録される。通常、アプリケーションは、NSApplicationというクラスで実現されており、そのクラスをインスタンス化するところからアプリケーションは始まる。もっとも、main.mというObjective-Cで書かれたソースが最初からプロジェクトに組み込まれているので、あまり意識はしたことがないかもしれない(この部分の解説は、Objective-CのNSApplicationのクラスの部分で見ることができる)。しかしながら、そこでは、プロジェクトの「アプリケーション設定」にある「メインnibファイル」に指定したnibファイルを自動的にロードするといった動作を行う。通常は、ここも最初から用意されているnibファイルであるMainMenuが設定されているので、MainMenu.nibに設定されたメニューがアプリケーションのメニューとして表示されるという動作になるわけだ。
一方、ドキュメントベースのアプリケーションの場合、必ずしもそのやり方しかできないわけではないものの、一般にはドキュメントの定義に対応したnibファイルを定義する。nibファイルは、ファイルとして存在するときには「クラス」という意味合いが強いが、それがロードされることによって「インスタンス化」されると考えればよい。だから、アプリケーションで使うnibファイルとは別に「文書ファイル」を定義するnibファイルを用意しておく。通常は、アプリケーションの中でドキュメントを複数開くことが多い。したがって、文書を開くたびに、その文書ファイルに対応したnibファイルを利用してプログラム上で利用するインスタンスを生成するという方法が、いちばん素直なやり方なのである。

Applicationクラスにあるドキュメントを関するクラスをまとめておこう。動作から考えると、文書ファイルがいくつかあり、さらに1つの文書ファイルで複数のウインドウということもあり得るというあたりを想像してもらいたい。そうした状況を実現できるようにCocoaは作られている。以下の図は、クラス階層ではなく、実行した段階でのインスタンスの階層であるので注意してもらいたい。

◇ドキュメントを管理するクラス
 

まず、いちばん根底にNSDocumentControllerというクラスがある。これはマルチドキュメントをサポートするクラスで、アプリケーションでは1つだけインスタンス化されている。このクラスはけっこういろいろな仕事をこなすが、何もしなくてもインスタンス化されていて使える状態にあると考えて良い。ここでは、文書を新規に作ったり、文書を開いたり、さらには終了時に閉じるかどうかを訪ねるとか、Finderでのドラッグ&ドロップとの連動といったことまでも行う。また、そうした動作を変更したいときには、このサブクラスを定義して利用することもできてしまう。今回のサンプルはとりあえずそのまま利用することにする。
次にNSDocumentクラスがあり、1つの文書ファイルに1つのインスタンスを用意する。ただし、文書のデータ処理に関しては、やはりどうしても共通に動作するものは無理なので、実際に作成するアプリケーションに合わせた部分を作らないといけない。そのため、通常はサブクラスを作ってそれを利用する。この動作については、一連の原稿で詳しく紹介しよう。
さらに、NSWindowControllerクラスがある。1つの文書ファイルに対して1つ用意し、1つの文書に対するマルチウインドウをサポートする。これも、基本となるクラスは定義されていて、通常はNSDocumentないしはそのサブクラスを作ると自動的に用意されるものと考えて良い。ただし、サブクラスを作ってカスタマイズすることも可能となっている。
そして、NSWindowクラスがあるが、これはウインドウそのものである。1つのウィンドウに対して、1つのインスタンスを使うことになるが、もちろんこれもサブクラスでもかまわない。単に通常のウインドウの動作をさせて、その中にコントロール類があるだけなら、通常はそのままを使う。また、言い換えれば、このNSWindowsクラスはnibファイルで定義しているものをそのまま使うのが一般的である。プロジェクトの初期状態がそうなっているので、まずはそうした使い方からマスターするのがいいだろう。つまり、nibファイルで作成したユーザインタフェースに基づくウインドウを作成するという具合である。
このようにいくつかのクラスがあって、それらが連係を取りながら動いて行く。しかも、自動的にいろいろ行われてしまうので、結果オーライとするのなら何も説明することはなくなってしまうのであるが、なるべく背後でのフレームワークでの動きを筋道を立てて説明していきたいと考える。
(この項、続く)
関連リンク