public PivotMdxDesignerControl()
        {
            ScrollViewer Scroll = new ScrollViewer();
            Scroll.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
            Scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;

            LayoutRoot = new Grid();
            LayoutRoot.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            LayoutRoot.RowDefinitions.Add(new RowDefinition());
            m_Input_Column = new ColumnDefinition() { Width = new GridLength(m_InputColumnWidth) };
            LayoutRoot.ColumnDefinitions.Add(m_Input_Column);
            LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition() { /*Width = new GridLength(2, GridUnitType.Star)*/ });

            // ТУЛБАР 
            m_ToolBar = new RanetToolBar();
            m_ToolBar.Margin = new Thickness(0, 0, 0, 4);
            LayoutRoot.Children.Add(m_ToolBar);
            Grid.SetColumnSpan(m_ToolBar, 2);

            m_ShowMetadataArea = new RanetToggleButton();
            m_ShowMetadataArea.ClickMode = ClickMode.Press;
            m_ShowMetadataArea.Click += new RoutedEventHandler(m_ShowMetadataArea_Click);
            m_ShowMetadataArea.IsChecked = new bool?(true);
            m_ShowMetadataArea.Content = UiHelper.CreateIcon(UriResources.Images.Menu16);
            ToolTipService.SetToolTip(m_ShowMetadataArea, Localization.MdxDesigner_ShowQueryDesigner_ToolTip);
            m_ToolBar.AddItem(m_ShowMetadataArea);

            m_ShowMDXQuery = new RanetToggleButton();
            m_ShowMDXQuery.ClickMode = ClickMode.Press;
            m_ShowMDXQuery.Click += new RoutedEventHandler(m_ShowMDXQuery_Click);
            m_ShowMDXQuery.IsChecked = new bool?(false);
            m_ShowMDXQuery.Content = UiHelper.CreateIcon(UriResources.Images.Mdx16);
            ToolTipService.SetToolTip(m_ShowMDXQuery, Localization.MdxDesigner_ShowQuery_ToolTip);
            m_ToolBar.AddItem(m_ShowMDXQuery);

            m_EditMDXQuery = new RanetToggleButton();
            m_EditMDXQuery.ClickMode = ClickMode.Press;
            m_EditMDXQuery.Click += new RoutedEventHandler(m_EditMDXQuery_Click);
            m_EditMDXQuery.IsChecked = new bool?(false);
            m_EditMDXQuery.Content = UiHelper.CreateIcon(UriResources.Images.Edit16);
            ToolTipService.SetToolTip(m_EditMDXQuery, Localization.MdxDesigner_EditQuery_ToolTip);
            m_ToolBar.AddItem(m_EditMDXQuery);

            m_RunAreaSplitter = new RanetToolBarSplitter();
            m_ToolBar.AddItem(m_RunAreaSplitter);

            m_CalculatedMemberEditor = new RanetToolBarButton();
            m_CalculatedMemberEditor.Content = UiHelper.CreateIcon(UriResources.Images.CustomCalculations16);
            m_CalculatedMemberEditor.Click += new RoutedEventHandler(m_CalculatedMemberEditor_Click);
            ToolTipService.SetToolTip(m_CalculatedMemberEditor, Localization.MdxDesigner_CalculatedMemberEditor);
            m_ToolBar.AddItem(m_CalculatedMemberEditor);

            m_RunQueryAutomatic = new RanetToggleButton();
            m_RunQueryAutomatic.ClickMode = ClickMode.Press;
            m_RunQueryAutomatic.IsChecked = new bool?(true);
            m_RunQueryAutomatic.Content = UiHelper.CreateIcon(UriResources.Images.AutoRun16);
            ToolTipService.SetToolTip(m_RunQueryAutomatic, Localization.MdxDesigner_RunQueryAutomatic);
            m_ToolBar.AddItem(m_RunQueryAutomatic);

            m_ExecuteQuery = new RanetToolBarButton();
            m_ExecuteQuery.Content = UiHelper.CreateIcon(UriResources.Images.Run16);
            m_ExecuteQuery.Click += new RoutedEventHandler(m_ExecuteQuery_Click);
            ToolTipService.SetToolTip(m_ExecuteQuery, Localization.MdxDesigner_ExecuteQuery);
            m_ToolBar.AddItem(m_ExecuteQuery);

            m_StorageAreaSplitter = new RanetToolBarSplitter();
            m_ToolBar.AddItem(m_StorageAreaSplitter);

            m_ImportLayout = new RanetToolBarButton();
            m_ImportLayout.Content = UiHelper.CreateIcon(UriResources.Images.FileImport16);
            m_ImportLayout.Click += new RoutedEventHandler(m_ImportLayout_Click);
            ToolTipService.SetToolTip(m_ImportLayout, Localization.MdxDesigner_ImportLayout_ToolTip);
            m_ToolBar.AddItem(m_ImportLayout);

            m_ExportLayout = new RanetToolBarButton();
            m_ExportLayout.Content = UiHelper.CreateIcon(UriResources.Images.FileExport16);
            m_ExportLayout.Click += new RoutedEventHandler(m_ExportLayout_Click);
            ToolTipService.SetToolTip(m_ExportLayout, Localization.MdxDesigner_ExportLayout_ToolTip);
            m_ToolBar.AddItem(m_ExportLayout);

            Grid Input_LayoutRoot = new Grid();
            Input_LayoutRoot.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(2, GridUnitType.Star) });
            Input_LayoutRoot.Margin = new Thickness(0, 0, 0, 0);
            Input_LayoutRoot.RowDefinitions.Add(new RowDefinition());

            Input_Border = new Border() { Padding = new Thickness(3), BorderBrush = new SolidColorBrush(Colors.DarkGray), BorderThickness = new Thickness(1) };
            Input_Border.Margin = new Thickness(0, 0, 3, 0);
            Input_Border.Child = Input_LayoutRoot;

            Grid Ouput_LayoutRoot = new Grid();
            Ouput_LayoutRoot.Margin = new Thickness(0, 0, 0, 0);
            // По умолчанию высота 0
            m_MDX_Row = new RowDefinition(){ Height = new GridLength(0.0)};
            Ouput_LayoutRoot.RowDefinitions.Add(m_MDX_Row);
            Ouput_LayoutRoot.RowDefinitions.Add(new RowDefinition() /*{ Height = new GridLength(2, GridUnitType.Star) }*/);

            LayoutRoot.Children.Add(Input_Border);
            Grid.SetRow(Input_Border, 1);
            LayoutRoot.Children.Add(Ouput_LayoutRoot);
            Grid.SetRow(Ouput_LayoutRoot, 1);
            Grid.SetColumn(Ouput_LayoutRoot, 1);

            LayoutRoot_VertSplitter = new GridSplitter();
            LayoutRoot_VertSplitter.VerticalAlignment = VerticalAlignment.Stretch;
            LayoutRoot_VertSplitter.HorizontalAlignment = HorizontalAlignment.Right;
            LayoutRoot_VertSplitter.Width = 3;
            LayoutRoot_VertSplitter.IsTabStop = false;
            LayoutRoot_VertSplitter.Background = new SolidColorBrush(Colors.Transparent);
            LayoutRoot.Children.Add(LayoutRoot_VertSplitter);
            Grid.SetRow(LayoutRoot_VertSplitter, 1);
            Grid.SetColumn(LayoutRoot_VertSplitter, 0);

            // Информация о кубе
            Grid Cube_LayotRoot = new Grid();
            Cube_LayotRoot.Margin = new Thickness(0, 3, 0, 0);
            Cube_LayotRoot.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            Cube_LayotRoot.RowDefinitions.Add(new RowDefinition());
            
            // Заголовок
            //HeaderControl cube_Header = new HeaderControl(UriResources.Images.Cube16, Localization.MdxDesigner_CubeMetadata) { Margin = new Thickness(0, 0, 0, 3) };
            //Cube_LayotRoot.Children.Add(cube_Header);

            // Просмотрщик куба
            m_ServerExplorer = new ServerExplorerCtrl();
            m_ServerExplorer.CubeBrowser.DragNodes = true;
            m_ServerExplorer.CubeBrowser.DragStarted += new EventHandler<DragNodeArgs<DragStartedEventArgs>>(m_CubeBrowser_DragStarted);
            m_ServerExplorer.CubeBrowser.DragDelta += new EventHandler<DragNodeArgs<DragDeltaEventArgs>>(m_CubeBrowser_DragDelta);
            m_ServerExplorer.CubeBrowser.DragCompleted += new EventHandler<DragNodeArgs<DragCompletedEventArgs>>(m_CubeBrowser_DragCompleted);
            m_ServerExplorer.CubeSelected += new EventHandler<CustomEventArgs<string>>(m_ServerExplorer_CubeSelected);
            Cube_LayotRoot.Children.Add(m_ServerExplorer);
            Grid.SetRow(m_ServerExplorer, 1);

            Input_LayoutRoot.Children.Add(Cube_LayotRoot);
            Grid.SetRow(Cube_LayotRoot, 0);

            Areas_LayoutRoot = new Grid();
            Areas_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition());
            Areas_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition());
            Areas_LayoutRoot.RowDefinitions.Add(new RowDefinition());
            Areas_LayoutRoot.RowDefinitions.Add(new RowDefinition());

            m_FilterAreaContainer = new PivotAreaContainer();
            m_FilterAreaContainer.ItemRemoved += new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved);
            m_FilterAreaContainer.Margin = new Thickness(0, 5, 0, 0);
            m_FilterAreaContainer.Icon = UriResources.Images.FiltersArea16;
            m_FilterAreaContainer.Caption = Localization.MdxDesigner_FilterArea_Caption;
            m_FilterAreaContainer.BeforeShowContextMenu += new EventHandler<AreaItemArgs>(m_FilterAreaContainer_BeforeShowContextMenu);
            m_FilterAreaContainer.ItemsListChanged += new EventHandler(AreaContainer_ItemsListChanged);
            Areas_LayoutRoot.Children.Add(m_FilterAreaContainer);
            Grid.SetRow(m_FilterAreaContainer, 0);
            Grid.SetColumn(m_FilterAreaContainer, 0);

            m_RowsAreaContainer = new PivotAreaContainer();
            m_RowsAreaContainer.ItemRemoved += new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved);
            m_RowsAreaContainer.Margin = new Thickness(0, 5, 0, 0);
            m_RowsAreaContainer.Icon = UriResources.Images.RowsArea16;
            m_RowsAreaContainer.Caption = Localization.MdxDesigner_RowsArea_Caption;
            m_RowsAreaContainer.BeforeShowContextMenu += new EventHandler<AreaItemArgs>(m_RowsAreaContainer_BeforeShowContextMenu);
            m_RowsAreaContainer.ItemsListChanged += new EventHandler(AreaContainer_ItemsListChanged);
            Areas_LayoutRoot.Children.Add(m_RowsAreaContainer);
            Grid.SetRow(m_RowsAreaContainer, 1);
            Grid.SetColumn(m_RowsAreaContainer, 0);

            m_ColumnsAreaContainer = new PivotAreaContainer();
            m_ColumnsAreaContainer.ItemRemoved += new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved);
            m_ColumnsAreaContainer.Margin = new Thickness(5, 5, 0, 0);
            m_ColumnsAreaContainer.Icon = UriResources.Images.ColumnsArea16;
            m_ColumnsAreaContainer.Caption = Localization.MdxDesigner_ColumnsArea_Caption;
            m_ColumnsAreaContainer.BeforeShowContextMenu += new EventHandler<AreaItemArgs>(m_ColumnsAreaContainer_BeforeShowContextMenu);
            m_ColumnsAreaContainer.ItemsListChanged += new EventHandler(AreaContainer_ItemsListChanged);
            Areas_LayoutRoot.Children.Add(m_ColumnsAreaContainer);
            Grid.SetRow(m_ColumnsAreaContainer, 0);
            Grid.SetColumn(m_ColumnsAreaContainer, 1);

            m_DataAreaContainer = new PivotAreaContainer();
            m_DataAreaContainer.ItemRemoved += new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved);
            m_DataAreaContainer.Margin = new Thickness(5, 5, 0, 0);
            m_DataAreaContainer.Icon = UriResources.Images.DataArea16;
            m_DataAreaContainer.Caption = Localization.MdxDesigner_DataArea_Caption;
            m_DataAreaContainer.ItemsListChanged += new EventHandler(AreaContainer_ItemsListChanged);
            Areas_LayoutRoot.Children.Add(m_DataAreaContainer);
            Grid.SetRow(m_DataAreaContainer, 1);
            Grid.SetColumn(m_DataAreaContainer, 1);

            Input_LayoutRoot.Children.Add(Areas_LayoutRoot);
            Grid.SetRow(Areas_LayoutRoot, 1);

            GridSplitter Input_HorzSplitter = new GridSplitter();
            Input_HorzSplitter.VerticalAlignment = VerticalAlignment.Bottom;
            Input_HorzSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
            Input_HorzSplitter.Height = 3;
            Input_HorzSplitter.IsTabStop = false;
            Input_HorzSplitter.Background = new SolidColorBrush(Colors.Transparent);
            Input_LayoutRoot.Children.Add(Input_HorzSplitter);
            Grid.SetRow(Input_HorzSplitter, 0);
            Grid.SetColumn(Input_HorzSplitter, 0);

            // Результат выполнения запроса
            Grid Pivot_LayotRoot = new Grid();
            Pivot_LayotRoot.Margin = new Thickness(0, 3, 0, 0);
            Pivot_LayotRoot.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            Pivot_LayotRoot.RowDefinitions.Add(new RowDefinition());

            // Заголовок
            HeaderControl pivot_Header = new HeaderControl(UriResources.Images.PivotGrid16, Localization.MdxDesigner_QueryResult) { Margin = new Thickness(0, 0, 0, 3) };
            Pivot_LayotRoot.Children.Add(pivot_Header);

            // Сводная таблица
            m_PivotGrid = new UpdateablePivotGridControl();
            m_PivotGrid.Margin = new Thickness(0, 0, 0, 0);
            m_PivotGrid.IsUpdateable = true;
            m_PivotGrid.ColumnsIsInteractive = true;
            m_PivotGrid.RowsIsInteractive = true;
            m_PivotGrid.ShowToolBar = true;
            Pivot_LayotRoot.Children.Add(m_PivotGrid);
            Grid.SetRow(m_PivotGrid, 1);

            Border Pivot_Border = new Border() { Padding = new Thickness(3), BorderBrush = new SolidColorBrush(Colors.DarkGray), BorderThickness = new Thickness(1) };
            Pivot_Border.Margin = new Thickness(0, 0, 0, 0);
            Pivot_Border.Child = Pivot_LayotRoot;

            Ouput_LayoutRoot.Children.Add(Pivot_Border);
            Grid.SetRow(Pivot_Border, 1);

            Output_HorzSplitter = new GridSplitter();
            Output_HorzSplitter.VerticalAlignment = VerticalAlignment.Bottom;
            Output_HorzSplitter.HorizontalAlignment = HorizontalAlignment.Stretch;
            Output_HorzSplitter.Height = 3;
            Output_HorzSplitter.IsTabStop = false;
            Output_HorzSplitter.Background = new SolidColorBrush(Colors.Transparent);
            Ouput_LayoutRoot.Children.Add(Output_HorzSplitter);
            Grid.SetRow(Output_HorzSplitter, 0);
            Grid.SetColumn(Output_HorzSplitter, 0);

            // Информация о MDX запросе
            Grid Mdx_LayotRoot = new Grid();
            Mdx_LayotRoot.Margin = new Thickness(0, 3, 0, 0);
            Mdx_LayotRoot.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            Mdx_LayotRoot.RowDefinitions.Add(new RowDefinition());

            // Заголовок
            HeaderControl mdx_Header = new HeaderControl(UriResources.Images.Mdx16, Localization.MdxDesigner_MdxQuery) { Margin = new Thickness(0, 0, 0, 3) };
            Mdx_LayotRoot.Children.Add(mdx_Header);
            
            // Текст запроса
            m_MdxQuery = new RichTextBox();
            m_MdxQuery.AcceptsReturn = true;
            m_MdxQuery.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
            m_MdxQuery.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
            m_MdxQuery.IsReadOnly = true;
            Mdx_LayotRoot.Children.Add(m_MdxQuery);
            Grid.SetRow(m_MdxQuery, 1);

            Mdx_Border = new Border() { Padding = new Thickness(3), BorderBrush = new SolidColorBrush(Colors.DarkGray), BorderThickness = new Thickness(1) };
            Mdx_Border.Margin = new Thickness(0, 0, 0, 4);
            Mdx_Border.Child = Mdx_LayotRoot;

            Ouput_LayoutRoot.Children.Add(Mdx_Border);
            Grid.SetRow(Mdx_Border, 0);

            AllowDragDrop(m_FilterAreaContainer);
            AllowDragDrop(m_ColumnsAreaContainer);
            AllowDragDrop(m_RowsAreaContainer);
            AllowDragDrop(m_DataAreaContainer);

            //Scroll.Content = LayoutRoot;

            m_ServerExplorer.OlapDataLoader = GetOlapDataLoader();
            m_PivotGrid.OlapDataLoader = GetOlapDataLoader();
            m_StorageManager = GetStorageManager();
            m_StorageManager.InvokeCompleted += new EventHandler<DataLoaderEventArgs>(StorageManager_ActionCompleted);

            this.Content = LayoutRoot;
        }
 void AllowDragDrop(PivotAreaContainer area)
 {
     if (area != null)
     {
         area.DragStarted += new EventHandler<DragAreaItemArgs<DragStartedEventArgs>>(area_DragStarted);
         area.DragDelta += new EventHandler<DragAreaItemArgs<DragDeltaEventArgs>>(area_DragDelta);
         area.DragCompleted += new EventHandler<DragAreaItemArgs<DragCompletedEventArgs>>(area_DragCompleted);
     }
 }
        /// <summary>
        /// Обновляет информацию о вычислениях. Удаляет лишние, обновляет информацию у существующих
        /// </summary>
        /// <param name="area">Область для обновления</param>
        void RefreshCalculationItems(PivotAreaContainer area)
        {
            if (area != null)
            {
                List<AreaItemControl> toDelete = new List<AreaItemControl>();
                foreach (AreaItemControl child in area.Items)
                {
                    InfoItemControl info_ctrl = child as InfoItemControl;
                    if (info_ctrl != null)
                    {
                        Calculated_AreaItemWrapper calculated = info_ctrl.Wrapper as Calculated_AreaItemWrapper;
                        if (calculated != null)
                        {
                            CalculationInfoBase item = null;
                            if (calculated is CalculatedMember_AreaItemWrapper)
                            {
                                item = GetCalculatedMember(calculated.Name);
                            }
                            if (calculated is CalculatedNamedSet_AreaItemWrapper)
                            {
                                item = GetCalculatedNamedSet(calculated.Name);
                            }

                            if (item == null)
                            {
                                toDelete.Add(child);
                            }
                            else
                            {
                                info_ctrl.Caption = calculated.Caption;
                            }
                        }
                    }
                }

                // Удаляем элементы, которые уже удалены в дизайнере
                foreach (AreaItemControl child in toDelete)
                {
                    area.RemoveItem(child);
                }
            }
        }
 void HighLightCustomNodes(PivotAreaContainer area)
 {
     if (area != null)
     {
         foreach (AreaItemControl child in area.Items)
         {
             InfoItemControl info_ctrl = child as InfoItemControl;
             if (info_ctrl != null)
             {
                 CustomTreeNode node = FindCustomNode(info_ctrl.Wrapper);
                 if (node != null)
                     node.UseBoldText = true;
             }
         }
     }
 }
        List<NamedSet_AreaItemControl> GetUsedNamedSets(PivotAreaContainer area)
        {
            List<NamedSet_AreaItemControl> list = new List<NamedSet_AreaItemControl>();
            if (area != null)
            {
                foreach (AreaItemControl child in area.Items)
                {
                    NamedSet_AreaItemControl set_ctrl = child as NamedSet_AreaItemControl;
                    if (set_ctrl != null)
                    {

                        if (!list.Contains(set_ctrl))
                        {
                            list.Add(set_ctrl);
                        }
                    }
                }
            }
            return list;
        }
        List<CalculationInfoBase> GetUsedCalculatedMembers(PivotAreaContainer area)
        {
            List<CalculationInfoBase> list = new List<CalculationInfoBase>();
            if (area != null)
            {
                foreach (AreaItemControl child in area.Items)
                {
                    CalculatedMember_AreaItemControl member_ctrl = child as CalculatedMember_AreaItemControl;
                    if (member_ctrl != null)
                    {
                        CalculationInfoBase item = GetCalculatedMember(member_ctrl.CalculatedMember.Name);
                        if (item != null && !list.Contains(item))
                        {
                            list.Add(item);
                        }
                    }

                    CalculateNamedSet_AreaItemControl set_ctrl = child as CalculateNamedSet_AreaItemControl;
                    if (set_ctrl != null)
                    {
                        CalculationInfoBase item = GetCalculatedNamedSet(set_ctrl.CalculatedNamedSet.Name);
                        if (item != null && !list.Contains(item))
                        {
                            list.Add(item);
                        }
                    }
                }
            }
            return list;
        }
        void BuildFromItemWrappers(PivotAreaContainer container, List<AreaItemWrapper> wrappers)
        {
            if (container != null)
            {
                container.Clear();

                if (wrappers != null)
                {
                    container.ItemsListChanged -= new EventHandler(AreaContainer_ItemsListChanged);
                    foreach (AreaItemWrapper wrapper in wrappers)
                    {
                        AreaItemControl ctrl = null;
                        CustomTreeNode nodeInTree = FindCustomNode(wrapper);

                        Values_AreaItemWrapper values_item = wrapper as Values_AreaItemWrapper;
                        if (values_item != null)
                        {
                            ctrl = new Values_AreaItemControl();
                        }

                        Measure_AreaItemWrapper measures_item = wrapper as Measure_AreaItemWrapper;
                        if (measures_item != null)
                        {
                            ctrl = new Measure_AreaItemControl(measures_item);
                        }

                        CalculatedMember_AreaItemWrapper calcMember_item = wrapper as CalculatedMember_AreaItemWrapper;
                        if (calcMember_item != null)
                        {
                            ctrl = new CalculatedMember_AreaItemControl(calcMember_item);
                        }

                        CalculatedNamedSet_AreaItemWrapper calculatedSet_item = wrapper as CalculatedNamedSet_AreaItemWrapper;
                        if (calculatedSet_item != null)
                        {
                            ctrl = new CalculateNamedSet_AreaItemControl(calculatedSet_item);
                        }

                        NamedSet_AreaItemWrapper set_item = wrapper as NamedSet_AreaItemWrapper;
                        if (set_item != null)
                        {
                            ctrl = new NamedSet_AreaItemControl(set_item);
                        }

                        Level_AreaItemWrapper level_item = wrapper as Level_AreaItemWrapper;
                        if (level_item != null)
                        {
                            ctrl = new Level_AreaItemControl(level_item);
                        }

                        Hierarchy_AreaItemWrapper hierarchy_item = wrapper as Hierarchy_AreaItemWrapper;
                        if (hierarchy_item != null)
                        {
                            ctrl = new Hierarchy_AreaItemControl(hierarchy_item);
                        }

                        Kpi_AreaItemWrapper kpi_item = wrapper as Kpi_AreaItemWrapper;
                        if (kpi_item != null)
                        {
                            ctrl = new Kpi_AreaItemControl(kpi_item);
                        }

                        if (ctrl != null)
                        {
                            if (nodeInTree != null)
                            {
                                ctrl.UserData = nodeInTree;
                                ctrl.Icon = nodeInTree.Icon;
                                nodeInTree.UseBoldText = true;
                            }

                            container.AddItem(ctrl);
                            ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);

                            FilteredItemControl filtered_item = ctrl as FilteredItemControl;
                            if (filtered_item != null)
                            {
                                filtered_item.ShowFilter += new EventHandler(FilteredItem_ShowFilter);
                                filtered_item.CancelFilter += new EventHandler(FilteredItem_CancelFilter);
                            }
                        }
                    }
                    container.ItemsListChanged += new EventHandler(AreaContainer_ItemsListChanged);
                }
            }
        }
        List<AreaItemWrapper> GetItemWrappers(PivotAreaContainer container)
        {
            List<AreaItemWrapper> list = new List<AreaItemWrapper>();
            if (container != null)
            {
                foreach (AreaItemControl item in container.Items)
                {
                    Values_AreaItemControl values_item = item as Values_AreaItemControl;
                    if (values_item != null)
                    {
                        list.Add(new Values_AreaItemWrapper());
                        continue;
                    }

                    Measure_AreaItemControl measures_item = item as Measure_AreaItemControl;
                    if (measures_item != null)
                    {
                        list.Add(measures_item.Measure);
                        continue;
                    }

                    CalculateNamedSet_AreaItemControl calculatedSet_item = item as CalculateNamedSet_AreaItemControl;
                    if (calculatedSet_item != null)
                    {
                        list.Add(calculatedSet_item.CalculatedNamedSet);
                        continue;
                    }

                    NamedSet_AreaItemControl set_item = item as NamedSet_AreaItemControl;
                    if (set_item != null)
                    {
                        list.Add(set_item.NamedSet);
                        continue;
                    }

                    CalculatedMember_AreaItemControl calcMember_item = item as CalculatedMember_AreaItemControl;
                    if (calcMember_item != null)
                    {
                        list.Add(calcMember_item.CalculatedMember);
                        continue;
                    }

                    FilteredItemControl level_item = item as FilteredItemControl;
                    if (level_item != null)
                    {
                        list.Add(level_item.Wrapper);
                        continue;
                    }

                    Kpi_AreaItemControl kpi_item = item as Kpi_AreaItemControl;
                    if (kpi_item != null)
                    {
                        list.Add(kpi_item.Kpi);
                        continue;
                    }
                }
            }
            return list;
        }
 AreaItemControl FindValuesItem(PivotAreaContainer container)
 {
     if (container != null)
     {
         foreach (AreaItemControl item in container.Items)
         {
             if (item is Values_AreaItemControl)
                 return item;
         }
     }
     return null;
 }
        /// <summary>
        /// Возвращает конкурента для элемента в указанной области. Конкурентами (для строк, колонок, фильтров) считаются элементы, принадлежащие одной иерархии
        /// Конкурентами для области данных являются элементы (меры, вычисляемые элементы) с таким же именем
        /// </summary>
        /// <param name="container"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        AreaItemControl FindConcurent(PivotAreaContainer container, TreeViewItem node)
        {
            if (container != null)
            {
                InfoBaseTreeNode infoNode = node as InfoBaseTreeNode;
                if (container == m_DataAreaContainer)
                {
                    CalculatedMemberTreeNode calcMemberNode = node as CalculatedMemberTreeNode;
                    if (infoNode != null || calcMemberNode != null)
                    {
                        KpiInfo kpi = infoNode != null ? infoNode.Info as KpiInfo : null;
                        MeasureInfo measure = infoNode != null ? infoNode.Info as MeasureInfo : null;
                        CalcMemberInfo member = calcMemberNode != null ? calcMemberNode.Info : null;

                        List<AreaItemControl> items = container.Items;
                        foreach (AreaItemControl item in items)
                        {
                            Measure_AreaItemControl measure_Item = item as Measure_AreaItemControl;
                            if (measure_Item != null && measure != null && measure.UniqueName == measure_Item.Measure.UniqueName)
                            {
                                return item;
                            }

                            Kpi_AreaItemControl kpi_Item = item as Kpi_AreaItemControl;
                            if (kpi_Item != null && kpi != null && kpi.Name == kpi_Item.Kpi.Name)
                            {
                                return item;
                            }

                            CalculatedMember_AreaItemControl member_Item = item as CalculatedMember_AreaItemControl;
                            if (member_Item != null && member != null && member.Name == member_Item.CalculatedMember.Name)
                            {
                                return item;
                            }
                        }
                    }
                }

                if (container == m_RowsAreaContainer ||
                    container == m_ColumnsAreaContainer ||
                    container == m_FilterAreaContainer)
                {
                    var setNode = node as CalculatedNamedSetTreeNode;
                    var memberNode = node as MemberLiteTreeNode; 

                    if (infoNode != null || setNode != null || memberNode != null)
                    {
                        // если node - узел иерархии, то ищем по уникальному имени еирархии среди элементов
                        // если node - узел уровня, то ищем по уникальному имени иерархии, которой этот узел принадлежит

                        HierarchyInfo hierarchy = infoNode != null ? infoNode.Info as HierarchyInfo : null;
                        LevelInfo level = infoNode != null ? infoNode.Info as LevelInfo : null;
                        CalculatedNamedSetInfo calculatedSet = setNode != null ? setNode.Info : null;
                        NamedSetInfo set = infoNode != null ? infoNode.Info as NamedSetInfo : null;

                        List<AreaItemControl> items = container.Items;
                        foreach (AreaItemControl item in items)
                        {
                            CalculateNamedSet_AreaItemControl calculatedSet_Item = item as CalculateNamedSet_AreaItemControl;
                            if (calculatedSet_Item != null && calculatedSet != null && calculatedSet.Name == calculatedSet_Item.CalculatedNamedSet.Name)
                            {
                                return item;
                            }

                            NamedSet_AreaItemControl set_Item = item as NamedSet_AreaItemControl;
                            if (set_Item != null && set != null && set.Name == set_Item.NamedSet.Name)
                            {
                                return item;
                            }
                            
                            Hierarchy_AreaItemControl hierarchy_Item = item as Hierarchy_AreaItemControl;
                            if (hierarchy_Item != null)
                            {
                                if (hierarchy != null && hierarchy_Item.Hierarchy.UniqueName == hierarchy.UniqueName)
                                {
                                    return item;
                                }
                                if (level != null && hierarchy_Item.Hierarchy.UniqueName == level.ParentHirerachyId)
                                {
                                    return item;
                                }
                                if (memberNode != null && memberNode.Info != null && hierarchy_Item.Hierarchy.UniqueName == memberNode.Info.HierarchyUniqueName)
                                {
                                    return item;
                                }
                            }

                            Level_AreaItemControl level_Item = item as Level_AreaItemControl;
                            if (level_Item != null)
                            {
                                if (hierarchy != null && level_Item.Level.HierarchyUniqueName == hierarchy.UniqueName)
                                {
                                    return item;
                                }
                                if (level != null && level_Item.Level.HierarchyUniqueName == level.ParentHirerachyId)
                                {
                                    return item;
                                }
                                if (memberNode != null && memberNode.Info != null && level_Item.Level.HierarchyUniqueName == memberNode.Info.HierarchyUniqueName)
                                {
                                    return item;
                                }
                            }
                        }
                    }
                }
            }
            return null;
        }
        String BuildAreaSet(PivotAreaContainer area)
        {
            String tmp = string.Empty;
            String result = String.Empty;

            String hierarchize_Blank = "Hierarchize({0})";

            if (area != null)
            {
                // Список из распаршенных элементов области
                List<String> list = new List<string>();
                foreach (AreaItemControl child in area.Items)
                {
                    tmp = BuildItemSet(child);
                    if (!String.IsNullOrEmpty(tmp))
                        list.Add(tmp);
                }

                if (list.Count > 0)
                {
                    if (list.Count == 1)
                    {
                        // Один элемент
                        result = String.Format(hierarchize_Blank, list[0]);
                    }
                    else
                    {
                        int i = 0;
                        int crossCount = 0;
                        // Пересечение элементов
                        foreach (String set in list)
                        {
                            if(i > 0)
                                result += ", ";
                            if (i < list.Count - 1)
                            {
                                result += "CrossJoin(";
                                crossCount++;
                            }
                            result += set;
                            i++;
                        }

                        for (int x = 0; x < crossCount; x++)
                        {
                            result += ")";
                        }
                        result = String.Format(hierarchize_Blank, result);
                    }
                }
            }
            return result;
        }
        List<String> BuildFilterSubCubes(PivotAreaContainer area)
        {
            List<String> result = new List<string>();

            if (area != null)
            {
                foreach (AreaItemControl child in area.Items)
                {
                    FilteredItemControl filtered_Item = child as FilteredItemControl;

                    if (filtered_Item != null)
                    {
                        if (filtered_Item.FilteredWrapper.CompositeFilter.Filter.IsUsed)
                        {
                            String set = BuildItemSet(child);

                            #region Top-Filter
                            if (filtered_Item.FilteredWrapper.CompositeFilter.Filter.CurrentFilter == FilterFamilyTypes.TopFilter)
                            {
                                String function = String.Empty;
                                switch (filtered_Item.FilteredWrapper.CompositeFilter.Filter.TopFilter.FilterType)
                                {
                                    case TopFilterTypes.Top:
                                        switch (filtered_Item.FilteredWrapper.CompositeFilter.Filter.TopFilter.FilterTarget)
                                        {
                                            case TopFilterTargetTypes.Items:
                                                function = "TopCount";
                                                break;
                                            case TopFilterTargetTypes.Percent:
                                                function = "TopPercent";
                                                break;
                                            case TopFilterTargetTypes.Sum:
                                                function = "TopSum";
                                                break;
                                        }
                                        break;
                                    case TopFilterTypes.Bottom:
                                        switch (filtered_Item.FilteredWrapper.CompositeFilter.Filter.TopFilter.FilterTarget)
                                        {
                                            case TopFilterTargetTypes.Items:
                                                function = "BottomCount";
                                                break;
                                            case TopFilterTargetTypes.Percent:
                                                function = "BottomPercent";
                                                break;
                                            case TopFilterTargetTypes.Sum:
                                                function = "BottomSum";
                                                break;
                                        }
                                        break;
                                }

                                if(!String.IsNullOrEmpty(function) && !String.IsNullOrEmpty(set))
                                {
                                    String Top_Template = " " + function + "({0}, {1}, {2})";
                                    set = String.Format(Top_Template, set, filtered_Item.FilteredWrapper.CompositeFilter.Filter.TopFilter.Count.ToString(), filtered_Item.FilteredWrapper.CompositeFilter.Filter.TopFilter.MeasureUniqueName);
                                    result.Add(set);
                                }
                            }
                            #endregion Top-Filter

                            #region Value-Filter
                            if (filtered_Item.FilteredWrapper.CompositeFilter.Filter.CurrentFilter == FilterFamilyTypes.ValueFilter)
                            {
                                String function = String.Empty;
                                switch (filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.FilterType)
                                {
                                    case ValueFilterTypes.Equal:
                                        function = "=";
                                        break;
                                    case ValueFilterTypes.NotEqual:
                                        function = "<>";
                                        break;
                                    case ValueFilterTypes.Less:
                                        function = "<";
                                        break;
                                    case ValueFilterTypes.LessOrEqual:
                                        function = "<=";
                                        break;
                                    case ValueFilterTypes.Greater:
                                        function = ">";
                                        break;
                                    case ValueFilterTypes.GreaterOrEqual:
                                        function = ">=";
                                        break;
                                }

                                if (!String.IsNullOrEmpty(set))
                                {
                                    if (!String.IsNullOrEmpty(function))
                                    {
                                        String Top_Template = " Filter(Hierarchize({0}), ({1} " + function + " {2}))";
                                        set = String.Format(Top_Template, set, filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.MeasureUniqueName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.Num1.ToString());
                                        result.Add(set);
                                    }
                                    else
                                    {
                                        if (filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.FilterType == ValueFilterTypes.Between ||
                                            filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.FilterType == ValueFilterTypes.NotBetween)
                                        {
                                            String Top_Template = " Filter(Hierarchize({0}), ({1} >= {2} AND {1} <= {3}))";
                                            if(filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.FilterType == ValueFilterTypes.NotBetween)
                                                Top_Template = " Filter(Hierarchize({0}), ({1} < {2} OR {1} > {3}))";
                                            set = String.Format(Top_Template, set, filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.MeasureUniqueName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.Num1.ToString(), filtered_Item.FilteredWrapper.CompositeFilter.Filter.ValueFilter.Num2.ToString());
                                            result.Add(set);
                                        }
                                    }
                                }
                            }
                            #endregion Value-Filter

                            #region Label-Filter
                            if (filtered_Item.FilteredWrapper.CompositeFilter.Filter.CurrentFilter == FilterFamilyTypes.LabelFilter)
                            {
                                Hierarchy_AreaItemControl hierarchy_Item = filtered_Item as Hierarchy_AreaItemControl;
                                Level_AreaItemControl level_Item = filtered_Item as Level_AreaItemControl;
                                String hierarchy_UniqueName = String.Empty;
        
                                if (hierarchy_Item != null)
                                {
                                    hierarchy_UniqueName = hierarchy_Item.Hierarchy.UniqueName;
                                }
                                if (level_Item != null)
                                {
                                    hierarchy_UniqueName = level_Item.Level.HierarchyUniqueName;
                                }

                                String Filter_Template = String.Empty;
                                String BeginEnd_Template = String.Empty;
                                String Between_Template = String.Empty;
                                switch (filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.FilterType)
                                {
                                    case LabelFilterTypes.Equal:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") = \"{3}\"))";
;                                       break;
                                    case LabelFilterTypes.NotEqual:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") <> \"{3}\"))";
                                        break;
                                    case LabelFilterTypes.Less:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") < \"{3}\"))";
                                        break;
                                    case LabelFilterTypes.LessOrEqual:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") <= \"{3}\"))";
                                        break;
                                    case LabelFilterTypes.Greater:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") > \"{3}\"))";
                                        break;
                                    case LabelFilterTypes.GreaterOrEqual:
                                        Filter_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") >= \"{3}\"))";
                                        break;
                                    case LabelFilterTypes.BeginWith:
                                        BeginEnd_Template = "Filter({0}, (Left({1}.CurrentMember.Properties(\"{2}\"), {3}) = \"{4}\"))";
                                        break;
                                    case LabelFilterTypes.EndWith:
                                        BeginEnd_Template = "Filter({0}, (Right({1}.CurrentMember.Properties(\"{2}\"), {3}) = \"{4}\"))";
                                        break;
                                    case LabelFilterTypes.NotEndWith:
                                        BeginEnd_Template = "Filter({0}, (Right({1}.CurrentMember.Properties(\"{2}\"), {3}) <> \"{4}\"))";
                                        break;
                                    case LabelFilterTypes.Contain:
                                        Filter_Template = "Filter({0}, (InStr(1, {1}.CurrentMember.Properties(\"{2}\"), \"{3}\") > 0))";
                                        break;
                                    case LabelFilterTypes.NotContain:
                                        Filter_Template = "Filter({0}, (InStr(1, {1}.CurrentMember.Properties(\"{2}\"), \"{3}\") == 0))";
                                        break;
                                    case LabelFilterTypes.Between:
                                        Between_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") >= \"{3}\") AND ({1}.CurrentMember.Properties(\"{2}\") <= \"{4}\"))";
                                        break;
                                    case LabelFilterTypes.NotBetween:
                                        Between_Template = "Filter({0}, ({1}.CurrentMember.Properties(\"{2}\") < \"{3}\") OR ({1}.CurrentMember.Properties(\"{2}\") > \"{4}\"))";
                                        break;
                                }

                                if (!String.IsNullOrEmpty(set))
                                {
                                    if (!String.IsNullOrEmpty(Filter_Template))
                                    {
                                        set = String.Format(Filter_Template, set, hierarchy_UniqueName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.LevelPropertyName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.Text1);
                                        result.Add(set);
                                    }
                                    if (!String.IsNullOrEmpty(BeginEnd_Template))
                                    {
                                        set = String.Format(BeginEnd_Template, set, hierarchy_UniqueName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.LevelPropertyName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.Text1.Length.ToString(), filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.Text1);
                                        result.Add(set);
                                    }
                                    if (!String.IsNullOrEmpty(Between_Template))
                                    {
                                        set = String.Format(Between_Template, set, hierarchy_UniqueName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.LevelPropertyName, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.Text1, filtered_Item.FilteredWrapper.CompositeFilter.Filter.LabelFilter.Text2);
                                        result.Add(set);
                                    }
                                }
                            }
                            #endregion Label-Filter
                        }
                    }
                }
            }
            return result;
        }
        bool CanDragToArea(PivotAreaContainer container, AreaItemControl item)
        {
            if (item != null && container != null)
            {
                if (container == m_DataAreaContainer)
                {
                    // В область данных можно таскать только меры, KPI и вычисляемые элементы
                    if (item is Kpi_AreaItemControl ||
                        item is Measure_AreaItemControl ||
                        item is CalculatedMember_AreaItemControl)
                        return true;
                }

                if (container == m_RowsAreaContainer || container == m_ColumnsAreaContainer)
                { 
                    // В область строк и колонок можно таскать: иерархии, уровни, Set(ы) и узел "Values"
                    if (item is Hierarchy_AreaItemControl ||
                        item is Level_AreaItemControl ||
                        item is CalculateNamedSet_AreaItemControl ||
                        item is Values_AreaItemControl)
                        return true;
                }

                if (container == m_FilterAreaContainer)
                {
                    // В область фильтров можно таскать: иерархии, уровни
                    if (item is Hierarchy_AreaItemControl ||
                        item is Level_AreaItemControl)
                        return true;
                }
            }
            return false;
        }
		void DropToArea(PivotAreaContainer container, CustomTreeNode node, bool raise_ItemsListChanged)
		{
			if (container != null && node != null)
			{
				Members_FilterWrapper custom_MemberFilter = null;

				// Убиваем конкурентов :D

				#region Узелы для элементов измерений
				// Если таскается элемент, то в случае если в данной области есть узел для иерархии или уровня, то элемент добавляется в фильтр
				var memberNode = node as MemberLiteTreeNode;
				if (memberNode != null && memberNode.Info != null)
				{
					// Убиваем конкурентов во всех областях кроме данной :D
					if (container == m_RowsAreaContainer)
					{
						m_ColumnsAreaContainer.RemoveItem(FindConcurent(m_ColumnsAreaContainer, node), false);
						m_FilterAreaContainer.RemoveItem(FindConcurent(m_FilterAreaContainer, node), false);
						m_DataAreaContainer.RemoveItem(FindConcurent(m_DataAreaContainer, node), false);
					}
					if (container == m_ColumnsAreaContainer)
					{
						m_RowsAreaContainer.RemoveItem(FindConcurent(m_RowsAreaContainer, node), false);
						m_FilterAreaContainer.RemoveItem(FindConcurent(m_FilterAreaContainer, node), false);
						m_DataAreaContainer.RemoveItem(FindConcurent(m_DataAreaContainer, node), false);
					}
					if (container == m_FilterAreaContainer)
					{
						m_ColumnsAreaContainer.RemoveItem(FindConcurent(m_ColumnsAreaContainer, node), false);
						m_RowsAreaContainer.RemoveItem(FindConcurent(m_RowsAreaContainer, node), false);
						m_DataAreaContainer.RemoveItem(FindConcurent(m_DataAreaContainer, node), false);
					}
					if (container == m_DataAreaContainer)
					{
						m_ColumnsAreaContainer.RemoveItem(FindConcurent(m_ColumnsAreaContainer, node), false);
						m_RowsAreaContainer.RemoveItem(FindConcurent(m_RowsAreaContainer, node), false);
						m_FilterAreaContainer.RemoveItem(FindConcurent(m_FilterAreaContainer, node), false);
					}

					// Находим конкурента в данной области
					var concurent = FindConcurent(container, node);
					var filtered_concurent = concurent as FilteredItemControl;
					if (filtered_concurent != null && filtered_concurent.FilteredWrapper != null &&
							(filtered_concurent is Hierarchy_AreaItemControl || // Если конкурентом является иерархиия то это нормально
							(filtered_concurent is Level_AreaItemControl && ((Level_AreaItemControl)filtered_concurent).Level != null && ((Level_AreaItemControl)filtered_concurent).Level.UniqueName == memberNode.Info.LevelName)) // Если конкурентом является уровень, то это должен быть тот же уровень что и у элемента
					)
					{
						bool isDublicate = false;
						// Ищем такой же элемент в фильтре
						foreach (var item in filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.SelectedInfo)
						{
							if (item.UniqueName == memberNode.Info.UniqueName && item.SelectState == SelectStates.Selected_Self)
								isDublicate = true;
						}
						if (!isDublicate)
						{
							// Добавляем сами руками в FilterSet. Он превильно сгенерируется только при закрытии диалога с фильтром
							if (String.IsNullOrEmpty(filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.FilterSet))
							{
								filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.FilterSet = "{" + memberNode.Info.UniqueName + "}";
							}
							else
							{
								String str = filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.FilterSet.Trim();
								if (str.EndsWith("}"))
								{
									str = str.Substring(0, str.Length - 1);
								}
								str += ", " + memberNode.Info.UniqueName + "}";
								filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.FilterSet = str;
							}

							var member_settings = new MemberChoiceSettings(memberNode.Info, SelectStates.Selected_Self);
							filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.SelectedInfo.Add(member_settings);
						}
						filtered_concurent.FilteredWrapper.CompositeFilter.MembersFilter.IsUsed = true;
						filtered_concurent.Refresh();
						if (m_FilterDialogs.ContainsKey(concurent))
						{
							ModalDialog dialog = m_FilterDialogs[concurent];
							if (dialog != null)
							{
								var filterControl = dialog.Content as FilterBuilderControl;
								if (filterControl != null)
								{
									// Переинициализировать контрол выбора элементов измерения в фильтре при открытии
									filterControl.MemberChoiceIsInitialized = false;
								}
							}
						}

						RefreshMdxQuery();
						return;
					}
					else
					{
						// Удаляем данного конкурента, т.к. он не поддерживает фильтр
						container.RemoveItem(concurent, false);
					}

					// Добавляем новый узел для иерархии
					// Ищем иерархию для данного элемента
					var hierarchyNode = m_ServerExplorer.CubeBrowser.FindHierarchyNode(memberNode.Info.HierarchyUniqueName);
					if (hierarchyNode != null)
					{
						custom_MemberFilter = new Members_FilterWrapper();
						var member_settings = new MemberChoiceSettings(memberNode.Info, SelectStates.Selected_Self);
						custom_MemberFilter.SelectedInfo.Add(member_settings);
						custom_MemberFilter.FilterSet = "{" + memberNode.Info.UniqueName + "}";
						node = hierarchyNode;
					}
				}
				else
				{
					AreaItemControl concurent = FindConcurent(m_RowsAreaContainer, node);
					m_RowsAreaContainer.RemoveItem(concurent, false);

					concurent = FindConcurent(m_ColumnsAreaContainer, node);
					m_ColumnsAreaContainer.RemoveItem(concurent, false);

					concurent = FindConcurent(m_FilterAreaContainer, node);
					m_FilterAreaContainer.RemoveItem(concurent, false);

					concurent = FindConcurent(m_DataAreaContainer, node);
					m_DataAreaContainer.RemoveItem(concurent, false);
				}
				#endregion Узелы для элементов измерений


				#region Узлы для вычисляемых элементов
				CalculatedMemberTreeNode calcMemberNode = node as CalculatedMemberTreeNode;
				if (calcMemberNode != null && calcMemberNode.Info != null)
				{
					// Вычисляемые элементы могут кидаться только в область данных
					AreaItemControl ctrl = new CalculatedMember_AreaItemControl(new CalculatedMember_AreaItemWrapper(calcMemberNode.Info), calcMemberNode.Icon);
					ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
					ctrl.UserData = node;


					if (container == m_DataAreaContainer)
					{
						int count = m_DataAreaContainer.Items.Count;

						// В случае, если в области данных стало более одного объекта, то добавляем специальный узел Values в область колонок 
						if (count == 1)
						{
							AreaItemControl value_ctrl = new Values_AreaItemControl();
							value_ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
							m_ColumnsAreaContainer.AddItem(value_ctrl, false);
						}

						m_DataAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
						calcMemberNode.UseBoldText = true;
					}
				}
				#endregion Узлы для вычисляемых элементов

				#region Узлы для именованных наборов
				CalculatedNamedSetTreeNode calculatedSetNode = node as CalculatedNamedSetTreeNode;
				if (calculatedSetNode != null && calculatedSetNode.Info != null)
				{
					// Set(ы) могут кидаться только в области строк и столбцов
					AreaItemControl ctrl = new CalculateNamedSet_AreaItemControl(new CalculatedNamedSet_AreaItemWrapper(calculatedSetNode.Info), calculatedSetNode.Icon);
					ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
					ctrl.UserData = node;

					if (container == m_RowsAreaContainer)
					{
						m_RowsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
						calculatedSetNode.UseBoldText = true;
					}

					if (container == m_ColumnsAreaContainer)
					{
						m_ColumnsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
						calculatedSetNode.UseBoldText = true;
					}
				}

				NamedSetTreeNode setNode = node as NamedSetTreeNode;
				if (setNode != null)
				{
					NamedSetInfo setInfo = setNode.Info as NamedSetInfo;
					if (setInfo != null)
					{
						// Set(ы) могут кидаться только в области строк и столбцов
						AreaItemControl ctrl = new NamedSet_AreaItemControl(new NamedSet_AreaItemWrapper(setInfo), setNode.Icon);
						ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
						ctrl.UserData = node;

						if (container == m_RowsAreaContainer)
						{
							m_RowsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
							setNode.UseBoldText = true;
						}

						if (container == m_ColumnsAreaContainer)
						{
							m_ColumnsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
							setNode.UseBoldText = true;
						}
					}
				}
				#endregion Узлы для именованных наборов

				#region Узлы метаданных (InfoBaseTreeNode)
				InfoBaseTreeNode info_node = node as InfoBaseTreeNode;
				if (info_node != null)
				{
					HierarchyInfo hierarchyInfo = info_node.Info as HierarchyInfo;
					LevelInfo levelInfo = info_node.Info as LevelInfo;
					MeasureInfo measureInfo = info_node.Info as MeasureInfo;
					KpiInfo kpiInfo = info_node.Info as KpiInfo;

					// Иерархии и уровни можно кидать только в области: строк, столбцов, фильтров
					if (hierarchyInfo != null || levelInfo != null)
					{
						FilteredItemControl ctrl = null;
						if (hierarchyInfo != null)
							ctrl = new Hierarchy_AreaItemControl(new Hierarchy_AreaItemWrapper(hierarchyInfo), info_node.Icon);
						if (levelInfo != null)
							ctrl = new Level_AreaItemControl(new Level_AreaItemWrapper(levelInfo), info_node.Icon);

						ctrl.ShowFilter += new EventHandler(FilteredItem_ShowFilter);
						ctrl.CancelFilter += new EventHandler(FilteredItem_CancelFilter);
						ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
						ctrl.UserData = node;
						if (custom_MemberFilter != null)
						{
							ctrl.FilteredWrapper.CompositeFilter.MembersFilter = custom_MemberFilter;
							ctrl.FilteredWrapper.CompositeFilter.MembersFilter.IsUsed = true;
							ctrl.Refresh();
						}

						if (container == m_RowsAreaContainer)
						{
							m_RowsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
							info_node.UseBoldText = true;
						}

						if (container == m_ColumnsAreaContainer)
						{
							m_ColumnsAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
							info_node.UseBoldText = true;
						}

						if (container == m_FilterAreaContainer)
						{
							m_FilterAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
							info_node.UseBoldText = true;
						}
					}

					// меры и Kpi могут кидаться только в область данных
					if (measureInfo != null ||
							kpiInfo != null)
					{
						AreaItemControl ctrl = null;
						if (measureInfo != null)
							ctrl = new Measure_AreaItemControl(new Measure_AreaItemWrapper(measureInfo), info_node.Icon);
						if (kpiInfo != null)
						{
							KpiControlType type = KpiControlType.Value;
							if (node is KpiStatusTreeNode)
								type = KpiControlType.Status;
							if (node is KpiTrendTreeNode)
								type = KpiControlType.Trend;
							if (node is KpiGoalTreeNode)
								type = KpiControlType.Goal;

							ctrl = new Kpi_AreaItemControl(new Kpi_AreaItemWrapper(kpiInfo, type), info_node.Icon);
						}

						if (ctrl != null)
						{
							ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
							ctrl.UserData = node;

							if (container == m_DataAreaContainer)
							{
								int count = m_DataAreaContainer.Items.Count;

								// В случае, если в области данных стало более одного объекта, то добавляем специальный узел Values в область колонок 
								if (count == 1)
								{
									AreaItemControl value_ctrl = new Values_AreaItemControl();
									value_ctrl.ContextMenuCreated += new EventHandler(ctrl_ContextMenuCreated);
									m_ColumnsAreaContainer.AddItem(value_ctrl, false);
								}

								m_DataAreaContainer.AddItem(ctrl, raise_ItemsListChanged);
								info_node.UseBoldText = true;
							}
						}
					}
				}
				#endregion Узлы метаданных (InfoBaseTreeNode)
			}
		}
		void DropToArea(PivotAreaContainer container, CustomTreeNode node)
		{
			DropToArea(container, node, true);
		}