public String 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());
        }
Example #2
0
        MemberAction CreateMemberAction(PerformMemberActionArgs args)
        {
            switch (args.Action)
            {
            case MemberActionType.Expand:
                return(new MemberActionExpand(args));

            case MemberActionType.Collapse:
                return(new MemberActionCollapse(args));

            case MemberActionType.DrillDown:
                return(new MemberActionDrillDown(args, DrillDownMode));

            default:
                return(null);
            }
        }
Example #3
0
 public String PerformMemberAction(PerformMemberActionArgs args)
 {
     if (args != null)
     {
         var Action = CreateMemberAction(args);
         if (Action != null)
         {
             AddCurrentStateToHistory();
             this.CurrentHistoryItem.AddMemberAction(args.AxisIndex, Action);
         }
         else if (args.Action == MemberActionType.SortByValue)
         {
             AddCurrentStateToHistory();
             this.CurrentHistoryItem.SortByValue(args.AxisIndex, args);
         }
     }
     return(RefreshQuery());
 }
        void DrillUpMember(PerformMemberActionArgs args)
        {
            //using (WaitCursor wc = new WaitCursor())
            {
                IList <DrillActionContainer> actions = null;
                if (!RotateAxes)
                {
                    actions = args.AxisIndex == 0 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                else
                {
                    actions = args.AxisIndex == 1 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                DrillActionContainer previous  = null;
                DrillActionContainer container = null;

                // Действия над элементами из этой же иерархии
                IList <DrillActionContainer> actionsToHierarchy = History.CurrentHistoryItem.FindDrillActionContainersByHierarchy(actions, args.Member.HierarchyUniqueName);
                if (actionsToHierarchy != null)
                {
                    // Все действия зануляем
                    foreach (DrillActionContainer action in actionsToHierarchy)
                    {
                        action.Action = null;
                    }
                }

                // Родители
                if (args.Ascendants != null)
                {
                    for (int i = args.Ascendants.Count - 1; i >= 0; i--)
                    {
                        MemberInfo mi = args.Ascendants[i];

                        container = History.CurrentHistoryItem.FindDrillActionContainer(actions, mi.UniqueName);
                        if (container == null)
                        {
                            container = new DrillActionContainer(mi.UniqueName, mi.HierarchyUniqueName);
                            if (previous == null)
                            {
                                actions.Add(container);
                            }
                            else
                            {
                                previous.Children.Add(container);
                            }
                        }
                        previous = container;
                    }
                }

                // Сам элемент
                container = History.CurrentHistoryItem.FindDrillActionContainer(actions, args.Member.UniqueName);
                if (container == null)
                {
                    container        = new DrillActionContainer(args.Member.UniqueName, args.Member.HierarchyUniqueName);
                    container.Action = new MdxDrillUpAction(args.Member.UniqueName, args.Member.HierarchyUniqueName, args.Member.LevelDepth);
                    if (previous == null)
                    {
                        actions.Add(container);
                    }
                    else
                    {
                        previous.Children.Add(container);
                    }
                }
                else
                {
                    // Удаляем все вложенные экшены для данной иерархии
                    IList <DrillActionContainer> child_actionsToHierarchy = History.CurrentHistoryItem.FindDrillActionContainersByHierarchy(container.Children, args.Member.HierarchyUniqueName);
                    if (child_actionsToHierarchy != null)
                    {
                        // Все действия зануляем
                        foreach (DrillActionContainer action in child_actionsToHierarchy)
                        {
                            action.Action = null;
                        }
                    }

                    container.Action = new MdxDrillUpAction(args.Member.UniqueName, args.Member.HierarchyUniqueName, args.Member.LevelDepth);
                }
            }

            /*using (WaitCursor wc = new WaitCursor())
             * {
             *  IList<DrillActionContainer> actions = args.AxisIndex == 0 ? ColumnsActionChain : RowsActionChain;
             *
             *  actions.Clear();
             *
             *  DrillActionContainer container = new DrillActionContainer(args.Member.UniqueName);
             *  container.Action = new MdxDrillUpAction(args.Member.UniqueName);
             *
             *  actions.Add(container);
             *
             *  this.RefreshQuery();
             * }*/
        }
        void CollapseMember(PerformMemberActionArgs args)
        {
            //using (WaitCursor wc = new WaitCursor())
            {
                IList <DrillActionContainer> actions = null;
                if (!RotateAxes)
                {
                    actions = args.AxisIndex == 0 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                else
                {
                    actions = args.AxisIndex == 1 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                DrillActionContainer previous  = null;
                DrillActionContainer container = null;

                // Родители
                if (args.Ascendants != null)
                {
                    for (int i = args.Ascendants.Count - 1; i >= 0; i--)
                    {
                        MemberInfo mi = args.Ascendants[i];

                        container = History.CurrentHistoryItem.FindDrillActionContainer(actions, mi.UniqueName);
                        if (container == null)
                        {
                            container = new DrillActionContainer(mi.UniqueName, mi.HierarchyUniqueName);
                            if (previous == null)
                            {
                                actions.Add(container);
                            }
                            else
                            {
                                previous.Children.Add(container);
                            }
                        }
                        previous = container;
                    }
                }

                // Сам элемент
                container = History.CurrentHistoryItem.FindDrillActionContainer(actions, args.Member.UniqueName);
                if (container == null)
                {
                    container        = new DrillActionContainer(args.Member.UniqueName, args.Member.HierarchyUniqueName);
                    container.Action = new MdxCollapseAction(args.Member.UniqueName);
                    if (previous == null)
                    {
                        actions.Add(container);
                    }
                    else
                    {
                        previous.Children.Add(container);
                    }
                }
                else
                {
                    // Удалем все дочерние - тем самым как бы схлопываем элемент
                    // Удаляем все вложенные экшены для данной иерархии
                    IList <DrillActionContainer> actionsToHierarchy = History.CurrentHistoryItem.FindDrillActionContainersByHierarchy(container.Children, args.Member.HierarchyUniqueName);
                    if (actionsToHierarchy != null)
                    {
                        // Все действия зануляем
                        foreach (DrillActionContainer action in actionsToHierarchy)
                        {
                            action.Action = null;
                        }
                    }
                    container.Action = new MdxCollapseAction(args.Member.UniqueName);
                }
            }
        }
        private void ExpandMember(PerformMemberActionArgs args)
        {
            //using (WaitCursor wc = new WaitCursor())
            {
                IList <DrillActionContainer> actions = null;
                if (!RotateAxes)
                {
                    actions = args.AxisIndex == 0 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                else
                {
                    actions = args.AxisIndex == 1 ? History.CurrentHistoryItem.ColumnsActionChain : History.CurrentHistoryItem.RowsActionChain;
                }
                DrillActionContainer previous  = null;
                DrillActionContainer container = null;

                // Родители
                if (args.Ascendants != null)
                {
                    for (int i = args.Ascendants.Count - 1; i >= 0; i--)
                    {
                        MemberInfo mi = args.Ascendants[i];

                        container = History.CurrentHistoryItem.FindDrillActionContainer(actions, mi.UniqueName);
                        if (container == null)
                        {
                            container = new DrillActionContainer(mi.UniqueName, mi.HierarchyUniqueName);
                            if (previous == null)
                            {
                                actions.Add(container);
                            }
                            else
                            {
                                previous.Children.Add(container);
                            }
                        }
                        previous = container;
                    }
                }

                MdxDrillDownAction skip_container = null;
                // Сам элемент
                container = History.CurrentHistoryItem.FindDrillActionContainer(actions, args.Member.UniqueName);
                if (container == null)
                {
                    container        = new DrillActionContainer(args.Member.UniqueName, args.Member.HierarchyUniqueName);
                    container.Action = new MdxExpandAction(args.Member.UniqueName);
                    if (previous == null)
                    {
                        actions.Add(container);
                    }
                    else
                    {
                        previous.Children.Add(container);
                    }
                }
                else
                {
                    // Если по данному элементу уже дедался дриллдаун - то дриллдаун остается в силе. А раскрытие - прокидываем
                    skip_container = container.Action as MdxDrillDownAction;
                    if (skip_container == null)
                    {
                        container.Action = new MdxExpandAction(args.Member.UniqueName);
                    }
                }

                // Вложенные действия над элементами из этой же иерархии
                IList <DrillActionContainer> actionsToHierarchy = History.CurrentHistoryItem.FindDrillActionContainersByHierarchy(actions, args.Member.HierarchyUniqueName);
                if (actionsToHierarchy != null)
                {
                    // Все DrillUp и DrillDown операции зануляем если уровень у них глубже
                    foreach (DrillActionContainer action in actionsToHierarchy)
                    {
                        MdxDrillDownAction drillDownAction = action.Action as MdxDrillDownAction;
                        if (drillDownAction != null && drillDownAction.LevelDepth >= args.Member.LevelDepth)
                        {
                            if (skip_container != null && skip_container == drillDownAction)
                            {
                                continue;
                            }

                            action.Action = null;
                        }
                        MdxDrillUpAction drillUpAction = action.Action as MdxDrillUpAction;
                        if (drillUpAction != null && drillUpAction.LevelDepth >= args.Member.LevelDepth)
                        {
                            action.Action = null;
                        }
                    }
                }
            }
        }