public void AddHistoryItem(HistoryItem item)
 {
     if (item != null)
     {
         m_History.Add(item);
         m_CurrentHistoryItem = item;
     }
 }
 public object Clone()
 {
     HistoryItem item = new HistoryItem();
     foreach(DrillActionContainer cont in this.ColumnsActionChain)
     {
         item.ColumnsActionChain.Add((DrillActionContainer)cont.Clone());
     }
     foreach (DrillActionContainer cont in this.RowsActionChain)
     {
         item.RowsActionChain.Add((DrillActionContainer)cont.Clone());
     } 
     return item;
 }
 public void ToEnd()
 {
     if (m_History.Count > 0)
     {
         m_CurrentHistoryItem = m_History[m_History.Count - 1];
     }
 }
 public void ToBegin()
 {
     if (m_History.Count > 0)
     {
         m_CurrentHistoryItem = m_History[0];
     }
 }
 public void MoveNext()
 {
     if (CurrentHistoryItem != null && m_History.Count > 0)
     {
         int indx = m_History.IndexOf(CurrentHistoryItem);
         if (indx >= 0 && indx < m_History.Count - 1)
         {
             m_CurrentHistoryItem = m_History[indx + 1];
         }
     }
 }
 public void MoveBack()
 {
     if (CurrentHistoryItem != null && m_History.Count > 0)
     {
         int indx = m_History.IndexOf(CurrentHistoryItem);
         if (indx > 0)
         {
             m_CurrentHistoryItem = m_History[indx - 1];
         }
     }
 }
        public CellSetData PerformMemberAction(PerformMemberActionArgs args)
        {
            if (args != null)
            {
                switch (args.Action)
                {
                    case MemberActionType.Expand:
                    case MemberActionType.Collapse:
                    case MemberActionType.DrillDown:
                    case MemberActionType.DrillUp:
                        // Удаляем все элементы истории, стоящие за текущим
                        History.CutRight();
                        HistoryItem clone = null;
                        if (History.CurrentHistoryItem != null)
                        {
                            // Клонируем текущий элемент истории чтобы действие добавлялось уже в клон
                            clone = (HistoryItem)(History.CurrentHistoryItem.Clone());
                        }
                        else
                        {
                            // Добавляем пустой элемент истории
                            HistoryItem first = new HistoryItem();
                            History.AddHistoryItem(first);

                            clone = new HistoryItem();
                        }

                        History.AddHistoryItem(clone);
                        break;
                }

                switch (args.Action)
                {
                    case MemberActionType.Expand:
                        ExpandMember(args);
                        break;
                    case MemberActionType.Collapse:
                        CollapseMember(args);
                        break;
                    case MemberActionType.DrillDown:
                        DrillDownMember(args);
                        break;
                    case MemberActionType.DrillUp:
                        DrillUpMember(args);
                        break;
                }
            }
            return RefreshQuery();
        }