void InitSelectionStates()
        {
            if (tabControl != null && mdxSetTab != null && tabControl.TabCtrl.SelectedItem == mdxSetTab)
            {
                selectedList.Items.Clear();
                m_Selected_Count.Text = "0";

                GenerateSetBySelectionState();

                mdxSetTextBox.Text = SelectedSet;

                foreach (OlapMemberInfo info in MembersInSet.Values)
                {
                    MemberTreeNode node = null;

                    node = new MemberTreeNode(info, MultiSelect);
                    node.MemberVisualizationType = MemberVisualizationType;
                    info.StateChanged += new OlapMemberInfo.StateChangedEventHandler(selectedNode_StateChanged);
                    node.Expanded += new RoutedEventHandler(selectedNode_DblClick);
                    node.Collapsed += new RoutedEventHandler(selectedNode_DblClick);

                    selectedList.Items.Add(node);
                }
                m_Selected_Count.Text = MembersInSet.Values.Count.ToString();
            }
        }
 void ChangeCurrentMember(MemberTreeNode node)
 {
     if (node != null)
     {
         m_CurrentMember = node.MemberInfo.Info;
     }
     else
     {
         m_CurrentMember = null;
     }
 }
        void FindMembers_InvokeCommandCompleted(DataLoaderEventArgs e, MemberTreeNode node_)
        {
            findResultTree.Items.Clear();
            m_Find_Count.Text = "0";

            if (e.Result.ContentType == InvokeContentType.Error)
            {
                findResultTree.IsError = true;
                return;
            }

            List<MemberData> members = new List<MemberData>();
            if (!String.IsNullOrEmpty(e.Result.Content))
            {
                CellSetData cellSet = CellSetData.Deserialize(e.Result.Content);
                members = QueryProvider.GetMembers(cellSet);
            }

            //ClearTree();
            // CreateChildNodes(null, members);

            List<OlapMemberInfo> infos = new List<OlapMemberInfo>();

            foreach (MemberData wrapper in members)
            {
                // Каждый из элементов помещаем в иерархию
                OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(wrapper);
                if (info != null)
                {
                    infos.Add(info);
                }
            }

            foreach (OlapMemberInfo info in infos)
            {
                MemberTreeNode node = null;

                node = new MemberTreeNode(info, MultiSelect);
                node.MemberVisualizationType = MemberVisualizationType;
                node.Expanded += new RoutedEventHandler(findedNode_DblClick);
                node.Collapsed += new RoutedEventHandler(findedNode_DblClick);

                findResultTree.Items.Add(node);
            }

            m_Find_Count.Text = infos.Count.ToString();
        }
        void GetAscendants_InvokeCommandCompleted(DataLoaderEventArgs e)
        {
            if (e.Result.ContentType == InvokeContentType.Error)
            {
                ClearTree();
                membersTree.IsError = true;
                return;
            }

            List<MemberData> members = new List<MemberData>();
            if (!String.IsNullOrEmpty(e.Result.Content))
            {
                CellSetData cellSet = CellSetData.Deserialize(e.Result.Content);
                members = QueryProvider.GetMembers(cellSet);
            }

            List<OlapMemberInfo> infos = new List<OlapMemberInfo>();

            foreach (MemberData member in members)
            {
                // Каждый из элементов помещаем в иерархию
                OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(member);
                if (info != null)
                {
                    infos.Add(info);
                }
            }

            foreach (OlapMemberInfo info in infos)
            {
                MemberTreeNode node = null;

                //Если родительский узел не задан, то узел добавится в корень
                if (m_TreeNodes.ContainsKey(info.UniqueName))
                {
                    node = m_TreeNodes[info.UniqueName];
                }

                if (node == null)
                {
                    node = new MemberTreeNode(info, MultiSelect);
                    node.MemberVisualizationType = MemberVisualizationType;
                    node.IsPreloaded = true;
                    node.Special_MouseDoubleClick += new EventHandler<CustomEventArgs<CustomTreeNode>>(node_SpecialNodeExpanded);
                    node.Expanded += new RoutedEventHandler(MemberNode_Expanded);

                    //Если есть дочерние, то добавляем фиктивный узел для отображения [+] напротив данного узла
                    if (!node.IsExpanded /*&& !node.IsReloadAll*/ && info.HasChildren)
                    {
                        if (node.Items.Count == 0)
                            node.IsWaiting = true;
                    }

                    //node.Expanded += new RoutedEventHandler(FindMemberNode_Expanded);
                    m_TreeNodes[info.UniqueName] = node;

                    MemberTreeNode parent = null;
                    String parentUniqueName = String.Empty;
                    if (info.Info != null)
                    {
                        PropertyData prop = info.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY);
                        if (prop != null && prop.Value != null)
                        {
                            parentUniqueName = prop.Value.ToString();
                        }
                    }

                    if (!String.IsNullOrEmpty(parentUniqueName))
                    {
                        //Если родительский узел не задан, то узел добавится в корень
                        if (m_TreeNodes.ContainsKey(parentUniqueName))
                        {
                            parent = m_TreeNodes[parentUniqueName];
                        }
                    }

                    if (parent == null)
                    {
                        membersTree.IsFullLoaded = false;
                        membersTree.Items.Add(node);
                        membersTree.IsWaiting = false;
                        //membersTree.IsReloadAll = true;
                    }
                    else
                    {
                        if (parent.Items.Count < parent.MemberInfo.CubeChildrenCount)
                            parent.IsFullLoaded = false;

                        parent.Items.Add(node);
                        parent.IsWaiting = false;
                        parent.IsExpanded = true;
                        //parent.IsReloadAll = true;
                    }
                }
            }

            MemberTreeNode memberNode = null;
            if (infos.Count > 0 && m_TreeNodes.ContainsKey(infos[infos.Count -1].UniqueName))
            {
                memberNode = m_TreeNodes[infos[infos.Count - 1].UniqueName];
            }

            if (memberNode != null)
            {
                // Если узел в дереве найден, то нужно просто переключиться на него
                SelectNode(memberNode);

                tabControl.TabCtrl.SelectedItem = membersTab;
            }

            //membersList.Initialize(infos);
            ////Получаем все родительские элементы для указанного
            //List<MemberDataWrapper> dict = GetAscendants(uniqueName);
            //if (dict != null && dict.Count > 0)
            //{
            //    bool allParentIsLoaded = true;
            //    TreeListNode parentNode = null;
            //    //Каждый из предков и сам узел в дерево
            //    foreach (MemberDataWrapper de in dict)
            //    {
            //        TreeListNode node = PreloadChildrenNodes(parentNode, de);
            //        if (node == null)
            //        {
            //            allParentIsLoaded = false;
            //            break;
            //        }

            //        parentNode = node;
            //    }

            //    //Если процесс дозагрузки дочерних для всех родителей прошел успешно
            //    if (allParentIsLoaded && parentNode != null)
            //    {
            //        Tree.SetFocusedNode(parentNode);
            //        TabControl.SelectedTabPageIndex = 0;
            //        //Устанавливаем фокус на дерево
            //        Tree.Focus();
            //    }
            //}
        }
        /// <summary>
        /// Загружает <paramref name="count"/> дочерних элементов для элемента с указанным <paramref name="uniqueName"/>, начиная c <paramref name="begin"/>.
        /// </summary>
        /// <param name="begin">индекс начала</param>
        /// <param name="count">количество</param>
        private void LoadChildren(MemberTreeNode item, long begin, long count)
        {
            if (item == null)
                return;

            OlapMemberInfo info = item.MemberInfo;

            //MemberChoiceQuery args = CommandHelper.CreateGetChildrenMembersQueryArgs(Connection, CubeName, SubCube, HierarchyUniqueName, info.UniqueName, CurrentLevelUniqueName, begin, count);
            //OlapDataLoader.LoadData(args, new UserSchemaWrapper<MemberChoiceQuery, MemberTreeNode>(args, item));

            // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext
            if (count != -1)
                count += 1;
            String query = DataManager.GetChildrenMembers(info.UniqueName, begin, count);
            LogManager.LogInformation(this, this.Name + " - Loading children for '" + info.UniqueName + "'");
            MdxQueryArgs query_args = CommandHelper.CreateMdxQueryArgs(Connection, query);
            OlapDataLoader.LoadData(query_args, new UserSchemaWrapper<MemberChoiceQueryType, MemberTreeNode>(MemberChoiceQueryType.GetChildrenMembers, item));
        }
        void Service_GetChildrenMembersCompleted(DataLoaderEventArgs e, MemberTreeNode parentNode)
        {
            if (e.Result.ContentType == InvokeContentType.Error)
            {
                ClearTree();
                membersTree.IsError = true;
                return;
            }

            List<MemberData> members = new List<MemberData>();
            if (!String.IsNullOrEmpty(e.Result.Content))
            {
                CellSetData cellSet = CellSetData.Deserialize(e.Result.Content);
                members = QueryProvider.GetMembers(cellSet);
            }

            CreateChildNodes(parentNode, members);
        }
 /// <summary>
 /// Загружает все дочерние элементы для указанного
 /// </summary>
 private void LoadChildren(MemberTreeNode item)
 {
     LoadChildren(item, -1, -1);
 }
        /// <summary>
        /// Раскрытие узла дерева
        /// </summary>
        /// <param name="node"></param>
        private void BeforeExpandNode(MemberTreeNode node)
        {
            node.Items.Clear();
            node.IsWaiting = true;

            //Загружаем дочерние элементы для данного узла
            if (useStepLoading)
            {
                LoadChildren(node, 0, Step);
            }
            else
            {
                LoadChildren(node);
            }
        }
        void CreateChildNodes(MemberTreeNode parent, List<MemberData> members)
        {
            if (members == null || members.Count == 0)
                return;

            List<OlapMemberInfo> infos = new List<OlapMemberInfo>();
            List<OlapMemberInfo> to_Collapse = new List<OlapMemberInfo>();

            for (int i = 0; i < members.Count; i++)
            {
                MemberData wrapper = members[i];
                // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext
                if (UseStepLoading && members.Count > Step && i >= (members.Count - 1))
                    break;

                // Каждый из элементов помещаем в иерархию
                OlapMemberInfo info = OlapMemberInfoHierarchy.AddMemberToHierarchy(wrapper);
                if (info != null)
                {
                    long realCount = QueryProvider.GetRealChildrenCount(wrapper);
                    if (info.CubeChildrenCount != realCount)
                    {
                        to_Collapse.Add(info);
                        info.CubeChildrenCount = realCount;
                    }
                    infos.Add(info);
                }
            }

            //Если известен родительский узел дерева. То получаем его OlapMemberInfo
            if (parent != null)
            {
                parent.IsWaiting = false;
            }

            // Вычисляем индекс служебного узла "Загрузить далее..."
            int loadNextIndex = -1;
            if (parent == null)
            {
                for (int i = membersTree.Items.Count - 1; i >= 0; i--)
                {
                    LoadNextTreeNode loadNext = membersTree.Items[i] as LoadNextTreeNode;
                    if (loadNext != null)
                    {
                        loadNextIndex = i;
                        break;
                    }
                }
            }
            else
            {
                for (int i = parent.Items.Count - 1; i >= 0; i--)
                {
                    LoadNextTreeNode loadNext = parent.Items[i] as LoadNextTreeNode;
                    if (loadNext != null)
                    {
                        loadNextIndex = i;
                        break;
                    }
                }
            }

            int indx = 0;
            foreach (OlapMemberInfo info in infos)
            {
                MemberTreeNode node = null;

                //Если родительский узел не задан, то узел добавится в корень
                if (m_TreeNodes.ContainsKey(info.UniqueName))
                {
                    node = m_TreeNodes[info.UniqueName];
                    if (to_Collapse.Contains(info))
                    {
                        //Сворачиваем узел, чтобы при разворачивании зачиталось новое количество дочерних
                        if (node != null)
                        {
                            node.IsExpanded = false;
                            //Удаляем дочерние узлы дерева
                            node.Items.Clear();
                            // Обновляем информацию о количестве дочерних
                            node.MemberInfo.CubeChildrenCount = info.CubeChildrenCount;
                        }
                    }

                }

                if (node == null)
                {
                    // Создание нового узла для добавления в дерево
                    node = new MemberTreeNode(info, MultiSelect);
                    node.MemberVisualizationType = MemberVisualizationType;
                    node.Special_MouseDoubleClick += new EventHandler<CustomEventArgs<CustomTreeNode>>(node_SpecialNodeExpanded);
                    node.Expanded += new RoutedEventHandler(MemberNode_Expanded);
                    m_TreeNodes[info.UniqueName] = node;

                    // Если узла "Загрузить далее..." не найдено то узел добавляем в конец списка
                    // В противном случае вставляем узел перед узлом "Загрузить далее..."
                    if (loadNextIndex == -1)
                    {
                        if (parent == null)
                            membersTree.Items.Add(node);
                        else
                            parent.Items.Add(node);
                    }
                    else
                    {
                        if (parent == null)
                            membersTree.Items.Insert(loadNextIndex + indx, node);
                        else
                            parent.Items.Insert(loadNextIndex + indx, node);
                    }
                }
                else
                {
                    // т.к. узел уже был создан ранее, то это означает что элемент был загружен в дерево во внеочередном порядке (т.к. находится после узла "Загрузить далее...")
                    // такое возможно при попытке загрузить родителей для элемента при переключении по двойному клику с закладки с результатами поиска
                    // В этом случе узел нужно удалить из списка и вставить перед узлом "Загрузить далее..."
                    if (loadNextIndex != -1)
                    {
                        if (parent == null)
                        {
                            membersTree.Items.Remove(node);
                            membersTree.Items.Insert(loadNextIndex + indx, node);
                            node.IsPreloaded = false;
                        }
                        else
                        {
                            parent.Items.Remove(node);
                            parent.Items.Insert(loadNextIndex + indx, node);
                            node.IsPreloaded = false;
                        }
                    }
                }

                //Если нужно выводить элемнты ТОЛЬКО верхнего уровня
                if (ShowOnlyFirstLevelMembers == false)
                {
                    //Если есть дочерние, то добавляем фиктивный узел для отображения [+] напротив данного узла
                    if (!node.IsExpanded && info.HasChildren)
                    {
                        if (node.Items.Count == 0)
                            node.IsWaiting = true;
                    }
                }
                indx++;
            }

            //Если режим Частичной загрузки, то сверяем количество загруженных элементов и количество элементов в кубе
            if (useStepLoading)
            {
                // Грузим Step+1 элемент, а отображать будем только Step штук. Если в ответе придет Step+1 элемент, то значит нужно отображать узел LoadNext
                if (members.Count > Step)
                {
                    if (loadNextIndex == -1)
                    {
                        if (parent != null)
                            parent.IsFullLoaded = false;
                        else
                        {
                            membersTree.IsFullLoaded = false;
                        }
                    }
                }
                else
                {
                    if (parent != null)
                        parent.IsFullLoaded = true;
                    else
                    {
                        membersTree.IsFullLoaded = true;
                    }
                }
            }
            else 
            {
                if (parent != null)
                    parent.IsFullLoaded = true;
                else
                {
                    membersTree.IsFullLoaded = true;
                }
            }

            membersTree.UpdateLayout();
        }
        void service_GetRootMembersCompleted(DataLoaderEventArgs e, MemberTreeNode parentNode)
        {
            membersTree.IsWaiting = false;
            membersTree.IsFullLoaded = true;

            if (e.Result.ContentType == InvokeContentType.Error)
            {
                ClearTree();
                membersTree.IsError = true;

                SetFilterBuilderToError();
                return;
            }

            List<MemberData> members = new List<MemberData>();
            if (!String.IsNullOrEmpty(e.Result.Content))
            {
                CellSetData cellSet = CellSetData.Deserialize(e.Result.Content);
                members = QueryProvider.GetMembers(cellSet);
            }

            CreateChildNodes(null, members);

            //            ClearCustomSelection();

            if (membersTree.Items.Count > 0)
            {
                MemberTreeNode node = membersTree.Items[0] as MemberTreeNode;
                SelectNode(node);
            }

            if (!m_LevelPropertiesIsLoaded)
                LoadLevelProperties();
        }
        void SelectNode(MemberTreeNode node)
        {
            ClearCustomSelection();

            if (node != null)
            {
                node.IsSelected = true;
                if (!m_CustomSelection.Contains(node))
                    m_CustomSelection.Add(node);
            }
        }