しばらくほったらかしになっていた俺的アウトラインプロセッサーの作成。やめたわけではありません。今回はノードの分割と統合をやってみます。
ノードの分割はリッチテキストのカーソルの位置で分割します。分割された後ろの部分は新しく作成された次のノードに表示されます。
ノードの統合は現在選択されているノードと次の位置にあるノードを結合します。また次のノードが子ノードをもつ場合は子ノードも移動させます。
ではやってみましょう。
ノードの統合はIntegrationNodesメソッド、分割はDivisionNodeでおこないます。引数は1ならSplitContainerの上側、2なら下側です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
public partial class Form1 : Form { private void IntegrationNodeToolStripMenuItem_Click(object sender, EventArgs e) { // ノードの統合 IntegrationNodes(1); } private void DivisionNodeToolStripMenuItem_Click(object sender, EventArgs e) { // ノードの分割 DivisionNode(2); } void DivisionNode(int i) { SyncRichTextBoxEx rich = syncRichTextBoxEx1; SyncTreeViewEx tree = syncTreeViewEx1; if (i == 2) { rich = syncRichTextBoxEx2; tree = syncTreeViewEx2; } SaveToMoromy(); int start = rich.SelectionStart; int allLen = rich.Data.Text.Length; int len = allLen - start; rich.SelectionStart = start; rich.SelectionLength = len; string rtf = rich.SelectedRtf; rich.SetSelectedText("", "DivisionNode"); TreeNodeEx nodeEx = tree.SelectedNode; RichData richData = new RichData(); richData.Rtf = rtf; Data data = new Data(); data.RichData = richData; tree.AddNodeNext(nodeEx, "New Node", 0, 0, data); } void IntegrationNodes(int i) { SyncRichTextBoxEx rich = syncRichTextBoxEx1; SyncTreeViewEx tree = syncTreeViewEx1; if (i == 2) { rich = syncRichTextBoxEx2; tree = syncTreeViewEx2; } TreeNodeEx nodeEx = tree.SelectedNode; TreeNodeEx nextNodeEx = nodeEx.NextNode; if (nextNodeEx != null && nextNodeEx != TrashNode) { SaveToMoromy(); Data nextData = GetData(nextNodeEx); string nextRtf = nextData.RichData.Rtf; // richtextboxを統合 int len = rich.Data.Text.Length; rich.SelectionStart = len; rich.SelectionLength = 0; rich.SetSelectedRtf(nextRtf, "IntegrationNodes"); // treenodeを統合 while (true) { TreeNodeEx childNode = nextNodeEx.FirstNode; if (childNode == null) break; tree.MoveToLastChild(childNode, nodeEx); } tree.DeleteNode(nextNodeEx); } } } |
これで完成!
あと右クリックされたらメニューで選択できるようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public partial class Form1 : Form { public Form1() { SetContextMenu(); } void SetContextMenu() { ContextMenuStrip rich1ContextMenuStrip = new ContextMenuStrip(); rich1ContextMenuStrip.Items.Add("ノードを分割する", null, delegate (object ASender, EventArgs ev) { DivisionNode(1); }); syncRichTextBoxEx1.ContextMenuStrip = rich1ContextMenuStrip; ContextMenuStrip rich2ContextMenuStrip = new ContextMenuStrip(); rich2ContextMenuStrip.Items.Add("ノードを分割する", null, delegate (object ASender, EventArgs ev) { DivisionNode(2); }); syncRichTextBoxEx2.ContextMenuStrip = rich2ContextMenuStrip; ContextMenuStrip tree1ContextMenuStrip = new ContextMenuStrip(); tree1ContextMenuStrip.Items.Add("ノードを統合する", null, delegate (object ASender, EventArgs ev) { IntegrationNodes(1); }); syncTreeViewEx1.ContextMenuStrip = tree1ContextMenuStrip; tree1ContextMenuStrip.Opening += Tree1ContextMenuStrip_Opening; ContextMenuStrip tree2ContextMenuStrip = new ContextMenuStrip(); tree2ContextMenuStrip.Items.Add("ノードを統合する", null, delegate (object ASender, EventArgs ev) { IntegrationNodes(2); }); syncTreeViewEx2.ContextMenuStrip = tree2ContextMenuStrip; tree2ContextMenuStrip.Opening += Tree2ContextMenuStrip_Opening; } } |
これでメニューが表示されます。ただツリービューを右クリックするだけではアイテムは選択されたことにはなりません。そこで右クリックされたら座標を調べてそこにあるアイテムを選択状態にします。それからメニューを表示させます。それから右クリックされたら座標にアイテムが存在しない場合はなにもおきません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public partial class Form1 : Form { private void Tree1ContextMenuStrip_Opening(object sender, CancelEventArgs e) { Point pt = Control.MousePosition; pt = syncTreeViewEx1.PointToClient(pt); var test = syncTreeViewEx1.HitTest(pt); TreeNodeEx nodeEx = test.TreeNodeEx; if (nodeEx == null) { e.Cancel = true; return; } syncTreeViewEx1.SelectedNode = nodeEx; } private void Tree2ContextMenuStrip_Opening(object sender, CancelEventArgs e) { Point pt = Control.MousePosition; pt = syncTreeViewEx2.PointToClient(pt); var test = syncTreeViewEx2.HitTest(pt); TreeNodeEx nodeEx = test.TreeNodeEx; if (nodeEx == null) { e.Cancel = true; return; } syncTreeViewEx2.SelectedNode = nodeEx; } } |