Example #1
0
        object UnpackMemberObject(InteractiveObject parent, int memberIndex,
                                  out InteractiveObject interactiveObject,
                                  out InteractiveObject.InteractMessage interactMessage)
        {
            interactMessage.MemberIndex         = memberIndex;
            interactMessage.RepresentationIndex = -1;

            var value = parent.Values [memberIndex];

            interactiveObject = value as InteractiveObject;
            if (interactiveObject != null)
            {
                return(value);
            }

            // FIXME?: InteractiveObjectRenderer will only support drilling down into
            // one InteractiveObject in a ResultCollection. In practive this should
            // be acceptable. Multiple InteractiveObject instances in a ResultCollection
            // is basically undefined behavior... we'll only support the first found.
            var resultCollection = value as RepresentedObject;

            for (var i = 0; resultCollection != null && i < resultCollection.Count; i++)
            {
                interactiveObject = resultCollection [i] as InteractiveObject;
                if (interactiveObject != null)
                {
                    interactMessage.RepresentationIndex = i;
                    return(value);
                }
            }

            return(value);
        }
Example #2
0
        async Task LoadValueAsync(HtmlElement parentRowElem, HtmlElement valueElem,
                                  InteractiveObject obj, InteractiveObject.InteractMessage interactMessage)
        {
            var parent       = parentRowElem.ParentElement;
            var insertBefore = parentRowElem.NextSibling;

            try {
                var result = (InteractiveObject)await Context.InteractAsync(
                    this, obj, interactMessage);

                // Returns null when disconnected from agent
                if (result == null)
                {
                    return;
                }

                parentRowElem.AddCssClass("expanded");
                parentRowElem.RemoveCssClass("collapsed");

                if (result.Members == null || result.Members.Length == 0)
                {
                    parentRowElem.RemoveCssClass("expanded");
                    valueElem.RemoveChildren();
                    valueElem.AppendChild(Document.CreateElement("code",
                                                                 innerHtml: result.ToStringRepresentation.HtmlEscape()));
                    return;
                }

                foreach (var row in RenderRows(result))
                {
                    // FIXME: JSC XCB InsertBefore binding throws an
                    // NRE if insertBefore is null... it should instead
                    // propagate the null to JS
                    if (insertBefore != null)
                    {
                        parent.InsertBefore(row.Element, insertBefore);
                    }
                    else
                    {
                        parent.AppendChild(row.Element);
                    }
                }
            } catch (Exception e) {
                valueElem.RemoveChildren();
                Context.Render(RenderState.CreateChild(e), valueElem);
            }
        }