private void TreeControl_NodeExpandedChanging(object sender, TreeControl.CancelNodeEventArgs e)
        {
            var treeView = TreeView.As <FilteredTreeView>();

            // early exit
            if (m_updating || !m_searching || e.Node.Tag == null ||
                treeView == null)
            {
                return;
            }

            // is the node or any of its decendants passed filter
            if (treeView.IsMatched(e.Node.Tag))
            {
                if (e.Node.Expanded)
                {
                    if (!treeView.IsFullyExpaned(e.Node.Tag))
                    {
                        // add all the children that did not pass
                        // the filtering to the exempted set.
                        treeView.AddToExemptSet(e.Node.Tag);

                        // save e.Node and expand it in NodeExpandedChanged event handler.
                        m_toExpand = e.Node;
                    }

                    if (RestoreSubExpansion)
                    {
                        treeView.SaveExpansion(e.Node);
                    }
                } // end of if (e.Node.Expanded )
                else
                { // e.Node about to expand. Remove all its children from exempted set.
                  // so normal filtering will be applied.
                    treeView.RemoveFromExemptSet(e.Node.Tag);
                }
            }//  end of if(treeView.IsMatched(e.Node.Tag))
            else
            {
                if (e.Node.Expanded)
                {
                    if (RestoreSubExpansion)
                    {
                        treeView.SaveExpansion(e.Node);
                    }
                }
                else
                {
                    treeView.AddToExemptSet(e.Node.Tag);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Performs custom actions before changing a node's Expanded property</summary>
        /// <param name="sender">Sender</param>
        /// <param name="e">Event args</param>
        void treeControl_NodeExpandedChanging(object sender, TreeControl.CancelNodeEventArgs e)
        {
            if ((!m_autoExpanding) && m_searching)
            {
                var filteredTreeView = TreeView as FilteredTreeView;
                // 3 states to toggle:
                if (filteredTreeView.IsNodeOpaque(e.Node) && filteredTreeView.IsNodeCurrentlyOpaque(e.Node))
                {
                    // two cases here: a) if  the node is expanding and all the child nodes are opaque, just expand all its children
                    // if some of the child nodes are visible, and the node is already expanded, then we need to expand all its children too

                    IEnumerable <object> itsChildren = filteredTreeView.GetChildren(e.Node.Tag); // get visible children
                    if (!itsChildren.Any())
                    {
                        if (!e.Node.Expanded)  /* case a*/
                        {
                            foreach (object child in filteredTreeView.GetUnfilteredChildren(e.Node.Tag))
                            {
                                filteredTreeView.AddCurrentVisibleNode(child);
                            }
                        }
                    }
                    else if (e.Node.Expanded) // an opaque node is about to collapsing; but we actually want it fully expanded
                    {
                        // this is a manual click-expanding case, make all children of the node visible
                        bool added = false;
                        foreach (object child in filteredTreeView.GetUnfilteredChildren(e.Node.Tag))
                        {
                            if (filteredTreeView.AddCurrentVisibleNode(child))
                            {
                                added = true;
                            }
                        }
                        filteredTreeView.RemoveOpaqueNode(e.Node);
                        filteredTreeView.RememberExpansion(e.Node);
                        if (added) // if false, all children are already visible, just collapse the node
                        {
                            m_nodeToExpand = e.Node;
                        }
                    }
                }
                else if (filteredTreeView.IsNodeOpaque(e.Node) && (!filteredTreeView.IsNodeCurrentlyOpaque(e.Node)) && (e.Node.Expanded))
                {
                    // the opaque node is fakely(fully) expanded, restore to hide non-matched ones
                    filteredTreeView.AddOpaqueNode(e.Node);
                    filteredTreeView.RememberExpansion(e.Node);
                    foreach (TreeControl.Node child in e.Node.Children)
                    {
                        if (!filteredTreeView.IsNodeMatched(child))
                        {
                            filteredTreeView.RemoveVisibleNode(child.Tag);
                        }
                    }
                }
                else if (e.Node.Expanded)
                {
                    filteredTreeView.RememberExpansion(e.Node);
                }
                else if (!filteredTreeView.IsNodeOpaque(e.Node)) // check expanding a node with all childen invisible
                {
                    foreach (object child in filteredTreeView.GetUnfilteredChildren(e.Node.Tag))
                    {
                        filteredTreeView.AddCurrentVisibleNode(child);
                    }
                }
            }
        }