private void UpdateMultiselection(TreeNode node) { bool bControl = (ModifierKeys == Keys.Control); bool bShift = (ModifierKeys == Keys.Shift); if (bControl) { if (mySelectedNodes.Contains(node)) { mySelectedNodes.Remove(node); } else { mySelectedNodes.Add(node); } } else if (bShift) { Queue myQueue = new Queue(); TreeNode uppernode = myFirstMultiSelectNode; TreeNode bottomnode = node; // case 1 : begin and end nodes are parent bool bParent = IsParent(myFirstMultiSelectNode, node); // is m_firstNode parent (direct or not) of e.Node if (!bParent) { bParent = IsParent(bottomnode, uppernode); if (bParent) // swap nodes { TreeNode t = uppernode; uppernode = bottomnode; bottomnode = t; } } if (bParent) { if (uppernode != null) { TreeNode n = bottomnode; while (n != uppernode.Parent) { if (!mySelectedNodes.Contains(n)) // new node ? { myQueue.Enqueue(n); } n = n.Parent; } } } // case 2 : nor the begin nor the end node are descendant one another else { if ((uppernode.Parent == null && bottomnode.Parent == null) || (uppernode.Parent != null && uppernode.Parent.Nodes.Contains(bottomnode))) // are they siblings ? { int nIndexUpper = uppernode.Index; int nIndexBottom = bottomnode.Index; if (nIndexBottom < nIndexUpper) // reversed? { TreeNode t = uppernode; uppernode = bottomnode; bottomnode = t; nIndexUpper = uppernode.Index; nIndexBottom = bottomnode.Index; } TreeNode n = uppernode; while (nIndexUpper <= nIndexBottom) { if (!mySelectedNodes.Contains(n)) // new node ? { myQueue.Enqueue(n); } n = n.NextNode; nIndexUpper++; } // end while } else { if (!mySelectedNodes.Contains(uppernode)) { myQueue.Enqueue(uppernode); } if (!mySelectedNodes.Contains(bottomnode)) { myQueue.Enqueue(bottomnode); } } } mySelectedNodes.AddRange(myQueue); myFirstMultiSelectNode = node; // let us chain several SHIFTs if we like it } else if (myLastMouseButton != MouseButtons.Right) // don't clear selection when popup menu is invoked { // in the case of a simple click, just add this item if (mySelectedNodes != null && mySelectedNodes.Count > 0) { mySelectedNodes.Clear(); } mySelectedNodes.Add(node); } }