vieweditattachhistorytopchangessearchhelp

第68回


■SqueakではじめるSmalltalk入門   第68回


本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、簡易GUIビルダを作成します。今回のテーマは、ウインドウメニューへのメニュー項目の追加です。

ウインドウメニューは、ウインドウのタイトルバー左寄り、クローズボタンの右隣にあるボタンをクリックしたときにポップアップするメニューのことです。このメニューには、モデル(a SystemWindowのインスタンス変数「model」に束縛されているオブジェクト)を通じて、好きなメニュー項目を追加することができます。作成中のGUIビルダでは、このメニューに、ウィジェットを追加したり削除するためのメニュー項目を設ける予定です。

手近なところでは、ワークスペースのウインドウメニューに項目が追加されています。どんなふうにしてそれを行なっているのか、参考にするため、しくみを調べてみましょう。


▼ワークスペースで追加されている項目の確認

まずは、デフォルトの状態。まさに「GUI Builder」ウインドウがそうなのですが、特に項目が追加されていない場合、次図のようなメニュー項目が現われるはずです。

[fig.A]デフォルトの項目のみのウインドウメニュー
Uploaded Image: 68a.png

次に、ワークスペース。デスクトップをクリックしてデスクトップメニューを呼び出し、cmd + K(あるいは、「開く…」→「ワークスペース」)でワークスペースを呼び出してから、ウインドウメニューボタンをクリックしてください。

[fig.B]ワークスペースのウインドウメニュー
Uploaded Image: 68b.png

4つのメニュー項目(正確にはさらに二本の区切り線)が追加されていますね。以上のメニュー項目が、どのようなメソッドを介して追加されているのかを調べるのには、すでに学んだ方法を駆使するいくつかの方法(よかったら、復習がてらにチャレンジしてみてください)がありますが、今回は、メニュー項目の文字列を手がかりにした、別の新しい方法をご紹介します。


▼メニュー項目の文字列を手がかりに関連メソッドを手繰る

すでに第57回ごろに学んだとおり、メニュー項目の追加は、通常、メニューオブジェクト(a MenuMorph)にメッセージを送信し、#add:target:action:などのメソッドを起動させることで行なわれます。このことは、たとえば「savecontents to file...」というメニュー項目を作る式(あるいは、そのとき送信されるメッセージ)には、'save contents to file...'という文字列リテラルが含まれている可能性が高いことを意味します。

ところで、Smalltalkシステムには、ある文字列リテラルを含むメソッドを探し出して列挙してくれる便利な機能が用意されています。シフト黄ボタンメニュー(黄ボタンメニュー→「さらに…」。英語ではmore...)にある「メソッド中文字列の部分」(英語では、method strings with it)で起動することが可能で、そのとき選択されている文字列が対象とされます。キーショートカットはcmd + shift + Eです。

つまり、メニュー項目の文字列を指定して、このサービスを利用すれば、注目
するメニュー項目を定義しているメソッド、あるいは、それに深い関わりを持
つ可能性が高いメソッドを列挙することが可能…というわけです。

ここで、さらにもうひとひねり。Squeakシステムで使われているポップアップメニューには、shiftキーを押しながら項目をクリックすると、そのメニュー項目をテキストとして選択可能…という、何に使うのかよく分からない、ちょっと変わった挙動を示します。この性質を先のcmd + shift + Eと組み合わせてみましょう。

[fig.C]shiftクリックで選択されたメニュー項目のテキスト
Uploaded Image: 68c.png

図のように、メニュー項目をテキストとして選択した状態にしてから、先に紹介したcmd + shift + Eをタイプしてみてください。結果、システムは、文字列「save contents to file...」について、ParagraphEditor class >> #shiftedYellowButtonMenuとWorkspace >> #addModelItemsToWindowMenu:の二つのメソッドがこれを含むことを見つけてきてくれます。念のため、我々が探しているメソッドは後者です。

[fig.D]「save contents to file...」を含むメソッド一覧
Uploaded Image: 68d.png

たった2アクションでこんな情報にアクセスできるなんて、Smalltalkというのは、まさに“なんでもあり”のシステムですね(笑)。ただし、残念ながら、メニュー項目が日本語の場合はこのTIPSは使えないようなので、他のメニュー項目で試してみたいときは、デスクトップメニュー→「ヘルプ…」→「言語を設定…」でEnglishを選んで言語を切り替えておく必要があります。

さて。当初の目的である「ウインドウメニューへ項目の追加」のためには、モデルの属するクラス(ワークスペースなら「Workspace」、作成中のGUIビルダなら「GuiBuilder」)に、#addModelItemsToWindowMenu:を定義して、パラメータとして与えられているaMenuにメニュー項目を追加すればよさそうなことが分かりました。

余力があれば、この、Workspace >> #addModelItemsToWindowMenu:の定義を変更(たとえば、メニュー項目の文字列を変更したり、新たにメニュー項目を追加するなど)して、実際に影響が及ぶかどうかを試してみるのも面白いでしょう。分解して仕組みを調べて学んだり、遊んだりできるのが“暫定ダイナブック環境”の醍醐味ですから、これを実践しない手はありません。

GuiBuilderへの#addModelItemsToWindowMenu:の追加は、次回。

このページを編集 (4597 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 890 times.