/// <summary>
        /// Processes the selection when the mouse point is double tapped on the particular cell in SfTreeGrid.
        /// </summary>
        /// <param name="currentRowColumnIndex">
        /// The corresponding rowColumnIndex of the mouse point.
        /// </param>
        /// <remarks>
        /// This method invoked to process selection and begin edit the cell when <see cref="Syncfusion.UI.Xaml.Grid.EditTrigger"/> is <see cref="Syncfusion.UI.Xaml.Grid.EditTrigger.OnDoubleTap"/>.
        /// </remarks>
        protected override void ProcessOnDoubleTapped(RowColumnIndex currentRowColumnIndex)
        {
            if (IsSuspended || this.TreeGrid.SelectionMode == GridSelectionMode.None || this.CurrentCellManager.CurrentRowColumnIndex != currentRowColumnIndex || this.TreeGrid.NavigationMode == NavigationMode.Row)
            {
                return;
            }

            if (this.TreeGrid.EditTrigger == EditTrigger.OnDoubleTap)
            {
                if (this.TreeGrid.SelectionMode != GridSelectionMode.Single)
                {
                    if (!SelectedRows.Any(r => r.RowIndex == currentRowColumnIndex.RowIndex))
                    {
                        var rowInfo = GetTreeGridSelectedRow(currentRowColumnIndex.RowIndex);
                        this.AddSelection(new List <object>()
                        {
                            rowInfo
                        });
                        if (TreeGrid.EnableRecursiveChecking)
                        {
                            SelectRowsOnRecursiveCheck(rowInfo.Node, needToRemoveItems: false);
                        }
                    }
                }
                CurrentCellManager.ProcessOnDoubleTapped();
            }
        }
        /// <summary>
        /// Update selection and current cell based on added items and removed items.
        /// </summary>
        /// <param name="addedItems">items to be seletced.</param>
        /// <param name="removedItems">items to be removed from selected items.</param>
        /// <param name="currentRowIndex">row index which needs to be set as current cell.</param>
        /// <param name="needToResetCurrentCell">indicates whether need to reset current cell</param>
        internal void UpdateSelection(List <object> addedItems, List <object> removedItems, int currentRowIndex = -1, bool needToResetCurrentCell = true)
        {
            if (removedItems.Count > 0)
            {
                bool needToSetCurrentCell    = false;
                var  needToRemoveCurrentCell = false;
                foreach (var row in removedItems)
                {
                    if ((row as TreeGridRowInfo).RowIndex == CurrentCellManager.CurrentRowColumnIndex.RowIndex)
                    {
                        needToRemoveCurrentCell = true;
                        break;
                    }
                }

                if (TreeGrid.NavigationMode == NavigationMode.Cell && needToRemoveCurrentCell)
                {
                    CurrentCellManager.RemoveCurrentCell(CurrentCellManager.CurrentRowColumnIndex);
                    if (addedItems.Count == 0)
                    {
                        if (SelectedRows.Count > removedItems.Count)
                        {
                            needToSetCurrentCell = true;
                        }
                    }
                }

                this.RemoveSelection(removedItems, needToSetCurrentCell);
            }
            AddSelection(addedItems);
            if (needToResetCurrentCell)
            {
                if (addedItems.Count > 0)
                {
                    this.CurrentCellManager.RemoveCurrentCell(this.CurrentCellManager.CurrentRowColumnIndex);
                    int columnIndex = this.CurrentCellManager.CurrentRowColumnIndex.ColumnIndex < this.CurrentCellManager.GetFirstCellIndex() ? this.CurrentCellManager.GetFirstCellIndex() : this.CurrentCellManager.CurrentRowColumnIndex.ColumnIndex;
                    if (currentRowIndex == -1)
                    {
                        this.CurrentCellManager.SelectCurrentCell(new RowColumnIndex(((TreeGridRowInfo)addedItems.LastOrDefault()).RowIndex, columnIndex), false);
                    }
                    else
                    {
                        this.CurrentCellManager.SelectCurrentCell(new RowColumnIndex(currentRowIndex, columnIndex), false);
                    }
                }
                else
                {
                    if (!SelectedRows.Any())
                    {
                        this.CurrentCellManager.RemoveCurrentCell(this.CurrentCellManager.CurrentRowColumnIndex);
                        this.CurrentCellManager.UpdateGridProperties(new RowColumnIndex(-1, -1));
                    }
                }
            }
            this.RefreshSelectedIndexAndItem();
        }
 internal void SetCurrentCellAndCurrentRowColumnIndex(RowColumnIndex rowColumnIndex, RowColumnIndex previousCurrentRowColumnIndex)
 {
     if (TreeGrid.NavigationMode == NavigationMode.Cell)
     {
         var currentColumnIndex = previousCurrentRowColumnIndex.ColumnIndex < CurrentCellManager.GetFirstCellIndex() ? CurrentCellManager.GetFirstCellIndex() : previousCurrentRowColumnIndex.ColumnIndex;
         rowColumnIndex.ColumnIndex = currentColumnIndex;
         CurrentCellManager.UpdateCurrentCell(rowColumnIndex, previousCurrentRowColumnIndex, ActivationTrigger.Program);
     }
     else
     {
         CurrentCellManager.UpdateGridProperties(rowColumnIndex);
     }
 }
        internal void UpdateCurrentRowColumnIndexOnNodeExpandAndCollapse()
        {
            if (!SelectedRows.Any(r => r.RowIndex != -1) || this.CurrentCellManager.CurrentRowColumnIndex.RowIndex != -1)
            {
                return;
            }
            var columnIndex           = this.CurrentCellManager.CurrentRowColumnIndex.ColumnIndex < CurrentCellManager.GetFirstCellIndex() ? CurrentCellManager.GetFirstCellIndex() : this.CurrentCellManager.CurrentRowColumnIndex.ColumnIndex;
            var currentRowColumnIndex = new RowColumnIndex(SelectedRows.LastOrDefault(r => r.RowIndex != -1).RowIndex, columnIndex);

            SetCurrentCellAndCurrentRowColumnIndex(currentRowColumnIndex, CurrentCellManager.CurrentRowColumnIndex);
        }
        /// <summary>
        /// Process the selection while changing IsChecked state of the particular tree node.
        /// </summary>
        /// <param name="treeNode">treeNode - its IsChecked state is changed.</param>
        internal override void ProcessSelectionOnCheckedStateChange(TreeNode treeNode)
        {
            if (TreeGrid.SelectionMode == GridSelectionMode.None)
            {
                return;
            }
            var addedItems            = new List <object>();
            var removedItems          = new List <object>();
            var isChecked             = treeNode.IsChecked;
            var rowIndex              = TreeGrid.ResolveToRowIndex(treeNode);
            var currentRowColumnIndex = CurrentCellManager.CurrentRowColumnIndex;
            var rowColumnIndex        = new RowColumnIndex(rowIndex, CurrentCellManager.CurrentRowColumnIndex.ColumnIndex);

            if (TreeGrid.SelectionMode == GridSelectionMode.Single)
            {
                if (isChecked == true)
                {
                    if (SelectedRows.Any())
                    {
                        removedItems.Add(SelectedRows[0]);
                    }
                    addedItems.Add(GetTreeGridSelectedRow(rowIndex));

                    if (RaiseSelectionChanging(addedItems, removedItems))
                    {
                        return;
                    }
                    SetCurrentCellAndCurrentRowColumnIndex(rowColumnIndex, currentRowColumnIndex);
                    RemoveSelection(removedItems);
                    if (removedItems.Any())
                    {
                        UpdateCheckedStateForSelectionRemovedRow(removedItems[0] as TreeGridRowInfo);
                    }
                    AddSelection(addedItems);
                    RaiseSelectionChanged(addedItems, removedItems);
                }
                else
                {
                    if (!SelectedRows.Any())
                    {
                        return;
                    }
                    if (SelectedRows[0].RowIndex != rowIndex)
                    {
                        return;
                    }
                    removedItems.Add(SelectedRows[0]);
                    if (RaiseSelectionChanging(addedItems, removedItems))
                    {
                        return;
                    }
                    if (TreeGrid.NavigationMode == NavigationMode.Cell)
                    {
                        CurrentCellManager.RemoveCurrentCell(currentRowColumnIndex);
                    }
                    CurrentCellManager.ResetCurrentRowColumnIndex();

                    RemoveSelection(removedItems);
                    UpdateCheckedStateForSelectionRemovedRow(removedItems[0] as TreeGridRowInfo);
                    this.SuspendUpdates();
                    RefreshSelectedIndexAndItem();
                    this.ResumeUpdates();
                    RaiseSelectionChanged(addedItems, removedItems);
                }
            }
            // Multiple and Extended Cases
            else
            {
                if (TreeGrid.EnableRecursiveChecking)
                {
                    SelectRowsOnRecursiveCheck(treeNode, rowIndex);
                    return;
                }

                if (isChecked == true)
                {
                    addedItems.Add(GetTreeGridSelectedRow(rowIndex));
                    if (RaiseSelectionChanging(addedItems, removedItems))
                    {
                        return;
                    }
                    SetCurrentCellAndCurrentRowColumnIndex(rowColumnIndex, currentRowColumnIndex);
                    AddSelection(addedItems);
                    RaiseSelectionChanged(addedItems, removedItems);
                }
                else
                {
                    if (!SelectedRows.Any())
                    {
                        return;
                    }
                    var selectedRow = SelectedRows.FirstOrDefault(r => r.RowIndex == rowIndex);
                    if (selectedRow == null)
                    {
                        return;
                    }
                    removedItems.Add(selectedRow);
                    if (RaiseSelectionChanging(addedItems, removedItems))
                    {
                        return;
                    }
                    var needToSetCurrentCell = false;
                    if (TreeGrid.NavigationMode == NavigationMode.Cell && selectedRow.RowIndex == currentRowColumnIndex.RowIndex)
                    {
                        CurrentCellManager.RemoveCurrentCell(currentRowColumnIndex);
                        needToSetCurrentCell = (SelectedRows.Count > 1);
                    }
                    RemoveSelection(removedItems, needToSetCurrentCell);
                    if (!SelectedRows.Any() || TreeGrid.NavigationMode == NavigationMode.Row)
                    {
                        CurrentCellManager.ResetCurrentRowColumnIndex();
                    }
                    UpdateCheckedStateForSelectionRemovedRow(removedItems[0] as TreeGridRowInfo);
                    this.SuspendUpdates();
                    RefreshSelectedIndexAndItem();
                    this.ResumeUpdates();
                    RaiseSelectionChanged(addedItems, removedItems);
                }
            }
        }