/// <summary> /// Метод, вызывающий событие NeedImageIndex. /// </summary> /// <param name="node">Узел, для которого определяется индекс изображения.</param> /// <param name="imageIndex">Предполагаемый индекс изображения.</param> /// <returns></returns> protected int OnNeedImageIndex(SimTreeNodeEx node, int imageIndex) { if(NeedImageIndex == null) return nodeItemsImageIndex; NeedImageIndexEventArgsEx args = new NeedImageIndexEventArgsEx(node.TreeItem, imageIndex); NeedImageIndex(this, args); return args.ImageIndex; }
//------------------------------------------------------------------------------------- #region << SimTree Handlers >> void _tree_ItemAdded(object sender, CollectionChangeNotifyEventArgs args) { //tree_ItemAdded(ITree sender, ITreeItem item) ITreeItem item = (ITreeItem)args.Item; try { if(isUpdated) return; if(item.IsRoot) { SimTreeNodeEx node = new SimTreeNodeEx(item, NodeTextPropName); if(item.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, closedImageIndex); else node.ImageIndex = node.SelectedImageIndex = closedImageIndex; } else node.SelectedImageIndex = node.ImageIndex = OnNeedImageIndex(node); treeView.Nodes.Add(node); } else //if(item.Parent.Props.ContainsParam("Node")) { SimTreeNodeEx pNode = treeView.Nodes.Find(item.Parent); if(pNode != null) if(pNode.Nodes.Count == 1 && pNode.Nodes[0].Name == "-1") { pNode.Nodes.Clear(); foreach(ITreeItem key in item.Parent.Children) { SimTreeNodeEx node = new SimTreeNodeEx(key, NodeTextPropName); if(key.HasChildren) node.Nodes.Add("-1", "hidden"); if(treeView.ImageList != null) if(key.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, closedImageIndex); else node.ImageIndex = node.SelectedImageIndex = closedImageIndex; } else node.SelectedImageIndex = node.ImageIndex = OnNeedImageIndex(node); pNode.Nodes.Add(node); } } else { SimTreeNodeEx node = new SimTreeNodeEx(item, NodeTextPropName); if(item.HasChildren) node.Nodes.Add("-1", "hidden"); if(treeView.ImageList != null) if(item.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, closedImageIndex); else node.ImageIndex = node.SelectedImageIndex = closedImageIndex; } else node.SelectedImageIndex = node.ImageIndex = OnNeedImageIndex(node); pNode.Nodes.Add(node); } } } catch(Exception Err) { ErrorBox.Show(Err); } }
/// <summary> /// Переустанавливает состояния для указанного элемента и всех его дочерних элементов. /// </summary> /// <param name="node"></param> public void ResetNodeState(SimTreeNodeEx node) { if(chType == CheckBoxesType.None && node.StateImageIndex == -1) return; for (int a = 0; a < node.Nodes.Count; a++) ResetNodeState(node.Nodes[a]); if(chType == CheckBoxesType.None) node.StateImageIndex = -1; else if(chType == CheckBoxesType.ThreeState) { if(node.TreeItem != null && node.TreeItem.IsGroup) { CheckState ii = node.Nodes[0].CheckState; foreach(SimTreeNodeEx n in node.Nodes) if(n.CheckState != ii) { ii = CheckState.Indeterminate; break; } node.CheckState = ii; } node.StateImageIndex = (int)node.CheckState; } else { node.CheckState = (node.CheckState == CheckState.Checked ? CheckState.Checked : CheckState.Unchecked); node.StateImageIndex = (int)node.CheckState; } }
private void RecursSetNodesChecked(SimTreeNodeEx node, CheckState check) { foreach (SimTreeNodeEx n in node.Nodes) RecursSetNodesChecked(n, check); if (check == CheckState.Checked) { foreach (SimTreeNodeEx n in node.Nodes) if (n.CheckState != CheckState.Checked) { check = CheckState.Indeterminate; break; } } if(node.Name == "-1" && node.Text == "hidden" && check == CheckState.Checked) check = CheckState.Unchecked; if (!OnBeforeCheck(node)) { node.CheckState = check; node.StateImageIndex = (int) check; OnAfterCheck(node); } }
protected bool OnBeforeCheck(SimTreeNodeEx node) { if (BeforeCheck != null) { TreeViewCancelEventArgs args = new TreeViewCancelEventArgs(node, false, TreeViewAction.Unknown); BeforeCheck(node, args); return args.Cancel; } return false; }
protected void OnAfterCheck(SimTreeNodeEx node) { if (AfterCheck != null) AfterCheck(node, new TreeViewEventArgs(node)); }
//------------------------------------------------------------------------------------- void tree_BeforeExpand(object sender, TreeViewCancelEventArgs e) { try { SimTreeNodeEx node = (SimTreeNodeEx)e.Node; if(node.TreeItem.HasChildren && node.Nodes[0].Name != "-1") { treeView.ResetNodeState(node); if(treeView.ImageList != null && node.TreeItem.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, openedImageIndex); else node.ImageIndex = node.SelectedImageIndex = openedImageIndex; } return; } node.Nodes.Clear(); ITreeItem item = (ITreeItem)node.TreeItem; List<SimTreeNodeEx> nodes = new List<SimTreeNodeEx>(item.Children.Count()); foreach(ITreeItem key in item.Children) { SimTreeNodeEx n = new SimTreeNodeEx(key, NodeTextPropName); if(key.HasChildren) n.Nodes.Add("-1", "hidden"); if(treeView.ImageList != null) if(key.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) n.ImageIndex = OnNeedImageIndex(n, closedImageIndex); else n.ImageIndex = n.SelectedImageIndex = closedImageIndex; } else n.SelectedImageIndex = n.ImageIndex = OnNeedImageIndex(n); nodes.Add(n); } node.Nodes.AddRange(nodes); if(treeView.ImageList != null && node.TreeItem.IsGroup) if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, openedImageIndex); else node.ImageIndex = node.SelectedImageIndex = openedImageIndex; treeView.ResetNodeState(node); } catch(Exception Err) { ErrorBox.Show(Err); } }
//------------------------------------------------------------------------------------- #region Tree Methods /// <summary> /// Строит начальное дерево. /// </summary> private void BuildTree() { try { List<SimTreeNodeEx> nodes = new List<SimTreeNodeEx>(); foreach(ITreeItem pid in _tree.GetRootItems()) { SimTreeNodeEx node = new SimTreeNodeEx(pid, NodeTextPropName); if(pid.HasChildren) node.Nodes.Add("-1", "hidden"); if(treeView.ImageList != null) if(pid.IsGroup) { if(needImageIndexEventTarget == NeedImageIndexEventTarget.AllNodes) node.ImageIndex = OnNeedImageIndex(node, closedImageIndex); else node.ImageIndex = node.SelectedImageIndex = closedImageIndex; } else node.SelectedImageIndex = node.ImageIndex = OnNeedImageIndex(node); nodes.Add(node); } treeView.BeginUpdate(); treeView.Nodes.Clear(); treeView.Nodes.AddRange(nodes); if(treeView.Nodes.Count > 0) treeView.Nodes[0].Expand(); btnFind.Enabled = true; treeView.ResetStates(); treeView.EndUpdate(); } catch(Exception Err) { ErrorBox.Show(Err); } }
private void ChoicedItemsAll(SimTreeNodeEx node) { foreach (var n in node.Nodes) { if (n.CheckState != CheckState.Unchecked && n.TreeItem != null) _choisedItems.Add(n.TreeItem); ChoicedItemsAll(n); } }