Пример #1
0
        /// <summary>
        ///  Imports templates and template folders stored in an external file</summary>
        /// <param name="toFolder">Template folder into which to import templates and template folders</param>
        /// <param name="uri"></param>
        private void ImportTemplateLibrary(DomNode  toFolder, Uri uri)
        {
            string filePath = uri.LocalPath;

            if (File.Exists(filePath))
            {
                // read the existing templates document
                using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    var newReader = new CircuitReader(TypeLoader);
                    DomNode templatesRoot = newReader.Read(stream, uri);
                    ImportTemplates(toFolder, templatesRoot, uri);
                }
            }
        }
Пример #2
0
        /// <summary>
        ///  Imports templates and template folders stored in an external file</summary>
        /// <param name="toFolder">Template folder into which to import templates and template folders</param>
        /// <param name="uri"></param>
        private void ImportTemplateLibrary(DomNode  toFolder, Uri uri)
        {
            string filePath = uri.LocalPath;

            if (File.Exists(filePath))
            {
                // read the existing templates document
                using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    var newReader = new CircuitReader(TypeLoader);
                    DomNode templatesRoot = newReader.Read(stream, uri);
                    ImportTemplates(toFolder, templatesRoot, uri);
                }
            }
        }
Пример #3
0
        /// <summary>
        ///  Load circuit templates stored in an external file</summary>
        /// <param name="uri">Document URI, or null to present file open dialog to user</param>
        /// <returns>Returns the file path used to load the external templates.
        /// An empty string indicates no templates were loaded</returns>
        protected override ImportedContent LoadExternalTemplateLibrary(Uri uri)
        {
            string filePath = string.Empty;

            if (uri == null)
            {
                var dlg = new OpenFileDialog();
                dlg.Filter          = "Circuit Template File (*.circuit)|*.circuit".Localize();
                dlg.CheckFileExists = true;
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    uri      = new Uri(dlg.FileName, UriKind.RelativeOrAbsolute);
                    filePath = dlg.FileName;
                }
            }
            else
            {
                filePath = uri.LocalPath;
            }

            if (File.Exists(filePath))
            {
                if (TemplatingContext.ValidateNewFolderUri(uri))
                {
                    // read existing document using standard XML reader
                    using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    {
                        var reader   = new CircuitReader(m_schemaLoader);
                        var root     = reader.Read(stream, uri);
                        var toFolder = CreateTemplateFolder();
                        reader.ImportTemplates(toFolder.DomNode, root, uri);
                        return(new ImportedContent(toFolder.DomNode, uri));
                    }
                }
            }

            return(new ImportedContent(null, null));
        }
Пример #4
0
        /// <summary>
        /// Opens or creates a document at the given URI.
        /// Creates and configures with control adapters D2dAdaptableControl to display subcircuit</summary>
        /// <param name="uri">Document URI</param>
        /// <returns>Document, or null if the document couldn't be opened or created</returns>
        public IDocument Open(Uri uri)
        {
            DomNode node     = null;
            string  filePath = uri.LocalPath;

            if (File.Exists(filePath))
            {
                // read existing document using standard XML reader
                using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    CircuitReader reader = new CircuitReader(m_schemaLoader);
                    node = reader.Read(stream, uri);
                }
            }
            else
            {
                // create new document by creating a Dom node of the root type defined by the schema
                node = new DomNode(Schema.circuitDocumentType.Type, Schema.circuitRootElement);
                // create an empty root prototype folder
                node.SetChild(
                    Schema.circuitDocumentType.prototypeFolderChild,
                    new DomNode(Schema.prototypeFolderType.Type));
            }

            CircuitDocument circuitCircuitDocument = null;

            if (node != null)
            {
                // now that the data is complete, initialize all other extensions to the Dom data
                node.InitializeExtensions();

                AdaptableControl control = CreateCircuitControl(node);
                control.AddHelp("https://github.com/SonyWWS/ATF/wiki/Adaptable-Controls".Localize());

                var viewingContext = node.Cast <ViewingContext>();
                viewingContext.Control = control;

                circuitCircuitDocument = node.Cast <CircuitDocument>();
                string      fileName    = Path.GetFileName(filePath);
                ControlInfo controlInfo = new ControlInfo(fileName, filePath, StandardControlGroup.Center);

                //Set IsDocument to true to prevent exception in command service if two files with the
                //  same name, but in different directories, are opened.
                controlInfo.IsDocument = true;

                circuitCircuitDocument.ControlInfo = controlInfo;
                circuitCircuitDocument.Uri         = uri;

                var editingContext = node.Cast <CircuitEditingContext>();
                editingContext.GetLocalBound       = GetLocalBound;
                editingContext.GetWorldOffset      = GetWorldOffset;
                editingContext.GetTitleHeight      = GetTitleHeight;
                editingContext.GetLabelHeight      = GetLabelHeight;
                editingContext.GetSubContentOffset = GetSubContentOffset;

                control.Context             = editingContext;
                editingContext.SchemaLoader = m_schemaLoader; // schema needed for cut and paste between applications

                m_circuitControlRegistry.RegisterControl(node, control, controlInfo, this);
                SkinService.ApplyActiveSkin(control);
                // Set the zoom and translation to show the existing items (if any).
                var enumerableContext = editingContext.Cast <IEnumerableContext>();
                if (viewingContext.CanFrame(enumerableContext.Items))
                {
                    viewingContext.Frame(enumerableContext.Items);
                }

                //var viewingAdapter = control.As<ViewingAdapter>();
                // enable toggle after initial frame operation.
                //  viewingAdapter.ToggleFramingEnabled = true; // toggle frame/unframe.
            }

            return(circuitCircuitDocument);
        }
