Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Sequence.cs / 1305376 / Sequence.cs
namespace System.Workflow.ComponentModel { #region Imports using System; using System.Text; using System.Reflection; using System.Collections; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Collections.Generic; using System.Workflow.ComponentModel.Compiler; #endregion internal static class SequenceHelper { private static DependencyProperty ActiveChildQualifiedNameProperty = DependencyProperty.RegisterAttached("ActiveChildQualifiedName", typeof(String), typeof(SequenceHelper)); private static DependencyProperty ActiveChildRemovedProperty = DependencyProperty.RegisterAttached("ActiveChildRemoved", typeof(bool), typeof(SequenceHelper), new PropertyMetadata(DependencyPropertyOptions.NonSerialized)); public static ActivityExecutionStatus Execute(CompositeActivity activity, ActivityExecutionContext executionContext) { if (activity.EnabledActivities.Count == 0) return ActivityExecutionStatus.Closed; else { activity.EnabledActivities[0].RegisterForStatusChange(Activity.ClosedEvent, (IActivityEventListener) activity); executionContext.ExecuteActivity(activity.EnabledActivities[0]); activity.SetValue(ActiveChildQualifiedNameProperty, activity.EnabledActivities[0].QualifiedName); return ActivityExecutionStatus.Executing; } } public static ActivityExecutionStatus Cancel(CompositeActivity activity, ActivityExecutionContext executionContext) { for (int i = (activity.EnabledActivities.Count - 1); i >= 0; i--) { Activity childActivity = activity.EnabledActivities[i]; if (childActivity.ExecutionStatus == ActivityExecutionStatus.Executing) { executionContext.CancelActivity(childActivity); return activity.ExecutionStatus; } if (childActivity.ExecutionStatus == ActivityExecutionStatus.Canceling || childActivity.ExecutionStatus == ActivityExecutionStatus.Faulting) { return activity.ExecutionStatus; } if (childActivity.ExecutionStatus == ActivityExecutionStatus.Closed) { activity.RemoveProperty(ActiveChildQualifiedNameProperty); return ActivityExecutionStatus.Closed; } } return ActivityExecutionStatus.Closed; } public static void OnEvent(CompositeActivity activity, Object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, (IActivityEventListener )activity); if (activity.ExecutionStatus == ActivityExecutionStatus.Canceling || activity.ExecutionStatus == ActivityExecutionStatus.Faulting || activity.ExecutionStatus == ActivityExecutionStatus.Executing && !TryScheduleNextChild(activity, context)) { activity.RemoveProperty(ActiveChildQualifiedNameProperty); context.CloseActivity(); } } private static bool TryScheduleNextChild(CompositeActivity activity, ActivityExecutionContext executionContext) { IList children = activity.EnabledActivities; // Find index of next activity to run. int indexOfNextActivity = 0; for (int i = (children.Count - 1); i >= 0; i--) { if (children[i].ExecutionStatus == ActivityExecutionStatus.Closed) { // Check whether this is last child? if (i == (children.Count - 1)) return false; indexOfNextActivity = i + 1; break; } } children[indexOfNextActivity].RegisterForStatusChange(Activity.ClosedEvent, (IActivityEventListener )activity); executionContext.ExecuteActivity(children[indexOfNextActivity]); activity.SetValue(ActiveChildQualifiedNameProperty, children[indexOfNextActivity].QualifiedName); return true; } public static void OnActivityChangeRemove(CompositeActivity activity, ActivityExecutionContext executionContext, Activity removedActivity) { String activeChildQualifiedName = activity.GetValue(ActiveChildQualifiedNameProperty) as String; if (removedActivity.QualifiedName.Equals(activeChildQualifiedName)) activity.SetValue(ActiveChildRemovedProperty, true); } public static void OnWorkflowChangesCompleted(CompositeActivity activity, ActivityExecutionContext executionContext) { String activeChildQualifiedName = activity.GetValue(ActiveChildQualifiedNameProperty) as String; bool activeChildRemovedInDynamicUpdate = (bool)activity.GetValue(ActiveChildRemovedProperty); if (activeChildQualifiedName != null && activeChildRemovedInDynamicUpdate) { //We have our active child removed. if (activity.ExecutionStatus == ActivityExecutionStatus.Canceling || activity.ExecutionStatus == ActivityExecutionStatus.Faulting || activity.ExecutionStatus == ActivityExecutionStatus.Executing && !TryScheduleNextChild(activity, executionContext)) { activity.RemoveProperty(ActiveChildQualifiedNameProperty); executionContext.CloseActivity(); } } activity.RemoveProperty(ActiveChildRemovedProperty); } } } // 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
- ScriptingSectionGroup.cs
- WebPartCollection.cs
- SettingsPropertyCollection.cs
- ContainerUIElement3D.cs
- ContentPlaceHolder.cs
- TraceHandlerErrorFormatter.cs
- _SSPIWrapper.cs
- ParallelEnumerable.cs
- X509ScopedServiceCertificateElementCollection.cs
- PagePropertiesChangingEventArgs.cs
- SystemParameters.cs
- SystemIcmpV4Statistics.cs
- LinearGradientBrush.cs
- Control.cs
- RequestSecurityTokenSerializer.cs
- PointF.cs
- RegisteredHiddenField.cs
- FilteredDataSetHelper.cs
- BatchServiceHost.cs
- SendMessageRecord.cs
- RoleManagerSection.cs
- Expressions.cs
- RoleExceptions.cs
- CodeIdentifier.cs
- XmlSerializerNamespaces.cs
- Membership.cs
- RequestQueryParser.cs
- Random.cs
- ParseNumbers.cs
- UInt64Converter.cs
- DiagnosticTraceRecords.cs
- FeedUtils.cs
- Visitors.cs
- XmlSchemaAttribute.cs
- AdornedElementPlaceholder.cs
- ReplyChannel.cs
- XmlUrlResolver.cs
- Helpers.cs
- XmlSerializationGeneratedCode.cs
- DataGridSortCommandEventArgs.cs
- QueryContinueDragEventArgs.cs
- _Semaphore.cs
- TypedTableBase.cs
- XmlSchemaAnnotated.cs
- DbMetaDataCollectionNames.cs
- HttpCapabilitiesBase.cs
- Hashtable.cs
- MenuItemStyle.cs
- printdlgexmarshaler.cs
- FtpRequestCacheValidator.cs
- SafeHandles.cs
- RolePrincipal.cs
- StylusPointPropertyInfo.cs
- DynamicArgumentDesigner.xaml.cs
- StringAnimationBase.cs
- TableCellCollection.cs
- DoubleLinkListEnumerator.cs
- ClassHandlersStore.cs
- PreProcessInputEventArgs.cs
- SupportsPreviewControlAttribute.cs
- EdmValidator.cs
- SecurityTokenProviderContainer.cs
- FullTrustAssembliesSection.cs
- PrintingPermissionAttribute.cs
- GroupItemAutomationPeer.cs
- XamlReader.cs
- MaterializeFromAtom.cs
- HttpServerVarsCollection.cs
- UpdateCommandGenerator.cs
- PageParser.cs
- iisPickupDirectory.cs
- OverlappedContext.cs
- ComponentFactoryHelpers.cs
- HMACSHA1.cs
- SerializationSectionGroup.cs
- listitem.cs
- FunctionUpdateCommand.cs
- AssemblyInfo.cs
- LinkLabelLinkClickedEvent.cs
- LocationSectionRecord.cs
- Gdiplus.cs
- DynamicQueryableWrapper.cs
- Misc.cs
- ApplicationFileCodeDomTreeGenerator.cs
- ProcessModuleCollection.cs
- AuthenticationModuleElement.cs
- Int32AnimationBase.cs
- _DigestClient.cs
- ApplicationFileCodeDomTreeGenerator.cs
- CalculatedColumn.cs
- panel.cs
- Types.cs
- propertyentry.cs
- ListCollectionView.cs
- PropertySet.cs
- DataGridLinkButton.cs
- RadioButtonFlatAdapter.cs
- DispatchWrapper.cs
- AnyReturnReader.cs
- DocumentPageTextView.cs