Differential D17919 Diff 43107 webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js
Changeset View
Changeset View
Standalone View
Standalone View
webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js
/** | /** | ||||
* @provides javelin-behavior-differential-edit-inline-comments | * @provides javelin-behavior-differential-edit-inline-comments | ||||
* @requires javelin-behavior | * @requires javelin-behavior | ||||
* javelin-stratcom | * javelin-stratcom | ||||
* javelin-dom | * javelin-dom | ||||
* javelin-util | * javelin-util | ||||
* javelin-vector | * javelin-vector | ||||
*/ | */ | ||||
JX.behavior('differential-edit-inline-comments', function(config) { | JX.behavior('differential-edit-inline-comments', function(config) { | ||||
var selecting = false; | var selecting = false; | ||||
var reticle = JX.$N('div', {className: 'differential-reticle'}); | var reticle = JX.$N('div', {className: 'differential-reticle'}); | ||||
var old_cells = []; | |||||
JX.DOM.hide(reticle); | JX.DOM.hide(reticle); | ||||
var origin = null; | var origin = null; | ||||
var target = null; | var target = null; | ||||
var root = null; | var root = null; | ||||
var changeset = null; | var changeset = null; | ||||
var editor = null; | |||||
function updateReticleForComment(e) { | |||||
root = e.getNode('differential-changeset'); | |||||
if (!root) { | |||||
return; | |||||
} | |||||
var data = e.getNodeData('differential-inline-comment'); | |||||
var change = e.getNodeData('differential-changeset'); | |||||
var id_part = data.on_right ? change.right : change.left; | |||||
var new_part = data.isNewFile ? 'N' : 'O'; | |||||
var prefix = 'C' + id_part + new_part + 'L'; | |||||
origin = JX.$(prefix + data.number); | |||||
target = JX.$(prefix + (parseInt(data.number, 10) + | |||||
parseInt(data.length, 10))); | |||||
updateReticle(); | |||||
} | |||||
function updateReticle() { | function updateReticle() { | ||||
JX.DOM.getContentFrame().appendChild(reticle); | JX.DOM.getContentFrame().appendChild(reticle); | ||||
var top = origin; | var top = origin; | ||||
var bot = target; | var bot = target; | ||||
if (JX.$V(top).y > JX.$V(bot).y) { | if (JX.$V(top).y > JX.$V(bot).y) { | ||||
var tmp = top; | var tmp = top; | ||||
top = bot; | top = bot; | ||||
Show All 28 Lines | function updateReticle() { | ||||
var bpos = JX.$V(bot) | var bpos = JX.$V(bot) | ||||
.add(JX.Vector.getAggregateScrollForNode(bot)); | .add(JX.Vector.getAggregateScrollForNode(bot)); | ||||
dim.y = (bpos.y - pos.y) + JX.Vector.getDim(bot).y; | dim.y = (bpos.y - pos.y) + JX.Vector.getDim(bot).y; | ||||
pos.setPos(reticle); | pos.setPos(reticle); | ||||
dim.setDim(reticle); | dim.setDim(reticle); | ||||
JX.DOM.show(reticle); | JX.DOM.show(reticle); | ||||
// Find all the cells in the same row position between the top and bottom | |||||
// cell, so we can highlight them. | |||||
var seq = 0; | |||||
var row = top.parentNode; | |||||
for (seq = 0; seq < row.childNodes.length; seq++) { | |||||
if (row.childNodes[seq] == top) { | |||||
break; | |||||
} | |||||
} | |||||
var cells = []; | |||||
while (true) { | |||||
cells.push(row.childNodes[seq]); | |||||
if (row.childNodes[seq] == bot) { | |||||
break; | |||||
} | |||||
row = row.nextSibling; | |||||
} | |||||
setSelectedCells(cells); | |||||
} | |||||
function setSelectedCells(new_cells) { | |||||
updateSelectedCellsClass(old_cells, false); | |||||
updateSelectedCellsClass(new_cells, true); | |||||
old_cells = new_cells; | |||||
} | |||||
function updateSelectedCellsClass(cells, selected) { | |||||
for (var ii = 0; ii < cells.length; ii++) { | |||||
JX.DOM.alterClass(cells[ii], 'selected', selected); | |||||
} | |||||
} | } | ||||
function hideReticle() { | function hideReticle() { | ||||
JX.DOM.hide(reticle); | JX.DOM.hide(reticle); | ||||
setSelectedCells([]); | |||||
} | } | ||||
function isOnRight(node) { | function isOnRight(node) { | ||||
return node.parentNode.firstChild != node; | return node.parentNode.firstChild != node; | ||||
} | } | ||||
function isNewFile(node) { | function isNewFile(node) { | ||||
var data = JX.Stratcom.getData(root); | var data = JX.Stratcom.getData(root); | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | JX.behavior('differential-edit-inline-comments', function(config) { | ||||
JX.Stratcom.listen( | JX.Stratcom.listen( | ||||
['mouseover', 'mouseout'], | ['mouseover', 'mouseout'], | ||||
['differential-changeset', 'tag:th'], | ['differential-changeset', 'tag:th'], | ||||
function(e) { | function(e) { | ||||
if (e.getIsTouchEvent()) { | if (e.getIsTouchEvent()) { | ||||
return; | return; | ||||
} | } | ||||
if (editor) { | |||||
// Don't update the reticle if we're editing a comment, since this | |||||
// would be distracting and we want to keep the lines corresponding | |||||
// to the comment highlighted during the edit. | |||||
return; | |||||
} | |||||
if (getRowNumber(e.getTarget()) === undefined) { | if (getRowNumber(e.getTarget()) === undefined) { | ||||
// Don't update the reticle if this "<th />" doesn't correspond to a | // Don't update the reticle if this "<th />" doesn't correspond to a | ||||
// line number. For instance, this may be a dead line number, like the | // line number. For instance, this may be a dead line number, like the | ||||
// empty line numbers on the left hand side of a newly added file. | // empty line numbers on the left hand side of a newly added file. | ||||
return; | return; | ||||
} | } | ||||
if (selecting) { | if (selecting) { | ||||
Show All 33 Lines | function(e) { | ||||
updateReticle(); | updateReticle(); | ||||
} | } | ||||
}); | }); | ||||
JX.Stratcom.listen( | JX.Stratcom.listen( | ||||
'mouseup', | 'mouseup', | ||||
null, | null, | ||||
function(e) { | function(e) { | ||||
if (editor || !selecting) { | if (!selecting) { | ||||
return; | return; | ||||
} | } | ||||
var o = getRowNumber(origin); | var o = getRowNumber(origin); | ||||
var t = getRowNumber(target); | var t = getRowNumber(target); | ||||
var insert; | var insert; | ||||
var len; | var len; | ||||
Show All 27 Lines | JX.behavior('differential-edit-inline-comments', function(config) { | ||||
JX.Stratcom.listen( | JX.Stratcom.listen( | ||||
['mouseover', 'mouseout'], | ['mouseover', 'mouseout'], | ||||
'differential-inline-comment', | 'differential-inline-comment', | ||||
function(e) { | function(e) { | ||||
if (e.getIsTouchEvent()) { | if (e.getIsTouchEvent()) { | ||||
return; | return; | ||||
} | } | ||||
if (e.getType() == 'mouseout') { | |||||
hideReticle(); | hideReticle(); | ||||
} else { | |||||
updateReticleForComment(e); | |||||
} | |||||
}); | }); | ||||
}); | }); |