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);
}