タイトル【Carbon化シリーズ】Navigation Serviceに対応(1)カテゴリーCarbon/CF, Carbon化
作成日2000/6/10 16:13:25作成者新居雅行
少し間が空いてしまったCarbon化シリーズだが、折しも小池さんの「プログラマー日記」もCarbonの話が始まった。同じテーマではあるものの、視点の違いもあるし、いろいろな説明があった方が理解の助けにもなるとも考えられる。いずれの記事もお読みいただきたい。
さて、Carbon Daterで得られた結果を見て考えたのだが、一気にライブラリをCarbonLibだけにしてしまって、エラーが出たらそれに合わせて修正する…という方法がまず1つある。しかしながら、そうなるとエラーの応酬で、試しに実行するというところに行くまでに非常に時間がかかるということが予想される。とにかくCarbon化するならその手法もありだが、いちおう記事を書かなくてはならない。そこで、Carbon Daterの結果を見ながら、まずは現状のライブラリ、つまりCarbonではなくClassic環境アプリケーションとしてなるべくCarbonに近いソースリストにしてから、最後にCarbonLibを統合するという手順の方がいいのではないかと判断した。というか、そうでもしないと、連載記事はいつまで経っても出てこないということになりかねない。

まず、Navigation Service対応から入ろう。ファイルを開く時や保存する時のダイアログボックスは、Standard File Packageという仕組みがToolboxに用意されていて、それを使って簡単にファイル選択のダイアログボックスが表示できた。昔のマルチアプリケーションではない時代のFinderならそれでもよかったのだが、マルチFinderになってからも、ファイルを開くダイアログボックスはモーダルだったために、使いにくいと思ってしまう場面はよくあった。また、ファイル一覧の表示形態は単なるファイル名だけの名前順リストだし、ダイアログボックスも大画面が当たり前の現状ではそぐわない小さなものだったりした。その状況を改良するためのNavigation Serviceというシステム機能が登場して利用できるようになった。当初はサポートするソフトウエアも少なかったが、Mac OS 9時代の現在は、多くのソフトウエアがサポートする機能だ。モードっレスダイアログで位置を移動でき、ファイルの一覧も階層化されて表示できるなどFinderの一覧表示に匹敵する。それに、「よく使う項目」などと連動しているなど、使い勝手は大きく上がるのである。APIの利用方法については、以下のドキュメントがあるが、SDKをダウロードすればPDFファイルも入手できる。
◇Programming With Navigation Service
 http://devworld.apple.com/techpubs/carbon/Files/NavigationServices/Navigation_Services/index.html
◇ナビゲーション・サービスを使ったプログラミング(日本語)
 http://developer.apple.com/ja/techpubs/pdf/NavigationServicesJ.pdf

まず、CarbonLib環境に移す前に、Classic環境でNavigation Serviceに対応し、動くソースプログラムを作ることにする。そのための基本は、ヘッダーのNavigation.hをインクルードすることだ。このヘッダは、MacHeadersには入っていないようなので、Navigation Serviceの機能を使うソースの頭で必要だ。TextDraw IVでは安直な方法として、すべてのソースでインクルードしているConstants.hというヘッダーにインクルード文を書き加えて、どのソースでもNavigation Serviceの機能を利用できるようにした。

#include        <Navigation.h>           //    (Carbonizing)

次に、Navigation Serviceのスタブをライブラリとして組み込む。リンクしてNavigation Serviceの関数呼び出しを行えるようにするためのもので、比較的最近に登場したシステム機能では、こうしたライブラリの組み込みが必要になる。プロジェクトのウインドウをアクティブにして、「プロジェクト」メニューから「ファイルを追加」を選択し、CodeWarrior Pro 5→Metrowerks CodeWarrior→MacOS Support→Universal→Libraries→StubLibraries→NavigationLibというライブラリファイルを選択する。これで、NavigationLibがプロジェクトに含まれる。CarbonLibを使えば必要なライブラリは全部含まれているということになっているので、NavigationLibをプロジェクトに登録する必要はないのだが、当面はClassicアプリケーションとしてソースを仕上げて行くので仕方ない。

さて、Navigation Serviceに対応するためにソースを書き直す…と行きたいところだが(実際には行ったのだが…)、その前に、openリソースの定義をしておくのが結論的には便利だということになる。openリソースはもともとはTranslation Manager(Inside Macintosh: More Macintosh Toolboxを参照)が利用するリソースではあるが、Navigation Serviceを使う上では、そのアプリケーションがサポートするファイルタイプを定義するリソースとなりうる。言い換えれば、openリソースから「開くことが可能なファイルのファイルタイプを得る」という方法ができ、それがいちばんシンプルなやり方なのである。従来からはこうした情報としてはBNDLリソースやFREFリソースがあり、もちろんそれらはそれらで定義しておかなければなければならない。後から追加されたTranslation Managerの機能をNavigation Serviceが採用したものだと思われる。ちなみに、BNDLリソースはアイコンとの対応に重点があるわけで、それに対してopneリソースはアプリケーションがサポートするファイルタイプと言うものを明確に規定しているものなのである。

さて、そのopenリソースだが、基本的にはID=128で作成する。ただ、ResEditにはテンプレートがないため、Rezのソースを作った方が簡単だろう。openリソースのテンプレートは、Finder.rに定義されている。それを元に、以下のようなopenリソースの定義を記述した(Finder.rのインクルードは必要はないようだ)。TextDrawではSaveAsDialog.rというリソース定義ファイルに以下の記載を追加した。txDCというのは、TextDrawの文書ファイルのフォーマットである。MNiiがTextDrawのアプリケーションシグネチャだ。定義定数で書いてもいいのだが、確定しているものなら、直接書いてしまった方が分かりやすいという気もする。

resource       ’open’    (128)
        {
               ’MNii’,     //アプリケーションのシグネチャ
               {’TEXT’, ’PICT’, ’txDC’}  //サポートするファイルタイプ
        };
【全角のシングルクォーテーションは実際には半角文字で入力してください】

次回はいよいよソースプログラムの改造に取りかかる。
関連リンク