● ToolBox API徒然草(2003/12/19)

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

 〜 HIViewを利用したテキスト編集(前半) 〜


Mac OS XのCarbon Frameworkでは、デスクトップに表示されるウィンドウ、コントロール、メニューといったオブジェクトの描画に対し、HIViewという仕組みが導入されています。Mac OS X 10.2までは道半ばで実装も中途半端でしたが、Mac OS X 10.3になり実用可能なレベルまで完成度が上がりました。HIViewが導入された理由は、QuickDrawを利用して各マネージャが独自に描画していたオブジェクトを、Quartz 2D(Core Graphics)による描画に切り替え、その仕組や取り扱い方法を統一することで、効果的にQuartz 2Dの描画能力(半透明やコンポジット描画)を引き出すためです。

もともとHIViewという考え方は、Cocoa Frameworkで一般的に利用されていたものです。そのおかげで、CocoaにはCarbonには存在していなかったToolBarやDrawer、そしてScroll ViewやSplit Viewといった有用なユーザインターフェース用オブジェクトが最初から実装されていました。Apple社は、CarbonとCocoa両アプリケーションでの機能差を無くしたいと考えていますので(道を一本にしたい)、Carbon FrameworkにもHIViewの概念を導入してCocoa Frameworkとの差異を解消するように試みているわけです。

そうした経緯から、Apple社としてはCarbonアプリケーションでのHIViewの利用を普及させないといけないわけで、デベロッパのサンプルソースコードサイトには数多くのHIView関連サンプルが登録されています。今回は、その中の「HITextViewShowcase」というサンプルをもう少し分かりやすくアレンジ(笑)して紹介します。このサンプルは、左右、上下スクロールバ付きのテキスト編集ウィンドウを表示するアプリケーションです。

最初に、HIView用オブジェクトを含むNibファイルを読み込むことでテキスト編集ウィンドウをオープンさせるnibTextScrollView()ルーチンを紹介します。



この場合には、先んじてInterface Builderで必要となる各種HIView用オブジェクトを用意しておく必要があります。Interface Builderでmain.nibというファイルを作成し、そこにウィンドウオブジェクトの「MainWindow」を登録します。この時、ウィンドウのアトリビュートとして、「Live risize」「Standard handler」「Compositing」をチェックしておいてください。そのウィンドウの上にText Viewをひとつ登録し、アトリビュートとして「Always Wraps at View Edge」と「Don't Draw Caret When Inatctive」をチェックしておきます。また、InfoウィンドウのControlタグで、Signature:に'text'をID:に1を代入しておきます。

このラベル付けにより、Text ViewのHIViewRefをHIViewFindByID()により簡単に呼び出すことが可能となります。続いてText Viewを選択し、Layoutメニューの「Embed in」から「Scroll View」を実行します。これにより、Scroll View内にText ViewがEmbed(埋め込み)されます。最後にScroll Viewを選択し、Infoウィンドウの「Layout」タグでScroll Viewの位置(Binding to parent)を親HIView(今回の場合はウィンドウ)のTop、Left、Bottom、Rightと一致するようにします。この設定により、親ウィンドウをリサイズしたとしても、Scroll Viewのフレームはいつもそれと同じサイズを保つように調整されることになります。

テキストのセットには、MLTE(Multilingual Text Engine)のAPIであるTXNSetData()を利用しています。テキスト処理の対象を示すTXNObjectは、HITextViewGetTXNObject()により得ることができます。つまり、Scroll Viewに埋め込んだText Viewに対して何らかのテキスト操作をしたい場合には、MLTE APIを呼べば良いことになります。テキストのファイルからの読み込みやファイルへの保存なども簡単に実現できます。今回用いたNibファイルの内容を詳しく調べてみたい方は、「HITextViewShowcase」サンプルに含まれるmain.nibをInterface Builderでオープンしてみてください。
http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_X_HIToolbox/HITextViewShowcase.htm

こうしたHIViewのAPIの中には、Mac OS X 10.2や10.3以降でしか利用できない物が沢山あります。自作アプリケーションで最新のHIView APIを利用したいのならば、以下のようにGestalt()でシステムのバージョンをチェックして処理を切り分ける必要があります。下の例題では、Mac OS X 10.3以降でしかアプリケーションが起動できないように制限しています。



次回は、NibファイルのHIView用オブジェクトを読み込むのではなく、HIViewのAPIのみを用いて今回とまったく同じ処理を実現してみます。

HIViewについてはUniversal InterfacesのHIView.hを参照してください。またMLTEに属するAPIは、MacTextEdit.hに記載されています。Control ManagerとHIViewの機能を比較検討したい時には、テクニカルノートTN2074「HIView APIs vs. Control Manager APIs」を参照すると良いでしょう。


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