Пример #5
0
        /// <summary>
        /// Opens or creates a document at the given URI.
        /// Creates and configures with control adapters D2dAdaptableControl to display subcircuit</summary>
        /// <param name="uri">Document URI</param>
        /// <returns>Document, or null if the document couldn't be opened or created</returns>
        public IDocument Open(Uri uri)
        {
            DomNode node = null;
            string filePath = uri.LocalPath;

            if (File.Exists(filePath))
            {
                // read existing document using standard XML reader
                using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    CircuitReader reader = new CircuitReader(m_schemaLoader);
                    node = reader.Read(stream, uri);
                }
            }
            else
            {
                // create new document by creating a Dom node of the root type defined by the schema
                node = new DomNode(Schema.circuitDocumentType.Type, Schema.circuitRootElement);
                // create an empty root prototype folder
                node.SetChild(
                    Schema.circuitDocumentType.prototypeFolderChild,
                    new DomNode(Schema.prototypeFolderType.Type));
            }

            CircuitDocument circuitCircuitDocument = null;
            if (node != null)
            {
                // now that the data is complete, initialize all other extensions to the Dom data
                node.InitializeExtensions();

                AdaptableControl control = CreateCircuitControl(node);
                control.AddHelp("https://github.com/SonyWWS/ATF/wiki/Adaptable-Controls".Localize());

                var viewingContext = node.Cast<ViewingContext>();
                viewingContext.Control = control;

                circuitCircuitDocument = node.Cast<CircuitDocument>();
                string fileName = Path.GetFileName(filePath);
                ControlInfo controlInfo = new ControlInfo(fileName, filePath, StandardControlGroup.Center);

                //Set IsDocument to true to prevent exception in command service if two files with the
                //  same name, but in different directories, are opened.
                controlInfo.IsDocument = true;

                circuitCircuitDocument.ControlInfo = controlInfo;
                circuitCircuitDocument.Uri = uri;

                var editingContext = node.Cast<CircuitEditingContext>();
                editingContext.GetLocalBound = GetLocalBound;
                editingContext.GetWorldOffset = GetWorldOffset;
                editingContext.GetTitleHeight = GetTitleHeight;
                editingContext.GetLabelHeight = GetLabelHeight;
                editingContext.GetSubContentOffset = GetSubContentOffset;

                control.Context = editingContext;
                editingContext.SchemaLoader = m_schemaLoader; // schema needed for cut and paste between applications

                m_circuitControlRegistry.RegisterControl(node, control, controlInfo, this);

                // Set the zoom and translation to show the existing items (if any).
                var enumerableContext = editingContext.Cast<IEnumerableContext>();
                if (viewingContext.CanFrame(enumerableContext.Items))
                    viewingContext.Frame(enumerableContext.Items);
            }

            return circuitCircuitDocument;
        }
