タイトル小池邦人のプログラミング日記》2001/5/14<Navigation Service 3.0を使う その1>カテゴリーユーザインタフェース, 小池邦人のプログラミング日記
作成日2001/5/14 14:48:24作成者新居雅行
今回から数回に分けて、Carbonアプリケーションへの「Navigation Service 3.0」の実装について解説してみたいと思います。Navigation Service 3.0を使えば、Mac OS Xのファイル保存ダイアログなどを「Sheet Window」として表示することが可能となります。まずは先んじて、Sheet Window自体の挙動も確認してみます。

前回取り上げた「謎」の幾つかについては、読者のみなさんからのメールにより、その解決方法が判明しました。みなさんのご協力に心から感謝いたします。Applicationメニューの「環境設定...」アイテムのハイライトを解除する方法は、EnableMenuItem()の代わりにEnableMenuCommand()を利用すればOKであることが分かりました。ダイアログの表示自体は、予想通りCarbn Eventのハイコマンド(kHICommandPreferences)用Handlerルーチンで処理します。もしアプリケーションがCarbon Event Modelを採用していなければ、CoreEventClassのkAEShowPreferencesに対応するApple Event Handlerを用意して対応することになります。ところで、シリーズ化を狙う「今週の謎」ですが(笑)、今回は「フォントパネルをCarbonアプリから呼び出すにはどうしたらよいのか?」と言う「お題目」を上げておきたいと思います。どこかにコンポーネントでも存在するのでしょうか?もし解決策をご存じの方がいらっしゃいましたら、ぜひご連絡ください。本連載で速やかに紹介したいと思います。

今回お話するNavigation Service 3.0に関する問題点も、読者の方のメールにより見事に解決しました。NavDialogCreationOptions構造体のparentWindowメンバーに親ウインドウ(WindowRef)をセットするだけでダメで、同時に、modalityメンバーにkWindowModalityWindowModalをセットする必要があったようです。おかげで、自作アプリを完全にNavigation Service 3.0に対応させることができました。Navigation Service 3.0の内容の詳細については、以下のApple Carbon Documentサイトにある「Navigation Services for Carbon API Reference」というドキュメントを参照することができます。

◇Navigation Services for Carbon API Reference
 http://developer.apple.com/techpubs/macosx/Carbon/Files/NavigationServices/navigationservices.html

しかし、それよりもCarbon SDKに含まれている「NavSample」というサンプルプロジェクトを参照した方が、より詳しい利用方法を学ぶことが出来ます。

 

このサンプルで使われている「modern.c」というソースファイルに、ファイルオープンやファイル保存に用いるNavigation Service 3.0の使用例が記述されています。このプロジェクトから作成した「NavSampleCarbon」というアプリケーションをMac OS Xで起動してみると、そのメニューの一番右側に「Modern」というタイトルが表示されます。利用者は、そのメニューからファイルのオープンや保存、フォルダの選択や作成、そして保存時のアラート表示など、Navigation Service 3.0が関わる機能の大部分を確認することができます。

 

実は筆者も、NavSampleサンプルの存在自体は、ずいぶんと前から知っていました。このサンプルを参考にして、自作アプリにNavigation Serviceの実装もしたのです。しかし、このサンプルがNavigation Service 3.0対応に書き換えられていることは、読者の方に教えてもらうまで、まったく気づきませんでした。やはり新バージョンのSDKが登場した時には、新しいサンプルが追加されたかどうかだけではなく、旧サンプルの変更点についても注意深くチェックする必要がありそうです。ちょうど数日前、ADCメンバーサイトに「CarbonLib 1.4d5 SDK」が登録されたので(CarbonLibはどこまで行くのだろうか?)、さっそくサンプルプロジェクトのラインアップを、CarbonLib 1.3.1 SDKと比較してみることにしました。

比較には、Finderリスト表示の「修正日」や「フォルダ容量」(表示オプションでONにする)を使うと便利です。とりあえず、今回のSDKで新しく追加されたサンプルは無いようです。各フォルダの修正日を調べると、半分ぐらいは5月7日に更新されていますが、その容量に変化があるのは「BasicPlugIn」「NavSample」「MLTESampleCarbon」「QTShellCarbon」ぐらいで、全体的には大きな変更は無さそうです。

 

