private void RemoveItemsRequested(object sender, RemoveItemsRequestedEventArgs e)
		{
			if (m_patternModel.Root.IsLeaf)
				return;

			SelectionHelper sel = SelectionHelper.Create(m_view);
			ComplexConcPatternNode parent = null;
			int index = -1;
			if (sel.IsRange)
			{
				ComplexConcPatternNode[] nodes = CurrentNodes;
				if (nodes.Length > 0)
				{
					parent = nodes[0].Parent;
					index = GetNodeIndex(nodes[0]);
					foreach (ComplexConcPatternNode node in nodes)
						node.Parent.Children.Remove(node);
				}
			}
			else
			{
				ComplexConcPatternNode n = GetNode(sel, SelectionHelper.SelLimitType.Top);
				parent = n.Parent;
				index = GetNodeIndex(n);
				ITsString tss = sel.GetTss(SelectionHelper.SelLimitType.Anchor);
				// if the current ich is at the end of the current string, then we can safely assume
				// we are at the end of the current item, so remove it or the next item based on what
				// key was pressed, otherwise we are in the middle in which
				// case the entire item is selected, or at the beginning, so we remove it or the previous
				// item based on what key was pressed
				if (sel.IchAnchor == tss.Length)
				{
					if (e.Forward)
					{
						if (index == n.Parent.Children.Count - 1)
							index = -1;
						else
							index++;
					}
				}
				else
				{
					if (!e.Forward)
						index--;
				}

				if (index != -1)
					parent.Children.RemoveAt(index);
			}

			if (parent != null && index != -1)
			{
				if (!parent.IsLeaf)
				{
					bool isFirstBdry = parent.Children[0] is ComplexConcWordBdryNode;
					if ((parent.Children.Count == 1 && isFirstBdry)
						|| (parent.Children.Count > 1 && isFirstBdry && !(parent.Children[1] is ComplexConcMorphNode)))
					{
						parent.Children.RemoveAt(0);
						if (index > 0)
							index--;
					}
				}
				if (parent.Children.Count > 1 && parent.Children[parent.Children.Count - 1] is ComplexConcWordBdryNode
					&& !(parent.Children[parent.Children.Count - 2] is ComplexConcMorphNode))
				{
					parent.Children.RemoveAt(parent.Children.Count - 1);
					if (index >= parent.Children.Count)
						index--;
				}
				for (int i = parent.Children.Count - 1; i > 0 ; i--)
				{
					if (parent.Children[i] is ComplexConcWordBdryNode)
					{
						if (parent.Children[i - 1] is ComplexConcWordBdryNode
							|| (!(parent.Children[i - 1] is ComplexConcMorphNode) || (i + 1 < parent.Children.Count && !(parent.Children[i + 1] is ComplexConcMorphNode))))
						{
							parent.Children.RemoveAt(i);
							if (index > i)
								index--;
						}
					}
				}

				if (!parent.IsLeaf && parent.Children[0] is ComplexConcOrNode)
				{
					parent.Children.RemoveAt(0);
					if (index > 0)
						index--;
				}
				if (!parent.IsLeaf && parent.Children[parent.Children.Count - 1] is ComplexConcOrNode)
				{
					parent.Children.RemoveAt(parent.Children.Count - 1);
					if (index >= parent.Children.Count)
						index--;
				}
				for (int i = parent.Children.Count - 1; i > 0 ; i--)
				{
					if (parent.Children[i] is ComplexConcOrNode && parent.Children[i - 1] is ComplexConcOrNode)
					{
						parent.Children.RemoveAt(i);
						if (index > i)
							index--;
					}
				}

				if (parent.Parent != null && parent.Children.Count == 1)
				{
					ComplexConcPatternNode p = parent.Parent;
					int parentIndex = GetNodeIndex(parent);
					p.Children.RemoveAt(parentIndex);
					p.Children.Insert(parentIndex, parent.Children[0]);
					index = index == 1 ? parentIndex + 1 : parentIndex;
				}
				else
				{
					while (parent.Parent != null && parent.IsLeaf)
					{
						ComplexConcPatternNode p = parent.Parent;
						index = GetNodeIndex(parent);
						p.Children.Remove(parent);
						parent = p;
					}
				}

				if (index >= parent.Children.Count)
					ReconstructView(parent, parent.Children.Count - 1, false);
				else
					ReconstructView(parent, index, true);
			}
		}
		private void RemoveItemsRequested(object sender, RemoveItemsRequestedEventArgs e)
		{
			SelectionHelper sel = SelectionHelper.Create(m_view);
			int cellId = -1;
			int cellIndex = -1;
			UndoableUnitOfWorkHelper.Do(MEStrings.ksRuleUndoRemove, MEStrings.ksRuleRedoRemove, m_cache.ActionHandlerAccessor, () =>
			{
				cellId = RemoveItems(sel, e.Forward, out cellIndex);
			});

			// if the no cell is returned, then do not reconstruct
			if (cellId != -1 && cellId != -2)
				// if the cell index is -1 that means that we removed the first item in this cell,
				// so we move the cursor to the beginning of the first item after the removed items,
				// instead of the end of the item before the removed items.
				ReconstructView(cellId, cellIndex, cellIndex == -1);
		}