Пример #1
0
 public override void OnDocument(DOM.Document pair)
 {
     PrintNodeName(pair);
     PrintNodeStart(pair);
     base.OnDocument(pair);
     PrintNodeEnd(pair);
 }
Пример #2
0
        /// <summary>
        /// Checks if XML document has one root element
        /// </summary>
        /// <param name="document"></param>
        private void CheckDocumentElement(DOM.Document document)
        {
            int rootElementCount = 0;

            foreach (var entity in document.Entities)
            {
                if (entity is DOM.Element)
                {
                    rootElementCount++;
                }

                if (entity is DOM.Antlr.Alias)
                {
                    rootElementCount += CalcNumOfRootElements(entity as DOM.Antlr.Alias, null);
                }

                if (rootElementCount > 1)
                {
                    _context.AddError(CompilerErrorFactory.DocumentMustHaveOneRootElement(document, document.Module.FileName, " only"));
                    break;
                }
            }
            if (rootElementCount == 0)
            {
                _context.AddError(CompilerErrorFactory.DocumentMustHaveOneRootElement(document, document.Module.FileName, " at least"));
            }
        }
 public override void OnDocument(DOM.Document document)
 {
     _namespaceResolver.EnterDocument((Document)document);
     ProcessInterpolation((IPairWithInterpolation)document);
     base.OnDocument(document);
     Visit(document.PairValue);
 }
Пример #4
0
 public override void OnDocument(DOM.Document node)
 {
     PrintNodeStart(node);
     _sb.Append(":");
     _sb.AppendLine();
     _indent++;
     base.OnDocument(node);
     _indent--;
     _sb.AppendLine();
 }
Пример #5
0
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <Scope> getScope, out string prefix,
                                   out string ns)
        {
            prefix = null;
            ns     = null;

            if (node.NsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                node.NsPrefix = scope.NsPrefix;
            }

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);
            var moduleMember = GetModuleMember((Node)node);
            var member       = moduleMember as ModuleMember;

            if (member != null)
            {
                //Resolving ns first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == moduleMember);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = member.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }
Пример #6
0
 internal static CompilerError DuplicateDocumentName(DOM.Document document, string fileName)
 {
     return(Instantiate("MCE0008", new LexicalInfo(fileName, document.start.Line, document.start.Column + 1, document.start.Index), document.Name));
 }
Пример #7
0
 internal static CompilerError DocumentMustHaveOneRootElement(DOM.Document document, string fileName, string only)
 {
     return(Instantiate("MCE0009", new LexicalInfo(fileName, document.start.Line, document.start.Column + 1, document.start.Index), document.Name, only));
 }
Пример #8
0
        public void Render(IVisio.Application app)
        {
            var orgchartdrawing = this;

            if (orgchartdrawing == null)
            {
                throw new System.ArgumentNullException("orgchartdrawing");
            }

            if (app == null)
            {
                throw new System.ArgumentNullException(nameof(app));
            }

            if (orgchartdrawing.OrgCharts.Count < 1)
            {
                throw new System.ArgumentException("orgchart must have at least one root");
            }

            foreach (var root in orgchartdrawing.OrgCharts)
            {
                if (root == null)
                {
                    throw new System.ArgumentException("Org chart has root node set to null");
                }
            }

            var  ver           = Application.ApplicationHelper.GetVersion(app);
            int  majorver      = ver.Major;
            bool is_visio_2013 = majorver >= 15;

            const string orgchart_vst = "orgch_u.vst";
            string       orgchart_master_node_name = is_visio_2013 ? "Position Belt" : "Position";
            const string dyncon_master_name        = "Dynamic connector";
            const double border_width = 0.5;

            var doc_node = new DOM.Document(orgchart_vst, IVisio.VisMeasurementSystem.visMSUS);

            var trees = new List <IList <InternalTree.Node <object> > >();

            foreach (var root in orgchartdrawing.OrgCharts)
            {
                // Construct a layout tree from the hierarchy
                var treenodes = Internal.TreeOps.CopyTree(
                    orgchartdrawing.OrgCharts[0],
                    n => n.Children,
                    n => this.node_to_layout_node(n),
                    (p, c) => p.AddChild(c));

                trees.Add(treenodes);

                // Perform the layout
                var layout = new InternalTree.TreeLayout <object>();

                layout.Options.Direction         = this.map_direction2(this.LayoutOptions.Direction);
                layout.Options.LevelSeparation   = 1;
                layout.Options.SiblingSeparation = 0.25;
                layout.Options.SubtreeSeparation = 1;

                layout.Root.AddChild(treenodes[0]);
                layout.PerformLayout();

                // Render the Document in Visio
                var bb = layout.GetBoundingBoxOfTree();

                // vis.ActiveWindow.ShowConnectPoints = 0;

                var page_node = new DOM.Page();
                doc_node.Pages.Add(page_node);

                // fixup the nodes so that they render on the page
                foreach (var i in treenodes)
                {
                    i.Position = i.Position.Add(border_width, border_width);
                }

                var centerpoints = new Drawing.Point[treenodes.Count];
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    centerpoints[i] = treenodes[i].Rect.Center;
                }

                // TODO: Add support for Left to right , Right to Left, and Bottom to Top Layouts

                var vmasters = centerpoints
                               .Select(centerpoint => page_node.Shapes.Drop(orgchart_master_node_name, null, centerpoint))
                               .ToList();


                // For each OrgChart object, attach the shape that corresponds to it
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    orgnode.DOMNode          = vmasters[i];
                    vmasters[i].Cells.Width  = treenodes[i].Size.Width;
                    vmasters[i].Cells.Height = treenodes[i].Size.Height;
                }

                if (this.LayoutOptions.UseDynamicConnectors)
                {
                    var orgchart_nodes = treenodes.Select(tn => tn.Data).Cast <Node>();

                    foreach (var parent in orgchart_nodes)
                    {
                        foreach (var child in parent.Children)
                        {
                            var parent_shape = (DOM.BaseShape)parent.DOMNode;
                            var child_shape  = (DOM.BaseShape)child.DOMNode;
                            var connector    = page_node.Shapes.Connect(dyncon_master_name, null, parent_shape, child_shape);
                        }
                    }
                }
                else
                {
                    foreach (var connection in layout.EnumConnections())
                    {
                        var bez = layout.GetConnectionBezier(connection);
                        page_node.Shapes.DrawBezier(bez);
                    }
                }

                // Set the Text Labels on each Org node
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    var shape   = (DOM.BaseShape)orgnode.DOMNode;
                    shape.Text = new Text.Markup.TextElement(orgnode.Text);
                }

                var page_size_with_border = bb.Size.Add(border_width * 2, border_width * 2.0);
                page_node.Size              = page_size_with_border;
                page_node.ResizeToFit       = true;
                page_node.ResizeToFitMargin = new Drawing.Size(border_width * 2, border_width * 2.0);
            } // finish handling root node

            var doc = doc_node.Render(app);

            foreach (var treenodes in trees)
            {
                var orgnodes           = treenodes.Select(i => i.Data).Cast <Node>();
                var orgnodes_with_urls = orgnodes.Where(n => n.URL != null);
                var all_urls           = orgnodes_with_urls.Select(n => new { orgnode = n, shape = (DOM.BaseShape)n.DOMNode, url = n.URL.Trim() });

                foreach (var url in all_urls)
                {
                    var hlink = url.orgnode.VisioShape.Hyperlinks.Add();
                    hlink.Name    = "Row_1";
                    hlink.Address = url.orgnode.URL;
                }

                // Attach all the orgchart nodes to the Visio shapes that were created
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    var shape   = (DOM.BaseShape)orgnode.DOMNode;
                    orgnode.VisioShape = shape.VisioShape;
                }
            }
        }
