あまつぶ

7.29 【メニューの階層化】

 QT-Qのスクリプトメニューの階層化に手をつけてみた。メニューIDとディレクトリIDの対応をさせないといけないのが面倒だなと思っていて今までかかってしまったのだが、やってみたらたいしたことはなかった。それより前に、メニューに項目を追加する時にそこからサブメニューが出るように変更してやるところでつまずいてしまったのだが(笑)。

 メニューに項目を追加するのはInsertMenuItem()などを使えばできる。ここまではこれまでにも使ってきたからなんということはない。で、追加した項目(アイテム)にサブメニューをつないでやるにはどうしたらいいのだろう。リソースでメニューを作る時はResEditで指定しておくだけでいいのだが……。
 ResEditで編集する時には、サブメニューにした時点でショートカットの指定とチェックマークの指定ができなくなる。ということは、このあたりに情報を格納すればいいのだろうか。MENUリソースをHex Editorで見てみるとまさにそんな感じだ。が、まあ、IM(Inside Macintosh)を頼ろう。Menu Managerを読むと……、Mac Toolbox Essentialsの3-53(Menu Manager A.pdfのP49)の下の方にそれらしいことが書いてある。ショートカットを指定する部分に「hierarchicalMenu」を(Universal Interfaces 3.3.1ではhMenuCmdになってる)、チェックマークを指定する部分にメニューIDを指定すればいいらしい。
 ショートカットはSetItemCmd()、チェックマークはSetItemMark()でそれぞれ指定するだけ。
 あとは、フォルダの中身を順に見ていって、フォルダを見つけたらその下を……っていう再帰ルーチンを書くだけ。IDが重複しないようにと、ディレクトリIDとメニューIDの対応を持たせるためにうちではグローバル変数を使った。

 そうだ。サブメニューのIDは、アプリケーションでは1から235を使い、デスクアクセサリでは236から255を使えと上記のページの次のページに書いてある。デスクアクセサリ云々というのは今となっては関係ないのだろうが、255までという制限はなんなのだろう。とりあえず、よくわからないが、うちのプログラムでは201から255までだけを使うことにしておいた。ま、55個もサブフォルダを作るなんてことはあまりないだろうし。
 それから、こちらはMenuManagerの制限か、サブメニューは最初のメニューから数えて5つまでしか作ることができない。これは他のアプリケーションや機能拡張が表示してくれるものでもそうだから別に問題ないとは思うけど。内容が表示できないのにサブメニューの表示が出てしまうのはかっこわるいから、そのあたりをちょっといじるくらいかな。

 任意のフォルダ内のファイルを階層メニューで表示することができるようになったので、Phutなんかにも移植(?)しようかななどと思う。ただまあ、FinderPopに頼むという姑息な手段で一応実現してあるからあんまりいらないような気もしつつ。


July 22, 2000 ↑ July index → August 12, 2000