forked from lxm_front/Mergely
Added keyboard shortcuts à la WinMerge:
Alt + Up or Down arrow : go to previous or next difference Alt + Left or Right arrow : merge difference using right or left content Shift, Ctr, Alt or Meta keys can be used indifferntly (to cope with browser's idiosyncratics). Event handler is now attached to text editor. This is clearly to review (does not capture all page events and too intrusive). New state "current_diff" has been added. Need to scroll the editor to center it on currently active state (scrollToChange function to add).
This commit is contained in:
239
lib/mergely.js
239
lib/mergely.js
@@ -5,7 +5,7 @@ Mgly.Timer = function(){
|
||||
self.start = function() { self.t0 = new Date().getTime(); }
|
||||
self.stop = function() {
|
||||
var t1 = new Date().getTime();
|
||||
var d = t1 - self.t0;
|
||||
var d = t1 - self.t0;
|
||||
self.t0 = t1;
|
||||
return d;
|
||||
}
|
||||
@@ -172,11 +172,11 @@ jQuery.extend(Mgly.diff.prototype, {
|
||||
var change = 'c';
|
||||
if (item.lhs_deleted_count == 0 && item.rhs_inserted_count > 0) change = 'a';
|
||||
else if (item.lhs_deleted_count > 0 && item.rhs_inserted_count == 0) change = 'd';
|
||||
|
||||
|
||||
if (item.lhs_deleted_count == 1) lhs_str = item.lhs_start + 1;
|
||||
else if (item.lhs_deleted_count == 0) lhs_str = item.lhs_start;
|
||||
else lhs_str = (item.lhs_start + 1) + ',' + (item.lhs_start + item.lhs_deleted_count);
|
||||
|
||||
|
||||
if (item.rhs_inserted_count == 1) rhs_str = item.rhs_start + 1;
|
||||
else if (item.rhs_inserted_count == 0) rhs_str = item.rhs_start;
|
||||
else rhs_str = (item.rhs_start + 1) + ',' + (item.rhs_start + item.rhs_inserted_count);
|
||||
@@ -369,7 +369,7 @@ jQuery.extend(Mgly.mergely.prototype, {
|
||||
Mgly.CodeMirrorDiffView = function(el, options) {
|
||||
CodeMirror.defineExtension('centerOnCursor', function() {
|
||||
var coords = this.cursorCoords(null, 'local');
|
||||
this.scrollTo(null,
|
||||
this.scrollTo(null,
|
||||
(coords.y + coords.yBot) / 2 - (this.getScrollerElement().clientHeight / 2));
|
||||
});
|
||||
this.init(el, options);
|
||||
@@ -384,13 +384,15 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
lcs: true,
|
||||
sidebar: true,
|
||||
viewport: false,
|
||||
ignorews: false,
|
||||
ignorews: true,
|
||||
fadein: 'fast',
|
||||
editor_width: '400px',
|
||||
editor_width: '650px',
|
||||
editor_height: '400px',
|
||||
resize_timeout: 500,
|
||||
change_timeout: 150,
|
||||
fgcolor: {a:'#4ba3fa',c:'#a3a3a3',d:'#ff7f7f'},
|
||||
current_diff: 0, // currently active difference, in 0 .. changes.length range.
|
||||
fgcolor: {a:'#4ba3fa',c:'#a3a3a3',d:'#ff7f7f', // color for differences (soft color)
|
||||
ca:'#4b73ff',cc:'#737373',cd:'#ff4f4f'}, // color for currently active difference (bright color)
|
||||
bgcolor: '#eee',
|
||||
vpcolor: 'rgba(0, 0, 200, 0.5)',
|
||||
lhs: function(setValue) { },
|
||||
@@ -443,15 +445,15 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
this.lhs_cmsettings = {};
|
||||
this.rhs_cmsettings = {};
|
||||
|
||||
|
||||
// save this element for faster queries
|
||||
this.element = jQuery(el);
|
||||
|
||||
|
||||
// save options if there are any
|
||||
if (options && options.cmsettings) jQuery.extend(this.lhs_cmsettings, cmsettings, options.cmsettings, options.lhs_cmsettings);
|
||||
if (options && options.cmsettings) jQuery.extend(this.rhs_cmsettings, cmsettings, options.cmsettings, options.rhs_cmsettings);
|
||||
if (options) jQuery.extend(this.settings, options);
|
||||
|
||||
|
||||
// bind if the element is destroyed
|
||||
this.element.bind('destroyed', jQuery.proxy(this.teardown, this));
|
||||
|
||||
@@ -565,7 +567,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
this.prev_query[side] = query;
|
||||
}
|
||||
var cursor = this.cursor[this.id];
|
||||
|
||||
|
||||
if (cursor[direction]()) {
|
||||
editor.setSelection(cursor.from(), cursor.to());
|
||||
}
|
||||
@@ -612,7 +614,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
this.merge_rhs_button = jQuery(merge_rhs_button);
|
||||
this.merge_lhs_button = jQuery(merge_lhs_button);
|
||||
|
||||
|
||||
// create the textarea and canvas elements
|
||||
jQuery(this.element).append(jQuery('<div class="mergely-margin" style="height: ' + height + '"><canvas id="' + this.id + '-lhs-margin" width="8px" height="' + height + '"></canvas></div>'));
|
||||
jQuery(this.element).append(jQuery('<div style="position:relative;width:' + width + '; height:' + height + '" id="' + this.id + '-editor-lhs" class="mergely-column"><textarea style="" id="' + this.id + '-lhs"></textarea></div>'));
|
||||
@@ -677,7 +679,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
sz(true);
|
||||
}
|
||||
//bind
|
||||
|
||||
|
||||
if (this.settings.lhs) {
|
||||
var setv = this.editor[this.id + '-lhs'].getDoc().setValue;
|
||||
this.settings.lhs(setv.bind(this.editor[this.id + '-lhs'].getDoc()));
|
||||
@@ -686,8 +688,77 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var setv = this.editor[this.id + '-rhs'].getDoc().setValue;
|
||||
this.settings.rhs(setv.bind(this.editor[this.id + '-rhs'].getDoc()));
|
||||
}
|
||||
|
||||
// register WinMerge style key bindings
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.key
|
||||
var self = this;
|
||||
el.addEventListener("keydown", function(evt) {
|
||||
if (evt.defaultPrevented)
|
||||
;//return; // Should do nothing if the key event was already consumed.
|
||||
|
||||
if (!evt.shiftKey && !evt.altKey && !evt.ctrlKey && !evt.metaKey)
|
||||
return; // if none of Shift, Alt, Ctrl or Meta key is used then do nothing
|
||||
|
||||
var shift_key = 16, alt_key = 17, ctrlKey = 18, metaKey = 91; // 13, 27 ?
|
||||
var up_arrow = 38, down_arrow = 40, left_arrow = 37, right_arrow = 39;
|
||||
if (!evt.key) {
|
||||
// use keyCode as key
|
||||
evt.key = evt.which;
|
||||
}
|
||||
|
||||
switch (evt.key) {
|
||||
case "ArrowDown":
|
||||
case down_arrow:
|
||||
self.settings.current_diff++;
|
||||
self._changed(self.id + '-lhs', self.id + '-rhs');
|
||||
break;
|
||||
case "ArrowUp":
|
||||
case up_arrow:
|
||||
self.settings.current_diff--;
|
||||
self.settings.current_diff = Math.max(self.settings.current_diff, 0);
|
||||
self._changed(self.id + '-lhs', self.id + '-rhs');
|
||||
break;
|
||||
case "ArrowLeft":
|
||||
case left_arrow:
|
||||
// !! recalculating the changes !!
|
||||
var editor_name1 = self.id + '-lhs';
|
||||
var editor_name2 = self.id + '-rhs';
|
||||
var lhs = self.editor[editor_name1].getValue();
|
||||
var rhs = self.editor[editor_name2].getValue();
|
||||
var d = new Mgly.diff(lhs, rhs, self.settings);
|
||||
var changes = Mgly.DiffParser(d.normal_form());
|
||||
|
||||
var change = changes[self.settings.current_diff];
|
||||
self._merge_change(change, "rhs", "lhs");
|
||||
break;
|
||||
case "ArrowRight":
|
||||
case right_arrow:
|
||||
// !! recalculating the changes !!
|
||||
var editor_name1 = self.id + '-lhs';
|
||||
var editor_name2 = self.id + '-rhs';
|
||||
var lhs = self.editor[editor_name1].getValue();
|
||||
var rhs = self.editor[editor_name2].getValue();
|
||||
var d = new Mgly.diff(lhs, rhs, self.settings);
|
||||
var changes = Mgly.DiffParser(d.normal_form());
|
||||
|
||||
var change = changes[self.settings.current_diff];
|
||||
self._merge_change(change, "lhs", "rhs");
|
||||
break;
|
||||
case "Enter":
|
||||
// Do something for "enter" or "return" key press.
|
||||
break;
|
||||
case "Escape":
|
||||
// Do something for "esc" key press.
|
||||
break;
|
||||
default:
|
||||
return; // Quit when this doesn't handle the key event.
|
||||
}
|
||||
|
||||
// Consume the event for suppressing "double action".
|
||||
//event.preventDefault();
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
_scrolling: function(editor_name) {
|
||||
if (this._skipscroll[editor_name] === true) {
|
||||
// scrolling one side causes the other to event - ignore it
|
||||
@@ -702,23 +773,23 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var midline = this.editor[editor_name].coordsChar({left:0, top:this.midway});
|
||||
var top_to = scroller.scrollTop();
|
||||
var left_to = scroller.scrollLeft();
|
||||
|
||||
|
||||
this.trace('scroll', 'side', editor_name);
|
||||
this.trace('scroll', 'midway', this.midway);
|
||||
this.trace('scroll', 'midline', midline);
|
||||
this.trace('scroll', 'top_to', top_to);
|
||||
this.trace('scroll', 'left_to', left_to);
|
||||
|
||||
|
||||
var editor_name1 = this.id + '-lhs';
|
||||
var editor_name2 = this.id + '-rhs';
|
||||
|
||||
|
||||
for (var name in this.editor) {
|
||||
if (!this.editor.hasOwnProperty(name)) continue;
|
||||
if (editor_name == name) continue; //same editor
|
||||
var this_side = editor_name.replace(this.id + '-', '');
|
||||
var other_side = name.replace(this.id + '-', '');
|
||||
var top_adjust = 0;
|
||||
|
||||
|
||||
// find the last change that is less than or within the midway point
|
||||
// do not move the rhs until the lhs end point is >= the rhs end point.
|
||||
var last_change = null;
|
||||
@@ -736,14 +807,14 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
force_scroll = true;
|
||||
}
|
||||
else {
|
||||
top_adjust +=
|
||||
(change[this_side+'-y-end'] - change[this_side+'-y-start']) -
|
||||
top_adjust +=
|
||||
(change[this_side+'-y-end'] - change[this_side+'-y-start']) -
|
||||
(change[other_side+'-y-end'] - change[other_side+'-y-start']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var vp = this.editor[name].getViewport();
|
||||
var scroll = true;
|
||||
if (last_change) {
|
||||
@@ -761,7 +832,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
scroller.scrollTop(top_to - top_adjust).scrollLeft(left_to);
|
||||
}
|
||||
else this.trace('scroll', 'not scrolling other side');
|
||||
|
||||
|
||||
if (this.settings.autoupdate) {
|
||||
var timer = new Mgly.Timer();
|
||||
this._calculate_offsets(editor_name1, editor_name2, this.changes);
|
||||
@@ -814,12 +885,12 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
});
|
||||
}
|
||||
self.chfns[name] = [];
|
||||
|
||||
|
||||
var ex = this._draw_info(this.id + '-lhs', this.id + '-rhs');
|
||||
var ctx_lhs = ex.clhs.get(0).getContext('2d');
|
||||
var ctx_rhs = ex.crhs.get(0).getContext('2d');
|
||||
var ctx = ex.dcanvas.getContext('2d');
|
||||
|
||||
|
||||
ctx_lhs.beginPath();
|
||||
ctx_lhs.fillStyle = this.settings.bgcolor;
|
||||
ctx_lhs.strokeStyle = '#888';
|
||||
@@ -831,7 +902,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
ctx_rhs.strokeStyle = '#888';
|
||||
ctx_rhs.fillRect(0, 0, 6.5, ex.visible_page_height);
|
||||
ctx_rhs.strokeRect(0, 0, 6.5, ex.visible_page_height);
|
||||
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.fillStyle = '#fff';
|
||||
ctx.fillRect(0, 0, this.draw_mid_width, ex.visible_page_height);
|
||||
@@ -903,16 +974,16 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var saveY = this.editor[editor_name1].getScrollInfo().top;
|
||||
// temporarily scroll to top
|
||||
this.editor[editor_name1].scrollTo(null, 0);
|
||||
|
||||
// this is the distance from the top of the screen to the top of the
|
||||
|
||||
// this is the distance from the top of the screen to the top of the
|
||||
// content of the first codemirror editor
|
||||
var topnode = jQuery('#' + this.id + ' .CodeMirror-measure').first();
|
||||
var top_offset = topnode.offset().top - 4;
|
||||
if(!top_offset) return false;
|
||||
|
||||
|
||||
// restore editor's scroll position
|
||||
this.editor[editor_name1].scrollTo(null, saveY);
|
||||
|
||||
|
||||
this.draw_top_offset = 0.5 - top_offset;
|
||||
return true;
|
||||
},
|
||||
@@ -942,10 +1013,10 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var lhschc = this.editor[editor_name1].charCoords({line: 0});
|
||||
var rhschc = this.editor[editor_name2].charCoords({line: 0});
|
||||
var vp = this._get_viewport(editor_name1, editor_name2);
|
||||
|
||||
|
||||
for (var i = 0; i < changes.length; ++i) {
|
||||
var change = changes[i];
|
||||
|
||||
|
||||
if (!this.settings.sidebar && !this._is_change_in_view(vp, change)) {
|
||||
// if the change is outside the viewport, skip
|
||||
delete change['lhs-y-start'];
|
||||
@@ -958,7 +1029,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
|
||||
var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
|
||||
var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
|
||||
|
||||
|
||||
var ls, le, rs, re;
|
||||
if (this.editor[editor_name1].getOption('lineWrapping') || this.editor[editor_name1].getOption('lineWrapping')) {
|
||||
// If using line-wrapping, we must get the height of the line
|
||||
@@ -969,7 +1040,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var tle = this.editor[editor_name1].cursorCoords({line: llt, ch: 0}, 'page');
|
||||
var lhseh = this.editor[editor_name1].getLineHandle(llt);
|
||||
le = { top: tle.top, bottom: tle.top + lhseh.height };
|
||||
|
||||
|
||||
var tls = this.editor[editor_name2].cursorCoords({line: rlf, ch: 0}, 'page');
|
||||
var rhssh = this.editor[editor_name2].getLineHandle(rlf);
|
||||
rs = { top: tls.top, bottom: tls.top + rhssh.height };
|
||||
@@ -980,24 +1051,24 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
else {
|
||||
// If not using line-wrapping, we can calculate the line position
|
||||
ls = {
|
||||
top: lhschc.top + llf * this.em_height,
|
||||
ls = {
|
||||
top: lhschc.top + llf * this.em_height,
|
||||
bottom: lhschc.bottom + llf * this.em_height + 2
|
||||
};
|
||||
le = {
|
||||
top: lhschc.top + llt * this.em_height,
|
||||
top: lhschc.top + llt * this.em_height,
|
||||
bottom: lhschc.bottom + llt * this.em_height + 2
|
||||
};
|
||||
rs = {
|
||||
top: rhschc.top + rlf * this.em_height,
|
||||
top: rhschc.top + rlf * this.em_height,
|
||||
bottom: rhschc.bottom + rlf * this.em_height + 2
|
||||
};
|
||||
re = {
|
||||
top: rhschc.top + rlt * this.em_height,
|
||||
top: rhschc.top + rlt * this.em_height,
|
||||
bottom: rhschc.bottom + rlt * this.em_height + 2
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
if (change['op'] == 'a') {
|
||||
// adds (right), normally start from the end of the lhs,
|
||||
// except for the case when the start of the rhs is 0
|
||||
@@ -1036,7 +1107,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
},
|
||||
_markup_changes: function (editor_name1, editor_name2, changes) {
|
||||
jQuery('.merge-button').remove(); // clear
|
||||
|
||||
|
||||
var self = this;
|
||||
var led = this.editor[editor_name1];
|
||||
var red = this.editor[editor_name2];
|
||||
@@ -1049,11 +1120,11 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
|
||||
var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
|
||||
var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
|
||||
|
||||
|
||||
var clazz = ['mergely', 'lhs', change['op'], 'cid-' + i];
|
||||
led.addLineClass(llf, 'background', 'start');
|
||||
led.addLineClass(llt, 'background', 'end');
|
||||
|
||||
|
||||
if (llf == 0 && llt == 0 && rlf == 0) {
|
||||
led.addLineClass(llf, 'background', clazz.join(' '));
|
||||
led.addLineClass(llf, 'background', 'first');
|
||||
@@ -1065,7 +1136,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
led.addLineClass(j, 'background', clazz.join(' '));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!red.getOption('readOnly')) {
|
||||
// add widgets to lhs, if rhs is not read only
|
||||
var rhs_button = self.merge_rhs_button.clone();
|
||||
@@ -1081,7 +1152,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
});
|
||||
|
||||
var vp = this._get_viewport(editor_name1, editor_name2);
|
||||
|
||||
|
||||
this.trace('change', 'markup lhs-editor time', timer.stop());
|
||||
red.operation(function() {
|
||||
for (var i = 0; i < changes.length; ++i) {
|
||||
@@ -1090,16 +1161,16 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
|
||||
var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
|
||||
var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
|
||||
|
||||
|
||||
if (!self._is_change_in_view(vp, change)) {
|
||||
// if the change is outside the viewport, skip
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
var clazz = ['mergely', 'rhs', change['op'], 'cid-' + i];
|
||||
red.addLineClass(rlf, 'background', 'start');
|
||||
red.addLineClass(rlt, 'background', 'end');
|
||||
|
||||
|
||||
if (rlf == 0 && rlt == 0 && llf == 0) {
|
||||
red.addLineClass(rlf, 'background', clazz.join(' '));
|
||||
red.addLineClass(rlf, 'background', 'first');
|
||||
@@ -1126,7 +1197,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
});
|
||||
this.trace('change', 'markup rhs-editor time', timer.stop());
|
||||
|
||||
|
||||
// mark text deleted, LCS changes
|
||||
var marktext = [];
|
||||
for (var i = 0; this.settings.lcs && i < changes.length; ++i) {
|
||||
@@ -1135,7 +1206,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
|
||||
var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
|
||||
var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
|
||||
|
||||
|
||||
if (!this._is_change_in_view(vp, change)) {
|
||||
// if the change is outside the viewport, skip
|
||||
continue;
|
||||
@@ -1151,7 +1222,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
else if (change['op'] == 'c') {
|
||||
// apply LCS changes to each line
|
||||
for (var j = llf, k = rlf, p = 0;
|
||||
for (var j = llf, k = rlf, p = 0;
|
||||
((j >= 0) && (j <= llt)) || ((k >= 0) && (k <= rlt));
|
||||
++j, ++k) {
|
||||
if (k + p > rlt) {
|
||||
@@ -1172,7 +1243,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
var lhs_stop = { line: -1, ch: -1 };
|
||||
var rhs_start = { line: -1, ch: -1 };
|
||||
var rhs_stop = { line: -1, ch: -1 };
|
||||
|
||||
|
||||
var lcs = new Mgly.LCS(lhs_line, rhs_line);
|
||||
lcs.diff(
|
||||
function (from, to) {//added
|
||||
@@ -1186,7 +1257,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
}
|
||||
this.trace('change', 'LCS marktext time', timer.stop());
|
||||
|
||||
|
||||
// mark changes outside closure
|
||||
led.operation(function() {
|
||||
// apply lhs markup
|
||||
@@ -1205,7 +1276,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
}
|
||||
});
|
||||
this.trace('change', 'LCS markup time', timer.stop());
|
||||
|
||||
|
||||
// merge buttons
|
||||
var ed = {lhs:led, rhs:red};
|
||||
jQuery('.merge-button').on('click', function(ev){
|
||||
@@ -1230,12 +1301,24 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
});
|
||||
var change = self.changes[cid];
|
||||
|
||||
var line = {lhs: ed['lhs'].lineInfo(llt), rhs: ed['rhs'].lineInfo(rlt)};
|
||||
|
||||
// line below not used
|
||||
//var line = {lhs: ed['lhs'].lineInfo(llt), rhs: ed['rhs'].lineInfo(rlt)};
|
||||
|
||||
self._merge_change(change, side, oside);
|
||||
});
|
||||
this.trace('change', 'markup buttons time', timer.stop());
|
||||
},
|
||||
_merge_change : function(change, side, oside) {
|
||||
var editor_name1 = this.id + '-lhs';
|
||||
var editor_name2 = this.id + '-rhs';
|
||||
var led = this.editor[editor_name1];
|
||||
var red = this.editor[editor_name2];
|
||||
var ed = {lhs:led, rhs:red};
|
||||
|
||||
var text = ed[side].getRange(
|
||||
CodeMirror.Pos(change[side + '-line-from'], 0),
|
||||
CodeMirror.Pos(change[side + '-line-to'] + 1, 0));
|
||||
|
||||
|
||||
if (change['op'] == 'c') {
|
||||
ed[oside].replaceRange(text,
|
||||
CodeMirror.Pos(change[oside + '-line-from'], 0),
|
||||
@@ -1272,8 +1355,6 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
ed['lhs'].setValue(ed['lhs'].getValue());
|
||||
ed['rhs'].setValue(ed['rhs'].getValue());
|
||||
return false;
|
||||
});
|
||||
this.trace('change', 'markup buttons time', timer.stop());
|
||||
},
|
||||
_draw_info: function(editor_name1, editor_name2) {
|
||||
var visible_page_height = jQuery(this.editor[editor_name1].getScrollerElement()).height();
|
||||
@@ -1311,14 +1392,14 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
this.trace('draw', 'visible_page_ratio', ex.visible_page_ratio);
|
||||
this.trace('draw', 'lhs-scroller-top', ex.lhs_scroller.scrollTop());
|
||||
this.trace('draw', 'rhs-scroller-top', ex.rhs_scroller.scrollTop());
|
||||
|
||||
|
||||
jQuery.each(jQuery.find('#' + this.id + ' canvas'), function () {
|
||||
jQuery(this).get(0).height = ex.visible_page_height;
|
||||
});
|
||||
|
||||
|
||||
ex.clhs.unbind('click');
|
||||
ex.crhs.unbind('click');
|
||||
|
||||
|
||||
ctx_lhs.beginPath();
|
||||
ctx_lhs.fillStyle = this.settings.bgcolor;
|
||||
ctx_lhs.strokeStyle = '#888';
|
||||
@@ -1344,41 +1425,41 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
this.trace('draw', 'marker calculated', lhs_y_start, lhs_y_end, rhs_y_start, rhs_y_end);
|
||||
|
||||
ctx_lhs.beginPath();
|
||||
ctx_lhs.fillStyle = this.settings.fgcolor[change['op']];
|
||||
ctx_lhs.fillStyle = this.settings.fgcolor[(this.settings.current_diff==i?'c':'')+change['op']];
|
||||
ctx_lhs.strokeStyle = '#000';
|
||||
ctx_lhs.lineWidth = 0.5;
|
||||
ctx_lhs.fillRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
|
||||
ctx_lhs.strokeRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
|
||||
|
||||
ctx_rhs.beginPath();
|
||||
ctx_rhs.fillStyle = this.settings.fgcolor[change['op']];
|
||||
ctx_rhs.fillStyle = this.settings.fgcolor[(this.settings.current_diff==i?'c':'')+change['op']];
|
||||
ctx_rhs.strokeStyle = '#000';
|
||||
ctx_rhs.lineWidth = 0.5;
|
||||
ctx_rhs.fillRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
|
||||
ctx_rhs.strokeRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
|
||||
|
||||
|
||||
if (!this._is_change_in_view(vp, change)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
lhs_y_start = change['lhs-y-start'];
|
||||
lhs_y_end = change['lhs-y-end'];
|
||||
rhs_y_start = change['rhs-y-start'];
|
||||
rhs_y_end = change['rhs-y-end'];
|
||||
|
||||
|
||||
var radius = 3;
|
||||
|
||||
|
||||
// draw left box
|
||||
ctx.beginPath();
|
||||
ctx.strokeStyle = this.settings.fgcolor[change['op']];
|
||||
ctx.lineWidth = 1;
|
||||
|
||||
ctx.strokeStyle = this.settings.fgcolor[(this.settings.current_diff==i?'c':'')+change['op']];
|
||||
ctx.lineWidth = (this.settings.current_diff==i) ? 1.5 : 1;
|
||||
|
||||
var rectWidth = this.draw_lhs_width;
|
||||
var rectHeight = lhs_y_end - lhs_y_start - 1;
|
||||
var rectX = this.draw_lhs_min;
|
||||
var rectY = lhs_y_start;
|
||||
// top and top top-right corner
|
||||
|
||||
|
||||
// draw left box
|
||||
ctx.moveTo(rectX, rectY);
|
||||
if (navigator.appName == 'Microsoft Internet Explorer') {
|
||||
@@ -1399,7 +1480,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
ctx.lineTo(rectX, rectY + rectHeight);
|
||||
}
|
||||
ctx.stroke();
|
||||
|
||||
|
||||
rectWidth = this.draw_rhs_width;
|
||||
rectHeight = rhs_y_end - rhs_y_start - 1;
|
||||
rectX = this.draw_rhs_max;
|
||||
@@ -1423,7 +1504,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
ctx.lineTo(rectX, rectY + rectHeight);
|
||||
}
|
||||
ctx.stroke();
|
||||
|
||||
|
||||
// connect boxes
|
||||
var cx = this.draw_lhs_min + this.draw_lhs_width;
|
||||
var cy = lhs_y_start + (lhs_y_end + 1 - lhs_y_start) / 2.0;
|
||||
@@ -1446,7 +1527,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
// visible window feedback
|
||||
ctx_lhs.fillStyle = this.settings.vpcolor;
|
||||
ctx_rhs.fillStyle = this.settings.vpcolor;
|
||||
|
||||
|
||||
var lto = ex.clhs.height() * ex.visible_page_ratio;
|
||||
var lfrom = (ex.lhs_scroller.scrollTop() / ex.gutter_height) * ex.clhs.height();
|
||||
var rto = ex.crhs.height() * ex.visible_page_ratio;
|
||||
@@ -1457,10 +1538,10 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
this.trace('draw', 'visible_page_ratio', ex.visible_page_ratio);
|
||||
this.trace('draw', 'lhs from', lfrom, 'lhs to', lto);
|
||||
this.trace('draw', 'rhs from', rfrom, 'rhs to', rto);
|
||||
|
||||
|
||||
ctx_lhs.fillRect(1.5, lfrom, 4.5, lto);
|
||||
ctx_rhs.fillRect(1.5, rfrom, 4.5, rto);
|
||||
|
||||
|
||||
ex.clhs.click(function (ev) {
|
||||
var y = ev.pageY - ex.lhs_xyoffset.top - (lto / 2);
|
||||
var sto = Math.max(0, (y / mcanvas_lhs.height) * ex.lhs_scroller.get(0).scrollHeight);
|
||||
@@ -1468,7 +1549,7 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
});
|
||||
ex.crhs.click(function (ev) {
|
||||
var y = ev.pageY - ex.rhs_xyoffset.top - (rto / 2);
|
||||
var sto = Math.max(0, (y / mcanvas_rhs.height) * ex.rhs_scroller.get(0).scrollHeight);
|
||||
var sto = Math.max(0, (y / mcanvas_rhs.height) * ex.rhs_scroller.get(0).scrollHeight);
|
||||
ex.rhs_scroller.scrollTop(sto);
|
||||
});
|
||||
},
|
||||
@@ -1476,14 +1557,14 @@ jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
|
||||
if(this.settings._debug.indexOf(name) >= 0) {
|
||||
arguments[0] = name+':';
|
||||
console.log([].slice.apply(arguments));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
jQuery.pluginMaker = function(plugin) {
|
||||
// add the plugin function as a jQuery plugin
|
||||
jQuery.fn[plugin.prototype.name] = function(options) {
|
||||
// get the arguments
|
||||
// get the arguments
|
||||
var args = jQuery.makeArray(arguments),
|
||||
after = args.slice(1);
|
||||
var rc = undefined;
|
||||
|
||||
Reference in New Issue
Block a user