俺的アウトラインプロセッサーをつくる(その1)

いらないノードを削除するまえにゴミ箱に移動するようにしましょう。

そのためにはゴミ箱の役割をするノードをつくる必要があります。最上位のレベルで一番下の位置につくることにします。

わかりやすくするためにプログラムがはじまったら、すぐにゴミ箱をつくります。

ただし、これはダメです。

他のTreeViewと対応しているノードをみつけるためにノード作成時刻を利用しています。

複数のTreeViewの内容を同期する

2つのノードをつくる時刻がまったく同じになってしまうことが多いのです。100万分の1秒単位でも同じになってしまうのでちょっと驚いています。そこでSystem.Threading.Thread.Sleep(10)を入れます。これで時間をずらすことができます。

それからどれがゴミ箱なのか記憶しておく必要があります。

このプログラムではRootノードの子ノードが見えるように展開しています。

それからもうひとつ気をつけることがあります。ファイルを読み込んだときにTreeNodeEx.Keyの値が変更されてしまうということです。

ゴミ箱の位置は、最上位のレベルで一番下の位置なので、ファイルを読み込んだときにゴミ箱の位置を調べて保存しなおしています。

さてノードを削除するとき、いきなり削除するのではなく、ゴミ箱に移動させます。ゴミ箱の中にあるものが削除される場合はそのまま削除してしまいます。

そのノードが別のTreeViewでは選択されている(データが編集されている)可能性があります。そこで別のTreeViewでは選択されている場合は警告のメッセージボックスを表示することにしました。

またそれでも削除をする場合、削除されたノードが選択されていたTreeViewでは別の適切なノードを選択させる必要があります。

まず、対象のノードがゴミ箱のなかにあるかどうかを知るには最上位レベルのノードのKeyを調べて、最初に保存しているtrashKeyと同じかどうかを調べればいいですね。

次にノードを削除(またはゴミ箱に移動)することになるのですが、ゴミ箱に入れた場合、削除されるノードを選択していたTreeViewはどのノードを選択すればよいのでしょうか?

削除されるノードに次のノードがあるのであれば次のノードを、なければ前のノードを、それもなければ親ノードを選択するようにしています。次、前、親、いずれも存在しない場合はノード削除はできないようにしています。

またゴミ箱ノードそのものを削除しようとしたときは、ゴミ箱は削除しないで中身のみを削除(TrashClearメソッド)するようにしています。

ゴミ箱ノードは最上位のレベルで一番下の位置から動くことはありません。そこでゴミ箱をドラッグしたり、移動させることはできないようにします。