エディタについて色々調べてきたけど、Squeak のエディタである ParagraphEditor も結構良い仕事をしている事が分かったのでメモ。
Workspace で何度か中ボタンを押すと、Text1 のような名前のオブジェクトを選択できる。Text1 は TextMorphForEditView のインスタンスで、Morphic の世界でテキストを保持する役目を持つ。
実際にテキストを持っているのは paragraph 変数にある MultiNewParagraph。このオブジェクトが、テキスト本体と表示に使うレイアウト情報を持っている。
TextMorphForEditView はもう一つ editor に TextMorphEditor (ParagraphEditor のサブクラス)を持っていて、これがユーザ入力を MultiNewParagraph に反映させる。つまり、MVC で言うとこうなっている。
- Model: MultiNewParagraph (テキストとレイアウト情報を持つ)
- View: TextMorphForEditView (Morphic World の中での位置を持つ)
- Controller: TextMorphEditor (MultiNewParagraph 変更を行う)
テキストデータは、MultiNewParagraph の中で文字列として持っている。つまり、文字の入力があるたびに replaceFrom:to:with:displaying: で毎度文字列とレイアウト情報を作り直すわけだが、意外と数万文字程度でも快適に使えている。
カーソルの表現は、MultiNewParagraph の中の startBlock と stopBlock によって行う。ややこしいが、カーソル位置にあるのが startBlock で、選択開始位置にあるのが stopBlock だ。表示上は文字列の間にカーソルが現れるが、内部表現は文字そのものをインデックスで指している。カーソルは、指している文字の前に表示される。つまり、文字列の最後を指す時、例えば文字列が三文字だと、インデックスは4を指す。
いやな感じがするのが、モデルである MultiNewParagraph の中にレイアウト情報が含まれている事。最近は国際化の事もあり文字列を表示するのに色んな事を気にしないといけないご時勢なので、表示情報はモデルの外に出したい物だ。