Author: jmorliaguet Date: Sat Jun 3 23:10:52 2006 New Revision: 3296 Modified: cpsskins/branches/paris-sprint-2006/lib/cpsskins/src/cpsskins.js
Log: - optimizations: - we use a set to keep a record of the views that have been registered for a given controller instead of doing unregister / register - which doesn't scale. - added a 'detachControllers' method to make it possible to unregister the views associated to a controller - getElementsByTagName() used in the registration of the DragAndDrop controller is limited to the scope of the widget (50% speed increase) Modified: cpsskins/branches/paris-sprint-2006/lib/cpsskins/src/cpsskins.js ============================================================================== --- cpsskins/branches/paris-sprint-2006/lib/cpsskins/src/cpsskins.js (original) +++ cpsskins/branches/paris-sprint-2006/lib/cpsskins/src/cpsskins.js Sat Jun 3 23:10:52 2006 @@ -30,7 +30,7 @@ } catch(e) { msg = e; } - $("message").innerHTML += msg + '</br>'; + $("message").innerHTML += msg + '</br> '; } var CPSSkins = { @@ -432,6 +432,7 @@ this.node = node; this.def = def; this.views = new CPSSkins.Set(); + this.registered = new CPSSkins.Set(); this.setup(); }, @@ -799,31 +800,28 @@ if (shifting) { if (shifting.element) { this._shiftablezones = document.getElementsByClassName( - shifting.element) + shifting.element, widget) } if (shifting.container) { this._containerzones = document.getElementsByClassName( - shifting.container) + shifting.container, widget) } } if (this.def.dropping) { if (this.def.dropping.target) { this._dropzones = document.getElementsByClassName( - this.def.dropping.target) + this.def.dropping.target, widget) } } - var dragEvent = this.dragEvent.bindAsEventListener( + this._dragEvent = this.dragEvent.bindAsEventListener( Object.extend(this, {widget: widget})); - widget.setStyle({cursor: 'default'}); - Event.observe(widget, "mousedown", dragEvent); + Event.observe(widget, "mousedown", this._dragEvent); }, unregister: function(view) { var widget = view.widget; - var dragEvent = this.dragEvent.bindAsEventListener( - Object.extend(this, {widget: widget})); - Event.stopObserving(widget, "mousedown", dragEvent); + Event.stopObserving(widget, "mousedown", this._dragEvent); }, _findDraggable: function(e) { @@ -1919,9 +1917,24 @@ var controller = CPSSkins.getControllerById(c); if (controller) { controller.views.add(view_id); + if (!controller.registered.contains(view_id)) { + controller.register(view); + controller.update(view); + controller.registered.add(view_id); + } + } + }); + }, + + detachControllers: function() { + var view = this; + var view_id = view.hash(); + var controllers_ids = view.getControllers(); + controllers_ids.each(function(c) { + var controller = CPSSkins.getControllerById(c); + if (controller) { controller.unregister(view); - controller.register(view); - controller.update(view); + controller.registered.remove(view_id); } }); }, @@ -1960,7 +1973,9 @@ reload: function() { var data = this.getData(); if (data) { + this.detachControllers(); this.display(data); + this.attachControllers(); } }, @@ -2118,7 +2133,6 @@ CPSSkins.registerEventHandler("loaded template", view, function(event) { var view = event.subscriber; view.reload(); - view.attachControllers(); CPSSkins.unsubscribe("loaded template", {scope: view.hash()}); }); @@ -2184,6 +2198,7 @@ if (widget.innerHTML != text) { widget.innerHTML = text; } + view.detachControllers(); CPSSkins._parse(widget); } }; -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins