Example #1
0
        /// <summary>
        /// 获取当前选定节点的下一个同级树节点的绑定对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T GetNextSelectedData <T>()
        {
            ITypeBinderTreeViewNode selectedNode = this._treeView.SelectedNode as ITypeBinderTreeViewNode;

            if (selectedNode == null)
            {
                return(default(T));
            }

            ITypeBinderTreeViewNode nextNode = selectedNode.NextNode;

            if (nextNode == null)
            {
                return(default(T));
            }

            object obj = nextNode.DataBoundItem;

            if (obj == null)
            {
                return(default(T));
            }

            //if (obj.GetType().Equals(typeof(T)) == false && obj.GetType().IsSubclassOf(typeof(T)) == false)
            //    return default(T);

            if (nextNode.Codon.UpwardCompatible(typeof(T)))
            {
                return((T)obj);
            }
            else
            {
                return(default(T));
            }
        }
        /// <summary>
        /// 移动源节点到目标节点的下面,成为目标节点的子节点
        /// </summary>
        /// <param name="sourceFilter"></param>
        /// <param name="targetFilter"></param>
        public void Move(Filter sourceFilter, Filter targetFilter)
        {
            ITypeBinderTreeViewNode sourceNode = Find(sourceFilter);
            ITypeBinderTreeViewNode targetNode = Find(targetFilter);

            Move(sourceNode, targetNode);
        }
Example #3
0
        /// <summary>
        /// 通过Filter过滤器递归节点及所有子节点,查找符合条件的节点
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        private ITypeBinderTreeViewNode Find(TreeNodeCollection nodes, Filter filter)
        {
            Debug.Assert(filter != null, "Filter 为 null");

            if (filter == null)
            {
                return(null);
            }

            foreach (ITypeBinderTreeViewNode item in nodes)
            {
                if (filter(item))
                {
                    return(item);
                }

                ITypeBinderTreeViewNode childNode = Find(item.Node.Nodes, filter);
                if (childNode != null)
                {
                    return(childNode);
                }
            }

            return(null);
        }
Example #4
0
        public void Update(Filter filter)
        {
            ITypeBinderTreeViewNode node = Find(filter);

            if (node != null)
            {
                node.Update();
            }
        }
Example #5
0
        public void Update(object obj)
        {
            ITypeBinderTreeViewNode node = Find(obj);

            if (node != null)
            {
                node.Update();
            }
        }
Example #6
0
        public void Remove(object obj)
        {
            ITypeBinderTreeViewNode node = Find(obj);

            if (node != null)
            {
                node.Remove();
            }
        }
Example #7
0
        public void Remove(Filter filter)
        {
            ITypeBinderTreeViewNode node = Find(filter);

            if (node != null)
            {
                Remove(node.DataBoundItem);
            }
        }
        public void Update(object obj, Filter filter)
        {
            ITypeBinderTreeViewNode node = Find(filter);

            if (node != null)
            {
                node.Update(obj);
                UpdateRelation(node);
            }
        }
Example #9
0
        /// <summary>
        /// 创建一个树节点
        /// </summary>
        /// <param name="dataBoundItem"></param>
        /// <returns></returns>
        private ITypeBinderTreeViewNode CreateNode(object dataBoundItem, IList ownerList)
        {
            ITypeBinderTreeViewNode node = (ITypeBinderTreeViewNode)Activator.CreateInstance(this.NodeType);

            node.DataBoundItem = dataBoundItem;
            node.Codon         = GetNodeCodon(dataBoundItem.GetType());
            node.OwnerList     = ownerList;
            DataBind(node);
            return(node);
        }
        public IList GetOwnerList(ITypeBinderTreeViewNode node)
        {
            ITypeBinderTreeViewNode parentNode = node.Parent;

            if (parentNode == null)
            {
                return(_ownerList);
            }

            return(parentNode.Items);
        }
Example #11
0
        public void Select(ITypeBinderTreeViewNode node)
        {
            if (node != null)
            {
                if (node.Node.Parent != null && node.Node.Parent.IsExpanded == false)
                {
                    node.Node.Parent.Expand();
                }

                _treeView.SelectedNode = node.Node;
            }
        }
