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