Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -r514d2e7d8903b5846e71ce5e066f574f89f1bb2b -r1cf5b2e08df10f32e5db73df84f8c4b6f41190c7 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 514d2e7d8903b5846e71ce5e066f574f89f1bb2b) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 1cf5b2e08df10f32e5db73df84f8c4b6f41190c7) @@ -117,6 +117,7 @@ treeView.AfterLabelEdit += TreeViewAfterLabelEdit; treeView.AfterCheck += TreeViewAfterCheck; treeView.KeyDown += TreeViewKeyDown; + treeView.MouseDown += TreeViewOnMouseDown; treeView.MouseClick += TreeViewMouseClick; treeView.DoubleClick += TreeViewDoubleClick; treeView.DragDrop += TreeViewDragDrop; @@ -816,9 +817,23 @@ } } + private void TreeViewOnMouseDown(object sender, MouseEventArgs e) + { + var point = new Point(e.X, e.Y); + var clickedNode = treeView.GetNodeAt(point); + if (clickedNode == null) + { + return; + } + if (e.Button.HasFlag(MouseButtons.Left) || e.Button.HasFlag(MouseButtons.Right)) + { + treeView.SelectedNode = clickedNode; + } + } + private void TreeViewMouseClick(object sender, MouseEventArgs e) { - var point = treeView.PointToClient(Cursor.Position); + var point = new Point(e.X, e.Y); var clickedNode = treeView.GetNodeAt(point); if (clickedNode == null) { @@ -829,7 +844,7 @@ if (e.Button.HasFlag(MouseButtons.Right)) { - treeView.SelectedNode = clickedNode; + //treeView.SelectedNode = clickedNode; var parentTag = GetParentTag(clickedNode); Index: Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs =================================================================== diff -u -re8b38c279ab010c360bd6589c8600e9cf387b11f -r1cf5b2e08df10f32e5db73df84f8c4b6f41190c7 --- Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision e8b38c279ab010c360bd6589c8600e9cf387b11f) +++ Core/Common/test/Core.Common.Controls.TreeView.Test/TreeViewControlTest.cs (.../TreeViewControlTest.cs) (revision 1cf5b2e08df10f32e5db73df84f8c4b6f41190c7) @@ -2,6 +2,8 @@ using System.Windows.Forms; using Core.Common.Base; using Core.Common.TestUtil; +using Core.Common.Utils.Reflection; + using NUnit.Extensions.Forms; using NUnit.Framework; using Rhino.Mocks; @@ -1346,6 +1348,65 @@ mocks.VerifyAll(); } } + + [Test] + [RequiresSTA] + [TestCase(MouseButtons.Left, true)] + [TestCase(MouseButtons.Right, true)] + [TestCase(MouseButtons.Middle, false)] + [TestCase(MouseButtons.XButton1, false)] + [TestCase(MouseButtons.XButton2, false)] + public void GivenTreeViewControl_WhenMouseButtonDownOnNode_SelectThatNodeForLeftAndRightMouseButtons( + MouseButtons mouseButtonDown, bool changeSelectionToTarget) + { + // Setup + using (var treeViewControl = new TreeViewControl()) + { + var selectionTarget = "I'm the target!"; + var treeNodeInfo = new TreeNodeInfo + { + TagType = typeof(object), + ChildNodeObjects = o => new object[] + { + selectionTarget + } + }; + var childTreeNodeInfo = new TreeNodeInfo + { + TagType = typeof(string), + Text = o => o.ToString() + }; + treeViewControl.RegisterTreeNodeInfo(treeNodeInfo); + treeViewControl.RegisterTreeNodeInfo(childTreeNodeInfo); + var data = new object(); + treeViewControl.Data = data; + treeViewControl.TryExpandAllNodesForData(data); + + // Precondition: + Assert.AreSame(data, treeViewControl.SelectedData); + + var identifier = "identifier"; + var treeView = (System.Windows.Forms.TreeView)treeViewControl.Controls[0]; + treeView.Name = identifier; + + try + { + WindowsFormsTestHelper.Show(treeViewControl); + var treeViewTester = new TreeViewTester(identifier); + + // Call + treeViewTester.FireEvent("MouseDown", new MouseEventArgs(mouseButtonDown, 1, 60, 30, 0)); + + // Assert + object expectedSelectedData = changeSelectionToTarget ? selectionTarget : data; + Assert.AreEqual(expectedSelectedData, treeViewControl.SelectedData); + } + finally + { + WindowsFormsTestHelper.CloseAll(); + } + } + } } public class TestObservable : Observable {}