private void OnClickDegroup(SubWindows.Group g)
 {
     foreach (var n in g.nodes)
     {
         n.inPoint.onClickConnectionPoint  = OnClickInPoint;
         n.outPoint.onClickConnectionPoint = OnClickOutPoint;
         n.ResetStyle();
     }
     foreach (var c in g.InterConnections)
     {
         c.onClickRemoveConnection = OnClickRemoveConnection;
     }
     nodes.AddRange(g.nodes);
     connections.AddRange(g.InterConnections);
     nodes.Remove(g);
     connections = (from c in connections
                    where c.inPoint.masterNode != g && c.outPoint.masterNode != g
                    select c).ToList();
     Save();
 }
        private KeyValuePair <List <NodeWindow>, List <Connection> > GetSystem(List <ScriptTree.Node> rawNodes)
        {
            List <NodeWindow> nodes = new List <NodeWindow>();
            List <Connection> conns = new List <Connection>();

            foreach (var rn in rawNodes)
            {
                NodeWindow node;
                if (rn.Base == "")
                {
                    var p = GetSystem(rn.Members);
                    SubWindows.Group g = new SubWindows.Group(p.Key, p.Value, rn.Name, new Vector2((float)rn.Position.X, (float)rn.Position.Y), 250, inPointStyle, outPointStyle,
                                                              OnClickInPoint, OnClickOutPoint, OnClickRemoveNode, OnClickGroup,
                                                              Events, OnClickDegroup, Save, GetNewName, SelectedNodes, SelectedConnections);
                    var start = g.nodes.Find(n => n.nodeName == rn.StartMember);
                    var end   = g.nodes.Find(n => n.nodeName == rn.EndMember);
                    if (start != null)
                    {
                        var startConn = new Connection(start.inPoint, g.startPoint, null, null);
                        g.connections.Add(startConn);
                    }
                    if (end != null)
                    {
                        var endConn = new Connection(g.endPoint, end.outPoint, null, null);
                        g.connections.Add(endConn);
                    }
                    node = g;
                }
                else
                {
                    node = new NodeWindow(rn.Base, rn.Name, new Vector2((float)rn.Position.X, (float)rn.Position.Y),
                                          250, inPointStyle, outPointStyle, OnClickInPoint, OnClickOutPoint, OnClickRemoveNode, OnClickGroup, GetNewName, SelectedNodes, SelectedConnections);
                    node.paramPairs = rn.Params.ToList();
                    node.nodeName   = rn.Name;
                }
                nodes.Add(node);
            }

            foreach (var rn in rawNodes)
            {
                var startNode = nodes.Find(n => n.nodeName == rn.Name);
                Debug.Assert(startNode != null);
                if (rn.Succ != null)
                {
                    foreach (var succ in rn.Succ)
                    {
                        var destNode = nodes.Find(n => n.nodeName == succ.Dest);
                        Debug.Assert(destNode != null);

                        var conn = new Connection(destNode.inPoint, startNode.outPoint, OnClickRemoveConnection, Events);
                        foreach (var cond in succ.Condition)
                        {
                            conn.conditions.Add(nodes.Find(n => n.nodeName == cond));
                        }
                        conn.stopPrev = succ.EndPrev;
                        conns.Add(conn);
                    }
                }
            }
            return(new KeyValuePair <List <NodeWindow>, List <Connection> >(nodes, conns));
        }