Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / Tools / System.Activities.Presentation / System / Activities / Presentation / Base / Core / OrderToken.cs / 1305376 / OrderToken.cs
namespace System.Activities.Presentation {
using System;
using System.Collections.Generic;
using System.Text;
using System.Activities.Presentation;
///
/// OrderToken is a generic class used to identify the sort
/// order of hierarchical items. OrderTokens can be used
/// to define priority that is based on some predefined defaults or
/// based on other OrderTokens.
///
abstract class OrderToken : IComparable {
private readonly OrderToken _reference;
private readonly OrderTokenPrecedence _precedence;
private readonly OrderTokenConflictResolution _conflictResolution;
private readonly int _depth;
private readonly int _index;
private int _nextChildIndex;
///
/// Creates a new OrderToken instance based on the specified
/// referenced OrderToken, precedence, and conflict resolution
/// semantics.
///
/// Precedence of this token based on the
/// referenced token.
/// Referenced token. May be null for the
/// root token case (token that's not dependent on anything else).
/// Conflict resolution semantics.
/// Winning ConflictResultion semantic should only be used
/// on predefined, default OrderToken instances to ensure
/// their correct placement in more complex chain of order
/// dependencies.
protected OrderToken(
OrderTokenPrecedence precedence,
OrderToken reference,
OrderTokenConflictResolution conflictResolution) {
if (!EnumValidator.IsValid(precedence)) throw FxTrace.Exception.AsError(new ArgumentOutOfRangeException("precedence"));
if (!EnumValidator.IsValid(conflictResolution)) throw FxTrace.Exception.AsError(new ArgumentOutOfRangeException("conflictResolution"));
_reference = reference;
_precedence = precedence;
_conflictResolution = conflictResolution;
_depth = reference == null ? 0 : reference._depth + 1;
_index = reference == null ? -1 : reference._nextChildIndex++;
}
///
/// Compares this order token with the specified order token.
/// The comparsion for OrderTokens that don't belong to the same
/// chain of OrderTokens will be resolved non-deterministically.
///
/// The token to compare this token to.
/// 0 when the tokens have an equal order priority,
/// -1 if this order comes before the specified order,
/// 1 otherwise.
/// When other is null
public virtual int CompareTo(OrderToken other) {
if (other == null)
throw FxTrace.Exception.ArgumentNull("other");
if (other == this)
return 0;
OrderToken thisOrder = this;
// Find a common parent
while (thisOrder._reference != other._reference) {
if (thisOrder._depth == other._depth)
{
thisOrder = thisOrder._reference;
other = other._reference;
}
else{
if (thisOrder._depth > other._depth) {
if (thisOrder._reference == other) return thisOrder._precedence == OrderTokenPrecedence.After ? 1 : -1;
thisOrder = thisOrder._reference;
}
else {
if (other._reference == thisOrder) return other._precedence == OrderTokenPrecedence.After ? -1 : 1;
other = other._reference;
}
}
}
// One order "before", one order "after"? Easy, return the
// "before" order.
if (thisOrder._precedence != other._precedence)
return thisOrder._precedence == OrderTokenPrecedence.Before ? -1 : 1;
// Both orders "before" the parent? Roots win, otherwise call ResolveConflict().
if (thisOrder._precedence == OrderTokenPrecedence.Before) {
if (thisOrder._conflictResolution == OrderTokenConflictResolution.Win)
return -1;
else if (other._conflictResolution == OrderTokenConflictResolution.Win)
return 1;
return ResolveConflict(thisOrder, other);
}
// Both orders "after" the parent? Roots win, otherwise call ResolveConflict().
if (thisOrder._conflictResolution == OrderTokenConflictResolution.Win)
return 1;
else if (other._conflictResolution == OrderTokenConflictResolution.Win)
return -1;
return ResolveConflict(thisOrder, other);
}
///
/// This method is called by CompareTo()'s default implementation when two OrderTokens
/// appear to be equivalent. The base functionality of this method uses the instantiation
/// order of the two tokens as a tie-breaker. Override this method to
/// implement custom algorithms. Note that if this method ever returns 0
/// (indicating that the two tokens are equivalent) and if these tokens
/// belong to a list that gets sorted multiple times, the relative order in
/// which they appear in the list will not be guaranteed. This side-effect
/// may or may not be a problem depending on the application.
///
/// Left OrderToken
/// Right OrderToken
/// 0, if the two are equal, -1, if left comes before right,
/// 1 otherwise.
protected virtual int ResolveConflict(OrderToken left, OrderToken right) {
return left._index.CompareTo(right._index);
}
}
}
// 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
- Track.cs
- StoryFragments.cs
- FixedTextContainer.cs
- WebServiceEnumData.cs
- RegexRunnerFactory.cs
- ProtectedConfiguration.cs
- ListBase.cs
- Binding.cs
- EncryptedType.cs
- DBBindings.cs
- ChameleonKey.cs
- DescendentsWalker.cs
- PolyLineSegment.cs
- WebPartZoneBase.cs
- DesignOnlyAttribute.cs
- Attributes.cs
- MaxSessionCountExceededException.cs
- TextRangeEditTables.cs
- MeasurementDCInfo.cs
- _RequestLifetimeSetter.cs
- ConfigurationPropertyAttribute.cs
- CodeStatementCollection.cs
- Timeline.cs
- ToolboxSnapDragDropEventArgs.cs
- X509Certificate2Collection.cs
- SharedStatics.cs
- ConnectionManagementElement.cs
- FactoryGenerator.cs
- DNS.cs
- WebPartExportVerb.cs
- Visual3D.cs
- EventWaitHandle.cs
- CatchDesigner.xaml.cs
- HelpProvider.cs
- WebBrowserProgressChangedEventHandler.cs
- ServiceDurableInstance.cs
- NamespaceTable.cs
- DbXmlEnabledProviderManifest.cs
- LogArchiveSnapshot.cs
- ReaderWriterLockSlim.cs
- Geometry.cs
- OleDbDataAdapter.cs
- CommandSet.cs
- EdmScalarPropertyAttribute.cs
- ChangeProcessor.cs
- WebColorConverter.cs
- HttpServerProtocol.cs
- ParallelTimeline.cs
- CommandArguments.cs
- NativeCompoundFileAPIs.cs
- CodeObject.cs
- TraceData.cs
- ExtenderProvidedPropertyAttribute.cs
- ServiceParser.cs
- Model3DCollection.cs
- EntityFrameworkVersions.cs
- TdsValueSetter.cs
- RSAOAEPKeyExchangeFormatter.cs
- SystemIPAddressInformation.cs
- FocusManager.cs
- SqlRewriteScalarSubqueries.cs
- XmlSchemaAppInfo.cs
- TextUtf8RawTextWriter.cs
- RectangleF.cs
- OperationAbortedException.cs
- Rect3D.cs
- XmlTextReaderImpl.cs
- Animatable.cs
- DataGridViewRowsAddedEventArgs.cs
- GridViewSortEventArgs.cs
- sqlinternaltransaction.cs
- TraceHwndHost.cs
- HTMLTextWriter.cs
- ChannelDispatcherCollection.cs
- MarshalDirectiveException.cs
- DocumentApplicationJournalEntry.cs
- MenuItem.cs
- NameTable.cs
- HttpModuleActionCollection.cs
- DataRowChangeEvent.cs
- StringExpressionSet.cs
- TaskFormBase.cs
- SerialPort.cs
- ConfigXmlDocument.cs
- RoutedEventValueSerializer.cs
- UrlAuthFailedErrorFormatter.cs
- querybuilder.cs
- RawStylusInputCustomData.cs
- AdapterDictionary.cs
- RouteParameter.cs
- Page.cs
- ExternalCalls.cs
- SpeechAudioFormatInfo.cs
- Console.cs
- InternalResources.cs
- FocusTracker.cs
- XsdValidatingReader.cs
- ButtonBase.cs
- XmlObjectSerializerWriteContext.cs
- TreeViewImageIndexConverter.cs