From c00a64d0782409bd2642cb63fa52f29b5ca08a1b Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 29 Aug 2011 07:23:24 -0400 Subject: [PATCH] trying to see if we can do appendchild ok --- web-world/dwarves/dwarves.rkt | 4 +-- web-world/impl.rkt | 1 + web-world/js-impl.js | 67 +++++++++++++++++++++++++++++++++++ web-world/racket-impl.rkt | 5 +++ 4 files changed, 75 insertions(+), 2 deletions(-) diff --git a/web-world/dwarves/dwarves.rkt b/web-world/dwarves/dwarves.rkt index 27e572d..88187a9 100644 --- a/web-world/dwarves/dwarves.rkt +++ b/web-world/dwarves/dwarves.rkt @@ -23,8 +23,8 @@ ;; until we're all done. (define (draw w v) (cond [(< w (length dwarf-names)) - (view-append (view-focus v "ul") - (make-item (list-ref dwarf-names w)))] + (view-append-child (view-focus v "ul") + (make-item (list-ref dwarf-names w)))] [else v])) diff --git a/web-world/impl.rkt b/web-world/impl.rkt index a53202f..af69961 100644 --- a/web-world/impl.rkt +++ b/web-world/impl.rkt @@ -45,4 +45,5 @@ view-form-value update-view-form-value + view-append-child )) diff --git a/web-world/js-impl.js b/web-world/js-impl.js index 6be34d7..edaf813 100644 --- a/web-world/js-impl.js +++ b/web-world/js-impl.js @@ -322,6 +322,30 @@ }; + MockView.prototype.appendChild = function(domNode) { + return this.act( + function(cursor) { + if (cursor.canDown()) { + cursor = cursor.down(); + while (cursor.canRight()) { + cursor = cursor.right(); + } + return cursor.insertRight(domNode); + } else { + return cursor.insertDown(domNode); + } + }, + function(eventHandlers) { return eventHandlers; }, + function(view) { + var clone = $(domNode).clone(true); + clone.appendTo(view.focus); + view.focus = clone; + } + ) + }; + + + ////////////////////////////////////////////////////////////////////// @@ -444,6 +468,40 @@ }; + var coerseToDomNode = function(x, onSuccess, onFail) { + var dom; + if (isDomNode(x)) { + return onSuccess(x); + } else if (isResource(x)) { + try { + dom = $(resourceContent(x).toString()) + .css("margin", "0px") + .css("padding", "0px") + .css("border", "0px"); + } catch (exn) { + return onFail(exn); + } + return onSuccess(dom); + } else if (isMockView(x)) { + return onSuccess(x.cursor.top().node); + } else { + try { + dom = $(plt.baselib.format.toDomNode(x)) + } catch (exn) { + return onFail(exn); + } + return onSuccess(dom); + } + }; + + + var isDomNode = function(x) { + if (return x.hasOwnProperty(nodeType) && + x.nodeType === 1); + }; + + + @@ -1166,6 +1224,15 @@ }); + + EXPORTS['view-append-child'] = makePrimitiveProcedure( + 'view-append-child', + 2, + function(MACHINE) { + var view = checkMockView(MACHINE, 'view-append-child', 1); + var dom = coerseToDomNode(MACHINE.env[MACHINE.env.length - 2]); + return view.appendChild(dom); + }); diff --git a/web-world/racket-impl.rkt b/web-world/racket-impl.rkt index c0be1d2..e31f88d 100644 --- a/web-world/racket-impl.rkt +++ b/web-world/racket-impl.rkt @@ -13,6 +13,7 @@ view-show view-hide + view-append-child ) @@ -86,3 +87,7 @@ (define (view-hide) (error 'view-hide "Please run in JavaScript context.")) + + +(define (view-append-child dom) + (error 'view-append "Please run in JavaScript context."))