PrePostDescendentsWalker.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / MS / Internal / PrePostDescendentsWalker.cs / 1 / PrePostDescendentsWalker.cs

                            //------------------------------------------------------------------------------ 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//  
//
// Description: 
//     A simple subclass of DescendentsWalker which introduces a second callback 
//     which is called after a node's children have been visited.
// 
// History:
//  04/13/2004: [....]:  Introduces class.
//  10/20/2004: [....]:  Moved class to MS.Internal.
// 
//-----------------------------------------------------------------------------
using System; 
using System.Diagnostics; 
using System.Windows;
using MS.Utility; 

namespace MS.Internal
{
    ///  
    ///     A simple subclass of DescendentsWalker which introduces a second callback
    ///     which is called after a node's children have been visited. 
    ///  
    internal class PrePostDescendentsWalker : DescendentsWalker
    { 
        //-----------------------------------------------------
        //
        //  Constructors
        // 
        //-----------------------------------------------------
 
        #region Constructors 

        ///  
        ///     Creates an instances of PrePostDescendentsWalker.
        /// 
        /// specifies which tree should be visited first
        /// the callback to be called before a node's children are visited 
        /// the callback to be called after a node's children are visited
        /// the data passed to each callback 
        public PrePostDescendentsWalker(TreeWalkPriority priority, VisitedCallback preCallback, VisitedCallback postCallback, T data) : 
            base(priority, preCallback, data)
        { 
            _postCallback = postCallback;
        }

        #endregion Constructors 

        //------------------------------------------------------ 
        // 
        //  Public Methods
        // 
        //-----------------------------------------------------

        #region Public Methods
 
        /// 
        ///     Starts the walking process for the given node. 
        ///  
        /// the node to start the walk on
        /// whether or not the first node should have the callbacks called on it 
        public override void StartWalk(DependencyObject startNode, bool skipStartNode)
        {
            try
            { 
                base.StartWalk(startNode, skipStartNode);
            } 
            finally 
            {
                if (!skipStartNode) 
                {
                    if (_postCallback != null)
                    {
                        // This type checking is done in DescendentsWalker.  Doing it here 
                        // keeps us consistent.
                        if (FrameworkElement.DType.IsInstanceOfType(startNode) || FrameworkContentElement.DType.IsInstanceOfType(startNode)) 
                        { 
                            _postCallback(startNode, this.Data);
                        } 
                    }
                }
            }
        } 

        #endregion Public Methods 
 
        //------------------------------------------------------
        // 
        //  Protected Methods
        //
        //------------------------------------------------------
 
        #region Protected Methods
 
        ///  
        ///     This method is called for every node touched during a walking of
        ///     the tree.  Some nodes may not have this called if the preCallback 
        ///     returns false - thereby preventing its subtree from being visited.
        /// 
        /// the node to visit
        protected override void _VisitNode(DependencyObject d) 
        {
            try 
            { 
                base._VisitNode(d);
            } 
            finally
            {
                if (_postCallback != null)
                { 
                    _postCallback(d, this.Data);
                } 
            } 
        }
 
        #endregion Protected Methods

        //-----------------------------------------------------
        // 
        //  Private Properties
        // 
        //------------------------------------------------------ 

        #region Private Properties 

        private VisitedCallback _postCallback;

        #endregion Private Properties 

    } 
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK