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
- SqlCacheDependencyDatabaseCollection.cs
- ActivityTrace.cs
- BasicAsyncResult.cs
- MimePart.cs
- ServiceProviders.cs
- DateTimeFormatInfoScanner.cs
- RawStylusInput.cs
- TabPageDesigner.cs
- ListInitExpression.cs
- SelectionRangeConverter.cs
- GeneralTransform.cs
- WebBrowserContainer.cs
- ComponentEditorForm.cs
- TextTreeTextElementNode.cs
- ChildrenQuery.cs
- BuildProviderAppliesToAttribute.cs
- InsufficientMemoryException.cs
- RectValueSerializer.cs
- HttpCacheVaryByContentEncodings.cs
- FileVersionInfo.cs
- HashRepartitionStream.cs
- WeakReadOnlyCollection.cs
- EntityExpressionVisitor.cs
- CalendarDataBindingHandler.cs
- SecurityProtocol.cs
- OleDbRowUpdatedEvent.cs
- Win32MouseDevice.cs
- DeviceFilterDictionary.cs
- ItemContainerGenerator.cs
- WebPartConnectionsCancelEventArgs.cs
- Token.cs
- TableProviderWrapper.cs
- DataGridViewImageCell.cs
- ReceiveCompletedEventArgs.cs
- DbConnectionHelper.cs
- FactoryGenerator.cs
- UnsafeNativeMethodsTablet.cs
- BitmapDecoder.cs
- CultureMapper.cs
- ConnectionConsumerAttribute.cs
- tabpagecollectioneditor.cs
- Sequence.cs
- HttpTransportBindingElement.cs
- SQLSingleStorage.cs
- Int16.cs
- SqlCacheDependency.cs
- DataGridTextBox.cs
- contentDescriptor.cs
- SourceFileBuildProvider.cs
- RSACryptoServiceProvider.cs
- SchemaMapping.cs
- namescope.cs
- OptimisticConcurrencyException.cs
- VisualBrush.cs
- CryptoStream.cs
- ViewgenContext.cs
- ServiceObjectContainer.cs
- SqlConnectionString.cs
- KoreanLunisolarCalendar.cs
- DetailsViewDeleteEventArgs.cs
- QfeChecker.cs
- HTTPNotFoundHandler.cs
- Label.cs
- ByteConverter.cs
- FileDialog.cs
- TableDetailsRow.cs
- HWStack.cs
- SoapClientMessage.cs
- ReaderOutput.cs
- WmlSelectionListAdapter.cs
- ContainerParaClient.cs
- RelationshipManager.cs
- BridgeDataRecord.cs
- OdbcReferenceCollection.cs
- EntityKeyElement.cs
- WorkflowDefinitionDispenser.cs
- EntityCollection.cs
- DbInsertCommandTree.cs
- SingleAnimationUsingKeyFrames.cs
- FakeModelItemImpl.cs
- RouteItem.cs
- CookieHandler.cs
- PerformanceCounterPermissionAttribute.cs
- SchemaImporterExtensionsSection.cs
- DataListAutoFormat.cs
- PropertyTabAttribute.cs
- DataGridViewSortCompareEventArgs.cs
- DateTimeConstantAttribute.cs
- StreamGeometry.cs
- Highlights.cs
- TextServicesPropertyRanges.cs
- TripleDES.cs
- PropertyGeneratedEventArgs.cs
- BitmapEffectInputData.cs
- MessageQueueKey.cs
- XmlDomTextWriter.cs
- LayoutEditorPart.cs
- InvalidFilterCriteriaException.cs
- ListCommandEventArgs.cs
- ContactManager.cs