印刷
カテゴリ: テキストエディタ作成
参照数: 688

テキスト編集その1からの続き。

編集することによって影響を受けるものの一つ、行の管理について。

行は今まで行管理クラスに、実際のテキストが格納されている位置を保存してた。

 

class CTextLine {
		bsize_t m_start;		///< 行先端のテキストバッファ位置
		bsize_t m_end;			///< 行終端のテキストバッファ位置

 

これだと文字が挿入/削除された際にずれてしまう。したがってずれた分補正をしてやる必要があるのだけれど、

これを影響の受ける行全てに対して行っていくと、行数が多い場合に大変な時間がかかってしまう。

なので以下のような構造体を定義。

 

typedef struct _text_line_adjust_t {

	bsize_t line;			///< 影響を受ける開始行
	bsize_t add;			///< 補正値
} text_line_adjust_t;

 

この構造体は、変更があった行から以降の行がどれくらいずれるかの情報を保存。

三行目に一文字挿入されたら、line = 4, add = 1。五文字挿入されたら、line = 4, add = 5。

adjust1

 

別の行に移動した場合はその行までの間だけ、ずれた値を実際の行クラス(上でいう CTextLine)の位置に反映して、

新add には 旧addの値を加算。

adjust2

これで問題ないはず。実際には反映が必要な行数の少ない方を選んで補正してるけど、基本はこんな感じ。

すっごい行数の多いテキストで一番下と一番上を編集とかやると重いかもしんない。

 

ちなみに補正の反映は、行クラスを取得する部分でやることにした。あまり美しくはないけど一番確実だからね。