Smrf.NodeXL.Visualization.Wpf.NodeXLControl.ExpandGroup C# (CSharp) Method

ExpandGroup() public method

public ExpandGroup ( String groupName, System.Boolean redrawGroupImmediately ) : void
groupName String
redrawGroupImmediately System.Boolean
return void
    ExpandGroup
    (
        String groupName,
        Boolean redrawGroupImmediately
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(groupName) );
        AssertValid();

        CheckIfLayingOutGraph("ExpandGroup");

        IVertex oCollapsedGroupVertex;

        if ( !m_oCollapsedGroups.TryGetValue(groupName,
            out oCollapsedGroupVertex) )
        {
            return;
        }

        Boolean bCollapsedGroupVertexWasSelected =
            VertexOrEdgeIsSelected(oCollapsedGroupVertex);

        // Retrieve the collapsed vertices and collapsed internal edges that
        // were stored on the group vertex by CollapseGroup().

        ICollection<IVertex> oCollapsedVertices =
            ( ICollection<IVertex> )oCollapsedGroupVertex.GetRequiredValue(
                ReservedMetadataKeys.CollapsedVertices,
                typeof( ICollection<IVertex> ) );

        ICollection<IEdge> oCollapsedInternalEdges =
            ( ICollection<IEdge> )oCollapsedGroupVertex.GetRequiredValue(
                ReservedMetadataKeys.CollapsedInternalEdges,
                typeof( ICollection<IEdge> ) );

        // Restore the collapsed vertices and internal edges.
        //
        // The selection state of the collapsed vertices and internal edges
        // should be the same as that of the collapsed group vertex.

        Random oRandom = new Random();

        foreach (IVertex oCollapsedVertex in oCollapsedVertices)
        {
            MarkVertexOrEdgeAsSelected(oCollapsedVertex,
                bCollapsedGroupVertexWasSelected);

            AddVertexDuringGroupExpand(oCollapsedVertex,
                redrawGroupImmediately, oRandom);
        }

        foreach (IEdge oCollapsedInternalEdge in oCollapsedInternalEdges)
        {
            MarkVertexOrEdgeAsSelected(oCollapsedInternalEdge,
                bCollapsedGroupVertexWasSelected);

            AddEdgeDuringGroupCollapseOrExpand(oCollapsedInternalEdge,
                redrawGroupImmediately);
        }

        Boolean bGraphIsDirected =
            (m_oGraph.Directedness == GraphDirectedness.Directed);

        // Remove the group vertex's incident edges.

        foreach (IEdge oIncidentEdge in oCollapsedGroupVertex.IncidentEdges)
        {
            IVertex oAdjacentVertex = oIncidentEdge.GetAdjacentVertex(
                oCollapsedGroupVertex);

            IEdge oExternalEdgeClone = null;
            Object oOriginalVertexAsObject;

            if ( oIncidentEdge.TryGetValue(
                ReservedMetadataKeys.OriginalVertex2InEdge + groupName,
                typeof(IVertex), out oOriginalVertexAsObject) )
            {
                IVertex oOriginalVertex = (IVertex)oOriginalVertexAsObject;

                // The incident edge is a clone of an original external edge.
                // Clone it again, this time connecting it back to its original
                // vertex.

                oExternalEdgeClone = oIncidentEdge.Clone(true, true,
                    oAdjacentVertex, oOriginalVertex, bGraphIsDirected);

                oExternalEdgeClone.RemoveKey(
                    ReservedMetadataKeys.OriginalVertex2InEdge + groupName);
            }
            else if ( oIncidentEdge.TryGetValue(
                ReservedMetadataKeys.OriginalVertex1InEdge + groupName,
                typeof(IVertex), out oOriginalVertexAsObject) )
            {
                IVertex oOriginalVertex = (IVertex)oOriginalVertexAsObject;

                oExternalEdgeClone = oIncidentEdge.Clone(true, true,
                    oOriginalVertex, oAdjacentVertex, bGraphIsDirected);

                oExternalEdgeClone.RemoveKey(
                    ReservedMetadataKeys.OriginalVertex1InEdge + groupName);
            }

            RemoveEdgeDuringGroupCollapseOrExpand(oIncidentEdge,
                redrawGroupImmediately);

            if (oExternalEdgeClone != null)
            {
                CollapsedGroupDrawingManager.RestoreExternalEdge(
                    oExternalEdgeClone);

                MarkVertexOrEdgeAsSelected(oExternalEdgeClone,
                    bCollapsedGroupVertexWasSelected);

                AddEdgeDuringGroupCollapseOrExpand(oExternalEdgeClone,
                    redrawGroupImmediately);
            }
        }

        // Remove the group vertex.

        RemoveVertexDuringGroupCollapseOrExpand(oCollapsedGroupVertex,
            redrawGroupImmediately);

        m_oCollapsedGroups.Remove(groupName);
    }
NodeXLControl