Example #12
0
        private TypeBinderTreeViewNodeCodon GetSelectedNodeCodon()
        {
            ITypeBinderTreeViewNode selectedNode = SelectedNode;

            if (selectedNode == null)
            {
                return(null);
            }
            else
            {
                return(selectedNode.Codon);
            }
        }
Example #13
0
        public void Add(object obj)
        {
            Debug.Assert(obj != null, "obj 为 null");

            if (_ownerList != null && _ownerList.Contains(obj) == false)
            {
                _ownerList.Add(obj);
            }

            ITypeBinderTreeViewNode node = CreateNode(obj, _ownerList);

            this._treeView.Nodes.Add(node.Node);
        }
Example #14
0
        public void Add(object obj, Filter filter)
        {
            Debug.Assert(obj != null, "obj 为 null");

            ITypeBinderTreeViewNode parentNode = Find(filter);

            if (parentNode == null)
            {
                return;
            }

            ITypeBinderTreeViewNode node = CreateNode(obj, parentNode.Items);

            parentNode.AddChild(node);
        }
Example #15
0
        /// <summary>
        /// 绑定指定节点的所有子节点(递归)
        /// </summary>
        /// <param name="node"></param>
        private void DataBind(ITypeBinderTreeViewNode node)
        {
            IList list = node.Items;

            if (list == null)
            {
                return;
            }

            foreach (var item in list)
            {
                ITypeBinderTreeViewNode childNode = CreateNode(item, list);
                node.Node.Nodes.Add(childNode.Node);
            }
        }
        /// <summary>
        /// 判断并更新(如果需要)指定节点与父节点的关联关系
        /// </summary>
        /// <param name="node"></param>
        private void UpdateRelation(ITypeBinderTreeViewNode node)
        {
            if (node == null)
            {
                Debug.Assert(false, "node 为空");
                return;
            }

            ITypeBinderTreeViewNode parentNode = node.Parent;

            if (parentNode == null)
            {
                return;
            }

            object nodeValue   = node.RelationParentMemberValue;
            object parentValue = parentNode.RelationChildMemberValue;

            if (nodeValue == null || nodeValue.Equals(parentValue))
            {
                return;
            }

            //如果关联值不相等,为传进来的 node 查找新的父节点

            ITypeBinderTreeViewNode newParentNode = Find(
                (filterNode) =>
            {
                object relationChildMemberValue = filterNode.RelationChildMemberValue;
                if (relationChildMemberValue == null)
                {
                    return(false);
                }
                else
                {
                    return(relationChildMemberValue.Equals(nodeValue));
                }
            });

            //如果找不到新的父节点,删除该节点
            if (newParentNode == null)
            {
                Remove(node.DataBoundItem);
            }

            Move(node, newParentNode);
        }
Example #17
0
        public void AddChild(ITypeBinderTreeViewNode node)
        {
            IList list = this.Items;

            if (list == null || node.DataBoundItem == null)
            {
                return;
            }
            if (list.Contains(node.DataBoundItem) == false)
            {
                list.Add(node.DataBoundItem);
            }
            if (this.Nodes.Contains(node.Node) == false)
            {
                this.Nodes.Add(node.Node);
            }
        }
Example #18
0
        /// <summary>
        /// 如果bubbling为true则从当前选中节点开始使用冒泡查询向上查询
        /// 直一遇到第一个绑定对象类型为T的节点
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="bubbling"></param>
        /// <returns></returns>
        public T GetSelectedData <T>(bool bubbling)
        {
            if (bubbling)
            {
                ITypeBinderTreeViewNode node = BubblingFind <T>(SelectedNode);
                if (node == null)
                {
                    return(default(T));
                }

                return((T)node.DataBoundItem);
            }
            else
            {
                return(GetSelectedData <T>());
            }
        }
        /// <summary>
        /// 创建一个树节点
        /// </summary>
        /// <param name="dataBoundItem"></param>
        /// <returns></returns>
        private ITypeBinderTreeViewNode CreateNode(object dataBoundItem)
        {
            ITypeBinderTreeViewNode node = (ITypeBinderTreeViewNode)Activator.CreateInstance(this.NodeType);

            node.DataBoundItem = dataBoundItem;
            TypeBinderTreeViewNodeCodon codon = GetNodeCodon(dataBoundItem.GetType());

            if (codon != null)
            {
                node.Codon = codon;
                //这里有个漏洞,一旦把绑定到 dataBoundItem 的节点移动到另外一个节点下,其实际 OwnerList 就已经发生了改变
                //所以不能在创建节点时一次写死
                //node.OwnerList = ownerList;
                DataBind(node);
            }
            return(node);
        }
