private IEnumerable <object> GetCompatibleData(IDataObject dataObject) { // try the local format first IEnumerable <object> items = dataObject.GetData(typeof(object[])) as object[]; if (items != null && (AreCircuitItems(items) || AreTemplateItems(items))) { return(items); } // try serialized format byte[] data = dataObject.GetData(CircuitFormat) as byte[]; if (data != null) { try { DomNodeSerializer serializer = new DomNodeSerializer(); IEnumerable <DomNode> deserialized = serializer.Deserialize(data, m_schemaLoader.GetNodeType); items = Adapters.AsIEnumerable <object>(deserialized); if (AreCircuitItems(items)) { return(items); } } catch /*(Exception ex)*/ { // the app cannot recover when using output servce //Outputs.WriteLine(OutputMessageType.Warning, ex.Message); } } return(null); }
/// <summary> /// Copies selected items from the circuit</summary> /// <returns>DataObject containing an enumeration of selected items</returns> public object Copy() { // copy selected text in the selected annotation? var annotationAdapter = m_viewingContext.Cast <AdaptableControl>().As <D2dAnnotationAdapter>(); if (annotationAdapter != null) { foreach (Annotation annotation in Selection.AsIEnumerable <Annotation>()) { if (annotationAdapter.CanCopyText(annotation)) { DataObject dataObjectText = new DataObject(); dataObjectText.SetText(annotationAdapter.TextSelected(annotation)); Clipboard.SetText(annotationAdapter.TextSelected(annotation)); return(dataObjectText); } } } if (m_instancingContext != null) { return(m_instancingContext.Copy()); } // get the selected modules HashSet <Element> modules = new HashSet <Element>(Selection.AsIEnumerable <Element>()); HashSet <object> itemsToCopy = new HashSet <object>(Adapters.AsIEnumerable <object>(modules)); // get selected connections between selected modules foreach (Wire connection in Selection.AsIEnumerable <Wire>()) { if (IsConnectionCopyable(connection, modules)) { itemsToCopy.Add(connection); } } // if no connections were added, look for copyable connections between the selected elements if (itemsToCopy.Count == modules.Count) { foreach (Wire connection in m_circuitContainer.Wires) { if (IsConnectionCopyable(connection, modules)) { itemsToCopy.Add(connection); } } } // add annotations foreach (Annotation annotation in Selection.AsIEnumerable <Annotation>()) { itemsToCopy.Add(Adapters.As <DomNode>(annotation)); } // create format for local use DataObject dataObject = new DataObject(Enumerable.ToArray(itemsToCopy)); // add a serializable format for the system clipboard DomNodeSerializer serializer = new DomNodeSerializer(); byte[] data = serializer.Serialize(Adapters.AsIEnumerable <DomNode>(itemsToCopy)); dataObject.SetData(CircuitFormat, data); return(dataObject); }