|
|
|
|
@@ -367,7 +367,7 @@ Mgly.CodeMirrorDiffView = function(el, options) {
|
|
|
|
|
CodeMirror.defineExtension('centerOnCursor', function() {
|
|
|
|
|
var coords = this.cursorCoords(null, 'local');
|
|
|
|
|
this.scrollTo(null,
|
|
|
|
|
(coords.y + coords.yBot) / 2 - (this.getScrollerElement().clientHeight / 2));
|
|
|
|
|
(coords.top + coords.bottom) / 2 - (this.getScrollerElement().clientHeight / 2));
|
|
|
|
|
});
|
|
|
|
|
this.init(el, options);
|
|
|
|
|
};
|
|
|
|
|
@@ -395,6 +395,9 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
license: '',
|
|
|
|
|
width: 'auto',
|
|
|
|
|
height: 'auto',
|
|
|
|
|
cmsettings: {
|
|
|
|
|
styleSelectedText: true
|
|
|
|
|
},
|
|
|
|
|
lhs: function(setValue) { },
|
|
|
|
|
rhs: function(setValue) { },
|
|
|
|
|
loaded: function() { },
|
|
|
|
|
@@ -429,11 +432,10 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
else {
|
|
|
|
|
self.show();
|
|
|
|
|
}
|
|
|
|
|
if (this.loaded) this.loaded();
|
|
|
|
|
}
|
|
|
|
|
if (this.resized) this.resized();
|
|
|
|
|
},
|
|
|
|
|
_debug: '', //scroll,draw,calc,diff,markup,change
|
|
|
|
|
_debug: '', //scroll,draw,calc,diff,markup,change,init
|
|
|
|
|
resized: function() { }
|
|
|
|
|
}, options);
|
|
|
|
|
|
|
|
|
|
@@ -645,6 +647,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
return d.normal_form();
|
|
|
|
|
},
|
|
|
|
|
bind: function(el) {
|
|
|
|
|
this.trace('init', 'bind');
|
|
|
|
|
this.element.hide();
|
|
|
|
|
this.id = jQuery(el).attr('id');
|
|
|
|
|
try {
|
|
|
|
|
@@ -781,6 +784,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
|
|
|
|
|
// bind
|
|
|
|
|
var self = this;
|
|
|
|
|
self.trace('init', 'binding event listeners');
|
|
|
|
|
this.editor = [];
|
|
|
|
|
this.editor[this.id + '-lhs'] = CodeMirror.fromTextArea(lhstx, this.lhs_cmsettings);
|
|
|
|
|
this.editor[this.id + '-rhs'] = CodeMirror.fromTextArea(rhstx, this.rhs_cmsettings);
|
|
|
|
|
@@ -795,9 +799,6 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
if (self.settings.resize) self.settings.resize(init);
|
|
|
|
|
self.editor[self.id + '-lhs'].refresh();
|
|
|
|
|
self.editor[self.id + '-rhs'].refresh();
|
|
|
|
|
if (self.settings.autoupdate) {
|
|
|
|
|
self._changing(self.id + '-lhs', self.id + '-rhs');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
jQuery(window).on('resize.mergely',
|
|
|
|
|
function () {
|
|
|
|
|
@@ -839,19 +840,34 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
gutterClicked.call(this, 'rhs', n, ev);
|
|
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
|
|
//bind
|
|
|
|
|
// if `lhs` and `rhs` are passed in, this sets the values in each editor
|
|
|
|
|
// and kicks off the whole change pipeline.
|
|
|
|
|
var setv;
|
|
|
|
|
if (this.settings.lhs) {
|
|
|
|
|
setv = this.editor[this.id + '-lhs'].getDoc().setValue;
|
|
|
|
|
this.settings.lhs(setv.bind(this.editor[this.id + '-lhs'].getDoc()));
|
|
|
|
|
self.trace('init', 'setting lhs value');
|
|
|
|
|
this.settings.lhs(function setValue(value) {
|
|
|
|
|
this._initializing = true;
|
|
|
|
|
this.editor[this.id + '-lhs'].getDoc().setValue(value);
|
|
|
|
|
}.bind(this));
|
|
|
|
|
}
|
|
|
|
|
if (this.settings.rhs) {
|
|
|
|
|
setv = this.editor[this.id + '-rhs'].getDoc().setValue;
|
|
|
|
|
this.settings.rhs(setv.bind(this.editor[this.id + '-rhs'].getDoc()));
|
|
|
|
|
self.trace('init', 'setting rhs value');
|
|
|
|
|
this.settings.rhs(function setValue(value) {
|
|
|
|
|
this._initializing = true;
|
|
|
|
|
this.editor[this.id + '-rhs'].getDoc().setValue(value);
|
|
|
|
|
}.bind(this));
|
|
|
|
|
}
|
|
|
|
|
this.element.one('updated', () => {
|
|
|
|
|
this._initializing = false;
|
|
|
|
|
if (self.settings.loaded) {
|
|
|
|
|
self.settings.loaded();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
this.trace('init', 'bound');
|
|
|
|
|
this.editor[this.id + '-lhs'].focus();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
_scroll_to_change : function(change) {
|
|
|
|
|
_scroll_to_change: function(change) {
|
|
|
|
|
if (!change) return;
|
|
|
|
|
var self = this;
|
|
|
|
|
var led = self.editor[self.id+'-lhs'];
|
|
|
|
|
@@ -862,6 +878,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
if (change["lhs-line-to"] >= 0) {
|
|
|
|
|
led.scrollIntoView({line: change["lhs-line-to"]});
|
|
|
|
|
}
|
|
|
|
|
led.focus();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
_scrolling: function(editor_name) {
|
|
|
|
|
@@ -1022,8 +1039,9 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
this.trace('change', 'diff time', Timer.stop());
|
|
|
|
|
this.changes = Mgly.DiffParser(d.normal_form());
|
|
|
|
|
this.trace('change', 'parse time', Timer.stop());
|
|
|
|
|
if (this._current_diff === undefined && this.changes.length) {
|
|
|
|
|
// go to first difference on start-up
|
|
|
|
|
if (this._current_diff === undefined && this.changes.length && this._initializing) {
|
|
|
|
|
// go to first difference on start-up where values are provided in
|
|
|
|
|
// settings.
|
|
|
|
|
this._current_diff = 0;
|
|
|
|
|
this._scroll_to_change(this.changes[0]);
|
|
|
|
|
}
|
|
|
|
|
@@ -1034,6 +1052,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
this.trace('change', 'markup time', Timer.stop());
|
|
|
|
|
this._draw_diff(editor_name1, editor_name2, this.changes);
|
|
|
|
|
this.trace('change', 'draw time', Timer.stop());
|
|
|
|
|
this.element.trigger('updated');
|
|
|
|
|
},
|
|
|
|
|
_parse_diff: function (editor_name1, editor_name2, diff) {
|
|
|
|
|
this.trace('diff', 'diff results:\n', diff);
|
|
|
|
|
@@ -1354,17 +1373,17 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
|
|
|
|
}
|
|
|
|
|
else if (change['op'] == 'c') {
|
|
|
|
|
// apply LCS changes to each line
|
|
|
|
|
for (j = llf, k = rlf, p = 0;
|
|
|
|
|
for (j = llf, k = rlf;
|
|
|
|
|
((j >= 0) && (j <= llt)) || ((k >= 0) && (k <= rlt));
|
|
|
|
|
++j, ++k) {
|
|
|
|
|
var lhs_line, rhs_line;
|
|
|
|
|
if (k + p > rlt && this._is_change_in_view('lhs', lhsvp, change)) {
|
|
|
|
|
if (k > rlt) {
|
|
|
|
|
// lhs continues past rhs, mark lhs as deleted
|
|
|
|
|
lhs_line = led.getLine( j );
|
|
|
|
|
marktext.push([led, {line:j, ch:0}, {line:j, ch:lhs_line.length}, {className: 'mergely ch d lhs'}]);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (j + p > llt && this._is_change_in_view('rhs', rhsvp, change)) {
|
|
|
|
|
if (j > llt) {
|
|
|
|
|
// rhs continues past lhs, mark rhs as added
|
|
|
|
|
rhs_line = red.getLine( k );
|
|
|
|
|
marktext.push([red, {line:k, ch:0}, {line:k, ch:rhs_line.length}, {className: 'mergely ch a rhs'}]);
|
|
|
|
|
|