Example #20
0
        private void OnNodeAdded()
        {
            if (NodeAdded != null)
            {
                ITypeBinderTreeViewNode node = _navigationTreeController.SelectedNode;

                NodeAddedEventArgs args = new NodeAddedEventArgs()
                {
                    DataBoundItem = node.DataBoundItem,
                    DataBoundType = node.Codon.DataBoundType,
                    ItemType      = node.ItemType,
                    Items         = node.Items
                };

                NodeAdded(this, args);
            }
        }
Example #21
0
        /// <summary>
        /// 通过递归节点及所有子节点查找所绑定对象为 obj 的节点
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        private ITypeBinderTreeViewNode Find(TreeNodeCollection nodes, object obj)
        {
            foreach (ITypeBinderTreeViewNode item in nodes)
            {
                if (item.DataBoundItem == obj)
                {
                    return(item);
                }

                ITypeBinderTreeViewNode childNode = Find(item.Node.Nodes, obj);
                if (childNode != null)
                {
                    return(childNode);
                }
            }

            return(null);
        }
Example #22
0
        public void DataBind(object obj)
        {
            if (obj == null)
            {
                Debug.Assert(false, "obj 为 null");
                Clear();
                return;
            }

            _treeView.SuspendLayout();
            _treeView.Nodes.Clear();

            ITypeBinderTreeViewNode node = CreateNode(obj, null);

            _treeView.Nodes.Add(node.Node);

            _treeView.ResumeLayout();
        }
        /// <summary>
        /// 绑定指定节点的所有子节点(递归)
        /// </summary>
        /// <param name="node"></param>
        private void DataBind(ITypeBinderTreeViewNode node)
        {
            IList list = node.Items;

            if (list == null)
            {
                return;
            }

            foreach (var item in list)
            {
                ITypeBinderTreeViewNode childNode = CreateNode(item);
                if (childNode.Codon == null)
                {
                    Debug.Assert(false, "childNode.Codon 为空");
                    continue;
                }

                node.Node.Nodes.Add(childNode.Node);
            }
        }
Example #24
0
        public TypeBinderTreeViewController(TreeView treeView)
        {
            _treeView = treeView;
            _treeView.HideSelection = false;

            _treeView.AfterSelect += (sender, e) =>
            {
                ITypeBinderTreeViewNode node = (ITypeBinderTreeViewNode)e.Node;

                //设置当前右键菜单
                this.ContextMenuStrip = node.Codon.ContextMenuStrip;

                //触发事件
                //这里把_ignoreAfterSelectedEvent放在这里判断,而不是连同上面的代码一起判断
                //是因为在内部调整节点选中状态时,有可能会在中间切换到其它节点时,变更了上述代码中的一些状态,如ContextMenuStrip
                if (_ignoreAfterSelectedEvent == false && AfterSelect != null)
                {
                    AfterSelect(this, new AfterSelectEventArgs(node));
                }
            };
        }
Example #25
0
        public void DataBind(IList list)
        {
            if (list == null)
            {
                Debug.Assert(false, "list 为空");
                Clear();
                return;
            }

            _ownerList = list;

            _treeView.SuspendLayout();
            _treeView.Nodes.Clear();

            foreach (var item in list)
            {
                ITypeBinderTreeViewNode node = CreateNode(item, list);
                this._treeView.Nodes.Add(node.Node);
            }

            _treeView.ResumeLayout();
        }