Пример #6
0
        /// <summary>
        /// Rescan all referenced template documents </summary>
        protected override void ReloadExternalTemplates()
        {
            // 1st, scan the template hierarchy tree and remember all the existing template's guid -> DomNode map
            var oldNodeGuidDictionary = new Dictionary <string, DomNode>();

            foreach (var node in TemplatingContext.RootFolder.DomNode.Subtree)
            {
                if (node.Is <Template>())
                {
                    var template = node.Cast <Template>();
                    if (template.Guid != Guid.Empty)
                    {
                        oldNodeGuidDictionary[template.Guid.ToString()] = node;
                    }
                }
            }

            // 2nd, scan the template hierarchy tree again and reload all the external templates
            var newNodeGuidDictionary = new Dictionary <string, DomNode>();

            foreach (var node in TemplatingContext.RootFolder.DomNode.Subtree)
            {
                var templateFolder = node.As <Sce.Atf.Dom.TemplateFolder>();
                if (templateFolder == null || templateFolder.Url == null)
                {
                    continue;
                }
                if (File.Exists(templateFolder.Url.LocalPath))
                {
                    using (FileStream stream = new FileStream(templateFolder.Url.LocalPath, FileMode.Open, FileAccess.Read))
                    {
                        var reader   = new CircuitReader(m_schemaLoader);
                        var rootNode = reader.Read(stream, templateFolder.Url);

                        foreach (var newnode in rootNode.Subtree)
                        {
                            var guidAttr = newnode.Type.GetAttributeInfo("guid");
                            if (guidAttr == null)
                            {
                                continue;
                            }
                            var guidStr = newnode.GetAttribute(guidAttr) as string;
                            if (!string.IsNullOrEmpty(guidStr))
                            {
                                newNodeGuidDictionary[guidStr] = newnode;
                            }
                        }
                        reader.ImportTemplates(templateFolder.DomNode, rootNode, templateFolder.Url);
                    }
                }
            }

            // 3rd, replace original nodes with newly loaded, matched by GUIDs
            foreach (var node in TemplatingContext.RootFolder.DomNode.GetRoot().Subtree)
            {
                // currently two types that reference templates: GroupInstance or ModuleInstance
                DomNode refNode;

                var groupInstance = node.As <GroupReference>();
                if (groupInstance != null)
                {
                    if (newNodeGuidDictionary.TryGetValue(groupInstance.Template.Guid.ToString(), out refNode))
                    {
                        groupInstance.Template = refNode.As <Template>();

                        // need to reset pin targets due to DomNode replacements
                        var graphContainer = groupInstance.DomNode.Parent.Cast <ICircuitContainer>();
                        foreach (var edge in graphContainer.Wires)
                        {
                            if (edge.OutputElement.DomNode == groupInstance.DomNode)
                            {
                                edge.OutputPinTarget = null;
                            }

                            if (edge.InputElement.DomNode == groupInstance.DomNode)
                            {
                                edge.InputPinTarget = null;
                            }
                        }
                        continue;
                    }
                }

                var moduleReference = node.As <ModuleReference>();
                if (moduleReference != null)
                {
                    if (newNodeGuidDictionary.TryGetValue(moduleReference.Template.Guid.ToString(), out refNode))
                    {
                        moduleReference.Template = refNode.As <Template>();

                        // need to reset pin targets due to DomNode replacements
                        var graphContainer = moduleReference.DomNode.Parent.Cast <ICircuitContainer>();
                        foreach (var edge in graphContainer.Wires)
                        {
                            if (edge.OutputElement.DomNode == moduleReference.DomNode)
                            {
                                edge.OutputPinTarget = null;
                            }

                            if (edge.InputElement.DomNode == moduleReference.DomNode)
                            {
                                edge.InputPinTarget = null;
                            }
                        }
                    }
                }
            }

            // finally, prune the old nodes
            foreach (var keyValue in newNodeGuidDictionary)
            {
                DomNode oldNode;
                if (oldNodeGuidDictionary.TryGetValue(keyValue.Key, out oldNode))
                {
                    oldNode.RemoveFromParent();
                }
            }
        }
