[4126]
Re6:矩形編集
げんた
インデントが入る位置はいいのですが,インデントを入れた後の選択位置が1行目を元に決定されているようで,1行目がTABだとインデント挿入後に選択範囲が飛び越えられてしまいます.
すいさんの例で言うと
→ [in]t param1,
a;→[→] int param2;
→ [→] → int param3;
→ [in]t param4;
であればスペースでもタブでも位置が揃うのですが,1行目を除いて
→ int param1,
a;→[→] int param2;
→ [→] → int param3;
→ [in]t param4;
としてTABではなくスペースを入れると最後の行にだけスペースが入る動作は納得ですが,その後の選択範囲が選択1行目の次の文字へ進んでしまって
→ int param1,
a;→→ [in]t param2;
→ → [→] int param3;
→ _int[ p]aram4;
と最終行の選択位置が当初と異なる位置になります.
たぶん最終行で元の位置を保とうとすると1行目の開始位置が文字の中間となって,そこにはキャレットを置けないのでこうなってしまうのかなと.
ソースコードでは CEditView_Command.cppの5463行目あたり.
if( 1 == nDataLen && ( SPACE == pData[0] || TAB == pData[0] ) ){
bIndent=TRUE;
}
スペースとタブだけ特別扱いしています.
5475行目で
nIdxFrom = LineColmnToIndex( pcLayout, rcSel.left );
nIdxTo = LineColmnToIndex( pcLayout, rcSel.right );
とレイアウト位置から対応する文字のバイト位置を求め,
nDelLen = nIdxTo - nIdxFrom;
とnDelLenを計算します.
5492行目で
if( bIndent && 0 == nDelLen ) continue;
と
文字幅が0,すなわち開始と終了が同一文字の中ならばインデントを行わないようになっています.
その後5530行目でキャレットを左上に持ってきて右に1文字動かしているので,1行目が1バイト文字でない場合にずれます.