前回は同一コントロール内部以外からデータがドロップされたときの処理をやりました。

複数のRichTextBoxを同期する ドラッグ&ドロップ編

今回は同一コントロール内部のドラッグ&ドロップです。

まずドロップされた場所を知る必要があります。これは単純にSelectionStartプロパティを参照すれば取得できます。

ドラッグされているのがn文字目からm文字目の場合、この場所に移動することはできません。本当に移動させることができるのか調べます。

移動させることができるのであれば移動させます。ドラッグされている文字を消去し、新しい位置に挿入します。新しい位置は、ドロップされた位置がドラッグが開始された位置よりも前の場合とそれ以外では計算方法が変わってきます。

新しい位置というよりは今の位置からどれだけズラすかという考え方です。

Undobufに新しい変数とプロパティを追加します。

移動させるためのメソッドです。

またUndoに対応させる必要があります。

これで完成といいたいのですが、他のアプリのRichTextBoxにドラッグ&ドロップすると文字列が消えてしまうことがあります。ドラッグ&ドロップされた場合、ドラッグ元のデータをどうするかはドロップ先によって決まるので、もし他のアプリのRichTextBoxにドロップされて文字列が消えてしまった場合、元に戻す必要があります。

あと、_dragDropRtfInfoがnullに戻されていないとSetSelectedTextメソッドとSetSelectedRtfメソッドを実行したときにおかしなことがおこります。そこで

ついでにOnDragOverにも改良を加えます。コピーされる場合と移動の場合がはっきりとわかるようにしました。Ctrlキーが押されながらドラッグされているときは内部で文字列を移動させるのではなくコピーします。

これに伴いOnDragDropも一部変更します。