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

Reply via email to