/// <summary>
 /// Gets all valid child and parent edges.
 /// Includes both main and secondary parent/children.
 /// </summary>
 /// <param name="taxonId">The taxon id.</param>
 /// <param name="treeIterationMode">The tree iteration mode.</param>
 /// <param name="onlyValid">if set to <c>true</c> only valid relations are included.</param>
 /// <param name="includeChildrenSecondaryParents">if set to <c>true</c> secondary parents to children are included.</param>
 /// <returns>
 /// A set with all child and parent edges.
 /// </returns>
 public HashSet <ITaxonRelationsTreeEdge> GetAllEdges(
     int taxonId,
     TaxonRelationsTreeIterationMode treeIterationMode,
     bool onlyValid,
     bool includeChildrenSecondaryParents = true)
 {
     return(GetAllEdges(
                GetTreeNode(taxonId),
                treeIterationMode,
                onlyValid,
                includeChildrenSecondaryParents));
 }
        /// <summary>
        /// Gets all valid child and parent edges.
        /// Includes both main and secondary parent/children.
        /// </summary>
        /// <param name="taxonIds">The taxon ids.</param>
        /// <param name="treeIterationMode">The tree iteration mode.</param>
        /// <param name="onlyValid">if set to <c>true</c> only valid relations are included.</param>
        /// <param name="includeChildrenSecondaryParents">if set to <c>true</c> secondary parents to children are included.</param>
        /// <returns>
        /// A set with all child and parent edges.
        /// </returns>
        public HashSet <ITaxonRelationsTreeEdge> GetAllEdges(
            IEnumerable <int> taxonIds,
            TaxonRelationsTreeIterationMode treeIterationMode,
            bool onlyValid,
            bool includeChildrenSecondaryParents = true)
        {
            List <ITaxonRelationsTreeNode> treeNodes = GetTreeNodes(taxonIds);

            return(GetAllEdges(
                       treeNodes,
                       treeIterationMode,
                       onlyValid,
                       includeChildrenSecondaryParents));
        }
 /// <summary>
 /// Gets all valid child and parent edges.
 /// Includes both main and secondary parent/children.
 /// </summary>
 /// <param name="treeNode">The tree node.</param>
 /// <param name="treeIterationMode">The tree iteration mode.</param>
 /// <param name="onlyValid">if set to <c>true</c> only valid relations are included.</param>
 /// <param name="includeChildrenSecondaryParents">if set to <c>true</c> secondary parents to children are included.</param>
 /// <returns>
 /// A set with all child and parent edges.
 /// </returns>
 public HashSet <ITaxonRelationsTreeEdge> GetAllEdges(
     ITaxonRelationsTreeNode treeNode,
     TaxonRelationsTreeIterationMode treeIterationMode,
     bool onlyValid,
     bool includeChildrenSecondaryParents = true)
 {
     return(GetAllEdges(
                new List <ITaxonRelationsTreeNode>()
     {
         treeNode
     },
                treeIterationMode,
                onlyValid,
                includeChildrenSecondaryParents));
 }
        /// <summary>
        /// Gets all valid child and parent edges.
        /// Includes both main and secondary parent/children.
        /// </summary>
        /// <param name="treeNodes">The tree nodes.</param>
        /// <param name="treeIterationMode">The tree iteration mode.</param>
        /// <param name="onlyValid">if set to <c>true</c> only valid relations are included.</param>
        /// <param name="includeChildrenSecondaryParents">if set to <c>true</c> secondary parents to children are included.</param>
        /// <returns>
        /// A set with all child and parent edges.
        /// </returns>
        public HashSet <ITaxonRelationsTreeEdge> GetAllEdges(
            ICollection <ITaxonRelationsTreeNode> treeNodes,
            TaxonRelationsTreeIterationMode treeIterationMode,
            bool onlyValid,
            bool includeChildrenSecondaryParents = true)
        {
            HashSet <ITaxonRelationsTreeEdge> hashEdges = new HashSet <ITaxonRelationsTreeEdge>();

            if (treeIterationMode == TaxonRelationsTreeIterationMode.BothParentsAndChildren ||
                treeIterationMode == TaxonRelationsTreeIterationMode.OnlyParents)
            {
                hashEdges = GetAllParentEdges(treeNodes, onlyValid);
            }

            if (treeIterationMode == TaxonRelationsTreeIterationMode.BothParentsAndChildren ||
                treeIterationMode == TaxonRelationsTreeIterationMode.OnlyChildren)
            {
                var childrenEdges = GetAllChildrenEdges(treeNodes, onlyValid, includeChildrenSecondaryParents);
                hashEdges.UnionWith(childrenEdges);
            }

            return(hashEdges);
        }
        /// <summary>
        /// Creates a graphviz format representation of the tree edges and its nodes.
        /// </summary>
        /// <param name="userContext">The user context.</param>
        /// <param name="tree">The tree.</param>
        /// <param name="treeNodes">The tree nodes.</param>
        /// <param name="treeIterationMode">The tree iteration mode.</param>
        /// <param name="onlyValid">if set to <c>true</c> only valid relations are included.</param>
        /// <param name="format">The format.</param>
        /// <returns>A GraphViz graph.</returns>
        public static string CreateGraphvizFormatRepresentation(
            IUserContext userContext,
            TaxonRelationsTree tree,
            ICollection <ITaxonRelationsTreeNode> treeNodes,
            TaxonRelationsTreeIterationMode treeIterationMode,
            bool onlyValid,
            GraphVizFormat format)
        {
            // Get edges.
            var edges = tree.GetAllEdges(
                treeNodes,
                treeIterationMode,
                onlyValid,
                treeIterationMode != TaxonRelationsTreeIterationMode.OnlyChildren);

            string str = CreateGraphvizFormatRepresentation(
                userContext,
                tree,
                edges,
                treeNodes,
                format);

            return(str);
        }