簡易ワークスペースを作る

やっぱり新しいバージョンのSeaSideが使えるsqueak版に乗り換え

80番起動

一旦停止させて80番で再起動

KomSeasideJ stop.
KomSeasideJ startOn: 80.

今回のコード

formを作ろう

http://d.hatena.ne.jp/minekoa/20061002/1159813201

目的そのままなので、ここに載っているサンプルを利用させていただくことにする。

WAComponent subclass: #WebWorkspace
    instanceVariableNames: 'values'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'MySeasideTutorial'

initialize
    values := ''

renderContentOn: html 
    html form:
        [html textAreaWithValue: values asString callback: [:v | values := v].
        html break.
        html submitButtonWithAction: [values := Compiler evaluate: values ] text: 'do it']

エラー

実際に動かしてみるとこんなエラーが出る。

MessageNotUnderstood: WARenderCanvas>>textAreaWithValue:callback:

以下試行錯誤。
ウェブブラウザのDebugのリンクを押すと、Squeak側でデバッガが起動。
デバッガを1段階戻してrenderContentOn:の画面にする。
デバッガでhtmlオブジェクトを選択すると中身は、WARenderCanvasのインスタンスであることがわかる。
そこで右クリックしてbrowse hierarchyを見ると、ProtoObject→Object→WACanvas→WAHtmlCanvas→WARenderCanvsとなっていることがわかる。

一方、Imprementors ofで、textAreaWithValue:callback:を探すと、WAHtmlRendrerクラスのみにメソッドがあることがわかる。
hierarchyボタンを押すと、ProtoObject→Object→WAAbstractHtmlBuilder→WAHtmlRendererとなっている。

別の階層ツリーになってるので、確かにこれだとメソッドが見つからないはずだ。

解決策

WAComponent>>rendererClassをオーバーライド
・WAHtmlRendererを使うこともできるがレガシー扱い
・WARenderCanvasのほうが綺麗に書ける。2.7からデフォルト

という情報により、以下のメソッドを追加したら動いた。

rendererClass
    ^WAHtmlRenderer

が、レガシー扱いか。
WARenderCanvasの方に同等の機能できれいに書けるメソッドがあるのかな?