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
- WebControlsSection.cs
- MbpInfo.cs
- CacheVirtualItemsEvent.cs
- DbConnectionPoolCounters.cs
- ReliabilityContractAttribute.cs
- DataGridViewCellStateChangedEventArgs.cs
- HttpListenerResponse.cs
- TextViewBase.cs
- DependencyStoreSurrogate.cs
- Lease.cs
- ExpressionPrinter.cs
- HealthMonitoringSection.cs
- ExclusiveCanonicalizationTransform.cs
- SurrogateEncoder.cs
- Int16Animation.cs
- AspNetSynchronizationContext.cs
- BrowserCapabilitiesCompiler.cs
- WebScriptMetadataMessageEncodingBindingElement.cs
- Pens.cs
- SizeKeyFrameCollection.cs
- DBSqlParserColumn.cs
- BindingWorker.cs
- LinqDataSourceStatusEventArgs.cs
- DataContract.cs
- XmlBindingWorker.cs
- ToolBarDesigner.cs
- Pipe.cs
- MonitorWrapper.cs
- StrongNamePublicKeyBlob.cs
- VirtualPath.cs
- StrongBox.cs
- ResXResourceReader.cs
- EntityContainer.cs
- ConnectionConsumerAttribute.cs
- ImportContext.cs
- TheQuery.cs
- CodeIndexerExpression.cs
- PrintDocument.cs
- SqlCacheDependencyDatabaseCollection.cs
- XhtmlConformanceSection.cs
- CacheOutputQuery.cs
- FormsAuthenticationCredentials.cs
- AnonymousIdentificationModule.cs
- DictationGrammar.cs
- NavigationEventArgs.cs
- TypeSystemHelpers.cs
- SafeTimerHandle.cs
- DataReaderContainer.cs
- ZoneIdentityPermission.cs
- EmbeddedMailObject.cs
- DataSourceCollectionBase.cs
- ServiceElementCollection.cs
- AutoResetEvent.cs
- DesignTimeVisibleAttribute.cs
- HttpRuntimeSection.cs
- SharedStream.cs
- ProcessModule.cs
- SQLBytes.cs
- TraceHwndHost.cs
- CategoryValueConverter.cs
- InputProviderSite.cs
- InvalidCastException.cs
- Enlistment.cs
- SQLCharsStorage.cs
- AudioFileOut.cs
- BoundingRectTracker.cs
- SQLInt16.cs
- FileStream.cs
- DocumentOrderQuery.cs
- XslNumber.cs
- JpegBitmapEncoder.cs
- AppDomainCompilerProxy.cs
- EventLogInformation.cs
- SapiInterop.cs
- HTMLTextWriter.cs
- RadioButtonRenderer.cs
- FlowDocumentPage.cs
- XsltLoader.cs
- ExecutionScope.cs
- SymLanguageType.cs
- ContextMenu.cs
- WaitHandle.cs
- DataGridBoolColumn.cs
- GPStream.cs
- TypedDataSetSchemaImporterExtension.cs
- MemoryFailPoint.cs
- AbsoluteQuery.cs
- TableLayoutPanel.cs
- AppDomainProtocolHandler.cs
- PropertyTab.cs
- HttpPostedFileWrapper.cs
- OpenFileDialog.cs
- SspiSecurityToken.cs
- XmlWhitespace.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- MoveSizeWinEventHandler.cs
- SafeThemeHandle.cs
- NativeMethods.cs
- OrderedDictionary.cs
- TextBox.cs