Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / Common / Walker.cs / 1305376 / Walker.cs
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
// WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
// THE ENTIRE RISK OF USE OR RESULTS IN CONNECTION WITH THE USE OF THIS CODE
// AND INFORMATION REMAINS WITH THE USER.
//
/**********************************************************************
* NOTE: A copy of this file exists at: WF\Common\Shared
* The two files must be kept in [....]. Any change made here must also
* be made to WF\Common\Shared\Walker.cs
*********************************************************************/
namespace System.Workflow.Activities.Common
{
#region Imports
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Workflow.ComponentModel;
#endregion
// Returns true to continue the walk, false to stop.
internal delegate void WalkerEventHandler(Walker walker, WalkerEventArgs eventArgs);
internal enum WalkerAction
{
Continue = 0,
Skip = 1,
Abort = 2
}
#region Class WalkerEventArgs
internal sealed class WalkerEventArgs: EventArgs
{
private Activity currentActivity = null;
private object currentPropertyOwner = null;
private PropertyInfo currentProperty = null;
private object currentValue = null;
private WalkerAction action = WalkerAction.Continue;
internal WalkerEventArgs(Activity currentActivity)
{
this.currentActivity = currentActivity;
this.currentPropertyOwner = null;
this.currentProperty = null;
this.currentValue = null;
}
internal WalkerEventArgs(Activity currentActivity, object currentValue, PropertyInfo currentProperty, object currentPropertyOwner)
: this(currentActivity)
{
this.currentPropertyOwner = currentPropertyOwner;
this.currentProperty = currentProperty;
this.currentValue = currentValue;
}
public WalkerAction Action
{
get
{
return this.action;
}
set
{
this.action = value;
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public PropertyInfo CurrentProperty
{
get
{
return this.currentProperty;
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public object CurrentPropertyOwner
{
get
{
return this.currentPropertyOwner;
}
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public object CurrentValue
{
get
{
return this.currentValue;
}
}
public Activity CurrentActivity
{
get
{
return this.currentActivity;
}
}
}
#endregion
internal sealed class Walker
{
#region Members
internal event WalkerEventHandler FoundActivity;
internal event WalkerEventHandler FoundProperty;
private bool useEnabledActivities = false;
#endregion
#region Methods
public Walker()
: this(false)
{
}
public Walker(bool useEnabledActivities)
{
this.useEnabledActivities = useEnabledActivities;
}
public void Walk(Activity seedActivity)
{
Walk(seedActivity, true);
}
public void Walk(Activity seedActivity, bool walkChildren)
{
Queue queue = new Queue();
queue.Enqueue(seedActivity);
while (queue.Count > 0)
{
Activity activity = queue.Dequeue() as Activity;
if (FoundActivity != null)
{
WalkerEventArgs args = new WalkerEventArgs(activity);
FoundActivity(this, args);
if (args.Action == WalkerAction.Abort)
return;
if (args.Action == WalkerAction.Skip)
continue;
}
if (FoundProperty != null)
{
if (!WalkProperties(activity))
return;
}
if (walkChildren && activity is CompositeActivity)
{
if (useEnabledActivities)
{
foreach (Activity activity2 in Helpers.GetAllEnabledActivities((CompositeActivity)activity))
queue.Enqueue(activity2);
}
else
{
foreach (Activity activity2 in ((CompositeActivity)activity).Activities)
queue.Enqueue(activity2);
}
}
}
}
private bool WalkProperties(Activity seedActivity)
{
return WalkProperties(seedActivity as Activity, seedActivity);
}
public bool WalkProperties(Activity activity, object obj)
{
Activity currentActivity = obj as Activity;
PropertyInfo[] props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo prop in props)
{
// !!Work around: no indexer property walking
if (prop.GetIndexParameters() != null && prop.GetIndexParameters().Length > 0)
continue;
DesignerSerializationVisibility visibility = GetSerializationVisibility(prop);
if (visibility == DesignerSerializationVisibility.Hidden)
continue;
//Try to see if we have dynamic property associated with the object on the same object
//if so then we should compare if the dynamic property values match with the property type
//if not we bail out
object propValue = null;
DependencyProperty dependencyProperty = DependencyProperty.FromName(prop.Name, obj.GetType());
if (dependencyProperty != null && currentActivity != null)
{
if (currentActivity.IsBindingSet(dependencyProperty))
propValue = currentActivity.GetBinding(dependencyProperty);
else
propValue = currentActivity.GetValue(dependencyProperty);
}
else
{
try
{
propValue = prop.CanRead ? prop.GetValue(obj, null) : null;
}
catch
{
// Eat exceptions that occur while invoking the getter.
}
}
if (FoundProperty != null)
{
WalkerEventArgs args = new WalkerEventArgs(activity, propValue, prop, obj);
FoundProperty(this, args);
if (args.Action == WalkerAction.Skip)
continue;
else if (args.Action == WalkerAction.Abort)
return false;
}
if (propValue is IList)
{
//We do not need to reflect on the properties of the list
foreach (object childObj in (IList)propValue)
{
if (FoundProperty != null)
{
WalkerEventArgs args = new WalkerEventArgs(activity, childObj, null, propValue);
FoundProperty(this, args);
if (args.Action == WalkerAction.Skip)
continue;
else if (args.Action == WalkerAction.Abort)
return false;
}
if(childObj != null && IsBrowsableType(childObj.GetType()))
{
if (!WalkProperties(activity, childObj))
return false;
}
}
}
else if (propValue != null && IsBrowsableType(propValue.GetType()))
{
if (!WalkProperties(activity, propValue))
return false;
}
}
return true;
}
private static DesignerSerializationVisibility GetSerializationVisibility(PropertyInfo prop)
{
// work around!!! for Activities collection
if(prop.DeclaringType == typeof(CompositeActivity) && string.Equals(prop.Name, "Activities", StringComparison.Ordinal))
return DesignerSerializationVisibility.Hidden;
DesignerSerializationVisibility visibility = DesignerSerializationVisibility.Visible;
DesignerSerializationVisibilityAttribute[] visibilityAttrs = (DesignerSerializationVisibilityAttribute[])prop.GetCustomAttributes(typeof(DesignerSerializationVisibilityAttribute), true);
if (visibilityAttrs.Length > 0)
visibility = visibilityAttrs[0].Visibility;
return visibility;
}
private static bool IsBrowsableType(Type type)
{
bool browsable = false;
BrowsableAttribute[] browsableAttrs = (BrowsableAttribute[])type.GetCustomAttributes(typeof(BrowsableAttribute), true);
if (browsableAttrs.Length > 0)
browsable = browsableAttrs[0].Browsable;
return browsable;
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TransactionWaitAsyncResult.cs
- CompilerCollection.cs
- ElementHost.cs
- DockAndAnchorLayout.cs
- MethodToken.cs
- ContextBase.cs
- ListSurrogate.cs
- TickBar.cs
- NamedObject.cs
- Emitter.cs
- CipherData.cs
- ReachFixedDocumentSerializerAsync.cs
- ProfileEventArgs.cs
- SoapAttributeOverrides.cs
- StdValidatorsAndConverters.cs
- GeometryDrawing.cs
- DataControlField.cs
- HwndStylusInputProvider.cs
- serverconfig.cs
- dataprotectionpermission.cs
- VoiceObjectToken.cs
- XmlSchemaSimpleTypeList.cs
- ProjectionPlan.cs
- DataColumnMapping.cs
- CroppedBitmap.cs
- TextTreeFixupNode.cs
- CardSpacePolicyElement.cs
- XDeferredAxisSource.cs
- CodeSubDirectoriesCollection.cs
- DependencyProperty.cs
- dsa.cs
- ObjectStateFormatter.cs
- BaseDataListComponentEditor.cs
- WindowsListViewGroup.cs
- TrustSection.cs
- ImageDrawing.cs
- RectangleHotSpot.cs
- ClipboardData.cs
- Emitter.cs
- TrustSection.cs
- TextDecorationCollectionConverter.cs
- EntityStoreSchemaFilterEntry.cs
- ActivityExecutionContextCollection.cs
- CapabilitiesState.cs
- ProxySimple.cs
- _TransmitFileOverlappedAsyncResult.cs
- ZoneLinkButton.cs
- dataobject.cs
- ArrayList.cs
- DbConnectionStringBuilder.cs
- Ref.cs
- TextDecorations.cs
- CqlLexerHelpers.cs
- XmlSchemaException.cs
- DesignerValidatorAdapter.cs
- MemberMemberBinding.cs
- TypedTableBase.cs
- WebPartCancelEventArgs.cs
- SystemIPGlobalStatistics.cs
- PersianCalendar.cs
- Version.cs
- ValidatingPropertiesEventArgs.cs
- MatcherBuilder.cs
- SystemNetworkInterface.cs
- XmlHierarchyData.cs
- CreationContext.cs
- CngAlgorithm.cs
- DataGridViewIntLinkedList.cs
- HtmlGenericControl.cs
- EmbeddedMailObjectsCollection.cs
- SqlDataSourceSelectingEventArgs.cs
- CultureInfoConverter.cs
- TimelineGroup.cs
- UrlMappingsModule.cs
- DataRelationPropertyDescriptor.cs
- GridViewUpdatedEventArgs.cs
- KeyFrames.cs
- dbdatarecord.cs
- GenericFlowSwitchHelper.cs
- Metafile.cs
- BamlBinaryReader.cs
- ContractsBCL.cs
- HtmlWindowCollection.cs
- SqlIdentifier.cs
- OutKeywords.cs
- TypeUsage.cs
- SqlParameterCollection.cs
- Utils.cs
- XmlBoundElement.cs
- RotateTransform.cs
- AlgoModule.cs
- DirectionalLight.cs
- MemberBinding.cs
- ProviderSettings.cs
- SamlConstants.cs
- QueryStringParameter.cs
- DefaultHttpHandler.cs
- ServiceDescription.cs
- EntityRecordInfo.cs
- BaseResourcesBuildProvider.cs