http://sakura.qp.land.to/?Develop%2F1
|
アウトライン解析の現状と改善案メッセージアウトライン解析をページの横にドッキングして欲しいという要望がある. 未だ実現していない理由の1つとして,現在は編集時にリストとの整合性を 保てないというのがある. 現状CEditViewのコマンド処理部からからMake_xxxxを呼びだしてCFuncInfoArrに見出し情報の配列を得る.それをCDlgFunclistへ渡してリストボックス,あるいはツリーの形で表示する. Make_xxxの部分は文書データからリストを作るところまで.リストを表示するための加工はCDlgFunclistの方にある. CFuncInfoArrは何故かCEditView::Command_FUNCLIST()にて static CFuncInfoArr cFuncInfoArr; とされている. CFuncInfoArrはCFuncInfoの配列を管理するクラス. CFuncInfoへのポインタを配列として管理している. CFuncInfoArr::AppendDataは要素が1つ増える毎にreallocしているので,メモリの再配置が頻繁に行われているかもしれない. CFuncInfoの要素は以下の通り.
CFuncInfo物理行とレイアウト行の両方が本当に必要かという疑問がある. 折り返し単位の行番号の現在の使われ方
変更案ウィンドウをドッキング可能にすると,もはやダイアログボックスではないので CDlgFunclistとは別の実装になると思われる.現在CDlgFunclistに入っている 種類毎の個別の表示処理を独立した関数とし,データ構築時にそのポインタを CFuncInfoArrに渡しておくようにする. 折り返し位置の変化によって値が変わってしまう折り返し単位の行番号は常時表示には向かないので必要に応じて計算し直すことにする.現在のカーソル位置との比較にもレイアウト行位置を使っているが,これは最初に一回変換しておけばそれ以降はレイアウト行である必要はない. 注意: 表示行→物理行のポインタはあるが逆はない. 行とのリンクのために,CFincInfoの項目として整数値を1つ追加する. また,CDocLineにも整数値を1つ追加して行位置がずれた場合に追跡可能にする. ただし,実際にどのくらいindexが作られるかはわからないのである範囲の番号を 使い回す.(別の言い方をすれば Count mod X の値を格納する) ルール
検索
この方法だと,インデックスの追加には対応できない.しかし,ファイルサイズによっては構築に時間がかかるので,むやみに完全再構築を行うべきではない. 番号が循環するので比較は単純には出来ない.例えばX=16(4bit利用),目的の番号=13のとき,1は13-1=11, 16+1-13=4なので目的より後ろと判断すべきである. これは (1-13)&15の最上位ビットを符号ビットと考えれば判定できるが, 誤判定を減らすために判断不能な領域を設けておいた方がよいかもしれない. (上の例では7とか) 見出しではない行も表現する必要がある.値の1つを使う方法と独立したフラグとする 方法が考えられるが,前者だと環状データが2^n-1周期となって単純なANDマスクが使えない. 行に付けるインデックスは,アウトラインデータ構築時に全ての行をスキャンすることを利用して再構築時にクリアする. 行番号インデックスの付いた行をbookmarkのように探すことで,前後の見出しへジャンプする機能を容易に実装できる. 2006.10.28 途中までUPまだCDocLineのiteratorとCFuncListArrへのCEditDoc追加くらい. 次はレイアウト行を使わないようにする. その後で行の読み出しと追加をiterator経由で行えるようにする. この段階で各メソッドはCEditDoc配下である必要が無くなるはず. 2006.10.30 途中までUPCFuncInfoからレイアウト行の情報を除去. MakeFunc_CだけCEditDocから切り離してみた.問題なく動作する. 2007.02.02 途中までUPさらに多くの関数を切り離した.残り2つ. 基本的にはAppendDataの引数を2つ削除するのとループを置き換えるだけなので 書き間違えなければ問題は出ないはずだが,別の場所からコピーした物を ベースにすると間違える.(txtで階層が作られない問題が出た.) PL/SQL, Textは良さそうだが最終的には全て試す必要有り. namespace OutlineAnalyzer に移動した関数の宣言部を使用場所の直前に置いているが, 別のヘッダに移す必要有り. 思いついたアイディア: 正規表現を利用したアウトライン解析は正規表現モジュールが必ずあるかどうかわからないので検討しなかったが,モジュールがなければ空のデータ(またはエラーメッセージのみ入ったデータ)を返す仕様なら良いのではないか? 2007.02.03 CEditDocからの切り離し完了コンパイルは通ったが,試験は行っていない. 2007.09.14 rev.1121への対応pythonのoutlineが追加されたため. funclistarray_p6_1121.zip 371件 [詳細] funclistarray_p5.zip 410件 [詳細] funclistarray_p4.zip 363件 [詳細] funclistarray_p3.diff 264件 [詳細] funclistarray_p2.diff 263件 [詳細] funclistarray_p1.diff 236件 [詳細] |