📄 tree2.cs
字号:
}
public virtual bool MoveNext()
{
return _Enumerator.MoveNext();
}
public virtual T Current
{
get
{
if ( _Enumerator == null ) { Debug.Assert( false ); return default( T ); }
if ( _Enumerator.Current == null ) { Debug.Assert( false ); return default( T ); }
return _Enumerator.Current.Data;
}
}
}
}
//-----------------------------------------------------------------------------
// AllEnumerator
public IEnumerableCollectionPair<T> All { get { return new AllEnumerator( this ); } }
protected class AllEnumerator : BaseEnumerableCollectionPair
{
public AllEnumerator( NodeTree<T> root ) : base( root ) { }
public override IEnumerableCollection<INode<T>> Nodes
{
get
{
return new NodesEnumerableCollection( Root );
}
}
protected class NodesEnumerableCollection : BaseNodesEnumerableCollection
{
private bool _First = true;
public NodesEnumerableCollection( NodeTree<T> root ) : base( root ) { }
protected NodesEnumerableCollection( NodesEnumerableCollection o ) : base( o.Root ) { }
protected override BaseNodesEnumerableCollection CreateCopy()
{
return new NodesEnumerableCollection( this );
}
public override void Reset()
{
base.Reset();
_First = true;
}
public override bool MoveNext()
{
if ( !base.MoveNext() ) goto hell;
if ( CurrentNode == null ) throw new InvalidOperationException( "Current is null" );
if ( CurrentNode.IsRoot )
{
CurrentNode = CurrentNode.Child;
if ( CurrentNode == null ) goto hell;
}
if ( _First ) { _First = false; return true; }
if ( CurrentNode.Child != null ) { CurrentNode = CurrentNode.Child; return true; }
for ( ; CurrentNode.Parent != null ; CurrentNode = CurrentNode.Parent )
{
if ( CurrentNode == Root ) goto hell;
if ( CurrentNode.Next != null ) { CurrentNode = CurrentNode.Next; return true; }
}
hell:
AfterLast = true;
return false;
}
}
}
//-----------------------------------------------------------------------------
// AllChildrenEnumerator
public IEnumerableCollectionPair<T> AllChildren { get { return new AllChildrenEnumerator( this ); } }
private class AllChildrenEnumerator : BaseEnumerableCollectionPair
{
public AllChildrenEnumerator( NodeTree<T> root ) : base( root ) { }
public override IEnumerableCollection<INode<T>> Nodes
{
get
{
return new NodesEnumerableCollection( Root );
}
}
protected class NodesEnumerableCollection : BaseNodesEnumerableCollection
{
public NodesEnumerableCollection( NodeTree<T> root ) : base( root ) { }
protected NodesEnumerableCollection( NodesEnumerableCollection o ) : base( o.Root ) { }
protected override BaseNodesEnumerableCollection CreateCopy()
{
return new NodesEnumerableCollection( this );
}
public override bool MoveNext()
{
if ( !base.MoveNext() ) goto hell;
if ( CurrentNode == null ) throw new InvalidOperationException( "Current is null" );
if ( CurrentNode.Child != null ) { CurrentNode = CurrentNode.Child; return true; }
for ( ; CurrentNode.Parent != null ; CurrentNode = CurrentNode.Parent )
{
if ( CurrentNode == Root ) goto hell;
if ( CurrentNode.Next != null ) { CurrentNode = CurrentNode.Next; return true; }
}
hell:
AfterLast = true;
return false;
}
}
}
//-----------------------------------------------------------------------------
// DirectChildrenEnumerator
public IEnumerableCollectionPair<T> DirectChildren { get { return new DirectChildrenEnumerator( this ); } }
private class DirectChildrenEnumerator : BaseEnumerableCollectionPair
{
public DirectChildrenEnumerator( NodeTree<T> root ) : base( root ) { }
public override IEnumerableCollection<INode<T>> Nodes
{
get
{
return new NodesEnumerableCollection( Root );
}
}
protected class NodesEnumerableCollection : BaseNodesEnumerableCollection
{
public NodesEnumerableCollection( NodeTree<T> root ) : base( root ) { }
protected NodesEnumerableCollection( NodesEnumerableCollection o ) : base( o.Root ) { }
protected override BaseNodesEnumerableCollection CreateCopy()
{
return new NodesEnumerableCollection( this );
}
public override int Count
{
get
{
return Root.DirectChildCount;
}
}
public override bool MoveNext()
{
if ( !base.MoveNext() ) goto hell;
if ( CurrentNode == null ) throw new InvalidOperationException( "Current is null" );
if ( CurrentNode == Root )
CurrentNode = Root.Child;
else
CurrentNode = CurrentNode.Next;
if ( CurrentNode != null ) return true;
hell:
AfterLast = true;
return false;
}
}
}
//-----------------------------------------------------------------------------
// DirectChildrenInReverseEnumerator
public IEnumerableCollectionPair<T> DirectChildrenInReverse { get { return new DirectChildrenInReverseEnumerator( this ); } }
private class DirectChildrenInReverseEnumerator : BaseEnumerableCollectionPair
{
public DirectChildrenInReverseEnumerator( NodeTree<T> root ) : base( root ) { }
public override IEnumerableCollection<INode<T>> Nodes
{
get
{
return new NodesEnumerableCollection( Root );
}
}
protected class NodesEnumerableCollection : BaseNodesEnumerableCollection
{
public NodesEnumerableCollection( NodeTree<T> root ) : base( root ) { }
protected NodesEnumerableCollection( NodesEnumerableCollection o ) : base( o.Root ) { }
protected override BaseNodesEnumerableCollection CreateCopy()
{
return new NodesEnumerableCollection( this );
}
public override int Count
{
get
{
return Root.DirectChildCount;
}
}
public override bool MoveNext()
{
if ( !base.MoveNext() ) goto hell;
if ( CurrentNode == null ) throw new InvalidOperationException( "Current is null" );
if ( CurrentNode == Root )
CurrentNode = Root.LastChild;
else
CurrentNode = CurrentNode.Previous;
if ( CurrentNode != null ) return true;
hell:
AfterLast = true;
return false;
}
}
}
//-----------------------------------------------------------------------------
// DirectChildCount
public int DirectChildCount
{
get
{
int i = 0;
for ( INode<T> n = this.Child ; n != null ; n = n.Next ) i++;
return i;
}
}
//-----------------------------------------------------------------------------
// ITree<T>
public virtual Type DataType
{
get
{
return typeof( T );
}
}
public void Clear()
{
if ( !this.IsRoot ) throw new InvalidOperationException( "This is not a Root" );
if ( !this.IsTree ) throw new InvalidOperationException( "This is not a tree" );
OnClearing( this );
_Child = null;
OnCleared( this );
}
//-----------------------------------------------------------------------------
// GetNodeTree
protected static NodeTree<T> GetNodeTree( ITree<T> tree )
{
if ( tree == null ) throw new ArgumentNullException( "Tree is null" );
return ( NodeTree<T> ) tree; // can throw an InvalidCastException.
}
protected static NodeTree<T> GetNodeTree( INode<T> node )
{
if ( node == null ) throw new ArgumentNullException( "Node is null" );
return ( NodeTree<T> ) node; // can throw an InvalidCastException.
}
//-----------------------------------------------------------------------------
// ICollection
// public virtual bool IsSynchronized { get { return false; } } // Not thread safe
// public virtual T SyncRoot { get { return this; } } // Not sure about this!
public virtual int Count
{
get
{
int i = IsRoot ? 0 : 1;
for ( INode<T> n = this.Child ; n != null ; n = n.Next )
i += n.Count;
return i;
}
}
public virtual bool IsReadOnly { get { return false; } }
//-----------------------------------------------------------------------------
// Events
private EventHandlerList _EventHandlerList;
protected EventHandlerList EventHandlerList
{
get { return _EventHandlerList; }
//set { _EventHandlerList = value; }
}
protected EventHandlerList GetCreateEventHandlerList()
{
if ( _EventHandlerList == null ) _EventHandlerList = new EventHandlerList();
return _EventHandlerList;
}
private static readonly object _ValidateEventKey = new object();
private static readonly object _ClearingEventKey = new object();
private static readonly object _ClearedEventKey = new object();
private static readonly object _SettingEventKey = new object();
private static readonly object _SetDoneEventKey = new object();
private static readonly object _InsertingEventKey = new object();
private static readonly object _InsertedEventKey = new object();
private static readonly object _CuttingEventKey = new object();
private static readonly object _CutDoneEventKey = new object();
private static readonly object _CopyingEventKey = new object();
private static readonly object _CopiedEventKey = new object();
private static readonly object _DeepCopyingEventKey = new object();
private static readonly object _DeepCopiedEventKey = new object();
protected static object ValidateEventKey { get { return _ValidateEventKey; } }
protected static object ClearingEventKey { get { return _ClearingEventKey; } }
protected static object ClearedEventKey { get { return _ClearedEventKey; } }
protected static object SettingEventKey { get { return _SettingEventKey; } }
protected static object SetDoneEventKey { get { return _SetDoneEventKey; } }
protected static object InsertingEventKey { get { return _InsertingEventKey; } }
protected static object InsertedEventKey { get { return _InsertedEventKey; } }
protected static object CuttingEventKey { get { return _CuttingEventKey; } }
protected static object CutDoneEventKey { get { return _CutDoneEventKey; } }
protected static object CopyingEventKey { get { return _CopyingEventKey; } }
protected static object CopiedEventKey { get { return _CopiedEventKey; } }
protected static object DeepCopyingEventKey { get { return _DeepCopyingEventKey; } }
protected static object DeepCopiedEventKey { get { return _DeepCopiedEventKey; } }
public event EventHandler<NodeTreeDataEventArgs<T>> Validate
{
add
{
GetCreateEventHandlerList().AddHandler( ValidateEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( ValidateEventKey, value );
}
}
public event EventHandler Clearing
{
add
{
GetCreateEventHandlerList().AddHandler( ClearingEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( ClearingEventKey, value );
}
}
public event EventHandler Cleared
{
add
{
GetCreateEventHandlerList().AddHandler( ClearedEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( ClearedEventKey, value );
}
}
public event EventHandler<NodeTreeDataEventArgs<T>> Setting
{
add
{
GetCreateEventHandlerList().AddHandler( SettingEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( SettingEventKey, value );
}
}
public event EventHandler<NodeTreeDataEventArgs<T>> SetDone
{
add
{
GetCreateEventHandlerList().AddHandler( SetDoneEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( SetDoneEventKey, value );
}
}
public event EventHandler<NodeTreeInsertEventArgs<T>> Inserting
{
add
{
GetCreateEventHandlerList().AddHandler( InsertingEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( InsertingEventKey, value );
}
}
public event EventHandler<NodeTreeInsertEventArgs<T>> Inserted
{
add
{
GetCreateEventHandlerList().AddHandler( InsertedEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( InsertedEventKey, value );
}
}
public event EventHandler Cutting
{
add
{
GetCreateEventHandlerList().AddHandler( CuttingEventKey, value );
}
remove
{
GetCreateEventHandlerList().RemoveHandler( CuttingEventKey, value );
}
}
public event EventHandler CutDone
{
add
{
GetCreateEventHandlerList().AddHandler( CutDoneEventKey, value );
}
remove
{
GetCreateEventHandlerList().Remo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -