| 68 | |
| 69 | var updating = false; |
| 70 | function registerUpdate(dv) { |
| 71 | var edit = {from: 0, to: 0, marked: []}; |
| 72 | var orig = {from: 0, to: 0, marked: []}; |
| 73 | var debounceChange, updatingFast = false; |
| 74 | function update(mode) { |
| 75 | updating = true; |
| 76 | updatingFast = false; |
| 77 | if (mode == "full") { |
| 78 | if (dv.svg) clear(dv.svg); |
| 79 | if (dv.copyButtons) clear(dv.copyButtons); |
| 80 | clearMarks(dv.edit, edit.marked, dv.classes); |
| 81 | clearMarks(dv.orig, orig.marked, dv.classes); |
| 82 | edit.from = edit.to = orig.from = orig.to = 0; |
| 83 | } |
| 84 | ensureDiff(dv); |
| 85 | if (dv.showDifferences) { |
| 86 | updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes); |
| 87 | updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes); |
| 88 | } |
| 89 | makeConnections(dv); |
| 90 | |
| 91 | if (dv.mv.options.connect == "align") |
| 92 | alignChunks(dv); |
| 93 | updating = false; |
| 94 | } |
| 95 | function setDealign(fast) { |
| 96 | if (updating) return; |
| 97 | dv.dealigned = true; |
| 98 | set(fast); |
| 99 | } |
| 100 | function set(fast) { |
| 101 | if (updating || updatingFast) return; |
| 102 | clearTimeout(debounceChange); |
| 103 | if (fast === true) updatingFast = true; |
| 104 | debounceChange = setTimeout(update, fast === true ? 20 : 250); |
| 105 | } |
| 106 | function change(_cm, change) { |
| 107 | if (!dv.diffOutOfDate) { |
| 108 | dv.diffOutOfDate = true; |
| 109 | edit.from = edit.to = orig.from = orig.to = 0; |
| 110 | } |
| 111 | // Update faster when a line was added/removed |
| 112 | setDealign(change.text.length - 1 != change.to.line - change.from.line); |
| 113 | } |
| 114 | dv.edit.on("change", change); |
| 115 | dv.orig.on("change", change); |
| 116 | dv.edit.on("markerAdded", setDealign); |
| 117 | dv.edit.on("markerCleared", setDealign); |
| 118 | dv.orig.on("markerAdded", setDealign); |
| 119 | dv.orig.on("markerCleared", setDealign); |
| 120 | dv.edit.on("viewportChange", function() { set(false); }); |
| 121 | dv.orig.on("viewportChange", function() { set(false); }); |
| 122 | update(); |
| 123 | return update; |
| 124 | } |
| 125 | |
| 126 | function registerScroll(dv) { |
| 127 | dv.edit.on("scroll", function() { |