Author: mgrigorov
Date: Mon Jun 13 15:35:37 2011
New Revision: 1135146

URL: http://svn.apache.org/viewvc?rev=1135146&view=rev
Log:
WICKET-3782 Notifications before and after DOM node replacement

Add Wicket.Event.(subscribe|publish) methods. Now interested parties can 
registers subscribers and listen on topics.
The topic can be fully qualified (like '/dom/node/added') or wildcard ('*') 
which will listen for all notifications.


Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/wicket-event.js

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=1135146&r1=1135145&r2=1135146&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/wicket-ajax.js 
(original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/wicket-ajax.js 
Mon Jun 13 15:35:37 2011
@@ -354,6 +354,8 @@ Wicket.replaceOuterHtmlSafari = function
  */
 Wicket.replaceOuterHtml = function(element, text) {    
 
+    Wicket.Event.publish('/dom/node/removing', element);
+
        if (Wicket.Browser.isIE() || Wicket.Browser.isOpera()) {                
                Wicket.replaceOuterHtmlIE(element, text);                       
        
     } else if (Wicket.Browser.isSafari()) {
@@ -364,8 +366,11 @@ Wicket.replaceOuterHtml = function(eleme
         range.selectNode(element);
                var fragment = range.createContextualFragment(text);
                
-        element.parentNode.replaceChild(fragment, element);        
-    }          
+        element.parentNode.replaceChild(fragment, element);
+    }
+    
+    var newElement = Wicket.$(element.id);
+    Wicket.Event.publish('/dom/node/added', newElement);
 }      
 
 /**

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/wicket-event.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/wicket-event.js?rev=1135146&r1=1135145&r2=1135146&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/wicket-event.js
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/wicket-event.js
 Mon Jun 13 15:35:37 2011
@@ -218,6 +218,73 @@ if (typeof(Wicket.Event) == "undefined")
                        } else {
                                window.addEventListener("domready", fn, false);
                        }
-               }
+               },
+       
+               /**
+               * A hash of subscribers per topic.
+               * String -> Array[Function].
+               */
+               subscribers : {},
+
+               /**
+               * Adds a subscriber for the passed topic.
+               * 
+               * @param String topic - the channel name for which this 
subscriber will be notified
+               *        If '*' then it will be notified for all topics
+               * @param Function subscriber - the callback to call when an 
event with this type is published
+               */    
+               subscribe: function(topic, subscriber) {
+                  if (typeof(topic) === 'undefined' || topic === null) {
+                          return;
+                  }
+                  
+                  var subscribers;
+                  
+                  subscribers = Wicket.Event.subscribers[topic];
+                  if (typeof(subscribers) === 'undefined' || subscribers === 
null) {
+                          subscribers = [];
+                          Wicket.Event.subscribers[topic] = subscribers;
+                  }
+                  
+                  subscribers.push(subscriber);
+               },
+
+               /**
+               * Sends a notification to all subscribers for the given topic.
+               * Subscribers for topic '*' receive the actual topic as first 
parameter,
+               * otherwise the topic is not passed to subscribers which listen 
for specific 
+               * event types.
+               *
+               * @param String topic - the channel name for which all 
subscribers will be notified.
+               */
+               publish: function(topic) {
+                  if (typeof(topic) === 'undefined' || topic === null) {
+                          return;
+                  }
+                  
+                  var subscribers, subscriberArguments;
+
+                  // notify all subscribers for this specific event type       
     
+                  subscribers = Wicket.Event.subscribers[topic];
+                  if (subscribers instanceof Array) {
+
+                          // cut the topic argument
+                          subscriberArguments = 
Array.prototype.slice.call(arguments).slice(1);
+                  
+                          for (var i = 0; i < subscribers.length; ++i) {
+                                  subscribers[i].apply(this, 
subscriberArguments);
+                          }
+                  }
+                  
+                  // notify all subscribers which listen for any kind of events
+                  // and pass them the event type as first parameter
+                  subscribers = Wicket.Event.subscribers['*'];
+                  if (subscribers instanceof Array) {
+
+                          for (var i = 0; i < subscribers.length; ++i) {
+                                  subscribers[i].apply(this, arguments);
+                          }
+                  }
+               }           
        };
 }


Reply via email to