예제 #1
0
        /// <summary>
        ///  엔티티를 로드하고, IRadTreeNodeContainer에 자식노드로 추가한다.
        /// </summary>
        /// <param name="node">선택된 IRadTreeNodeContainer</param>
        /// <param name="exceptionAction">예외발생 시 수행할 Action</param>
        protected virtual void LoadAndAddEntity(IRadTreeNodeContainer node, Action <Exception> exceptionAction)
        {
            if (IsDebugEnabled)
            {
                log.Debug(@"==>S 엔티티[{0}] 목록을 로드하여, TreeView에 바인딩 시킵니다...", ConcreteType.Name);
            }

            node.ShouldNotBeNull("선택된 IRadTreeNodeContainer정보가 없습니다.");

            try
            {
                LoadEntity(node);
                AddEntity(node);
            }
            catch (Exception ex)
            {
                var errorMsg = string.Format(@"엔티티[{0}]를 로드하고, Binding 시에 예외가 발생했습니다.", ConcreteType.Name);

                if (log.IsErrorEnabled)
                {
                    log.ErrorException(errorMsg, ex);
                }

                if (exceptionAction != null)
                {
                    exceptionAction(ex);
                }
                else
                {
                    WebAppTool.MessageBox(errorMsg, this);
                }
            }
        }
예제 #2
0
        /// <summary>
        /// 특정 NodeContainer의 자손 중 자식 노드가 없는 TreeNode들 (나무 잎) 을 열거합니다.
        /// </summary>
        /// <param name="nodeContainer"></param>
        /// <returns></returns>
        public static IEnumerable <RadTreeNode> FindLeafNodes(this IRadTreeNodeContainer nodeContainer)
        {
            nodeContainer.ShouldNotBeNull("nodeContainer");

            if (IsDebugEnabled)
            {
                log.Debug(@"특정 NodeContainer 하위의 모든 Leaf Node (자식이 없는 노드) 들을 Depth First 방식으로 찾습니다. nodeContainer=[{0}]", nodeContainer.AsTextAndValue());
            }

            return(nodeContainer.GetDescendentNodes().Where(n => n.Nodes.Count == 0));
        }
예제 #3
0
        /// <summary>
        /// Depth-First 탐색으로 특정 Node 와 그 자손 Node 들 중에 검사를 통과하는 Node들을 열거합니다.
        /// </summary>
        /// <param name="nodeContainer"></param>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public static IEnumerable <RadTreeNode> FindNodes(this IRadTreeNodeContainer nodeContainer, Func <RadTreeNode, bool> predicate)
        {
            nodeContainer.ShouldNotBeNull("nodeContainer");
            predicate.ShouldNotBeNull("predicate");

            if (IsDebugEnabled)
            {
                log.Debug("특정 NodeContainer(TreeView or TreeNode)부터 predicate를 만족하는 RadTreeNode 들을 모두 열거합니다. nodeContainer=[{0}]",
                          nodeContainer.AsTextAndValue());
            }

            return(nodeContainer.GetDescendentNodes().Where(predicate));
        }
예제 #4
0
        /// <summary>
        /// 특정 TreeNode의 자식으로 노드를 추가합니다.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="parent"></param>
        /// <param name="nodeFactory">노드 생성 메소드</param>
        /// <param name="nodeAddedAction">노드 추가마다 호출되는 메소드</param>
        /// <param name="items"></param>
        public static void AddNodes <T>(this IRadTreeNodeContainer parent,
                                        Func <T, RadTreeNode> nodeFactory,
                                        Action <T, RadTreeNode> nodeAddedAction,
                                        IEnumerable <T> items)
        {
            if (items.IsEmptySequence())
            {
                return;
            }

            parent.ShouldNotBeNull("parent");
            nodeFactory.ShouldNotBeNull("nodeFactory");

            if (IsDebugEnabled)
            {
                log.Debug(@"TreeNode의 자식 노드들을 추가합니다...");
            }

            foreach (T item in items)
            {
                if (IsDebugEnabled)
                {
                    log.Debug(@"엔티티를 RadTreeNode로 빌드합니다. item=[{0}]", item);
                }

                var childNode = nodeFactory(item);

                if (childNode != null)
                {
                    parent.Nodes.Add(childNode);

                    if (IsDebugEnabled)
                    {
                        log.Debug(@"TreeNode에 자식 노드를 추가했습니다. parent=[{0}], childNode=[{1}]", parent, childNode.Text);
                    }

                    if (nodeAddedAction != null)
                    {
                        nodeAddedAction(item, childNode);
                    }
                }
            }
        }
예제 #5
0
        /// <summary>
        /// <see cref="ITreeNodeEntity{T}"/>를 구현한 엔티티들을 표현할 TreeNode를 생성하여 TreeView에 추가합니다.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="parent">부모 노드 또는 TreeView</param>
        /// <param name="nodeFactory">TreeNode를 생성하는 Factory 함수</param>
        /// <param name="findNodeFunc">기존 TreeView에서 엔티티와 관련된 Node를 찾는 함수</param>
        /// <param name="nodeAddedAction">TreeNode 하나를 추가할 때마다 수행하는 Action</param>
        /// <param name="items">엔티티</param>
        /// <param name="includeChildren">엔티티의 자손들도 Binding 할 것인가?</param>
        public static void BuildTreeNodes <T>(this IRadTreeNodeContainer parent,
                                              Func <T, RadTreeNode> nodeFactory,
                                              Func <T, RadTreeNode> findNodeFunc,
                                              Action <T, RadTreeNode> nodeAddedAction,
                                              IEnumerable <T> items,
                                              bool includeChildren) where T : class, ITreeNodeEntity <T>
        {
            if (items.IsEmptySequence())
            {
                return;
            }

            parent.ShouldNotBeNull("parent");
            nodeFactory.ShouldNotBeNull("nodeFactory");
            findNodeFunc.ShouldNotBeNull("findNodeFunc");

            RadTreeNode parentNode = null;

            foreach (T item in items)
            {
                // 이미 관련 노드가 있다면 추가하지 않습니다.
                if (findNodeFunc(item) != null)
                {
                    continue;
                }

                if (IsDebugEnabled)
                {
                    log.Debug(@"엔티티를 TreeNode로 빌드하여, TreeView에 추가합니다... item=[{0}]", item);
                }

                var childNode = nodeFactory(item);

                if (item.Parent != null)
                {
                    parentNode = findNodeFunc(item.Parent);
                }

                if (parentNode != null)
                {
                    // 부모 노드가 이미 TreeView에 추가되어 있다면, 부모 노드에 자식으로 추가합니다.
                    parentNode.Nodes.Add(childNode);
                }
                else
                {
                    // 부모 노드가 없다면, parent에 추가한다.
                    parent.Nodes.Add(childNode);
                }

                if (IsDebugEnabled)
                {
                    log.Debug(@"엔티티를 TreeNode로 빌드하여, TreeView에 추가했습니다!!!. childNode=[{0}]", childNode);
                }

                if (nodeAddedAction != null)
                {
                    nodeAddedAction(item, childNode);
                }

                // 자식 노드들이 있고, 추가해야 한다면 DepthFirst 방식으로 추가합니다.
                //
                if (includeChildren && item.GetChildCount() > 0)
                {
                    BuildTreeNodes(parentNode ?? parent, nodeFactory, findNodeFunc, nodeAddedAction, item.Children, true);
                }
            }
        }