private void HandleSameLevelGroupMove( GeneratorNode node, NotifyCollectionChangedEventArgs e ) { GroupGeneratorNode parentGroup = node.Parent as GroupGeneratorNode; //Start a NodeHelper on the first child of the node where the move occured. GeneratorNodeHelper nodeHelper = new GeneratorNodeHelper( node, 0, 0 ); nodeHelper.ReverseCalculateIndex(); //determine index of the node. //Advance to the first "Group" node (skip the GroupHEaders) while( !( nodeHelper.CurrentNode is GroupGeneratorNode ) ) { if( !nodeHelper.MoveToNext() ) throw new DataGridInternalException(); } //then move up to the removal start point. if( !nodeHelper.MoveToNextBy( e.OldStartingIndex ) ) { throw new DataGridInternalException(); } //remember the current node as the start point of the move (will be used when "extracting the chain") GeneratorNode startNode = nodeHelper.CurrentNode; //also remember the index of the node, to calculate range of elements to remove (containers ) int startIndex = nodeHelper.Index; //then, cumulate the total number of items in the groups concerned int totalCountRemoved = 0; node = this.ProcessGroupRemoval( startNode, e.OldItems.Count, false, out totalCountRemoved ); //send a message to the panel to remove the visual elements concerned GeneratorPosition removeGenPos = this.GeneratorPositionFromIndex( startIndex ); List<DependencyObject> removedContainers = new List<DependencyObject>(); int genCountRemoved = this.RemoveGeneratedItems( startIndex, startIndex + totalCountRemoved - 1, removedContainers ); this.SendRemoveEvent( removeGenPos, startIndex, totalCountRemoved, genCountRemoved, removedContainers ); //reset the node parameter for the "re-addition" node = ( parentGroup != null ) ? parentGroup.Child : m_firstItem; if( node == null ) throw new DataGridInternalException(); //Once the chain was pulled out, re-insert it at the appropriate location. nodeHelper = new GeneratorNodeHelper( node, 0, 0 ); //do not care about the index for what I need //Advance to the first "Group" node (skip the GroupHEaders) while( !( nodeHelper.CurrentNode is GroupGeneratorNode ) ) { if( !nodeHelper.MoveToNext() ) throw new DataGridInternalException(); } bool insertBefore = nodeHelper.MoveToNextBy( e.NewStartingIndex ); if( insertBefore ) { if( nodeHelper.CurrentNode == m_firstItem ) { if( m_startNode == m_firstItem ) { m_startNode = startNode; } m_firstItem = startNode; } //reinsert the chain at the specified location. nodeHelper.InsertBefore( startNode ); } else { nodeHelper.InsertAfter( startNode ); } //and finally, call to increment the generation count for the generator content this.IncrementCurrentGenerationCount(); }
private GeneratorPosition HandleSameLevelGroupRemove( GeneratorNode firstChild, out int countRemoved, out int genCountRemoved, out int removeIndex, NotifyCollectionChangedEventArgs e, IList<DependencyObject> removedContainers ) { GeneratorPosition retval; countRemoved = 0; genCountRemoved = 0; GeneratorNodeHelper nodeHelper = new GeneratorNodeHelper( firstChild, 0, 0 ); nodeHelper.ReverseCalculateIndex(); //Advance to the first "Group" node (skip the GroupHEaders) while( !( nodeHelper.CurrentNode is GroupGeneratorNode ) ) { if( !nodeHelper.MoveToNext() ) throw new DataGridInternalException(); } //then move up to the removal start point. if( !nodeHelper.MoveToNextBy( e.OldStartingIndex ) ) { throw new DataGridInternalException(); } GroupGeneratorNode startNode = nodeHelper.CurrentNode as GroupGeneratorNode; removeIndex = -1; //Only fetch the index if the group itself is not "collapsed" or under a collapsed group already if( ( startNode.IsExpanded == startNode.IsComputedExpanded ) && ( startNode.ItemCount > 0 ) ) { removeIndex = nodeHelper.Index; retval = this.GeneratorPositionFromIndex( removeIndex ); } else { retval = new GeneratorPosition( -1, 1 ); } //retrieve the generator position for the first item to remove. this.ProcessGroupRemoval( startNode, e.OldItems.Count, true, out countRemoved ); //Clean the chain "isolated" previously this.NodeFactory.CleanGeneratorNodeTree( startNode ); if( removeIndex != -1 ) { //remove the appropriate genCountRemoved = this.RemoveGeneratedItems( removeIndex, removeIndex + countRemoved - 1, removedContainers ); } return retval; }