現在、アウトラインプロセッサを作成していますが、今回はノードをコピーしたりペーストできるようにします。
Ctrl+Cでコピーし、Ctrl+Vでペーストします。
SyncTreeViewクラスはこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class SyncTreeViewEx : SyncTreeView { protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.C && e.Control) { CopyToClipboard(SelectedNode, types.ToArray()); return; } if (e.KeyCode == Keys.V && e.Control) { PasteFromClipboard(SelectedNode, InsertTo.LastChild, types.ToArray()); return; } base.OnKeyDown(e); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class SyncTreeView { public void CopyToClipboard(TreeNodeEx sourceNode, Type[] types) { List<TreeNodeEx> treeNodeExs = GetTreeNodeExs(sourceNode); XmlSerializer xml = null; if (types == null || types.Length == 0) xml = new XmlSerializer(typeof(List<TreeNodeEx>)); else xml = new XmlSerializer(typeof(List<TreeNodeEx>), types); MemoryStream ms = new MemoryStream(); xml.Serialize(ms, treeNodeExs); string cf = Application.ExecutablePath; Clipboard.SetData(cf, ms.ToArray()); } } |
SyncTreeViewクラスを継承したSyncTreeViewExクラスではCopyToClipboardメソッドをこのようにオーバーライドします(仮想メソッドではないのでオーバーライドではないけど・・・)。
CopyToClipboardを実行するまえにSaveToMoromyを実行し、RichTextBoxのデータをRichDataに保存しています。
1 2 3 4 5 6 7 8 9 |
public class SyncTreeViewEx : SyncTreeView { new void CopyToClipboard(TreeNodeEx nodeEx, Type[] types) { Form1 f = (Form1)FindForm(); f.SaveToMoromy(); base.CopyToClipboard(nodeEx, types); } } |
コピーはそのままコピーするのではなく、オブジェクトの参照先もコピーする必要があります。そこでMemoryStreamを作成してそこに保存しています。これをClipboard.SetDataを使ってクリップボートに転送しています。
Clipboard.SetData、Clipboard.GetDataを呼び出すときにクリップボードフォーマットを指定する必要があります。これは既存のものとダブってはいけないのですが、実行ファイルのパスを使用しています。これで既存のものとダブることはないはず・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class SyncTreeView { public void PasteFromClipboard(TreeNodeEx targetNode, InsertTo insertTo, Type[] types) { string cf = Application.ExecutablePath; byte[] bytes = (byte[])Clipboard.GetData(cf); MemoryStream ms = new MemoryStream(bytes); XmlSerializer xml = null; if (types == null || types.Length == 0) xml = new XmlSerializer(typeof(List<TreeNodeEx>)); else xml = new XmlSerializer(typeof(List<TreeNodeEx>), types.ToArray()); List<TreeNodeEx> nodeExs = (List<TreeNodeEx>)xml.Deserialize(ms); RestoreNodes(nodeExs, SelectedNode, insertTo); } } |
SyncTreeView.RestoreNodesの処理に関してはこちらを参照してください。
これも
PasteFromClipboardの第二引数を変えることでペーストする位置を変える(ノードの次の位置、前の位置、最初の子の位置)ことができます。