1 /** 2 * @fileoverview A class representing the controller of 3 * the model-view-controller. 4 */ 5 6 goog.provide('xrx.controller'); 7 8 9 goog.require('xrx.update'); 10 11 12 13 xrx.controller = function() {}; 14 15 16 17 /** 18 * 19 */ 20 xrx.controller.update = function(control, update) { 21 var node = control.getNode(); 22 var stream = new xrx.stream(xrx.model.getComponent(node.instance()).xml()); 23 var token = node.token(); 24 25 var diff = xrx.update.notTag(stream, token, update); 26 xrx.model.getComponent(node.instance()).xml(stream.xml()); 27 xrx.controller.valueUpdate(control, diff, update); 28 }; 29 30 31 32 /** 33 * Handles a value update. 34 */ 35 xrx.controller.valueUpdate = function(control, diff, update) { 36 var node = control.getNode(); 37 var offset = node.token().offset(); 38 39 // Recalculate the Model: 40 // Update the offset of each bind's node which appears 41 // after the updated node's offset (in document order) 42 for (var c in xrx.model.getComponents()) { 43 var component = xrx.model.getComponent(c); 44 if (component instanceof xrx.bind) { 45 46 var o = component.node.offset(); 47 if (o > offset) { 48 var token = component.node.token(); 49 token.offset(o += diff); 50 } 51 } 52 } 53 54 // Refresh the View: 55 // Update the value of each control bound to the same node 56 // as the updated node, but not the updated node itself 57 for (var c in xrx.view.getComponents()) { 58 var contr = xrx.view.getComponent(c); 59 if (contr.getNode().sameAs(node) && c != control.getId()) { 60 contr.setValue(update, true); 61 } else if (control.getNode().label().isDescendantOf(contr.getNode().label()) && c != control.getId() ) { 62 contr.refresh(); 63 } 64 } 65 }; 66 67 68 69 /** 70 * Handles a structural update. 71 */ 72 xrx.controller.structuralUpdate = function() { 73 74 }; 75 76 77 78