続いて、興味の対象となるサンプルのソースファイルについても個々に比較してみました。その結果、今回のNavSampleサンプルは、幾つかの不必要なファイルが外されてはいるのですが、ソースコード自体にはまったく変更点が無いことが判明しました。

Navigation Service 3.0を利用するメリットは、Mac OS Xでの「Sheet Windowによるファイル保存ダイアログやアラートの表示」と「256文字までのファイル名の入力」に対応できることでしょう。当然、Service自体がCarbon Event Modelに最適化されていると予想されますので、Mac OS Xでは旧版の代わりにこちらを利用するのが最善だと思います。ただし、現在のMac OS Xのファイル保存ダイアログは、長いファイル名を入力するのにはまったく向いていません(笑)。ファイル名のカラムに漢字や仮名を入力しながら一度に表示できるのは23文字までです。それ以上入力された文字は、実際に入力はされているのですが消えてしまって見えません。(まあ、そんなに長いファイル名を付ける人も希でしょうが...)ちなみに、Mac OS 9で付けられるファイル名の長さは、日本語の場合で15文字までが限界でした。

Navigation Service 3.0を使う前に、先んじてファイル保存ダイアログやアラート表示に使われている「Sheet Window」の挙動を調べてみることにします。以下に示すサンプルルーチンは、アプリケーションのアバウトを、ドキュメントウィンドウ上のSheet Windowへと表示します。

 

Sheet Windowも通常のウィンドウと同様に、CreateNewWindow()で作成することができます。ただし、引数として渡すWindow Classeには「kSheetWindowClass」を設定しておきます。そしてウィンドウをオープンする時には、ShowSheetWindow()に「親ウィンドウ」(WindowRef)を渡すようにします。Sheet Windowは、親ウィンドウのタイトルバーから降りるアニメーションを実行しながらオープンします。今回のサンプルでは、オープンされたSheet Windowをカレントポートに設定した後に、GetPicture()で呼び出したPICT画像をウィンドウ上に描画しています。この状態でユーザがマウスクリックすると、ウィンドウはタイトルバーへ登るアニメーションを実行しながら閉じられます。Sheet Windowを閉じるのにはHideSheetWindow()を使います。

 

このルーチンをMac OS Xで動かしてみると、Sheet Windowがタイトルバーから降りてくる途中では画像が表示されておらず、完全に落ちきった時点で現れることが分かります。HideSheetWindow()でウィンドウが閉じられる時には、そこに描画された画像も徐々にタイトルバーへと引き込まれて行きます。本当ならば、画像を表示したまま降りて来てくれると美しいのですが、どうもそれは無理のようです。ところが、Navigation Service 3.0によるアラート表示を見てみると、ちゃんとテキスト、アイコン、ボタンといったウィンドウの中身が表示されて降りてくるではありませんか?詳しく調べてみると、どうもウィンドウに配置したコントロールについては、アニメーションが実行中でも表示されているようです。ですから、PICT画像やアイコンなどもコントロールとしてウィンドウに貼り付けておけば、中身を描画しながらの美しいアニメーションが実現できそうです。

それから、CarbonLibアプリケーションならば、Mac OS 9でもShowSheetWindow()やHideSheetWindow()といったAPIを呼ぶことができます。しかし、Mac OS 8/9ではユーザインターフェースとしての機能自体が実装されておらず、Sheet Windowは普通のダイアログとして表示されてしまいます。つまりMac OS 9専用のCarbonアプリケーションでは、Sheet Windowを使う意味はありません。Mac OS 9でもこれらのAPIが実装されているのは、Mac OS X用のソースコードをMac OS 9でも共用できるようにと考慮されたためでしょう。これらについては、これから解説する予定のNavigation Service 3.0でも同様です。Navigation Service 3.0に対応したからといって、Mac OS 9でSheet Windowが表示されるわけではなく、普通のダイアログ表示になることを憶えておいてください。

次回は、自作Carbonアプリケーションのソースコードを参考にしながら、Navigation Service 3.0を実装方法について解説してみたいと思います。
[小池邦人/オッティモ]
関連リンクオッティモ