Finderでは、ウィンドウタイトル右上の長細いボタン(Toolbarボックス)をクリックすると、そのすぐ下にアイコンなどが降りてきます。それがToolbarです。タイトルバーのすぐ下にアイコンやラベル(アイテムと呼ぶ)を並べ、それらをマウスクリックすることで何らかの機能を実行させるために用意されたユーザインターフェイスです。もう片方のDrawerとは「引き出し」のことです。親ウィンドウの上下左右から子ウィンドウをせり出させ、必要に応じて機能を追加できるようにします。こちらのユーザインターフェイスは、Mailアプリケーションの「メールボックス表示」などで採用されています。
どちらもCocoaのみで採用されていたユーザインターフェイスでしたが、「CocoaとCarbonの機能統合を進める!」と宣言したApple社の方針により、Mac OS X 10.2からCarbon環境でも利用可能となりました。ただし、Toolbarの挙動やDrawerのフラーム形状など、Cocoaバージョンと若干異なる点もいくつかあります。しかし、こうした差異も徐々に吸収され、近い将来には「API名は別だが元をたどれば同じコードで処理されている」といった状況になると予想されます。今回は、Toolbarを装備した親ウィンドウをひとつ用意し、そのアイテムをクリックすることで、右側にせり出すDrawerウィンドウを切り替えてみたいと思います。
まずは、Interface BuilderでToolbarを装備する親ウィンドウ(MainWindow)と、そこからせり出す2つのDrawerウィンドウ(Drawer_1とDrawer_2)のNibファイルを作成しておきます。MainWindowの方は、情報設定ウィンドウでButtonsの「Toolbar」をチェックしておいてください。Drawerウィンドウの方は、Window Classに「Drawer」を選び、Attributesとして「Compositing」をチェックしておきます。これのチェックを忘れていると、どうしたことか、Drawerは親ウィンドウから正常にせり出しません(単なるCarbonのバグなのかもしれませんが...)。
まずは、親ウィンドウを作成するopenMyWindow()ルーチンからです。NibファイルからMainWindowを呼び出し、InstallWindowEventHandler()でCarbonEvent HandlerをインストールしてからShowWindow()を実行します。その後、setupMyToolbar()でToolbarの作成を行い、ShowHideWindowToolbar()でそれを表示させます。このAPIの2番目の引き数は表示と非表示を指示する値(1かゼロ)であり、3番目はアニメーション表示をさせるかどうかを指示する値(1かゼロ)です。最後に、ディフォルトでせり出しておくDrawerウィンドウ(ID=1)を、openMyDrawerWindow()ルーチンにより表示して作業は終了です。Drawer関係のルーチンについては、次回に詳しく解説します。

次は、親ウィンドウにインストールされているCarbonEvent Handlerルーチンを見てみます。Toolbar上のアイテムがマウスクリックされると、kEventProcessCommandイベントが発生し、その種類はアイテムに割り付けられたHICommandで判断できます。今回の設定では、その値が1であれば1番目のアイテムが、2であれば2番目がクリックされたことを意味します。今とは別のDrawer用アイテムがクリックされていれば、switchMyDrawerWindow()ルーチンを実行し、指定されたID番号のDrawerに切り替えます。もしそれが現在表示されているのと同じID番号のDrawerであれば、それを閉じるようにします。

setupMyToolbar()ルーチンは、親ウィンドウのToolbarを準備します。HIToolbarCreate()でHIToolbarItemRef(tbar)を得たら、アイテムに表示するラベルやアイコンを1つ1つ追加して行きます。今回は、HIToolbarItemCreate()により「Item1」「Item2」の2つのアイテムをで作成しています。アイテムのラベル名は「Drawer(1)」と「Drawer(2)」とし、HIToolbarItemSetLabel()で登録します。それぞれがクリックされた時にCarbonEvent Handlerへ送られるHICommandの方は、HIToolbarItemSetCommandID()で設定します。今回は、Item1には「1」を、Item2には「2」を設定していることが分かります。

アイテムに表示するアイコンの方は、HIToolbarItemSetIconRef()を使い登録します。今回のアイコンはシステムからの借用であり、表示内容は実際の機能とはまったく関係ないので注意してください。本来なら、こうしたアイテムについてもInterface Builderで編集できることが望ましいのですが、残念ながら現状は不可能です。次期バージョンには期待したいと思います。HIToolbarAppendItem()により、すべてのアイテムの追加が完了したら、ToolbarをSetWindowToolbar()で親ウィンドウに実装して作業は終了です。
ToolbarやDrawerに関係するAPIが定義されているUniversal Interfacesは、MacWindows.hです。ただし、CarbonLib 1.6 SDKに含まれるヘッダファイルのバージョンは古いので、これらについての記載は存在していないと思います(多分)。そんな時には、Mac OS X 10.2.xのCarbon Frameworkに付属しているヘッダファイルの方を参照してください。
ToolbarやDrawerについての技術資料としては、以下のサイトからダウンロードできる「Handling Carbon Windows and Controls」(176ページ 3.7MB)というPDFドキュメントが参考になります。ファイル名は「windowscontrols.pdf」です。
http://developer.apple.com/techpubs/macosx/Carbon/HumanInterfaceToolbox/WindowManager/windowmanager.html
次回は、ToolBarアイテムをクリックした時のDrawerの切り替え作業について解説したいと思います。
copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp