Esempio n. 1
0
            public void Dispose()
            {
                foreach (var modelBase in models)
                {
                    if (!(modelBase is NodeModel)) // Only nodes have connectors.
                    {
                        continue;
                    }

                    var nodeModel = modelBase as NodeModel;
                    foreach (var connectorModel in nodeModel.AllConnectors)
                    {
                        // Connectors after node is modified.
                        remainingConnectors[connectorModel.GUID] = connectorModel;
                    }
                }

                var removed = new List <XmlElement>();
                var added   = new List <ConnectorModel>();

                if (!ComputeDifference(removed, added))
                {
                    return; // No difference in connectors.
                }
                // If there are differences in connector count, some connectors must
                // have been dropped or created. In this case the originally recorded
                // entry on the undo stack must be discarded, and recreated in the
                // same action group as these connectors.
                //
                var previousGroup = recorder.PopFromUndoGroup();

                // Create a new action group to record changes
                // affecting the node and its connectors.
                using (recorder.BeginActionGroup())
                {
                    // For each of the deleted connectors, record its respective
                    // XmlElement that was serialized before they were deleted.
                    var deletionString = UserAction.Deletion.ToString();
                    foreach (var connector in removed)
                    {
                        recorder.SetNodeAction(connector, deletionString);
                        recorder.currentActionGroup.AppendChild(connector);
                    }

                    foreach (XmlNode childNode in previousGroup.ChildNodes)
                    {
                        // Record the model modification itself.
                        recorder.currentActionGroup.AppendChild(childNode);
                    }

                    foreach (var connector in added)
                    {
                        recorder.RecordCreationForUndo(connector);
                    }

                    // When a new action group is recorded for undo,
                    // the redo stack should always be cleared.
                    if (recorder.redoStack.Count > 0)
                    {
                        throw new InvalidOperationException(
                                  "Redo stack should be empty after recording!");
                    }
                }
            }