Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / PrePostDescendentsWalker.cs / 1305600 / 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: rruiz: Introduces class.
// 10/20/2004: rruiz: 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.
//------------------------------------------------------------------------------
//
//
// 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: rruiz: Introduces class.
// 10/20/2004: rruiz: 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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BaseTemplateBuildProvider.cs
- SetMemberBinder.cs
- EllipseGeometry.cs
- XmlAttributeCache.cs
- ResourceKey.cs
- DependencyPropertyKey.cs
- UnsafeNativeMethods.cs
- HealthMonitoringSectionHelper.cs
- MsmqTransportBindingElement.cs
- BuildProvider.cs
- XPathMessageFilterElement.cs
- CodeNamespaceCollection.cs
- OneOfTypeConst.cs
- ExtendedPropertyCollection.cs
- CodeLinePragma.cs
- XNodeValidator.cs
- DataServiceStreamResponse.cs
- ClientScriptManager.cs
- ClosableStream.cs
- CallInfo.cs
- NullableIntSumAggregationOperator.cs
- MultitargetUtil.cs
- ZoneIdentityPermission.cs
- PathSegment.cs
- SecurityCriticalDataForSet.cs
- PermissionRequestEvidence.cs
- Polygon.cs
- SelectionChangedEventArgs.cs
- SchemaInfo.cs
- TextSelection.cs
- DataServiceClientException.cs
- MsmqIntegrationSecurityMode.cs
- ExceptionCollection.cs
- DataIdProcessor.cs
- DesignColumnCollection.cs
- MimePart.cs
- SqlInternalConnectionSmi.cs
- KnownTypesProvider.cs
- ComplusEndpointConfigContainer.cs
- CoTaskMemUnicodeSafeHandle.cs
- SessionStateSection.cs
- Selection.cs
- ListenerElementsCollection.cs
- LogWriteRestartAreaAsyncResult.cs
- RecipientInfo.cs
- StringInfo.cs
- CheckBox.cs
- DocumentOrderComparer.cs
- MimeTypeMapper.cs
- MailAddress.cs
- GacUtil.cs
- XmlMtomWriter.cs
- SecurityHelper.cs
- BitmapScalingModeValidation.cs
- MaskInputRejectedEventArgs.cs
- ViewGenerator.cs
- ModulesEntry.cs
- XmlSchemaDocumentation.cs
- BinHexDecoder.cs
- ToolStripDropDownButton.cs
- StateManagedCollection.cs
- EffectiveValueEntry.cs
- WebService.cs
- StringUtil.cs
- Errors.cs
- Listbox.cs
- BaseValidator.cs
- ConfigXmlCDataSection.cs
- LinkButton.cs
- DesignerRegionMouseEventArgs.cs
- BaseCAMarshaler.cs
- FunctionDescription.cs
- SqlDataSourceRefreshSchemaForm.cs
- RemoteHelper.cs
- RegexWorker.cs
- HttpModulesSection.cs
- SafeEventLogWriteHandle.cs
- ObjectAnimationBase.cs
- XmlSchemaSimpleContentExtension.cs
- PrivilegeNotHeldException.cs
- __Error.cs
- DataBindingList.cs
- PropertyInfo.cs
- FolderLevelBuildProviderCollection.cs
- Sql8ConformanceChecker.cs
- Int16.cs
- EntityProxyTypeInfo.cs
- printdlgexmarshaler.cs
- GACIdentityPermission.cs
- TabletCollection.cs
- AlignmentXValidation.cs
- FacetChecker.cs
- SamlSerializer.cs
- DataGridRelationshipRow.cs
- ResumeStoryboard.cs
- RequestCacheManager.cs
- CheckBox.cs
- TreeViewImageKeyConverter.cs
- InvalidPrinterException.cs
- ByteConverter.cs