Пример #9
0
        public void GetPrefixAndNs(INsNode node, DOM.Document document, Func <DOM.AliasDefinition> getAliasDef, Func <Scope> getScope, out string prefix, out string ns)
        {
            prefix = null;
            ns     = null;

            if (node.NsPrefix == null)
            {
                var scope = getScope();
                if (scope == null)
                {
                    return;
                }
                node.NsPrefix = scope.NsPrefix;
            }

            //Getting namespace info for the generated document.
            var targetNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == document);

            var aliasDef = getAliasDef();

            if (aliasDef == null)
            {//Resolving based on document's NsInfo
                var domNamespace = targetNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                if (domNamespace != null)
                {
                    prefix = domNamespace.Name;
                    ns     = domNamespace.Value;
                }
                else
                {
                    //Prefix is defined in Module. Resolving using module namespaces
                    //Finding uri first
                    var moduleNamespace = document.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;

                        //Finding effective prefix in the Document Namespace
                        domNamespace = targetNsInfo.Namespaces.First(n => n.Value == moduleNamespace.Value);
                        prefix       = domNamespace.Name;
                    }
                }
            }
            else
            {
                //Resolving ns first using aliasDef context NsInfo
                var contextNsInfo = ModuleMembersNsInfo.First(n => n.ModuleMember == aliasDef);
                var domNamespace  = contextNsInfo.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);

                if (domNamespace == null)
                {
                    //Prefix was defined in the module. Looking up in the module.
                    var moduleNamespace = aliasDef.Module.Namespaces.FirstOrDefault(n => n.Name == node.NsPrefix);
                    if (moduleNamespace != null)
                    {
                        ns = moduleNamespace.Value;
                    }
                }
                else
                {
                    ns = domNamespace.Value;
                }
                //Resolving prefix using Document's NsInfo
                if (ns != null)
                {
                    var ns1 = ns;
                    prefix = targetNsInfo.Namespaces.First(n => n.Value == ns1).Name;
                }
            }
        }
        public void Render(IVisio.Application app)
        {
            var orgchartdrawing = this;

            if (orgchartdrawing == null)
            {
                throw new System.ArgumentNullException("orgchartdrawing");
            }

            if (app == null)
            {
                throw new System.ArgumentNullException(nameof(app));
            }

            if (orgchartdrawing.OrgCharts.Count < 1)
            {
                throw new System.ArgumentException("orgchart must have at least one root");
            }

            foreach (var root in orgchartdrawing.OrgCharts)
            {
                if (root == null)
                {
                    throw new System.ArgumentException("Org chart has root node set to null");
                }
            }

            var ver = Application.ApplicationHelper.GetVersion(app);
            int majorver = ver.Major;
            bool is_visio_2013 = majorver >= 15;

            const string orgchart_vst = "orgch_u.vst";
            string orgchart_master_node_name = is_visio_2013 ? "Position Belt" : "Position";
            const string dyncon_master_name = "Dynamic connector";
            const double border_width = 0.5;

            var doc_node = new DOM.Document(orgchart_vst, IVisio.VisMeasurementSystem.visMSUS);

            var trees = new List<IList<InternalTree.Node<object>>>();

            foreach (var root in orgchartdrawing.OrgCharts)
            {
                // Construct a layout tree from the hierarchy
                var treenodes = Internal.TreeOps.CopyTree(
                    orgchartdrawing.OrgCharts[0],
                    n => n.Children,
                    n => this.node_to_layout_node(n),
                    (p, c) => p.AddChild(c));

                trees.Add(treenodes);

                // Perform the layout
                var layout = new InternalTree.TreeLayout<object>();

                layout.Options.Direction = this.map_direction2(this.LayoutOptions.Direction);
                layout.Options.LevelSeparation = 1;
                layout.Options.SiblingSeparation = 0.25;
                layout.Options.SubtreeSeparation = 1;

                layout.Root.AddChild(treenodes[0]);
                layout.PerformLayout();

                // Render the Document in Visio
                var bb = layout.GetBoundingBoxOfTree();

                // vis.ActiveWindow.ShowConnectPoints = 0;

                var page_node = new DOM.Page();
                doc_node.Pages.Add(page_node);

                // fixup the nodes so that they render on the page
                foreach (var i in treenodes)
                {
                    i.Position = i.Position.Add(border_width, border_width);
                }

                var centerpoints = new Drawing.Point[treenodes.Count];
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    centerpoints[i] = treenodes[i].Rect.Center;
                }

                // TODO: Add support for Left to right , Right to Left, and Bottom to Top Layouts

                var vmasters = centerpoints
                    .Select(centerpoint => page_node.Shapes.Drop(orgchart_master_node_name, null, centerpoint))
                    .ToList();


                // For each OrgChart object, attach the shape that corresponds to it
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    orgnode.DOMNode = vmasters[i];
                    vmasters[i].Cells.Width = treenodes[i].Size.Width;
                    vmasters[i].Cells.Height = treenodes[i].Size.Height;
                }

                if (this.LayoutOptions.UseDynamicConnectors)
                {
                    var orgchart_nodes = treenodes.Select(tn => tn.Data).Cast<Node>();

                    foreach (var parent in orgchart_nodes)
                    {
                        foreach (var child in parent.Children)
                        {
                            var parent_shape = (DOM.BaseShape)parent.DOMNode;
                            var child_shape = (DOM.BaseShape)child.DOMNode;
                            var connector = page_node.Shapes.Connect(dyncon_master_name, null, parent_shape, child_shape);
                        }
                    }
                }
                else
                {
                    foreach (var connection in layout.EnumConnections())
                    {
                        var bez = layout.GetConnectionBezier(connection);
                        page_node.Shapes.DrawBezier(bez);
                    }
                }

                // Set the Text Labels on each Org node
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    var shape = (DOM.BaseShape)orgnode.DOMNode;
                    shape.Text = new Text.Markup.TextElement(orgnode.Text);
                }

                var page_size_with_border = bb.Size.Add(border_width * 2, border_width * 2.0);
                page_node.Size = page_size_with_border;
                page_node.ResizeToFit = true;
                page_node.ResizeToFitMargin = new Drawing.Size(border_width * 2, border_width * 2.0);
            } // finish handling root node

            var doc = doc_node.Render(app);

            foreach (var treenodes in trees)
            {
                var orgnodes = treenodes.Select(i => i.Data).Cast<Node>();
                var orgnodes_with_urls = orgnodes.Where(n => n.URL != null);
                var all_urls = orgnodes_with_urls.Select(n => new { orgnode = n, shape = (DOM.BaseShape)n.DOMNode, url = n.URL.Trim() });

                foreach (var url in all_urls)
                {
                    var hlink = url.orgnode.VisioShape.Hyperlinks.Add();
                    hlink.Name = "Row_1";
                    hlink.Address = url.orgnode.URL;
                }

                // Attach all the orgchart nodes to the Visio shapes that were created
                foreach (int i in Enumerable.Range(0, treenodes.Count))
                {
                    var orgnode = (Node)treenodes[i].Data;
                    var shape = (DOM.BaseShape)orgnode.DOMNode;
                    orgnode.VisioShape = shape.VisioShape;
                }
            }
        }