You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2006/02/20 12:19:25 UTC

svn commit: r379090 - in /cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js: BUHandler.js __package__.js browserupdater.js cocoon-ajax.js cocoon.js timedbrowserupdater.js

Author: sylvain
Date: Mon Feb 20 03:19:02 2006
New Revision: 379090

URL: http://svn.apache.org/viewcvs?rev=379090&view=rev
Log:
Migration of Ajax stuff to Dojo, orderable repeater and inline-edit styling

Added:
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js   (with props)
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js   (with props)
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js   (with props)
Removed:
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/browserupdater.js
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon-ajax.js
Modified:
    cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/timedbrowserupdater.js

Added: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js?rev=379090&view=auto
==============================================================================
--- cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js (added)
+++ cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js Mon Feb 20 03:19:02 2006
@@ -0,0 +1,244 @@
+/*
+ * Copyright 1999-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * General purpose AJAX infrastructure to handle a BU ("browser update") response
+ *
+ * To add a new handler for a given request, create a new BUHandler and update its
+ * handlers property.
+ *
+ * @version $Id$
+ */
+
+dojo.require("dojo.dom");
+dojo.require("dojo.html");
+dojo.provide("cocoon.ajax.BUHandler");
+
+cocoon.ajax.BUHandler = function() { };
+
+/**
+ * Imports an element into a document, taking care of using the correct implementation
+ * so that the browser interprets it as displayable XML.
+ *
+ * Any <script> in the imported node are collected and for post-import evaluation
+ * FIXME: only inline script are considered, but not <script src="">
+ *
+ * @return { element: <em>imported_element</em>, scripts: <em>array_of_script_text</em> }
+ */
+cocoon.ajax.BUHandler.importNode = function(node, targetDoc) {
+    if(node.xml) {
+        // IE
+        var div = targetDoc.createElement("DIV");
+        var text = node.xml;
+        
+        // Code below heavily inspired by the Prototype library
+        var scriptExpr = "(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)";
+        
+        // Update screen with removed scripts
+        div.innerHTML = text.replace(new RegExp(scriptExpr, 'img'), '');;
+        
+        var matchAll = new RegExp(scriptExpr, 'img');
+        var matchOne = new RegExp(scriptExpr, 'im');
+        var allMatches = text.match(matchAll);
+        var scripts = new Array();
+        for (var i = 0; i < allMatches.length; i++) {
+            scripts.push(allMatches[i].match(matchOne)[1]);
+        }
+        return { element: dojo.dom.getFirstChildElement(div), scripts: scripts };
+        
+    } else {
+        var scripts = new Array();
+        var element = cocoon.ajax.BUHandler._DOMimportNode(node, targetDoc, scripts);
+        return { element: element, scripts: scripts }
+    }
+}
+	
+/**
+ * DOM implementation of importNode, recursively creating nodes.
+ * Scripts are collected in the "scripts" parameter
+ */
+cocoon.ajax.BUHandler._DOMimportNode = function(node, targetDoc, scripts) {
+    switch(node.nodeType) {
+        case dojo.dom.ELEMENT_NODE:
+            if (node.nodeName.toLowerCase() == "script") {
+                // Collect scripts
+                scripts.push(node.firstChild && node.firstChild.nodeValue);
+                return;
+            }
+            var element = targetDoc.createElement(node.nodeName);
+            //var element = targetDoc.createElementNS(node.namespaceURI, node.nodeName);
+            var attrs = node.attributes;
+            for (var i = 0; i < attrs.length; i++) {
+                var attr = attrs[i];
+                element.setAttribute(attr.nodeName, attr.nodeValue);
+                //element.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.nodeValue);
+            }
+            var children = node.childNodes;
+            for (var j = 0; j < children.length; j++) {
+                var imported = cocoon.ajax.BUHandler._DOMimportNode(children[j], targetDoc, scripts);
+                if (imported) element.appendChild(imported);
+            }
+            return element;
+        break;
+        
+        case dojo.dom.TEXT_NODE:
+            return targetDoc.createTextNode(node.nodeValue);
+        break;
+        
+        case dojo.dom.CDATA_SECTION_NODE:
+            return targetDoc.createTextNode(node.nodeValue);
+        break;
+    }
+}
+
+cocoon.ajax.BUHandler._destroyDojoWidgets = function(element) {
+    var widget = dojo.widget.byNode(element);
+    if (widget) {
+        // Dojo will destroy all its children
+        widget.destroy(true, true);
+    } else {
+        // Recurse until we eventually find a widget
+        var children = element.childNodes;
+        for (var i = 0; i < children.length; i++) {
+            var child = children[i];
+            if (child.nodeType == dojo.dom.ELEMENT_NODE) {
+                cocoon.ajax.BUHandler._destroyDojoWidgets(child);
+            }
+        }
+    }
+}
+
+cocoon.ajax.BUHandler._parseDojoWidgets = function(element) {
+    // Find a parent widget (if any) so that Dojo can maintain its widget tree
+    var parentWidget = cocoon.ajax.BUHandler._findParentWidget(element);
+	var parser = new dojo.xml.Parse();
+
+	// FIXME: parser.parseElement() parses the _children_ of an element, whereas we want here
+	// the element itself to be parsed. Parsing its parent is not an option as we don't want
+	// to parse the siblings. So place it in a temporary div that we'll trash afterwards.
+	var div = document.createElement("DIV");
+	element.parentNode.replaceChild(div, element);
+	div.appendChild(element);
+	var frag = parser.parseElement(div, null, true);
+	dojo.widget.getParser().createComponents(frag, parentWidget);
+	div.parentNode.replaceChild(element, div);
+	parentWidget && parentWidget.onResized();
+}
+
+cocoon.ajax.BUHandler._findParentWidget = function(element) {
+    var parent = element.parentNode;
+    var widget;
+    while (parent && !widget) {
+        var widget = dojo.widget.byNode(parent);
+        if (widget) {
+            return widget;
+        }
+        parent = parent.parentNode;
+    }
+}
+
+cocoon.ajax.BUHandler.fade = function(node) {
+    dojo.require("dojo.fx.*");
+    dojo.fx.highlight(element, dojo.graphics.color.hex2rgb("#ffc"), 700, 300);
+}
+
+dojo.lang.extend(cocoon.ajax.BUHandler, {
+    // Default highlight effect
+    highlight: null,
+    
+    processResponse: function(doc, request) {
+	    var nodes = doc.documentElement.childNodes;
+	    for (var i = 0; i < nodes.length; i++) {
+	        var node = nodes[i];
+	        if (node.nodeType == dojo.dom.ELEMENT_NODE) {
+	            var handler;
+	            if (node.localName) {
+	                handler = node.localName;
+	            } else {
+	                // No DOM2 support (IE6)
+	                handler = node.nodeName.replace(/.*:/, "");
+	            }
+	            var handlerFunc = this.handlers[handler];
+	            if (handlerFunc) {
+	                handlerFunc(node);
+	            } else {
+	                this.handleError("No handler found for element " + handler, request);
+	            }
+	        }
+	    }
+	},
+	
+	handleError: function(message, request) {
+	    if (confirm(message + "\nShow server response?")) {
+	        var w = window.open(undefined, "Cocoon Error", "location=no");
+	        if (w == undefined) {
+	            alert("You must allow popups from this server to display the response.");
+	        } else {
+		        var doc = w.document;
+		        doc.open();
+		        doc.write(request.responseText);
+		        doc.close();
+		    }
+		}
+    },
+
+    handlers: {
+        replace: function(element) {
+	        var id = element.getAttribute("id");
+	        if (!id) {
+	           alert("no id found on update element");
+	           return;
+	        }    
+	        // Get the first child element (the first child may be some text!)
+	        var firstChild = dojo.dom.getFirstChildElement(element);
+	    
+	        var oldElement = document.getElementById(id);
+	        
+	        if (!oldElement) {
+	            alert("no element '" + id + "' in source document");
+	            return;
+	        }
+
+	        var imported = cocoon.ajax.BUHandler.importNode(firstChild, document);
+	        var newElement = imported.element;
+	        // Don't update if we don't have a valid new element.
+	        if (newElement) {
+		        // Warn: it's replace(new, old)!!
+		        oldElement.parentNode.replaceChild(newElement, oldElement);
+		        // Ensure the new node has the correct id
+		        newElement.setAttribute("id", id);
+		        
+	            // Destroy Dojo widgets associated with the old element
+	            cocoon.ajax.BUHandler._destroyDojoWidgets(oldElement);
+
+		        // Evaluate scripts
+		        for (var i = 0; i < imported.scripts.length; i++) {
+		            eval(imported.scripts[i]);
+		        }
+		        
+		        // Parse dojo widgets for the new element
+		        cocoon.ajax.BUHandler._parseDojoWidgets(newElement);
+		        
+		        // Reload it as the widgetization may have changed it
+		        newElement = document.getElementById(id);
+		        
+		        if (this.highlight) {
+		           this.highlight(newElement);
+		        }
+		    }
+		}
+    }
+});
\ No newline at end of file

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/BUHandler.js
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js?rev=379090&view=auto
==============================================================================
--- cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js (added)
+++ cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js Mon Feb 20 03:19:02 2006
@@ -0,0 +1,22 @@
+/*
+ * Copyright 1999-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+dojo.hostenv.conditionalLoadModule({
+        common: [
+                "cocoon.ajax.BUHandler"
+        ]
+});
+s
+dojo.hostenv.moduleLoaded("cocoon.ajax.*");

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/__package__.js
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js?rev=379090&view=auto
==============================================================================
--- cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js (added)
+++ cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js Mon Feb 20 03:19:02 2006
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Bootstrap file to plug Cocoon in the Dojo package system. It declares the
+ * "cocoon" root package and hooks in the script loading engine to handle
+ * the per-block organization of JS files in Cocoon.
+ * <p>
+ * A typical usage scenario would be:
+ * <pre>
+ *   <script src="resources/dojo/dojo.js">
+ *   <script src="resources/ajax/js/cocoon.js"/>
+ *   <script>
+ *      dojo.require("cocoon.forms.Form");
+ *      ...
+ *    </script>
+ * </pre>
+ *
+ * @version $Id$
+ */
+
+dojo.provide("cocoon");
+
+// Setup hooks to load JS files provided by Cocoon blocks
+(function() {
+    // base path is "resources/dojo". Move to back to "resources"
+    var rsrcPath = "../";
+  
+    // cocoon.foo.bar is loaded from "resources/foo/js/bar.js"
+    var orgRequire = dojo.require;
+    dojo.require = function() {
+        var module = arguments[0];
+        var match = module.match(/^(cocoon\.([^\.]*))/);
+        if (match) {
+            var block = match[1];
+            var name = match[2];
+            if (dojo.hostenv.getModulePrefix(block) == block) {
+                // Register the block's path
+                //dojo.debug("Registering Cocoon module = " + arguments[0]);
+                var prefix = rsrcPath + name + "/js";
+                dojo.hostenv.setModulePrefix(block, prefix);           
+                //dojo.debug("calling setModulePrefix("+block+", "+ prefix +")");
+            }
+        }
+        // Continue normal processing
+        return orgRequire.apply(this, arguments);
+    };
+
+    // cocoon.foo (single JS file for a block) is loaded from "resources/foo/js/common.js"
+    var orgLoadUri = dojo.hostenv.loadUri;
+    dojo.hostenv.loadUri = function(uri) {
+        // match 'xxx/dojo/cocoon/yyy.js
+        var match = uri.match(/^(.*)\/dojo\/cocoon\/([^\/]*)\.js$/);
+        if (match) {
+            arguments[0] = match[1] + "/cocoon/" + match[2] + "/js/common.js";
+        }
+        return orgLoadUri.apply(this, arguments);
+    }
+})();

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/cocoon.js
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/timedbrowserupdater.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/timedbrowserupdater.js?rev=379090&r1=379089&r2=379090&view=diff
==============================================================================
--- cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/timedbrowserupdater.js (original)
+++ cocoon/trunk/cocoon-ajax/cocoon-ajax-impl/src/main/java/org/apache/cocoon/ajax/resources/js/timedbrowserupdater.js Mon Feb 20 03:19:02 2006
@@ -16,6 +16,8 @@
 
 /* @version $Id$ */
 
+/* TO BE REWRITTEN WITH DOJO
+   -------------------------
 
 Cocoon.Ajax.TimedBrowserUpdater = Class.create();
 Cocoon.Ajax.TimedBrowserUpdater.prototype = Object.extend(new Ajax.Base(), {
@@ -216,3 +218,4 @@
 		insertion: Cocoon.Ajax.Insertion.Replace
 	}
 );
+*/