Пример #7
0
        /// <summary>
        /// Rescan all referenced template documents </summary>
        protected override void ReloadExternalTemplates()
        {
            // 1st, scan the template hierarchy tree and remember all the existing template's guid -> DomNode map
            var oldNodeGuidDictionary = new Dictionary<string, DomNode>();
            foreach (var node in TemplatingContext.RootFolder.DomNode.Subtree)
            {
                if (node.Is<Template>())
                {
                    var template = node.Cast<Template>();
                    if (template.Guid != Guid.Empty)
                        oldNodeGuidDictionary[template.Guid.ToString()] = node;
                }
            }

            // 2nd, scan the template hierarchy tree again and reload all the external templates  
            var newNodeGuidDictionary = new Dictionary<string, DomNode>();

            foreach (var node in TemplatingContext.RootFolder.DomNode.Subtree)
            {
                var templateFolder = node.As<Sce.Atf.Dom.TemplateFolder>();
                if (templateFolder == null || templateFolder.Url == null)
                    continue;
                if (File.Exists(templateFolder.Url.LocalPath))
                {
                    using (FileStream stream = new FileStream(templateFolder.Url.LocalPath, FileMode.Open, FileAccess.Read))
                    {
                        var reader = new CircuitReader(m_schemaLoader);
                        var rootNode = reader.Read(stream, templateFolder.Url);

                        foreach (var newnode in rootNode.Subtree)
                        {
                            var guidAttr = newnode.Type.GetAttributeInfo("guid");
                            if (guidAttr == null)
                                continue;
                            var guidStr = newnode.GetAttribute(guidAttr) as string;
                            if (!string.IsNullOrEmpty(guidStr))
                                newNodeGuidDictionary[guidStr] = newnode;
                        }
                        reader.ImportTemplates(templateFolder.DomNode, rootNode, templateFolder.Url);
                    }
                }
            }

            // 3rd, replace original nodes with newly loaded, matched by GUIDs
            foreach (var node in TemplatingContext.RootFolder.DomNode.GetRoot().Subtree)
            {
                // currently two types that reference templates: GroupInstance or ModuleInstance
                DomNode refNode;

                var groupInstance = node.As<GroupReference>();
                if (groupInstance != null)
                {
                    if (newNodeGuidDictionary.TryGetValue(groupInstance.Template.Guid.ToString(), out refNode))
                    {
                        groupInstance.Template = refNode.As<Template>();
   
                        // need to reset pin targets due to DomNode replacements 
                        var graphContainer = groupInstance.DomNode.Parent.Cast<ICircuitContainer>();
                        foreach (var edge in graphContainer.Wires)
                        {
                            if (edge.OutputElement.DomNode == groupInstance.DomNode)
                                edge.OutputPinTarget = null;

                            if (edge.InputElement.DomNode == groupInstance.DomNode)
                                edge.InputPinTarget = null;

                        }
                        continue;
                    }                 
                }

                var moduleReference = node.As<ModuleReference>();
                if (moduleReference != null)
                {
                    if (newNodeGuidDictionary.TryGetValue(moduleReference.Template.Guid.ToString(), out refNode))
                    {
                        moduleReference.Template = refNode.As<Template>();

                        // need to reset pin targets due to DomNode replacements 
                        var graphContainer = moduleReference.DomNode.Parent.Cast<ICircuitContainer>();
                        foreach (var edge in graphContainer.Wires)
                        {
                            if (edge.OutputElement.DomNode == moduleReference.DomNode)
                                edge.OutputPinTarget = null;

                            if (edge.InputElement.DomNode == moduleReference.DomNode)
                                edge.InputPinTarget = null;
                        }
                    }
                }
            }

            // finally, prune the old nodes
            foreach (var keyValue in newNodeGuidDictionary)
            {
                DomNode oldNode;
                if (oldNodeGuidDictionary.TryGetValue(keyValue.Key, out oldNode))
                {
                    oldNode.RemoveFromParent();
                }
            }
        }
Пример #8
0
        /// <summary>
        ///  Load circuit templates stored in an external file</summary>
        /// <param name="uri">Document URI, or null to present file open dialog to user</param>
        /// <returns>Returns the file path used to load the external templates.
        /// An empty string indicates no templates were loaded</returns>
        protected override ImportedContent LoadExternalTemplateLibrary(Uri uri)
        {
 
            string filePath = string.Empty;
            if (uri == null)
            {
                var dlg = new OpenFileDialog();
                dlg.Filter = "Circuit Template File (*.circuit)|*.circuit".Localize();
                dlg.CheckFileExists = true;
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    uri = new Uri(dlg.FileName, UriKind.RelativeOrAbsolute);
                    filePath = dlg.FileName;
                }

            }
            else
                filePath = uri.LocalPath;

            if (File.Exists(filePath))
            {
                if (TemplatingContext.ValidateNewFolderUri(uri))
                {
                    // read existing document using standard XML reader
                    using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    {
                        var reader = new CircuitReader(m_schemaLoader);
                        var root = reader.Read(stream, uri);
                        var toFolder = CreateTemplateFolder();
                        reader.ImportTemplates(toFolder.DomNode, root, uri);
                        return new ImportedContent(toFolder.DomNode, uri);
                    }                 
                }
            }

            return new ImportedContent(null, null);           
        }