vieweditattachhistorytopchangessearchhelp

第63回


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


本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、MorphicGUIフレームワークが提供する、システムウインドウ(…という複合モーフ)が、マウス操作に対してだけでなく、Smalltalkコードを介したメッセージングに対し、どのように振る舞うかを見てみましょう。

Squeakシステムのアプリケーションはたいてい、システムウインドウを用い、そこに各種機能をサブモーフとして登録することで構築されています。書きかけのメモ帳である「ワークスペース」、クラス定義の閲覧・編集用でお馴染みの「システムブラウザ」、ファイラとエディタを兼ねた「ファイルリスト」など、ALTO時代から続く旧MVC GUIフレームワーク上に構築された古典的なSmalltalkアプリケーションの多くは、新しいMorphic GUIフレームワークへの移行後も、引き続き利用できるように移植されました。

もちろん例外もあって、Morphic GUIフレームワークへの移行後に新たに必要とされて作られたソフトの中には、システムウインドウを使わないものもあります。たとえば、ゴミ箱の中味にアクセスするためのモーフ(ゴミ箱はAppleの発明で、ALTO時代にはありませんでした)や、各種モーフを分類して引き出せるようにする「オブジェクトのカタログ」…などがこれにあたります。この種のソフトでのウインドウ(もどき)の移動やサイズ変更は、コマンドクリックによりモーフとして選択した後、ハローを使って操作します。

さて、話をシステムウインドウに戻しましょう。

前々回の分解や、インスペクタによる解析からもお分かりいただけたように、システムウインドウは、ベースとなる矩形枠とタイトルバーにより構成されています。タイトルバーにはさらに、中央にウインドウタイトル、左側にはクローズボタンとウインドウメニューボタン、右側にはズームボタンと折りたたみボタンがあります。折りたたみボタンというのは、ウインドウをタイトルのみにする、旧Mac OSで言うところのウインドウシェード機能を司るボタンです。余談ですが、ゴミ箱と違い、この機能はALTO/Smalltalkシステムのほうがずっと先(1970年代半ば)です。

前回提示したスクリプトにも含まれていましたが、システムウインドウ(aSystemWindow)というモーフを作って画面に呼び出すには、次のような式を評価(選択して、do it(cmd + D))します。

(SystemWindow labelled: 'Window Title') openInWorld


他の一般的なモーフ同様、カーソルの位置に表示するには、openInWorldの代わりにopenInHandを送信します。

(SystemWindow labelled: 'Window Title') openInHand


新しく作られたウインドウが、マウスポインタについてくる(ピックアップした状態になる)ので、最初にクリックした場所に設置することができます。

もちろん、作ったウインドウをテンポラリ変数に束縛し、そこにメッセージを送っても、まったく同じです。

| window |
window := SystemWindow labelled: 'Window Title'.
window openInWorld


メッセージ「setWindowColor: aColor」をシステムウインドウに送信することで、その色を自由に変えられます。

| window |
window := SystemWindow labelled: 'Window Title'.
window setWindowColor: Color orange.
window openInWorld


ウインドウの色は、あらかじめ設定しておくだけでなく、画面に呼び出した後に変えること可能です。たとえば、次のスクリプトでは、最初、オレンジで現れたウインドウが青色に変化します。変化の様子を把握しやすいように、途中で0.5秒のウエイトを入れてみました。

| window |
window := SystemWindow labelled: 'Window Title'.
window setWindowColor: Color orange.
window openInWorld.

(Delay forMilliseconds: 500) wait.
window setWindowColor: Color blue


同様のことは、ウインドウのインスペクタでも行なえます。開いたウインドウをモーフとして選択(コマンドクリック)したときに現れる灰色のデバッグハローをshiftキーを押しながらクリックするか、次のスクリプトを評価して、ウインドウを束縛したインスペクタをあらかじめ呼び出しておきます。

| window |
window := SystemWindow labelled: 'Window Title'.
window setWindowColor: Color orange.
window inspect; openInWorld


呼び出したインスペクタ下部の作業用ペインで、次のような式を評価することで、先のスクリプト中の式と同じ要領で色を変えることができます。ただ、レシーバがテンポラリ変数のwindowから擬変数のselfに変わっていることに気をつけてください。

self setWindowColor: Color yellow


[fig.A]インスペクタの作業用ペインでスクリプトを実行
Uploaded Image: 63a.png

タイトルバーの各種ボタンをクリックしたときと同じことを、ウインドウへのメッセージングでも行なえます。…というよりは、各種機能ボタンをクリックしたときに、これらと同じメッセージがウインドウに送られる仕組みになっているので、当たり前、といえば当たり前ですね。

"ウインドウを最大化・元に戻すトグル"
self expandBoxHit


"ウインドウを折りたたみ・元に戻すトグル"
self collapseOrExpand


"ウインドウタイトルの変更"
self setLabel: 'Changed Title'


"ウインドウを閉じる"
self closeBoxHit


閉じてしまっても、インスペクタが束縛している限りガベージコレクトの対象にはならないので、再び呼び出すことができます。

"閉じたウインドウの再度呼び出し"
self openInWorld


通常はタイトルバーのドラッグによる位置の移動や、ウインドウ枠境界部のドラッグによるサイズ変更も同様にSmalltalkのスクリプトとして評価可能で
す。

"サイズを変えて、デスクトップ中央に移動"
self extent: 320 @ 240; center: World center


次回は、このシステムウインドウのクラスであるSystemWindowを継承して、ほんのちょっとだけ機能を追加した新しいウインドウを定義してみましょう。

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


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

This page has been visited 844 times.