Index: Core/Common/src/Core.Common.Controls.TreeView/TreeNodeInfo.cs =================================================================== diff -u -rc6f289d3b0d20b920ddd0938d1b24620a6dfa29e -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/src/Core.Common.Controls.TreeView/TreeNodeInfo.cs (.../TreeNodeInfo.cs) (revision c6f289d3b0d20b920ddd0938d1b24620a6dfa29e) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeNodeInfo.cs (.../TreeNodeInfo.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -42,7 +42,7 @@ public Func Text { get; set; } /// - /// Gets or sets a function for obtaining the tree node fore color. + /// Gets or sets a function for obtaining the tree node forecolor. /// The object parameter represents the data of the tree node. /// public Func ForeColor { get; set; } @@ -179,7 +179,7 @@ public Func Text { get; set; } /// - /// Gets or sets a function for obtaining the tree node fore color. + /// Gets or sets a function for obtaining the tree node forecolor. /// The parameter represents the data of the tree node. /// public Func ForeColor { get; set; } Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -rf24e27cd856cf597082209f97478815b5e9cebbe -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision f24e27cd856cf597082209f97478815b5e9cebbe) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -29,12 +29,50 @@ using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using Core.Common.Base; +using Core.Common.Controls.Forms; using Core.Common.Controls.TreeView.Properties; using Core.Common.Utils.Events; using BaseResources = Core.Common.Base.Properties.Resources; namespace Core.Common.Controls.TreeView { + /// + /// A that encapulates a + /// in such a way that objects can be registered for configuring + /// the way tree nodes are drawn and can be interacted with. A general implementation is + /// provided when it comes to: + /// + /// + /// drawing tree nodes (including images, checkboxes and forecolors); + /// + /// + /// selecting tree nodes; + /// + /// + /// expanding/collapsing tree nodes; + /// + /// + /// renaming tree nodes (including feedback popups); + /// + /// + /// removing tree nodes (including feedback popups); + /// + /// + /// dragging and dropping tree nodes (including visual feedback); + /// + /// + /// opening tree node context menus; + /// + /// + /// short keys for tree node interaction via the keyboard. + /// + /// + /// + /// + /// The current implementation assumes that the data hierarchy, + /// defined by the combination of registered objects and the set + /// , only contains uniquely identifiable data objects. + /// public partial class TreeViewControl : UserControl { public event EventHandler DataDoubleClick; @@ -53,6 +91,9 @@ private object data; + /// + /// Creates a new instance of . + /// public TreeViewControl() { InitializeComponent(); @@ -85,8 +126,13 @@ } /// - /// Gets or sets the data to render in the tree view. + /// Gets or sets the data to show in the . /// + /// + /// Ensure all necessary objects are registered in order to prevent + /// an . Take notice of the fact that these kind of + /// exceptions might not directly occur after setting the data. + /// public object Data { get @@ -110,6 +156,10 @@ } } + /// + /// Gets the data of the selected tree node in the . + /// + /// null is returned when no tree node is selected. public object SelectedData { get @@ -119,22 +169,36 @@ } /// - /// This method registers the provided . + /// This method registers a object. /// /// The to register. public void RegisterTreeNodeInfo(TreeNodeInfo treeNodeInfo) { tagTypeTreeNodeInfoLookup[treeNodeInfo.TagType] = treeNodeInfo; } + /// + /// This method returns whether or not the tree node corresponding to the + /// can be renamed. + /// + /// The data object to obtain the corresponding tree node for. + /// Whether or not the tree node can be renamed. public bool CanRenameNodeForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); return treeNode != null && CanRename(treeNode); } - public void StartRenameForData(object dataObject) + /// + /// This method tries to start a rename action for the tree node corresponding to the + /// . + /// + /// The data object to obtain the corresponding tree node for. + /// + /// When the tree node cannot be renamed, a popup is shown for notifying the end user. + /// + public void TryRenameNodeForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); @@ -144,14 +208,28 @@ } } + /// + /// This method returns whether or not the tree node corresponding to the + /// can be removed. + /// + /// The data object to obtain the corresponding tree node for. + /// Whether or not the tree node can be removed. public bool CanRemoveNodeForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); return treeNode != null && CanRemove(treeNode); } - public void RemoveNodeForData(object dataObject) + /// + /// This method tries to remove the tree node corresponding to the . + /// + /// The data object to obtain the corresponding tree node for. + /// + /// When the tree node can be removed, a popup is shown for confirmation by the end user. + /// When the tree node cannot be removed, a popup is shown for simply notifying the end user. + /// + public void TryRemoveNodeForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); @@ -161,14 +239,24 @@ } } - public bool CanExpandOrCollapseAllNodesForData(object dataObject) + /// + /// This method returns whether or not the tree node corresponding to the + /// can be collapsed/expanded. + /// + /// The data object to obtain the corresponding tree node for. + /// Whether or not the tree node can be collapsed/expanded. + public bool CanExpandOrCollapseForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); return treeNode != null && treeNode.Nodes.Count > 0; } - public void CollapseAllNodesForData(object dataObject) + /// + /// This method tries to collapse all nodes of the tree node corresponding to the + /// (child nodes are taken into account recursively). + /// + public void TryCollapseAllNodesForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); @@ -178,7 +266,11 @@ } } - public void ExpandAllNodesForData(object dataObject) + /// + /// This method tries to expand all nodes of the tree node corresponding to the + /// (child nodes are taken into account recursively). + /// + public void TryExpandAllNodesForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); @@ -188,12 +280,20 @@ } } - public void SelectNodeForData(object dataObject) + /// + /// This method tries to select the tree node corresponding to the . + /// + /// The data object to obtain the corresponding tree node for. + public void TrySelectNodeForData(object dataObject) { treeView.SelectedNode = GetNodeByTag(dataObject); } - public string GetPathForData(object dataObject) + /// + /// This method tries to return the path of the tree node corresponding to the . + /// + /// The data object to obtain the corresponding tree node for. + public string TryGetPathForData(object dataObject) { var treeNode = GetNodeByTag(dataObject); Index: Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs =================================================================== diff -u -r4512af7782ee31b36941bb280b54d9da2953dd71 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision 4512af7782ee31b36941bb280b54d9da2953dd71) +++ Core/Common/src/Core.Common.Gui/ContextMenu/TreeViewContextMenuItemFactory.cs (.../TreeViewContextMenuItemFactory.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -69,7 +69,7 @@ Image = Resources.RenameIcon, Enabled = treeViewControl.CanRenameNodeForData(dataObject) }; - toolStripMenuItem.Click += (s, e) => treeViewControl.StartRenameForData(dataObject); + toolStripMenuItem.Click += (s, e) => treeViewControl.TryRenameNodeForData(dataObject); return toolStripMenuItem; } @@ -86,7 +86,7 @@ Image = Resources.DeleteIcon, Enabled = treeViewControl.CanRemoveNodeForData(dataObject) }; - toolStripMenuItem.Click += (s, e) => treeViewControl.RemoveNodeForData(dataObject); + toolStripMenuItem.Click += (s, e) => treeViewControl.TryRemoveNodeForData(dataObject); return toolStripMenuItem; } @@ -101,9 +101,9 @@ { ToolTipText = Resources.Expand_all_ToolTip, Image = Resources.ExpandAllIcon, - Enabled = treeViewControl.CanExpandOrCollapseAllNodesForData(dataObject) + Enabled = treeViewControl.CanExpandOrCollapseForData(dataObject) }; - toolStripMenuItem.Click += (s, e) => treeViewControl.ExpandAllNodesForData(dataObject); + toolStripMenuItem.Click += (s, e) => treeViewControl.TryExpandAllNodesForData(dataObject); return toolStripMenuItem; } @@ -118,9 +118,9 @@ { ToolTipText = Resources.Collapse_all_ToolTip, Image = Resources.CollapseAllIcon, - Enabled = treeViewControl.CanExpandOrCollapseAllNodesForData(dataObject) + Enabled = treeViewControl.CanExpandOrCollapseForData(dataObject) }; - toolStripMenuItem.Click += (s, e) => treeViewControl.CollapseAllNodesForData(dataObject); + toolStripMenuItem.Click += (s, e) => treeViewControl.TryCollapseAllNodesForData(dataObject); return toolStripMenuItem; } } Index: Core/Common/src/Core.Common.Gui/RingtoetsGui.cs =================================================================== diff -u -r0ae715fe2b16306e4147fed9749bae67ce186168 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision 0ae715fe2b16306e4147fed9749bae67ce186168) +++ Core/Common/src/Core.Common.Gui/RingtoetsGui.cs (.../RingtoetsGui.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -395,7 +395,7 @@ return; } - DocumentViews.SetTooltip(view, ProjectExplorer.TreeViewControl.GetPathForData(view.Data)); + DocumentViews.SetTooltip(view, ProjectExplorer.TreeViewControl.TryGetPathForData(view.Data)); } private void ConfigureLogging() Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs =================================================================== diff -u -r5774b9c9fd8cc22fc2196ec871431631133e6221 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision 5774b9c9fd8cc22fc2196ec871431631133e6221) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/ContextMenuBuilderTest.cs (.../ContextMenuBuilderTest.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -233,7 +233,7 @@ var viewCommandsMock = mocks.StrictMock(); var treeViewControlMock = mocks.StrictMock(); - treeViewControlMock.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(dataObject)).Return(hasChildren); + treeViewControlMock.Expect(tvc => tvc.CanExpandOrCollapseForData(dataObject)).Return(hasChildren); mocks.ReplayAll(); @@ -263,7 +263,7 @@ var viewCommandsMock = mocks.StrictMock(); var treeViewControlMock = mocks.StrictMock(); - treeViewControlMock.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(dataObject)).Return(hasChildren); + treeViewControlMock.Expect(tvc => tvc.CanExpandOrCollapseForData(dataObject)).Return(hasChildren); mocks.ReplayAll(); Index: Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs =================================================================== diff -u -r5774b9c9fd8cc22fc2196ec871431631133e6221 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision 5774b9c9fd8cc22fc2196ec871431631133e6221) +++ Core/Common/test/Core.Common.Gui.Test/ContextMenu/TreeViewContextMenuItemFactoryTest.cs (.../TreeViewContextMenuItemFactoryTest.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -90,7 +90,7 @@ if (canDelete) { - treeViewControlMock.Expect(tvc => tvc.RemoveNodeForData(nodeData)); + treeViewControlMock.Expect(tvc => tvc.TryRemoveNodeForData(nodeData)); } mocks.ReplayAll(); @@ -134,7 +134,7 @@ if (canRename) { - treeViewControlMock.Expect(tvc => tvc.StartRenameForData(dataObject)); + treeViewControlMock.Expect(tvc => tvc.TryRenameNodeForData(dataObject)); } mocks.ReplayAll(); Index: Core/Plugins/src/Core.Plugins.ProjectExplorer/ProjectExplorer.cs =================================================================== diff -u -r1fd75ff6e5e3593bdf2c875a1dc107b22b482418 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Plugins/src/Core.Plugins.ProjectExplorer/ProjectExplorer.cs (.../ProjectExplorer.cs) (revision 1fd75ff6e5e3593bdf2c875a1dc107b22b482418) +++ Core/Plugins/src/Core.Plugins.ProjectExplorer/ProjectExplorer.cs (.../ProjectExplorer.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -165,7 +165,7 @@ return; } - treeViewControl.SelectNodeForData(applicationSelection.Selection); + treeViewControl.TrySelectNodeForData(applicationSelection.Selection); } } } \ No newline at end of file Index: Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs =================================================================== diff -u -rfafe08c402bd6ab5a283556660e34df47ce01dea -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs (.../ProjectExplorerTest.cs) (revision fafe08c402bd6ab5a283556660e34df47ce01dea) +++ Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerTest.cs (.../ProjectExplorerTest.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -171,7 +171,7 @@ }) { // Call - explorer.TreeViewControl.RemoveNodeForData(project); + explorer.TreeViewControl.TryRemoveNodeForData(project); } // Assert mocks.VerifyAll(); @@ -228,7 +228,7 @@ Assert.AreNotSame(explorer.TreeViewControl.SelectedData, stringA); // Call - explorer.TreeViewControl.SelectNodeForData(stringA); + explorer.TreeViewControl.TrySelectNodeForData(stringA); // Assert Assert.AreSame(explorer.TreeViewControl.SelectedData, stringA); Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -rae6c53b67bd2ae5e49606b31fd1575eecc58620d -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision ae6c53b67bd2ae5e49606b31fd1575eecc58620d) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -880,7 +880,7 @@ if (renamed) { - treeViewControl.StartRenameForData(draggedData); + treeViewControl.TryRenameNodeForData(draggedData); } } Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -r635f3563d55eeaf54725ddcf654670f26d55a663 -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision 635f3563d55eeaf54725ddcf654670f26d55a663) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -712,7 +712,7 @@ treeViewControl.Expect(tvc => tvc.CanRenameNodeForData(nodeData)).Return(true); treeViewControl.Expect(tvc => tvc.CanRemoveNodeForData(nodeData)).Return(true); - treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(nodeData)).Repeat.Twice().Return(false); + treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseForData(nodeData)).Repeat.Twice().Return(false); mocks.ReplayAll(); @@ -822,7 +822,7 @@ gui.Expect(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); treeViewControl.Expect(tvc => tvc.CanRenameNodeForData(nodeData)).Return(true); - treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(nodeData)).Repeat.Twice().Return(false); + treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseForData(nodeData)).Repeat.Twice().Return(false); mocks.ReplayAll(); @@ -925,7 +925,7 @@ var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, nodeData, treeViewControl); gui.Expect(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); - treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(nodeData)).Repeat.Twice().Return(false); + treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseForData(nodeData)).Repeat.Twice().Return(false); mocks.ReplayAll(); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs =================================================================== diff -u -r95487d39e17289b2a656e34d85b808186222c0ee -rd03f2b52982110a0f804adfefe73f86551c59e62 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs (.../PipingFailureMechanismTreeNodeInfoTest.cs) (revision 95487d39e17289b2a656e34d85b808186222c0ee) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingFailureMechanismTreeNodeInfoTest.cs (.../PipingFailureMechanismTreeNodeInfoTest.cs) (revision d03f2b52982110a0f804adfefe73f86551c59e62) @@ -201,7 +201,7 @@ var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandler, exportImportHandler, viewCommandsHandler, failureMechanism, treeViewControl); gui.Expect(cmp => cmp.Get(failureMechanism, treeViewControl)).Return(menuBuilder); - treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseAllNodesForData(failureMechanism)).Repeat.Twice().Return(false); + treeViewControl.Expect(tvc => tvc.CanExpandOrCollapseForData(failureMechanism)).Repeat.Twice().Return(false); mocks.ReplayAll();