/// <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 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)
			}
		}