Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / Controls / ModelTreeEnumerator.cs / 1305600 / ModelTreeEnumerator.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using MS.Internal.Controls;
using MS.Internal.Data;
using MS.Utility;
namespace MS.Internal.Controls
{
internal abstract class ModelTreeEnumerator : IEnumerator
{
internal ModelTreeEnumerator(object content)
{
_content = content;
}
#region IEnumerator
object IEnumerator.Current
{
get
{
return this.Current;
}
}
bool IEnumerator.MoveNext()
{
return this.MoveNext();
}
void IEnumerator.Reset()
{
this.Reset();
}
#endregion
#region Protected
protected object Content
{
get
{
return _content;
}
}
protected int Index
{
get
{
return _index;
}
set
{
_index = value;
}
}
protected virtual object Current
{
get
{
// Don't VerifyUnchanged(); According to MSDN:
// If the collection is modified between MoveNext and Current,
// Current will return the element that it is set to, even if
// the enumerator is already invalidated.
if (_index == 0)
{
return _content;
}
#pragma warning disable 1634 // about to use PreSharp message numbers - unknown to C#
// Fall through -- can't enumerate (before beginning or after end)
#pragma warning suppress 6503
throw new InvalidOperationException(SR.Get(SRID.EnumeratorInvalidOperation));
// above exception is part of the IEnumerator.Current contract when moving beyond begin/end
#pragma warning restore 1634
}
}
protected virtual bool MoveNext()
{
if (_index < 1)
{
// Singular content, can move next to 0 and that's it.
_index++;
if (_index == 0)
{
// don't call VerifyUnchanged if we're returning false anyway.
// This permits users to change the Content after enumerating
// the content (e.g. in the invalidation callback of an inherited
// property). See bug 955389.
VerifyUnchanged();
return true;
}
}
return false;
}
protected virtual void Reset()
{
VerifyUnchanged();
_index = -1;
}
protected abstract bool IsUnchanged
{
get;
}
protected void VerifyUnchanged()
{
// If the content has changed, then throw an exception
if (!IsUnchanged)
{
throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged));
}
}
#endregion
#region Data
private int _index = -1;
private object _content;
#endregion
}
internal class ContentModelTreeEnumerator : ModelTreeEnumerator
{
internal ContentModelTreeEnumerator(ContentControl contentControl, object content) : base(content)
{
Debug.Assert(contentControl != null, "contentControl should be non-null.");
_owner = contentControl;
}
protected override bool IsUnchanged
{
get
{
return Object.ReferenceEquals(Content, _owner.Content);
}
}
private ContentControl _owner;
}
internal class HeaderedContentModelTreeEnumerator : ModelTreeEnumerator
{
internal HeaderedContentModelTreeEnumerator(HeaderedContentControl headeredContentControl, object content, object header) : base(header)
{
Debug.Assert(headeredContentControl != null, "headeredContentControl should be non-null.");
Debug.Assert(header != null, "Header should be non-null. If Header was null, the base ContentControl enumerator should have been used.");
_owner = headeredContentControl;
_content = content;
}
protected override object Current
{
get
{
if ((Index == 1) && (_content != null))
{
return _content;
}
return base.Current;
}
}
protected override bool MoveNext()
{
if (_content != null)
{
if (Index == 0)
{
// Moving from the header to content
Index++;
VerifyUnchanged();
return true;
}
else if (Index == 1)
{
// Going from content to the end
Index++;
return false;
}
}
return base.MoveNext();
}
protected override bool IsUnchanged
{
get
{
object header = Content; // Header was passed to the base so that it would appear in index 0
return Object.ReferenceEquals(header, _owner.Header) &&
Object.ReferenceEquals(_content, _owner.Content);
}
}
private HeaderedContentControl _owner;
private object _content;
}
internal class HeaderedItemsModelTreeEnumerator : ModelTreeEnumerator
{
internal HeaderedItemsModelTreeEnumerator(HeaderedItemsControl headeredItemsControl, IEnumerator items, object header) : base(header)
{
Debug.Assert(headeredItemsControl != null, "headeredItemsControl should be non-null.");
Debug.Assert(items != null, "items should be non-null.");
Debug.Assert(header != null, "header should be non-null. If Header was null, the base ItemsControl enumerator should have been used.");
_owner = headeredItemsControl;
_items = items;
}
protected override object Current
{
get
{
if (Index > 0)
{
return _items.Current;
}
return base.Current;
}
}
protected override bool MoveNext()
{
if (Index >= 0)
{
Index++;
return _items.MoveNext();
}
return base.MoveNext();
}
protected override void Reset()
{
base.Reset();
_items.Reset();
}
protected override bool IsUnchanged
{
get
{
object header = Content; // Header was passed to the base so that it would appear in index 0
return Object.ReferenceEquals(header, _owner.Header);
}
}
private HeaderedItemsControl _owner;
private IEnumerator _items;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using MS.Internal.Controls;
using MS.Internal.Data;
using MS.Utility;
namespace MS.Internal.Controls
{
internal abstract class ModelTreeEnumerator : IEnumerator
{
internal ModelTreeEnumerator(object content)
{
_content = content;
}
#region IEnumerator
object IEnumerator.Current
{
get
{
return this.Current;
}
}
bool IEnumerator.MoveNext()
{
return this.MoveNext();
}
void IEnumerator.Reset()
{
this.Reset();
}
#endregion
#region Protected
protected object Content
{
get
{
return _content;
}
}
protected int Index
{
get
{
return _index;
}
set
{
_index = value;
}
}
protected virtual object Current
{
get
{
// Don't VerifyUnchanged(); According to MSDN:
// If the collection is modified between MoveNext and Current,
// Current will return the element that it is set to, even if
// the enumerator is already invalidated.
if (_index == 0)
{
return _content;
}
#pragma warning disable 1634 // about to use PreSharp message numbers - unknown to C#
// Fall through -- can't enumerate (before beginning or after end)
#pragma warning suppress 6503
throw new InvalidOperationException(SR.Get(SRID.EnumeratorInvalidOperation));
// above exception is part of the IEnumerator.Current contract when moving beyond begin/end
#pragma warning restore 1634
}
}
protected virtual bool MoveNext()
{
if (_index < 1)
{
// Singular content, can move next to 0 and that's it.
_index++;
if (_index == 0)
{
// don't call VerifyUnchanged if we're returning false anyway.
// This permits users to change the Content after enumerating
// the content (e.g. in the invalidation callback of an inherited
// property). See bug 955389.
VerifyUnchanged();
return true;
}
}
return false;
}
protected virtual void Reset()
{
VerifyUnchanged();
_index = -1;
}
protected abstract bool IsUnchanged
{
get;
}
protected void VerifyUnchanged()
{
// If the content has changed, then throw an exception
if (!IsUnchanged)
{
throw new InvalidOperationException(SR.Get(SRID.EnumeratorVersionChanged));
}
}
#endregion
#region Data
private int _index = -1;
private object _content;
#endregion
}
internal class ContentModelTreeEnumerator : ModelTreeEnumerator
{
internal ContentModelTreeEnumerator(ContentControl contentControl, object content) : base(content)
{
Debug.Assert(contentControl != null, "contentControl should be non-null.");
_owner = contentControl;
}
protected override bool IsUnchanged
{
get
{
return Object.ReferenceEquals(Content, _owner.Content);
}
}
private ContentControl _owner;
}
internal class HeaderedContentModelTreeEnumerator : ModelTreeEnumerator
{
internal HeaderedContentModelTreeEnumerator(HeaderedContentControl headeredContentControl, object content, object header) : base(header)
{
Debug.Assert(headeredContentControl != null, "headeredContentControl should be non-null.");
Debug.Assert(header != null, "Header should be non-null. If Header was null, the base ContentControl enumerator should have been used.");
_owner = headeredContentControl;
_content = content;
}
protected override object Current
{
get
{
if ((Index == 1) && (_content != null))
{
return _content;
}
return base.Current;
}
}
protected override bool MoveNext()
{
if (_content != null)
{
if (Index == 0)
{
// Moving from the header to content
Index++;
VerifyUnchanged();
return true;
}
else if (Index == 1)
{
// Going from content to the end
Index++;
return false;
}
}
return base.MoveNext();
}
protected override bool IsUnchanged
{
get
{
object header = Content; // Header was passed to the base so that it would appear in index 0
return Object.ReferenceEquals(header, _owner.Header) &&
Object.ReferenceEquals(_content, _owner.Content);
}
}
private HeaderedContentControl _owner;
private object _content;
}
internal class HeaderedItemsModelTreeEnumerator : ModelTreeEnumerator
{
internal HeaderedItemsModelTreeEnumerator(HeaderedItemsControl headeredItemsControl, IEnumerator items, object header) : base(header)
{
Debug.Assert(headeredItemsControl != null, "headeredItemsControl should be non-null.");
Debug.Assert(items != null, "items should be non-null.");
Debug.Assert(header != null, "header should be non-null. If Header was null, the base ItemsControl enumerator should have been used.");
_owner = headeredItemsControl;
_items = items;
}
protected override object Current
{
get
{
if (Index > 0)
{
return _items.Current;
}
return base.Current;
}
}
protected override bool MoveNext()
{
if (Index >= 0)
{
Index++;
return _items.MoveNext();
}
return base.MoveNext();
}
protected override void Reset()
{
base.Reset();
_items.Reset();
}
protected override bool IsUnchanged
{
get
{
object header = Content; // Header was passed to the base so that it would appear in index 0
return Object.ReferenceEquals(header, _owner.Header);
}
}
private HeaderedItemsControl _owner;
private IEnumerator _items;
}
}
// 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
- FramingEncoders.cs
- storepermissionattribute.cs
- EntityDataSourceViewSchema.cs
- RectValueSerializer.cs
- DataGridViewButtonColumn.cs
- Utils.cs
- BinarySerializer.cs
- BrowserCapabilitiesFactoryBase.cs
- XmlSchemaObjectCollection.cs
- ADMembershipUser.cs
- OletxCommittableTransaction.cs
- ConfigurationLocationCollection.cs
- EntityCodeGenerator.cs
- DropDownList.cs
- RoutingService.cs
- Int32CAMarshaler.cs
- LZCodec.cs
- DataRelation.cs
- UnsafeNativeMethods.cs
- DataGridState.cs
- DelayedRegex.cs
- SQLDecimal.cs
- RectAnimationUsingKeyFrames.cs
- IDReferencePropertyAttribute.cs
- DefaultBindingPropertyAttribute.cs
- UInt32.cs
- GcHandle.cs
- OptionalColumn.cs
- Codec.cs
- TreeView.cs
- RelativeSource.cs
- RijndaelManagedTransform.cs
- DiagnosticsElement.cs
- CodeSubDirectoriesCollection.cs
- CqlParser.cs
- ChannelParameterCollection.cs
- ILGenerator.cs
- Hash.cs
- DocumentOrderQuery.cs
- processwaithandle.cs
- PipeException.cs
- KerberosTicketHashIdentifierClause.cs
- StringComparer.cs
- StorageAssociationTypeMapping.cs
- XmlArrayItemAttributes.cs
- DirectoryInfo.cs
- XmlSchemaSimpleContentExtension.cs
- Documentation.cs
- DrawingGroupDrawingContext.cs
- DataGridColumnsPage.cs
- ScaleTransform3D.cs
- GeometryDrawing.cs
- FormDocumentDesigner.cs
- User.cs
- FixedSOMLineCollection.cs
- Tracking.cs
- NamespaceMapping.cs
- LocatorPartList.cs
- CustomSignedXml.cs
- CodeStatementCollection.cs
- AppDomainCompilerProxy.cs
- DesignerFrame.cs
- MethodCallTranslator.cs
- SyndicationSerializer.cs
- TraceSource.cs
- RequiredAttributeAttribute.cs
- SqlBulkCopy.cs
- DotExpr.cs
- UrlPropertyAttribute.cs
- CompositeDispatchFormatter.cs
- MergeFailedEvent.cs
- OdbcStatementHandle.cs
- HostingPreferredMapPath.cs
- InternalConfigHost.cs
- CreateUserWizardDesigner.cs
- FunctionQuery.cs
- UriSection.cs
- _ShellExpression.cs
- MimeTypePropertyAttribute.cs
- NamedPipeChannelFactory.cs
- ActiveXHelper.cs
- DirtyTextRange.cs
- TextTreeRootNode.cs
- CatalogPart.cs
- DataGridViewImageColumn.cs
- TableHeaderCell.cs
- PeerNameRegistration.cs
- TimeSpanSecondsConverter.cs
- ObjectDataSourceStatusEventArgs.cs
- LongTypeConverter.cs
- CheckBox.cs
- CompositionTarget.cs
- DesignerTextWriter.cs
- PropertyCollection.cs
- PriorityBindingExpression.cs
- ArgumentsParser.cs
- __ComObject.cs
- SystemIPInterfaceStatistics.cs
- ImageListStreamer.cs
- StickyNote.cs