[スレッド全体]

2008/5/25 (日) 03:26:55 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5299] 水平スクロールバーを常にテキストの幅に合わせる
A) 水平スクロールバーを常にテキストの幅に合わせる
B) 常にウィンドウの幅で折り返す

上記の機能を実験的に作ってみました(ダウンロードページの10-5.)
しかし、速度の問題と分割ウィンドウでの表示の問題があります。

■速度の問題
A:入力毎に全ラインを走査してテキストの最大幅を求めています。そしてAdjustScrollBars()でそれを使っています。
B:OnSize()にて折り返し位置の変更を呼び出しています。こちらの方が負荷が高いです。

これをAthlonXP-M3000, mem DDR1GB, Win2k SP4のデスクトップ環境で試してみました。
A:10万行程度までなら使えそうな感じ。
B:1万行までなら大丈夫そう、2万行あると遅さが分かる。
  5万行では明らかに遅い。書き直しに1秒程掛かる。

■分割ウィンドウの問題(Bのみ)
左右に分割すると、左側のウィンドウが右側のウィンドウサイズで折り返されます。
折り返し幅は1つしかないので処理順の都合でこの様になります(と思う)
こちらは今のままだとちょっと致命的ですかね?左右に分割すると問題ありますよ、で押し通したい所ですが……


一応タイプ別オプション→スクリーン→レイアウトの所にオプションを追加して選択できるようにしてみました。
また、Ctrl+Alt+Uでの折り返しの変更については、AまたはBが選択されている時はA,Bのトグルとしました。

こんな感じですが、この機能使えると思います?
Patchesに載せる価値あるでしょうか?

http://www.geocities.jp/nasukoji_7/download/download_sakuraeditor.html


2008/6/4 (水) 20:05:58 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5323] Re:水平スクロールバーを常にテキストの幅に合わせる
ツリーが深いのでここへ繋げます。
修正版をアップしました。
 080604_01_TextWrapControl_a1364.zip

1.1行が最大幅を超える場合、水平スクロール バーのつまみを最右端にすることができない不具合を修正しました。

2.以下の操作を除いて全ラインの走査をしないようにしました。
・最大幅の行で改行を入力する
・最大幅の行を含んで削除を実行する


Undo, Redoや置換で発生する操作も対象に含まれます。
普通に入力するぶんには今まで殆ど変わらない負荷となると思います。

高負荷となるような操作例:
・最大幅の行の行頭でEnterキーをリピートする
・最大幅の行でDeleteキーまたはBackSpaceキーをリピートする


2008/6/5 (木) 17:51:44 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5325] 修正版アップしました
以下の修正を行いました。

1.置換ダイアログで置換を実行したとき、スクロールバーの幅が更新されない不具合を修正(dev:5322,5324)
2.最大幅の行での文字削除によるカーソル行アンダーラインのちらつきを軽減した
3.最大幅の行で改行を入力した場合でも、行頭かつ文字列非選択の場合は全ラインの走査を実行しないようにした(負荷軽減)

2008/6/5 (木) 20:54:51 ryoji  
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.5.21022)
[5326] Re:修正版アップしました
ざっとソースコードも眺めてみました。
それで、いくつか疑問・コメントがあります。

1.
テキスト最大幅の算出をテキスト変更直後ではなく CEditView::MoveCursor() で遅延実行するのはなぜですか?
その場で計算させれば、
m_bCalTextWidth
m_nCalTextWidthLinesFrom
m_nCalTextWidthLinesTo
といったややこしいメンバー変数も不要になると思うのですが…
あと、以前の計算要求が実行される前に次のテキスト変更があった場合、新たな変更を加えてしまった後で以前の計算要求を実行しているように見えますが、これは何?

2.
テキスト最大幅の算出を CEditView::OnSize() で実行するのはなぜですか?
テキスト最大幅は画面サイズには関係無いと思うのですが…
CEditView::OnSize() は各ビューのサイズ変更で呼ばれるので、画面を4分割して分割バーを動かすと1度に4回も計算しなおすことになるのでは?
テキスト変更時と SetLayoutInfo() のときくらいだけで済ませられないのでしょうか?

3.
CEditView::GetRightEdgeForScrollBar()は「折り返しなし」のときしか使われていないのですが、全モード共通でスクロール最右端の計算をするのに使えれば、もっとすっきりしたものができるかな?と思います。
指定幅で折り返す場合にも指定幅ぴったりではなく、右余白(改行/句読点ぶら下げ)が見えるところまでスクロールバーでスクロールできるようになると嬉しいですね。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.000]