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); }
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); } }