







第61回
■
■SqueakではじめるSmalltalk入門 第61回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。
前回まで4回にわたってポップアップメニューを“解剖”し、それがモーフの組み合わせで構成されていること、メニュー項目モーフ自身が、マウスで選択されたときに実行すべきことを「ターゲット」と、それに送る「メッセージ」(厳密には「セレクタ」とそれに添える「パラメータ」)というかたちで情報を保持していることを確かめました。ずいぶん間が開いてしまいましたが、当初のお約束通り、次は「ウインドウ」の番です。
ウインドウもまた、ポップアップメニュー同様、枠、あるいは土台となるオーナーモーフと、細部を構成するたくさんのサブモーフからできあがっています。Squeakのウインドウは、MacやWindowsのウインドウに大まかなデザインが似せてあり、その構成成分や役割も(前回までのポップアップメニューよりは)身近でイメージしやすいと思います。そこで、サブモーフの選択や操作方法の復習を兼ねて、ちょっとしたイタズラ気分で、ウインドウを文字通りバラバラに分解してみることにしましょう。
“生け贄”にはワークスペースを選びます。デスクトップメニューから「開く…」→「ワークスペース」を選択して、ウインドウを開いてください。
ウインドウに対する一回目のコマンドクリックでは、そこにあるモーフ(オーナーモーフ。ウインドウなら外枠)が選択状態になります。モーフは選択されるとハローが周りに現れます。
[fig.A]モーフとして選択されたウインドウ

この状態で再度クリックすると、クリックした場所にあるサブモーフが選択されます。たとえば、タイトルバーをクリックすれば、タイトルバーを構成するモーフの周りに改めてハローが現れます。このとき、それまでウインドウの周りにあったハローは消え、選択対象が移ったことを伝えてくれます。
[fig.B]サブモーフとして選択されたタイトルバー

この状態で、黒色のハローをクリックして“持ち上げる”と、タイトルバーをウインドウから“切り離す”ことが可能です。こうして、タイトルバーを一度取り外してしまうと(つまり、オーナーモーフであるウインドウ本体との関係を断ち切ると)、ドラッグしてウインドウを動かしたり、逆にウインドウの動きに追従することはできなくなります。
このタイトルバーもやはりサブモーフより成っています。コマンドキーを押しながら連続でクリックして選択した後、先ほど同様、黒色ハローをクリック、あるいは、ドラッグすることで部品として組み込まれたサブモーフたちを次々と取り外してゆくことが可能です。タイトルはテキストのモーフ、ボタンはボタンモーフとスケッチモーフの組み合わせ、タイトルバーの濃淡は2つの明度の異なる矩形モーフの組み合わせで表現されていることがお分かりいただけることと思います。
テキストを入力したり表示する部分についても、同様のことが可能です。タイトルバー以外の領域には「プラガブルテキスト」というテキスト入力欄のモーフが設置されています。プラガブルテキストモーフは、さらにその右端にスクロールバーをサブモーフとして持ち、そのスクロールバーは、矩形モーフやボタンモーフの組み合わせで構成されています。
[fig.C]ほとんどすべてを分解したウインドウ

このようにとことん分解してしまえば、もちろん、ウインドウのいくつかの機能は失われてしまいます。しかし、それでも、スクロールバーのボタン群やスクロールボックスなどは、健気にその役割を演じ続けます。なにかこう、オブジェクトの“生命力”のようなものすら感じられてきそうですね。
では、このウインドウはいったん破棄して、別の角度からモーフとしてのウインドウを解析してみましょう。なお、バラバラにしてしまったウインドウは、それぞれのモーフをコマンドクリックして改めて選択し、×印ハローのクリックで削除可能です。また、一括して選択し、削除してもよいでしょう。隣接する複数のモーフを一括して選択するには、選択したいモーフを囲むようにshiftキーを押しながらマウスをドラッグして青枠の矩形を描きます。削除したいモーフだけが選択されていることを確認した後、×印ハローをクリックすれば、青枠の矩形内のモーフはいちどきに削除できます。なお、あとでイメージを保存せずにSqueakを終了すれば、結果的に破棄したも同然なので、面倒ならば(多少邪魔になりますが…)そのままでも結構です。
再び新しいワークスペースを開いて、コマンドクリックでモーフとして選択し、今度は、灰色のデバッグハローをshiftキーを押しながらクリックすることでウインドウのインスペクタを開きます。
[fig.D]ウインドウのインスペクタ

ポップアップメニューのときと同様に、submorphsというインスタンス変数には、サブモーフが配列の要素として束縛されているのが見てとれるでしょう。第一階層のサブモーフは、さきほどの分解でもおわかりいただけるように、タイトルバーとテキスト入力欄の2つです。
インスペクタのワークスペース(下のペイン)で、
submorphs do: [:each | each inspect]
とタイプして入力し、do it(cmd + D)すると、タイトルバーとテキスト入力欄、それぞれのモーフのインスペクタを開くことができます。そこにあるsubmorphsの中味をたどることで、先ほど実際に分解したのと同じ情報を、今度はウインドウを破壊せずに得ることができます。
このページを編集 (4622 bytes)
 |
以下の 1 ページから参照されています。 |
This page has been visited 774 times.