Ejemplo n.º 1
0
        /// <summary>
        /// Get the view component for the specified object
        /// </summary>
        internal static IBiViewComponent GetViewComponent(XName elementName)
        {
            IBiViewComponent retVal = null;

            if (!m_componentCache.TryGetValue(elementName, out retVal) && !m_componentCache.TryGetValue(elementName.Namespace + "any", out retVal))
            {
                return(null);
            }
            return(retVal);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Write the specified object to the screen
        /// </summary>
        internal static void Write(XmlWriter writer, XNode nd, IRenderContext context)
        {
            if (nd is XElement el)
            {
                // TODO get helper here
                IBiViewComponent component = ReportViewUtil.GetViewComponent(el.Name);

                if (component == null)
                {
                    writer.WriteComment($"WARNING: No component for {el.Name} is registered");
                }
                else if (component.Validate(el, context))
                {
                    component.Render(el, writer, context);
                }
                else
                {
#if DEBUG
                    throw new ViewValidationException(el, $"Component {component?.ComponentName} failed validation");
#else
                    writer.WriteStartElement("em", BiConstants.HtmlNamespace);
                    writer.WriteAttributeString("style", "color: #f00");
                    StringBuilder path = new StringBuilder($"/{el.Name}");
                    var           p    = el.Parent;
                    while (p != el.Document.Root && p != null)
                    {
                        path.Insert(0, $"/{p.Name}");
                        p = p.Parent;
                    }
                    writer.WriteString($"Component {component.ComponentName} failed validation at {path}");
                    writer.WriteEndElement(); // em
#endif
                }
            }
            else if (nd is XText xt)
            {
                writer.WriteString(xt.Value.Trim());
            }
        }