DotNet 4.8.1 build of DotNetBar
This commit is contained in:
160
PROMS/DotNetBar Source Code/AdvTree/SelectedNodesCollection.cs
Normal file
160
PROMS/DotNetBar Source Code/AdvTree/SelectedNodesCollection.cs
Normal file
@@ -0,0 +1,160 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace DevComponents.AdvTree
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents the selected nodes collection.
|
||||
/// </summary>
|
||||
public class SelectedNodesCollection : NodeCollection
|
||||
{
|
||||
#region Internal Implementation
|
||||
internal AdvTree TreeSelectionControl = null;
|
||||
internal bool SuspendEvents = false;
|
||||
internal bool SuspendClearEvents = false;
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the SelectedNodesCollection class.
|
||||
/// </summary>
|
||||
public SelectedNodesCollection()
|
||||
{
|
||||
PassiveCollection = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds new object to the collection and provides information about the source of the command
|
||||
/// </summary>
|
||||
/// <param name="node">Node to add</param>
|
||||
/// <param name="action">Source action</param>
|
||||
/// <returns></returns>
|
||||
public override int Add(Node node, eTreeAction action)
|
||||
{
|
||||
if (this.List.Contains(node)) return -1;
|
||||
|
||||
if (TreeSelectionControl.MultiSelect)
|
||||
{
|
||||
if (TreeSelectionControl.MultiSelectRule == eMultiSelectRule.SameParent && this.Count>0)
|
||||
{
|
||||
if (this[0].Parent != node.Parent)
|
||||
throw new InvalidOperationException("Node being added does not belong to the same parent as currently selected nodes. See AdvTree.MultiSelectRule property");
|
||||
}
|
||||
if (!SuspendEvents)
|
||||
{
|
||||
AdvTreeNodeCancelEventArgs cancelArgs = new AdvTreeNodeCancelEventArgs(action, node);
|
||||
TreeSelectionControl.InvokeOnBeforeNodeSelect(cancelArgs);
|
||||
if (cancelArgs.Cancel)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return base.Add(node, action);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds an array of objects to the collection.
|
||||
/// </summary>
|
||||
/// <param name="nodes">Array of Node objects.</param>
|
||||
public override void AddRange(Node[] nodes)
|
||||
{
|
||||
this.MultiNodeOperation = true;
|
||||
base.AddRange(nodes);
|
||||
this.MultiNodeOperation = false;
|
||||
if (!SuspendEvents)
|
||||
TreeSelectionControl.InvokeSelectionChanged(EventArgs.Empty);
|
||||
}
|
||||
|
||||
protected override void OnInsertComplete(int index, object value)
|
||||
{
|
||||
if (TreeSelectionControl.MultiSelect)
|
||||
{
|
||||
Node node = value as Node;
|
||||
node.IsSelected = true;
|
||||
TreeSelectionControl.InvalidateNode(node);
|
||||
if (node.SelectedCell == null)
|
||||
{
|
||||
node.SelectFirstCell(SourceAction);
|
||||
}
|
||||
AdvTreeNodeEventArgs args = new AdvTreeNodeEventArgs(SourceAction, node);
|
||||
TreeSelectionControl.InvokeOnAfterNodeSelect(args);
|
||||
node.InternalSelected(this.SourceAction);
|
||||
if(!_MultiNodeOperation)
|
||||
TreeSelectionControl.InvokeSelectionChanged(EventArgs.Empty);
|
||||
}
|
||||
base.OnInsertComplete(index, value);
|
||||
|
||||
}
|
||||
|
||||
protected override void OnRemoveComplete(int index, object value)
|
||||
{
|
||||
if (TreeSelectionControl.MultiSelect)
|
||||
{
|
||||
Node node = value as Node;
|
||||
node.IsSelected = false;
|
||||
TreeSelectionControl.InvalidateNode(node);
|
||||
if (node.SelectedCell != null)
|
||||
node.SelectedCell.SetSelected(false, SourceAction);
|
||||
|
||||
TreeSelectionControl.InvokeOnAfterNodeDeselect(new AdvTreeNodeEventArgs(this.SourceAction, node));
|
||||
node.InternalDeselected(this.SourceAction);
|
||||
if (!_MultiNodeOperation)
|
||||
TreeSelectionControl.InvokeSelectionChanged(EventArgs.Empty);
|
||||
}
|
||||
base.OnRemoveComplete(index, value);
|
||||
}
|
||||
|
||||
private int _NumberOfClearedNodes = 0;
|
||||
protected override void OnClear()
|
||||
{
|
||||
if (TreeSelectionControl.MultiSelect)
|
||||
{
|
||||
_NumberOfClearedNodes = this.List.Count;
|
||||
Node[] list = new Node[_NumberOfClearedNodes];
|
||||
this.List.CopyTo(list, 0);
|
||||
foreach (Node node in list)
|
||||
{
|
||||
node.IsSelected = false;
|
||||
TreeSelectionControl.InvalidateNode(node);
|
||||
if (node.SelectedCell == null)
|
||||
node.Cells[0].SetSelected(false, SourceAction);
|
||||
_ClearedEventArgsList.Add(new AdvTreeNodeEventArgs(this.SourceAction, node)); // Delay event notification to OnClearComplete so node is not in collection if collection is being tested
|
||||
//TreeSelectionControl.InvokeOnAfterNodeDeselect(new AdvTreeNodeEventArgs(this.SourceAction, node));
|
||||
node.InternalDeselected(this.SourceAction);
|
||||
}
|
||||
}
|
||||
base.OnClear();
|
||||
}
|
||||
private List<AdvTreeNodeEventArgs> _ClearedEventArgsList = new List<AdvTreeNodeEventArgs>();
|
||||
protected override void OnClearComplete()
|
||||
{
|
||||
if (TreeSelectionControl.MultiSelect)
|
||||
{
|
||||
if (TreeSelectionControl != null && !SuspendClearEvents)
|
||||
{
|
||||
// Invoke nodes deselected
|
||||
foreach (AdvTreeNodeEventArgs advTreeNodeEventArgs in _ClearedEventArgsList)
|
||||
{
|
||||
TreeSelectionControl.InvokeOnAfterNodeDeselect(advTreeNodeEventArgs);
|
||||
}
|
||||
}
|
||||
_ClearedEventArgsList.Clear();
|
||||
if (!SuspendClearEvents && _NumberOfClearedNodes > 0)
|
||||
TreeSelectionControl.InvokeSelectionChanged(EventArgs.Empty);
|
||||
}
|
||||
base.OnClearComplete();
|
||||
}
|
||||
|
||||
private bool _MultiNodeOperation;
|
||||
internal bool MultiNodeOperation
|
||||
{
|
||||
get
|
||||
{
|
||||
return _MultiNodeOperation;
|
||||
}
|
||||
set
|
||||
{
|
||||
_MultiNodeOperation = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user