vieweditattachhistorytopchangessearchhelp

第56回


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


本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、ウインドウやメニューなどのGUIウィジェットの成り立ちを理解するうえで欠かせない「サブモーフ化」についてです。


▼サブモーフ化とは
サブモーフ化というのは、簡単に言ってしまえば、あるモーフに別のモーフをくっつけて一緒に移動できるようにすることです。イメージとしては、ドロー系ソフトのオブジェクトのグループ化に似ています。ただ、登録する側、される側…というようにいわゆる“親子関係”がはっきりしている点で異なります。“子”に当たるモーフを「サブモーフ(submorph)」と呼び、逆にサブモーフに対して“親”にあたるモーフのことは「オーナー(owner)」といいます。


▼GUI操作でのサブモーフ化
まずサブモーフ化という概念を具体的にイメージしやすいように、GUI操作を使ってサブモーフ化を実際に試してみましょう。

ここでは、四角形モーフ(a RectangleMorph)と楕円モーフ(anEllipseMorph)を用意し、楕円を四角形のサブモーフにしてみます。四角形モーフと楕円モーフはそれぞれ次の式をdo it(cmd + D)して作ることができます。

RectangleMorph new openInHand

EllipseMorph new openInHand


これらのモーフは、GUI操作で画面右下の「部品」フラップから取り出すことも可能です。「部品」タブをクリックしたりドラッグしてフラップ(引き出し)を開き、デスクトップにドラッグ&ドロップします。

[fig.A]四角形モーフと楕円モーフ
Uploaded Image: 56a.png

サブモーフ化にあたり、まず、サブモーフ化したいモーフのオーナーに対する位置を決めておおきます。今は、四角形の中心よりほんの少しだけ右下に置くことにしましょう。楕円モーフはクリックでピックアップすることが出来るので、この操作により持ち上げて、ねらった位置でクリックしてそこに置いてください。なお一部の例外を除き、サブモーフ化したいモーフは、原則としてオーナーの手前になければいけません。

[fig.B]楕円モーフをねらった位置へ
Uploaded Image: 56b.png

次に楕円モーフをコマンドクリック(コマンドキーを押しながらクリック。ブルーボタンクリックとも呼びます)で選択し、現れた赤色ハローをクリックしてポップアップする「埋め込む先...」サブメニューを呼び出します。そのメニューには「ワールド」と「四角形」があるはずなので「四角形」のほうを選びます。これでサブモーフ化の作業は完了です。

[fig.C]楕円を四角形のサブモーフにする
Uploaded Image: 56c.png

ちなみに「ワールド」とはモーフとしてのデスクトップのことです。Smalltalk言語を通じてアクセスする場合は、ActiveWorldとかWorldというグローバル変数に束縛されているので、いつでも参照可能です。これは後に出てくるスクリプトでも使っています。


▼サブモーフ化されたモーフの選択のしかた
いったんサブモーフ化されると、通常、そのモーフはオーナーと一体化します。つまりこの場合、楕円部分をクリックしてピックアップしようとしても、オーナーの四角形ごとピックアップされてしまい、楕円単体でピックアップすることができなくなります。同様にコマンドクリックによる選択もオーナーの選択に代えられてしまいます。

改めてサブモーフのみを選択するには、楕円をいったんコマンドクリックしてオーナーである四角形が選択されるのを確認したあと、もう一度、楕円をコマンドクリックします。なお、この操作のショートカットとして、シフトキーを押しながらコマンドクリックすることでねらったサブモーフを一発で選択する方法も用意されています。

[fig.D]サブモーフを選択
Uploaded Image: 56d.png

余談ですが、この楕円のようにサブモーフ化されたモーフを扱う際に、黒色ハローと茶色ハロー差がはっきりします。もしこの局面で、楕円の黒色ハローをクリックしてしまうと、楕円のサブモーフ化は解除されてしまいます。サブモーフ化を解除せずに楕円のオーナーとの位置関係を変えたい場合は、茶色ハローをドラッグする必要があります。


▼スクリプトでサブモーフ化
サブモーフ化のイメージをつかめたところで、まったく同じ作業をSmalltalkのコードで表現してみましょう。ざっと書き下すと、次のような感じになります。

| rectangle ellipse |
rectangle := RectangleMorph new.
rectangle center: ActiveWorld center.
ellipse := EllipseMorph new.
ellipse center: rectangle center + 10 asPoint.
rectangle addMorph: ellipse.
rectangle openInWorld


メッセージ「center: ポイント」は、モーフの中心の位置を決めるためのものです。先に述べたようにActiveWorldはモーフとしてのデスクトップを束縛しています。他方で、メッセージ「center」はモーフの中心の座標を得るためのものです。これらをまとめると、「rectangle center: ActiveWorldcenter」という式は、rectangleを画面の中心に据えることを意味していることがわかります。

サブモーフ化には「addMorph: サブモーフ化したいモーフ」というメッセージをオーナーとなるモーフに送ります。「openInWorld」はモーフを画面上に表示するためのメッセージです。

ワークスペースなど文字を入力できる場所で、上のようにタイプするか、このメールからコピー&ペーストして、全体を選択したのちdo it(cmd + D)してみましょう。画面中央に先ほどGUI操作でこしらえたのとほぼ同じ、楕円がサブモーフ化された四角形が現れるはずです。

[fig.E]四角形に楕円をサブモーフ化するスクリプトと評価結果
Uploaded Image: 56e.png

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


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

This page has been visited 816 times.