Example #26
0
        /// <summary>
        /// 从指定节点,开如冒泡查询指定类型T的节点
        /// 若查询到顶都没有,则返回null,否则返回遇到的第一个匹配的节点
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="node"></param>
        /// <returns></returns>
        private ITypeBinderTreeViewNode BubblingFind <T>(ITypeBinderTreeViewNode node)
        {
            if (node == null)
            {
                return(null);
            }

            //if (node.DataBoundItem.GetType() == typeof(T) || node.DataBoundItem.GetType().IsSubclassOf(typeof(T)))
            //    return node;

            if (node.Codon.UpwardCompatible(typeof(T)))
            {
                return(node);
            }

            if (node.Parent == null)
            {
                return(null);
            }

            return(BubblingFind <T>(node.Parent));
        }
Example #27
0
 public AfterSelectEventArgs(ITypeBinderTreeViewNode node)
 {
     Node = node;
 }
Example #28
0
        public void MoveAfter(Filter sourceFilter, Filter targetFilter)
        {
            ITypeBinderTreeViewNode sourceNode = Find(sourceFilter);
            ITypeBinderTreeViewNode targetNode = Find(targetFilter);

            Debug.Assert(sourceNode != null || targetNode != null, "目标树节点为null");

            if (sourceNode == null || targetNode == null)
            {
                return;
            }

            Debug.Assert(sourceNode != targetNode, "指定的两个节点是同一个节点");

            if (sourceNode == targetNode)
            {
                return;
            }

            TreeNodeCollection sourceOwnerNodes;

            if (sourceNode.Parent == null)
            {
                sourceOwnerNodes = _treeView.Nodes;
            }
            else
            {
                sourceOwnerNodes = sourceNode.Parent.Node.Nodes;
            }

            TreeNodeCollection targetOwnerNodes;

            if (targetNode.Parent == null)
            {
                targetOwnerNodes = _treeView.Nodes;
            }
            else
            {
                targetOwnerNodes = targetNode.Parent.Node.Nodes;
            }

            int sourceIndex = sourceOwnerNodes.IndexOf(sourceNode.Node);
            int targetIndex = targetOwnerNodes.IndexOf(targetNode.Node);

            //如果targetObj刚好在beforeObj之后,就无需移动了
            if (sourceOwnerNodes == targetOwnerNodes && sourceIndex - targetIndex == 1)
            {
                return;
            }

            //如果原节点原来是选定状态,在移动之后继续保持其选中状态
            //但是不能触发AfterSelect事件,否则会引发外部一些不必要的处理逻辑
            bool willBeSelected = sourceNode.Node.IsSelected;

            _ignoreAfterSelectedEvent = true;

            //调整树节点的顺序
            sourceOwnerNodes.Remove(sourceNode.Node);
            //要重新 IndexOf(beforeObj) ,因为targetObj被remove之后,beforeObj的下标就可能被改变了
            targetOwnerNodes.Insert(targetOwnerNodes.IndexOf(targetNode.Node) + 1, sourceNode.Node);

            if (willBeSelected)
            {
                _treeView.SelectedNode = sourceNode.Node;
            }

            _ignoreAfterSelectedEvent = false;

            //调整所绑定对象在所在的IList内的顺利
            IList sourceOwnerList = sourceNode.OwnerList;
            IList targetOwnerList = targetNode.OwnerList;

            if (sourceOwnerList != null && sourceOwnerList.Contains(sourceNode.DataBoundItem))
            {
                sourceOwnerList.Remove(sourceNode.DataBoundItem);
            }

            if (targetOwnerList != null && targetOwnerList.Contains(targetNode.DataBoundItem))
            {
                targetOwnerList.Insert(targetOwnerList.IndexOf(targetNode.DataBoundItem) + 1, sourceNode.DataBoundItem);
            }
        }
Example #29
0
        /// <summary>
        /// 选中树中所绑定对象为obj的节点
        /// </summary>
        /// <param name="obj"></param>
        public void Select(object obj)
        {
            ITypeBinderTreeViewNode node = Find(obj);

            Select(node);
        }
Example #30
0
        public void Select(Filter filter)
        {
            ITypeBinderTreeViewNode node = Find(filter);

            Select(node);
        }