private void DomNodeOnChildRemoving(object sender, ChildEventArgs e) { if (Validating) { // removing a module from a sub-circuit? Element element = e.Child.As <Element>(); SubCircuit subCircuit = e.Parent.As <SubCircuit>(); if (element != null && subCircuit != null) { ICircuitElementType type = element.Type; // todo: this test isn't quite right, because not all circuit elements // necessarily have both inputs and outputs. For example, if the Speaker // element from the Circuit Editor sample app is the only element in a Master, // and then it is deleted, that will trigger this exception. if (type.Inputs.Count + type.Outputs.Count == 1) { // Ensures that sub-circuit inputs/outputs aren't added or removed, as this would // invalidate wiring on instances of them. throw new InvalidTransactionException( "Can't remove connectors from sub-circuits".Localize()); } } } }
private void DomNodeChildInserting(object sender, ChildEventArgs e) { if (Validating) { // inserting an instance of a sub-circuit into itself? SubCircuitInstance subCircuitInstance = e.Child.As <SubCircuitInstance>(); SubCircuit subCircuit = e.Parent.As <SubCircuit>(); if (subCircuitInstance != null && subCircuit != null && subCircuitInstance.SubCircuit == subCircuit) { throw new InvalidTransactionException( "Can't use a sub-circuit inside itself".Localize()); } } }
private object[] ExpandMaster(CircuitEditingContext context, SubCircuitInstance subCircuitInstance) { // remove the sub-circuit instance var circuit = context.CircuitContainer; circuit.Elements.Remove(subCircuitInstance); SubCircuit subCircuit = subCircuitInstance.SubCircuit as SubCircuit; // clone sub-circuit contents List <object> subCircuitContents = new List <object>(); subCircuitContents.AddRange(Adapters.AsIEnumerable <object>(subCircuit.Elements)); subCircuitContents.AddRange(Adapters.AsIEnumerable <object>(subCircuit.Wires)); DomNode[] clones = DomNode.Copy(Adapters.AsIEnumerable <DomNode>(subCircuitContents)); object[] data = new object[clones.Length]; clones.CopyTo(data, 0); return(data); }