● ToolBox API徒然草(2005/04/01)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 Navigation Service APIの活用(その5) 〜


今回は、navMyGetFile()から呼ばれているnavGetImportTypeList()とnavMakeTypeList()の2つの自作ルーチンを解説することで、ファイル選択時の「ファイルタイプ」と「拡張子」の混在問題について考えてみます。

特殊なアプリケーション(例えばファイルメンテナンスやユーティリティ関連など)を除き、一般的なアプリケーションでは、ユーザが選択すべきファイルの種類は限定されています。選択しても意味の無いファイルは、ファイル選択ダイアログのブラウザで選択不可(ハイライト表示)にしておくのが、Macintoshユーザインターフェースにおける一般的なルールです。具体的には、選択対象であるファイルタイプの配列(NavTypeList構造体)をNavTypeListHandleへ格納してから、NavGetFile()へ引数として渡してやります。アプリケーション自身で作成されたドキュメントをオープンする場合には、通常そのファイルタイプはひとつで固定されていますので、NavTypeListを作成することは至極簡単な作業となります。しかし、場合によっては、渡すべきNavTypeListの内容やその総数を確定できない場合もあります。

その代表的な例が、様々な画像ファイルをオープンするために「QuickTime Importer」を使う場合です。QuickTimeがバージョンアップする度に、Importerでオープン可能な画像ファイルの種類は増加していきました。つまり、インストールされているQuickTimeのバージョンにより、対応ファイルの種類の総数が異なるわけです。まあ、「オープンするファイルはPICT、TIFF、JPEG、8BPS(Photoshop)だけに固定だ!」と決めつけてしまえば、その4タイプをNavTypeListに代入するだけで済むので話は簡単です。しかし、それではせっかくのImporterの強力な能力を制限してしまうことになります。それを避けるのためには、現バージョンのQuickTime Importerでオープンできるファイルタイプの種類と総数を、リアルタイムで把握する必要があるわけです。

以下が、QuickTime Importerによりオープン可能なファイルタイプの種類と総数を返すnavGetImportTypeList()ルーチンです。仕組みは簡単でして、Importerが取り扱い可能な画像ファイルは、それを処理するためのコンポーネント(システムモジュール)に一対一で対応していますので、それを順次読み出して、そこからファイル情報を得るわけです。



何らかの操作(例えばDrag&Drop)で得られたファイルタイプが、Importerでオープン可能な種類かどうかを判断するには、以下のような簡単なルーチンを用意すればOKです。



おまけとして、「QuickTime Exporter」で取り扱い可能な画像ファイルタイプの一覧を得るためのnavGetExportTypeList()ルーチンを紹介しておきます。QuickTime Exporterは、メモリ(CGrafPortやGWorldなど)上に展開した画像データを、指定タイプの画像ファイルとして保存する場合に活用します。



こうして得られたOSTypeの配列を、NavTypeListHandleへ保存するのがnavMakeTypeList()ルーチンです。与えられたファイルタイプの総数から必要とされるメモリ容量を計算し、NewHandleClear()でHandleを確保した後に、ファイルタイプをひとつずつ代入します。ちなみに、NavTypeList構造体はヘッダーファイルのNavigation.hに以下のように定義されています。NavTypeListHandleを確保する場合には、OSTypeの配列箇所が総数分増えるとみなし、その容量を計算するわけです。



ここで注意する点は、上記のような操作で得られたNavTypeListHandleをNavGetFile()に渡したとしても、「拡張子」でしかその種類を判断できないファイルには選択表示処理が適応されないということです。本当ならば、「'JPEG'ファイルタイプは表示する!」と設定しさえすれば、Navigation Service側で対応データベースを参照し、ファイルタイプが付加されていないファイルであっても、拡張子が'.jpg’や'.jpeg'のファイルは選択対象だと「賢く判断」してくれるのが人の道でしょう(せめてImporterやExpoterが対応しているファイルぐらいは...)。残念ながら、現状のNavigation Serviceはそれほど賢くないため、開発者側で面倒な前処理や後処理を追加する手間が発生してしまいます。

次回は,今回説明できなかったもうひとつの自作ルーチンnavCheckImportExtention()を紹介し、それをNavGetFile()のフィルター内で使うケースを解説します。また、拡張子もファイルタイプもない画像に遭遇した時、そのファイルがオープン可能かどうかを判断するための簡単な手段も紹介したいと思います。


copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp