/// <summary> /// Сообщает родительскому элементу об изменении состояния текущего элемента /// </summary> /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param> private void Raise_ChildSelectStateChanged(OlapMemberInfo changedMember) { //Отправляем это событие родителю передаем дальше элемент, который изначально инициировал событие if (Parent != null) { Parent.ChildSelectStateChanged(this, changedMember); } }
/// <summary> /// Генерирует событие - изменилось состояние всей иерархии элементов /// </summary> protected void Raise_HierarchyStateChanged(OlapMemberInfo sender) { StateChangedEventHandler handler = this.HierarchyStateChanged; if (handler != null) { handler(sender); } }
/// <summary> /// Родительский элемент OlapMemberInfo /// </summary> private void SetParentOlapMemberInfo(OlapMemberInfo parent) { this.m_Parent = parent; if (Parent != null) { SetStateByParent(); } }
/// <summary> /// Добавляет элемент в коллекцию дочерних OlapMemberInfo /// </summary> /// <param name="memberInfo"></param> public void AddChild(OlapMemberInfo memberInfo) { if (Root != null && Root is RootOlapMemberInfo) { ((RootOlapMemberInfo)Root).AllMembers[memberInfo.UniqueName] = memberInfo; } Children[memberInfo.UniqueName] = memberInfo; memberInfo.SetParentOlapMemberInfo(this); }
/// <summary> /// Сообщает дочерним элементам об изменении состояния текущего элемента /// </summary> /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param> private void Raise_ParentSelectStateChanged(OlapMemberInfo changedMember) { //Отправляем это событие дальше дочерним, передаем дальше элемент, который изначально инициировал событие if (Children != null) { foreach (OlapMemberInfo memberInfo in Children.Values) { memberInfo.ParentSelectStateChanged(this, changedMember); } } }
/// <summary> /// Возвращает родительские элементы иерархии /// </summary> /// <param name="useRoot">true - с учетом RootOlapMemberInfo, false - без RootOlapMemberInfo</param> /// <returns></returns> public IList <OlapMemberInfo> GetAscendants(bool useRoot) { IList <OlapMemberInfo> ascendants = new List <OlapMemberInfo>(); OlapMemberInfo parent = this; while (parent.Parent != null) { parent = parent.Parent; if (parent is RootOlapMemberInfo && useRoot == false) { continue; } ascendants.Add(parent); } return(ascendants); }
public MemberTreeNode(OlapMemberInfo info, bool useMultiSelect) : base(useMultiSelect) { if (info == null) throw new ArgumentNullException("info"); m_MemberInfo = info; if (info.Info != null && info.Info != null) Text = MemberInfo.Info.Caption; else Text = String.Empty; // В случае множ. выбора клик на иконке используем для изменения состояния m_ItemCtrl.IconClick += new EventHandler(item_ctrl_IconClick); if (useMultiSelect) { UpdateNodeIcon(); } info.StateChanged += new OlapMemberInfo.StateChangedEventHandler(info_StateChanged); }
/// <summary> /// Функция вызывается родителем для дочерних для сигнализации о том что како-либо родительский OlapMemberInfo переведен в новое состояние /// </summary> /// <param name="changedMember">Элемент, который первым изменил состояние</param> private void ParentSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember) { bool changed = false; switch (changedMember.SelectState) { case SelectStates.Selected_Self: break; case SelectStates.Not_Selected: changed = SetState(SelectStates.Not_Initialized); if (changed) { Raise_ParentSelectStateChanged(changedMember); } break; case SelectStates.Selected_With_Children: if (HasChildren) { SetState(SelectStates.Selected_By_Parent_With_Children); } else { SetState(SelectStates.Selected_By_Parent); } Raise_ParentSelectStateChanged(changedMember); break; case SelectStates.Not_Initialized: changed = SetState(SelectStates.Not_Initialized); if (changed) { Raise_ChildSelectStateChanged(changedMember); } break; } }
/// <summary> /// Родительский элемент OlapMemberInfo /// </summary> private void SetParentOlapMemberInfo(OlapMemberInfo parent) { this.m_Parent = parent; if (Parent != null) { SetStateByParent(); } }
/// <summary> /// Добавляет элемент в иерархию MemberNodeInfo /// </summary> /// <param name="member">Member, информация о котором должна быть добавлена в иерархию</param> public OlapMemberInfo AddMemberToHierarchy(MemberData info) { //Задача: Добавить OlapMemberInfo в иерархию //Возможные варианты: // - если элемент в иерархии уже есть, то выход // - если элемента в иерархии еще нет, то ищем его родителя. // Если Родитель задан, Но родителя в иерархии тоже нет, то добавляем родителя и ищем дальше следующего родителя рекурсивно // Если родитель не задан, то элемент является корневым (одним из корневых) в иерархии //Таким образом в иерархию добавляется не только элемент, но и полностью ветка его родителей (если ее не было) //Ищем информацию о данном члене измерения в загруженной иерархии OlapMemberInfo memberInfo = FindMember(info.UniqueName); //Если элемент в иерархии не найден, то его нужно добавить if (memberInfo == null) { //Создаем OlapMemberInfo memberInfo = new OlapMemberInfo(info); // Подписываемся у каждого добавленного элемента на событие - изменение состояния всей иерархии // данное событие генерит элемент, послуживший инициатором рекурсивного обновления состояний в дереве memberInfo.HierarchyStateChanged += new StateChangedEventHandler(memberInfo_HierarchyStateChanged); //OlapMemberInfo, который будем использовать для формирования ветки ....->Дед->Отец->Изначально добавляемый мембер //Ветку будем формировать при поиске родительских элементов OlapMemberInfo addedHierarchy = memberInfo; bool foundParentHierarchy = true; while (foundParentHierarchy) { String parentUniqueName = String.Empty; if (addedHierarchy.Info != null) { PropertyData prop = addedHierarchy.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY); if (prop != null && prop.Value != null) { parentUniqueName = prop.Value.ToString(); } } if (String.IsNullOrEmpty(parentUniqueName)) { // В случае если например в мерархию загружены элементы уровня 1 и потом догружается элемент All, // то получится что в коллекции корневых элементов находятся элементы уровней 0 и 1. Чтобы такого не произошло // после добавления просматриваем коллекцию корневых элементов и проверяем не является данный добавленный элемент родителем для кого-нибудь из уже имеющихся // Если дочерние обнаружены, то они удаляются из корневых и добавляются в дочерние к данному элементу. // Ищем среди корневых элементы дочерние для данного Dictionary <String, OlapMemberInfo> toDelete = new Dictionary <string, OlapMemberInfo>(); foreach (var child in Children.Values) { String pun = String.Empty; if (child.Info != null) { PropertyData prop = child.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY); if (prop != null && prop.Value != null) { pun = prop.Value.ToString(); } } if (!String.IsNullOrEmpty(pun) && pun == addedHierarchy.UniqueName) { toDelete.Add(child.UniqueName, child); } } // Удаляем из коллекции корневых дочерние элементы foreach (var del in toDelete) { Children.Remove(del.Key); } // Добавляем в коллекцию корневых элементов AddChild(addedHierarchy); // Добавляем в дочерние те элементы, которые были до этого корневыми foreach (var del in toDelete) { addedHierarchy.AddChild(del.Value); } foundParentHierarchy = false; break; } else { OlapMemberInfo parentOlapMemberInfo = null; parentOlapMemberInfo = FindMember(parentUniqueName); //если родитель найден, то добавляем ему нашу сформированную ветку в дочерние if (parentOlapMemberInfo != null) { parentOlapMemberInfo.AddChild(addedHierarchy); foundParentHierarchy = false; break; } else { //Добавляем в коллекцию корневых элементов AddChild(addedHierarchy); foundParentHierarchy = false; break; //throw new Exception(String.Format("Родитель для элемента {0} не найден в иерархии", info.Member.UniqueName)); ////Создаем OlapMemberInfo для родителя //parentOlapMemberInfo = new OlapMemberInfo(addedHierarchy.Member.Parent, Mode, addedHierarchy.Member.Parent.ChildCount); ////Добавляем ненайденного родителя в ветку, которую нужно добавить в иерархию //parentOlapMemberInfo.AddChildOlapMemberInfo(addedHierarchy); ////В этом случае мы иерархию строим руками и нужно явно добавлять в коллекцию memberInfoHierarchy.AllMembers //memberInfoHierarchy.AllMembers[addedHierarchy.UniqueName] = addedHierarchy; //addedHierarchy = parentOlapMemberInfo; } } } } return(memberInfo); }
void memberInfo_HierarchyStateChanged(OlapMemberInfo sender) { Raise_HierarchyStateChanged(sender); }
/// <summary> /// Функция вызывается дочерним для родителя для сигнализации о том что како-либо дочерний OlapMemberInfo переведен в новое состояние /// </summary> /// <param name="changedMember">Элемент, который первым изменил состояние</param> private void ChildSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember) { bool changed = false; switch (changedMember.SelectState) { case SelectStates.Selected_Self: if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected) { SetNewState(SelectStates.Selected_With_Children); } else { if (SelectState == SelectStates.Not_Initialized || SelectState == SelectStates.Not_Selected) { changed = SetState(SelectStates.Labeled_As_Parent); } if (changed) Raise_ChildSelectStateChanged(changedMember); } break; case SelectStates.Not_Selected: case SelectStates.Not_Initialized: if (this.HasSelectedChildren == false) { if (SelectState == SelectStates.Labeled_As_Parent) { changed = SetState(SelectStates.Not_Initialized); Raise_SetChildrenState(SelectStates.Not_Initialized, false); if (changed) Raise_ChildSelectStateChanged(changedMember); break; } } if (HasSelectedChildren == false && AllChildrenIsLoaded == true) { switch (SelectState) { case SelectStates.Selected_With_Children: case SelectStates.Selected_With_Children_Has_Excluded: changed = SetState(SelectStates.Selected_Self); Raise_SetChildrenState(SelectStates.Not_Initialized, false); break; case SelectStates.Selected_By_Parent_With_Children: case SelectStates.Selected_By_Parent_With_Children_Has_Excluded: changed = SetState(SelectStates.Selected_By_Parent); break; } } else { switch (SelectState) { case SelectStates.Selected_With_Children: changed = SetState(SelectStates.Selected_With_Children_Has_Excluded); break; case SelectStates.Selected_By_Parent_With_Children: changed = SetState(SelectStates.Selected_By_Parent_With_Children_Has_Excluded); break; } } if (changed) Raise_ChildSelectStateChanged(changedMember); break; case SelectStates.Selected_With_Children: if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected) { SetNewState(SelectStates.Selected_With_Children); } else { if (SelectState == SelectStates.Not_Initialized || SelectState == SelectStates.Not_Selected) { changed = SetState(SelectStates.Labeled_As_Parent); } else { if (HasExcludedChildren == false) { if (SelectState == SelectStates.Selected_With_Children_Has_Excluded) { changed = SetState(SelectStates.Selected_With_Children); Raise_ParentSelectStateChanged(this); } if (SelectState == SelectStates.Selected_By_Parent_With_Children_Has_Excluded) changed = SetState(SelectStates.Selected_By_Parent_With_Children); } } if (changed) Raise_ChildSelectStateChanged(changedMember); } break; } }
/// <summary> /// Функция вызывается родителем для дочерних для сигнализации о том что како-либо родительский OlapMemberInfo переведен в новое состояние /// </summary> /// <param name="changedMember">Элемент, который первым изменил состояние</param> private void ParentSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember) { bool changed = false; switch (changedMember.SelectState) { case SelectStates.Selected_Self: break; case SelectStates.Not_Selected: changed = SetState(SelectStates.Not_Initialized); if (changed) { Raise_ParentSelectStateChanged(changedMember); } break; case SelectStates.Selected_With_Children: if (HasChildren) SetState(SelectStates.Selected_By_Parent_With_Children); else SetState(SelectStates.Selected_By_Parent); Raise_ParentSelectStateChanged(changedMember); break; case SelectStates.Not_Initialized: changed = SetState(SelectStates.Not_Initialized); if (changed) Raise_ChildSelectStateChanged(changedMember); break; } }
void memberInfo_HierarchyStateChanged(OlapMemberInfo sender) { Raise_HierarchyStateChanged(sender); }
public static BitmapImage GetIconImage(OlapMemberInfo memberInfo) { if (memberInfo == null) return null; BitmapImage res = null; switch (memberInfo.SelectState) { case SelectStates.Not_Initialized: case SelectStates.Not_Selected: res = UriResources.Images.NotSelected16; break; case SelectStates.Selected_Self: case SelectStates.Selected_By_Parent: res = UriResources.Images.Selected16; break; case SelectStates.Selected_With_Children: case SelectStates.Selected_By_Parent_With_Children: res = UriResources.Images.SelectedChildren16; break; case SelectStates.Labeled_As_Parent: res = UriResources.Images.HasSelectedChildren16; break; case SelectStates.Selected_With_Children_Has_Excluded: case SelectStates.Selected_By_Parent_With_Children_Has_Excluded: res = UriResources.Images.HasExcludedChildren16; break; default: break; } return res; }
void info_StateChanged(OlapMemberInfo sender) { UpdateNodeIcon(); }
/// <summary> /// Добавляет элемент в коллекцию дочерних OlapMemberInfo /// </summary> /// <param name="memberInfo"></param> public void AddChild(OlapMemberInfo memberInfo) { if (Root != null && Root is RootOlapMemberInfo) { ((RootOlapMemberInfo)Root).AllMembers[memberInfo.UniqueName] = memberInfo; } Children[memberInfo.UniqueName] = memberInfo; memberInfo.SetParentOlapMemberInfo(this); }
/// <summary> /// Функция вызывается дочерним для родителя для сигнализации о том что како-либо дочерний OlapMemberInfo переведен в новое состояние /// </summary> /// <param name="changedMember">Элемент, который первым изменил состояние</param> private void ChildSelectStateChanged(OlapMemberInfo sender, OlapMemberInfo changedMember) { bool changed = false; switch (changedMember.SelectState) { case SelectStates.Selected_Self: if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected) { SetNewState(SelectStates.Selected_With_Children); } else { if (SelectState == SelectStates.Not_Initialized || SelectState == SelectStates.Not_Selected) { changed = SetState(SelectStates.Labeled_As_Parent); } if (changed) { Raise_ChildSelectStateChanged(changedMember); } } break; case SelectStates.Not_Selected: case SelectStates.Not_Initialized: if (this.HasSelectedChildren == false) { if (SelectState == SelectStates.Labeled_As_Parent) { changed = SetState(SelectStates.Not_Initialized); Raise_SetChildrenState(SelectStates.Not_Initialized, false); if (changed) { Raise_ChildSelectStateChanged(changedMember); } break; } } if (HasSelectedChildren == false && AllChildrenIsLoaded == true) { switch (SelectState) { case SelectStates.Selected_With_Children: case SelectStates.Selected_With_Children_Has_Excluded: changed = SetState(SelectStates.Selected_Self); Raise_SetChildrenState(SelectStates.Not_Initialized, false); break; case SelectStates.Selected_By_Parent_With_Children: case SelectStates.Selected_By_Parent_With_Children_Has_Excluded: changed = SetState(SelectStates.Selected_By_Parent); break; } } else { switch (SelectState) { case SelectStates.Selected_With_Children: changed = SetState(SelectStates.Selected_With_Children_Has_Excluded); break; case SelectStates.Selected_By_Parent_With_Children: changed = SetState(SelectStates.Selected_By_Parent_With_Children_Has_Excluded); break; } } if (changed) { Raise_ChildSelectStateChanged(changedMember); } break; case SelectStates.Selected_With_Children: if (SelectState == SelectStates.Selected_Self && AllChildrenIsSelected) { SetNewState(SelectStates.Selected_With_Children); } else { if (SelectState == SelectStates.Not_Initialized || SelectState == SelectStates.Not_Selected) { changed = SetState(SelectStates.Labeled_As_Parent); } else { if (HasExcludedChildren == false) { if (SelectState == SelectStates.Selected_With_Children_Has_Excluded) { changed = SetState(SelectStates.Selected_With_Children); Raise_ParentSelectStateChanged(this); } if (SelectState == SelectStates.Selected_By_Parent_With_Children_Has_Excluded) { changed = SetState(SelectStates.Selected_By_Parent_With_Children); } } } if (changed) { Raise_ChildSelectStateChanged(changedMember); } } break; } }
void OlapMemberInfoHierarchy_HierarchyStateChanged(OlapMemberInfo sender) { GenerateSetBySelectionState(); }
/// <summary> /// Генерирует событие - изменилось состояние всей иерархии элементов /// </summary> protected void Raise_HierarchyStateChanged(OlapMemberInfo sender) { StateChangedEventHandler handler = this.HierarchyStateChanged; if (handler != null) { handler(sender); } }
void selectedNode_StateChanged(OlapMemberInfo sender) { InitSelectionStates(); }
/// <summary> /// Сообщает дочерним элементам об изменении состояния текущего элемента /// </summary> /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param> private void Raise_ParentSelectStateChanged(OlapMemberInfo changedMember) { //Отправляем это событие дальше дочерним, передаем дальше элемент, который изначально инициировал событие if (Children != null) { foreach (OlapMemberInfo memberInfo in Children.Values) { memberInfo.ParentSelectStateChanged(this, changedMember); } } }
/// <summary> /// Добавляет элемент в иерархию MemberNodeInfo /// </summary> /// <param name="member">Member, информация о котором должна быть добавлена в иерархию</param> public OlapMemberInfo AddMemberToHierarchy(MemberData info) { //Задача: Добавить OlapMemberInfo в иерархию //Возможные варианты: // - если элемент в иерархии уже есть, то выход // - если элемента в иерархии еще нет, то ищем его родителя. // Если Родитель задан, Но родителя в иерархии тоже нет, то добавляем родителя и ищем дальше следующего родителя рекурсивно // Если родитель не задан, то элемент является корневым (одним из корневых) в иерархии //Таким образом в иерархию добавляется не только элемент, но и полностью ветка его родителей (если ее не было) //Ищем информацию о данном члене измерения в загруженной иерархии OlapMemberInfo memberInfo = FindMember(info.UniqueName); //Если элемент в иерархии не найден, то его нужно добавить if (memberInfo == null) { //Создаем OlapMemberInfo memberInfo = new OlapMemberInfo(info); // Подписываемся у каждого добавленного элемента на событие - изменение состояния всей иерархии // данное событие генерит элемент, послуживший инициатором рекурсивного обновления состояний в дереве memberInfo.HierarchyStateChanged += new StateChangedEventHandler(memberInfo_HierarchyStateChanged); //OlapMemberInfo, который будем использовать для формирования ветки ....->Дед->Отец->Изначально добавляемый мембер //Ветку будем формировать при поиске родительских элементов OlapMemberInfo addedHierarchy = memberInfo; bool foundParentHierarchy = true; while (foundParentHierarchy) { String parentUniqueName = String.Empty; if (addedHierarchy.Info != null) { PropertyData prop = addedHierarchy.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY); if (prop != null && prop.Value != null) { parentUniqueName = prop.Value.ToString(); } } if (String.IsNullOrEmpty(parentUniqueName)) { // В случае если например в мерархию загружены элементы уровня 1 и потом догружается элемент All, // то получится что в коллекции корневых элементов находятся элементы уровней 0 и 1. Чтобы такого не произошло // после добавления просматриваем коллекцию корневых элементов и проверяем не является данный добавленный элемент родителем для кого-нибудь из уже имеющихся // Если дочерние обнаружены, то они удаляются из корневых и добавляются в дочерние к данному элементу. // Ищем среди корневых элементы дочерние для данного Dictionary<String, OlapMemberInfo> toDelete = new Dictionary<string, OlapMemberInfo>(); foreach(var child in Children.Values) { String pun = String.Empty; if (child.Info != null) { PropertyData prop = child.Info.GetMemberProperty(MemberData.PARENT_UNIQUE_NAME_PROPERTY); if (prop != null && prop.Value != null) { pun = prop.Value.ToString(); } } if (!String.IsNullOrEmpty(pun) && pun == addedHierarchy.UniqueName) { toDelete.Add(child.UniqueName, child); } } // Удаляем из коллекции корневых дочерние элементы foreach (var del in toDelete) { Children.Remove(del.Key); } // Добавляем в коллекцию корневых элементов AddChild(addedHierarchy); // Добавляем в дочерние те элементы, которые были до этого корневыми foreach (var del in toDelete) { addedHierarchy.AddChild(del.Value); } foundParentHierarchy = false; break; } else { OlapMemberInfo parentOlapMemberInfo = null; parentOlapMemberInfo = FindMember(parentUniqueName); //если родитель найден, то добавляем ему нашу сформированную ветку в дочерние if (parentOlapMemberInfo != null) { parentOlapMemberInfo.AddChild(addedHierarchy); foundParentHierarchy = false; break; } else { //Добавляем в коллекцию корневых элементов AddChild(addedHierarchy); foundParentHierarchy = false; break; //throw new Exception(String.Format("Родитель для элемента {0} не найден в иерархии", info.Member.UniqueName)); ////Создаем OlapMemberInfo для родителя //parentOlapMemberInfo = new OlapMemberInfo(addedHierarchy.Member.Parent, Mode, addedHierarchy.Member.Parent.ChildCount); ////Добавляем ненайденного родителя в ветку, которую нужно добавить в иерархию //parentOlapMemberInfo.AddChildOlapMemberInfo(addedHierarchy); ////В этом случае мы иерархию строим руками и нужно явно добавлять в коллекцию memberInfoHierarchy.AllMembers //memberInfoHierarchy.AllMembers[addedHierarchy.UniqueName] = addedHierarchy; //addedHierarchy = parentOlapMemberInfo; } } } } return memberInfo; }
/// <summary> /// Сообщает родительскому элементу об изменении состояния текущего элемента /// </summary> /// <param name="changedMember">элемент, который самым первым изменил свое состояние</param> private void Raise_ChildSelectStateChanged(OlapMemberInfo changedMember) { //Отправляем это событие родителю передаем дальше элемент, который изначально инициировал событие if (Parent != null) { Parent.ChildSelectStateChanged(this, changedMember); } }