Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / MS / Internal / Data / CollectionViewGroupInternal.cs / 1 / CollectionViewGroupInternal.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
//
//
//
// Description: A CollectionViewGroupInternal, as created by a CollectionView according to a GroupDescription.
//
// See spec at http://avalon/connecteddata/Specs/Grouping.mht
//
//---------------------------------------------------------------------------
using System;
using System.Collections; // IEnumerator
using System.ComponentModel; // PropertyChangedEventArgs, GroupDescription
using System.Windows; // DependencyProperty.UnsetValue
using System.Windows.Data; // CollectionViewGroup
namespace MS.Internal.Data
{
internal class CollectionViewGroupInternal : CollectionViewGroup
{
#region Constructors
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
internal CollectionViewGroupInternal(object name, CollectionViewGroupInternal parent) : base(name)
{
_parentGroup = parent;
}
#endregion Constructors
#region Public Properties
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
///
/// Is this group at the bottom level (not further subgrouped).
///
public override bool IsBottomLevel
{
get { return (_groupBy == null); }
}
#endregion Public Properties
#region Internal Properties
//------------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
// how this group divides into subgroups
internal GroupDescription GroupBy
{
get { return _groupBy; }
set
{
bool oldIsBottomLevel = IsBottomLevel;
if (_groupBy != null)
((INotifyPropertyChanged)_groupBy).PropertyChanged -= new PropertyChangedEventHandler(OnGroupByChanged);
_groupBy = value;
if (_groupBy != null)
((INotifyPropertyChanged)_groupBy).PropertyChanged += new PropertyChangedEventHandler(OnGroupByChanged);
if (oldIsBottomLevel != IsBottomLevel)
{
OnPropertyChanged(new PropertyChangedEventArgs("IsBottomLevel"));
}
}
}
// the number of items and groups in the subtree under this group
internal int FullCount
{
get { return _fullCount; }
set { _fullCount = value; }
}
// the most recent index where actvity took place
internal int LastIndex
{
get { return _lastIndex; }
set { _lastIndex = value; }
}
// the first item (leaf) added to this group. If this can't be determined,
// DependencyProperty.UnsetValue.
internal object SeedItem
{
get
{
if (ItemCount > 0 && (GroupBy == null || GroupBy.GroupNames.Count == 0))
{
// look for first item, child by child
for (int k=0, n=Items.Count; k 0)
{
// child is a nonempty subgroup - ask it
return subgroup.SeedItem;
}
// otherwise child is an empty subgroup - go to next child
}
// we shouldn't get here, but just in case...
return DependencyProperty.UnsetValue;
}
else
{
// the group is empty, or it has explicit subgroups.
// In either case, we cannot determine the first item -
// it could have gone into any of the subgroups.
return DependencyProperty.UnsetValue;
}
}
}
#endregion Properties
#region Internal methods
//-----------------------------------------------------
//
// Internal methods
//
//------------------------------------------------------
internal void Add(object item)
{
ChangeCounts(item, +1);
ProtectedItems.Add(item);
}
internal int Remove(object item, bool returnLeafIndex)
{
int index = -1;
int localIndex = ProtectedItems.IndexOf(item);
if (localIndex >= 0)
{
if (returnLeafIndex)
{
index = LeafIndexFromItem(null, localIndex);
}
ChangeCounts(item, -1);
ProtectedItems.RemoveAt(localIndex);
}
return index;
}
internal void Clear()
{
ProtectedItems.Clear();
FullCount = 1;
ProtectedItemCount = 0;
}
// return the index of the given item within the list of leaves governed
// by this group
internal int LeafIndexOf(object item)
{
int leaves = 0; // number of leaves we've passed over so far
for (int k=0, n=Items.Count; k= groupBy.GroupNames.Count)
{
parent.Remove(group, false);
}
}
}
void OnGroupByChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
OnGroupByChanged();
}
#endregion Private methods
#region Private fields
//-----------------------------------------------------
//
// Private fields
//
//------------------------------------------------------
GroupDescription _groupBy;
CollectionViewGroupInternal _parentGroup;
int _fullCount = 1;
int _lastIndex;
int _version; // for detecting stale enumerators
#endregion Private fields
#region Private classes
//------------------------------------------------------
//
// Private classes
//
//-----------------------------------------------------
private class LeafEnumerator : IEnumerator
{
public LeafEnumerator(CollectionViewGroupInternal group)
{
_group = group;
DoReset(); // don't call virtual Reset in ctor
}
void IEnumerator.Reset()
{
DoReset();
}
void DoReset()
{
_version = _group._version;
_index = -1;
_subEnum = null;
}
bool IEnumerator.MoveNext()
{
// check for invalidated enumerator
if (_group._version != _version)
throw new InvalidOperationException();
// move forward to the next leaf
while (_subEnum == null || !_subEnum.MoveNext())
{
// done with the current top-level item. Move to the next one.
++ _index;
if (_index >= _group.Items.Count)
return false;
CollectionViewGroupInternal subgroup = _group.Items[_index] as CollectionViewGroupInternal;
if (subgroup == null)
{
// current item is a leaf - it's the new Current
_current = _group.Items[_index];
_subEnum = null;
return true;
}
else
{
// current item is a subgroup - get its enumerator
_subEnum = subgroup.GetLeafEnumerator();
}
}
// the loop terminates only when we have a subgroup enumerator
// positioned at the new Current item
_current = _subEnum.Current;
return true;
}
object IEnumerator.Current
{
get
{
if (_index < 0 || _index >= _group.Items.Count)
throw new InvalidOperationException();
return _current;
}
}
CollectionViewGroupInternal _group; // parent group
int _version; // parent group's version at ctor
int _index; // current index into Items
IEnumerator _subEnum; // enumerator over current subgroup
object _current; // current item
}
#endregion Private classes
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) 2003 by Microsoft Corporation. All rights reserved.
//
//
//
// Description: A CollectionViewGroupInternal, as created by a CollectionView according to a GroupDescription.
//
// See spec at http://avalon/connecteddata/Specs/Grouping.mht
//
//---------------------------------------------------------------------------
using System;
using System.Collections; // IEnumerator
using System.ComponentModel; // PropertyChangedEventArgs, GroupDescription
using System.Windows; // DependencyProperty.UnsetValue
using System.Windows.Data; // CollectionViewGroup
namespace MS.Internal.Data
{
internal class CollectionViewGroupInternal : CollectionViewGroup
{
#region Constructors
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
internal CollectionViewGroupInternal(object name, CollectionViewGroupInternal parent) : base(name)
{
_parentGroup = parent;
}
#endregion Constructors
#region Public Properties
//------------------------------------------------------
//
// Public Properties
//
//-----------------------------------------------------
///
/// Is this group at the bottom level (not further subgrouped).
///
public override bool IsBottomLevel
{
get { return (_groupBy == null); }
}
#endregion Public Properties
#region Internal Properties
//------------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
// how this group divides into subgroups
internal GroupDescription GroupBy
{
get { return _groupBy; }
set
{
bool oldIsBottomLevel = IsBottomLevel;
if (_groupBy != null)
((INotifyPropertyChanged)_groupBy).PropertyChanged -= new PropertyChangedEventHandler(OnGroupByChanged);
_groupBy = value;
if (_groupBy != null)
((INotifyPropertyChanged)_groupBy).PropertyChanged += new PropertyChangedEventHandler(OnGroupByChanged);
if (oldIsBottomLevel != IsBottomLevel)
{
OnPropertyChanged(new PropertyChangedEventArgs("IsBottomLevel"));
}
}
}
// the number of items and groups in the subtree under this group
internal int FullCount
{
get { return _fullCount; }
set { _fullCount = value; }
}
// the most recent index where actvity took place
internal int LastIndex
{
get { return _lastIndex; }
set { _lastIndex = value; }
}
// the first item (leaf) added to this group. If this can't be determined,
// DependencyProperty.UnsetValue.
internal object SeedItem
{
get
{
if (ItemCount > 0 && (GroupBy == null || GroupBy.GroupNames.Count == 0))
{
// look for first item, child by child
for (int k=0, n=Items.Count; k 0)
{
// child is a nonempty subgroup - ask it
return subgroup.SeedItem;
}
// otherwise child is an empty subgroup - go to next child
}
// we shouldn't get here, but just in case...
return DependencyProperty.UnsetValue;
}
else
{
// the group is empty, or it has explicit subgroups.
// In either case, we cannot determine the first item -
// it could have gone into any of the subgroups.
return DependencyProperty.UnsetValue;
}
}
}
#endregion Properties
#region Internal methods
//-----------------------------------------------------
//
// Internal methods
//
//------------------------------------------------------
internal void Add(object item)
{
ChangeCounts(item, +1);
ProtectedItems.Add(item);
}
internal int Remove(object item, bool returnLeafIndex)
{
int index = -1;
int localIndex = ProtectedItems.IndexOf(item);
if (localIndex >= 0)
{
if (returnLeafIndex)
{
index = LeafIndexFromItem(null, localIndex);
}
ChangeCounts(item, -1);
ProtectedItems.RemoveAt(localIndex);
}
return index;
}
internal void Clear()
{
ProtectedItems.Clear();
FullCount = 1;
ProtectedItemCount = 0;
}
// return the index of the given item within the list of leaves governed
// by this group
internal int LeafIndexOf(object item)
{
int leaves = 0; // number of leaves we've passed over so far
for (int k=0, n=Items.Count; k= groupBy.GroupNames.Count)
{
parent.Remove(group, false);
}
}
}
void OnGroupByChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
OnGroupByChanged();
}
#endregion Private methods
#region Private fields
//-----------------------------------------------------
//
// Private fields
//
//------------------------------------------------------
GroupDescription _groupBy;
CollectionViewGroupInternal _parentGroup;
int _fullCount = 1;
int _lastIndex;
int _version; // for detecting stale enumerators
#endregion Private fields
#region Private classes
//------------------------------------------------------
//
// Private classes
//
//-----------------------------------------------------
private class LeafEnumerator : IEnumerator
{
public LeafEnumerator(CollectionViewGroupInternal group)
{
_group = group;
DoReset(); // don't call virtual Reset in ctor
}
void IEnumerator.Reset()
{
DoReset();
}
void DoReset()
{
_version = _group._version;
_index = -1;
_subEnum = null;
}
bool IEnumerator.MoveNext()
{
// check for invalidated enumerator
if (_group._version != _version)
throw new InvalidOperationException();
// move forward to the next leaf
while (_subEnum == null || !_subEnum.MoveNext())
{
// done with the current top-level item. Move to the next one.
++ _index;
if (_index >= _group.Items.Count)
return false;
CollectionViewGroupInternal subgroup = _group.Items[_index] as CollectionViewGroupInternal;
if (subgroup == null)
{
// current item is a leaf - it's the new Current
_current = _group.Items[_index];
_subEnum = null;
return true;
}
else
{
// current item is a subgroup - get its enumerator
_subEnum = subgroup.GetLeafEnumerator();
}
}
// the loop terminates only when we have a subgroup enumerator
// positioned at the new Current item
_current = _subEnum.Current;
return true;
}
object IEnumerator.Current
{
get
{
if (_index < 0 || _index >= _group.Items.Count)
throw new InvalidOperationException();
return _current;
}
}
CollectionViewGroupInternal _group; // parent group
int _version; // parent group's version at ctor
int _index; // current index into Items
IEnumerator _subEnum; // enumerator over current subgroup
object _current; // current item
}
#endregion Private classes
}
}
// 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
- UnitySerializationHolder.cs
- XmlSchemaSet.cs
- IconBitmapDecoder.cs
- ManagementNamedValueCollection.cs
- PenThread.cs
- DataGridViewHeaderCell.cs
- Resources.Designer.cs
- PerformanceCounterPermissionEntryCollection.cs
- ResourceDescriptionAttribute.cs
- DataGridViewRowCancelEventArgs.cs
- ReadingWritingEntityEventArgs.cs
- ListViewInsertEventArgs.cs
- TextFragmentEngine.cs
- DefinitionUpdate.cs
- TableProviderWrapper.cs
- GPPOINT.cs
- TextEmbeddedObject.cs
- XsltException.cs
- HtmlDocument.cs
- DataSourceListEditor.cs
- BitmapEffectrendercontext.cs
- WriteableOnDemandPackagePart.cs
- OleDbRowUpdatingEvent.cs
- DocumentPaginator.cs
- XPathNodeHelper.cs
- MexHttpBindingElement.cs
- TransactionFlowAttribute.cs
- TranslateTransform.cs
- Win32.cs
- IPipelineRuntime.cs
- CallbackHandler.cs
- EntityDataSourceView.cs
- ImageListUtils.cs
- ConfigurationLocationCollection.cs
- Mappings.cs
- SspiNegotiationTokenAuthenticator.cs
- FirstMatchCodeGroup.cs
- FileDetails.cs
- TableItemProviderWrapper.cs
- KeyNotFoundException.cs
- CollectionViewGroupRoot.cs
- BitSet.cs
- ExpressionEditorSheet.cs
- HtmlTextArea.cs
- RepeatInfo.cs
- HttpModuleCollection.cs
- WebPartChrome.cs
- BufferModesCollection.cs
- ConfigXmlAttribute.cs
- TraceRecords.cs
- ContainerAction.cs
- UnaryOperationBinder.cs
- MembershipPasswordException.cs
- StaticTextPointer.cs
- ConnectionProviderAttribute.cs
- CngAlgorithm.cs
- XmlSchemaComplexContentRestriction.cs
- Visitors.cs
- HMACSHA1.cs
- DesignTimeParseData.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- DropDownList.cs
- BuilderPropertyEntry.cs
- SeverityFilter.cs
- DetailsViewDesigner.cs
- HeaderedContentControl.cs
- ColumnWidthChangingEvent.cs
- ActivityExecutorOperation.cs
- ClockController.cs
- XmlRawWriterWrapper.cs
- XsdCachingReader.cs
- FloaterParagraph.cs
- DockingAttribute.cs
- SafeFindHandle.cs
- Overlapped.cs
- FacetValues.cs
- TdsParameterSetter.cs
- BamlReader.cs
- ValidatorUtils.cs
- SiteMapNodeCollection.cs
- DataReaderContainer.cs
- DNS.cs
- AdornerHitTestResult.cs
- WebBrowserProgressChangedEventHandler.cs
- FindSimilarActivitiesVerb.cs
- DefaultBinder.cs
- SByteConverter.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- ValueUtilsSmi.cs
- ResourcePool.cs
- MulticastIPAddressInformationCollection.cs
- __Filters.cs
- NameValueFileSectionHandler.cs
- MsmqTransportBindingElement.cs
- RSAOAEPKeyExchangeFormatter.cs
- VisualBasicExpressionConverter.cs
- FormsAuthentication.cs
- PropertyCollection.cs
- NamedElement.cs
- DetailsViewModeEventArgs.cs