87 lines
1.8 KiB
JavaScript
87 lines
1.8 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* The highlighter can highlight/unhighlight a node, and
|
||
|
* animate the visibility of a context menu.
|
||
|
* @constructor Highlighter
|
||
|
*/
|
||
|
function Highlighter () {
|
||
|
this.locked = false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Hightlight given node and its childs
|
||
|
* @param {Node} node
|
||
|
*/
|
||
|
Highlighter.prototype.highlight = function (node) {
|
||
|
if (this.locked) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (this.node != node) {
|
||
|
// unhighlight current node
|
||
|
if (this.node) {
|
||
|
this.node.setHighlight(false);
|
||
|
}
|
||
|
|
||
|
// highlight new node
|
||
|
this.node = node;
|
||
|
this.node.setHighlight(true);
|
||
|
}
|
||
|
|
||
|
// cancel any current timeout
|
||
|
this._cancelUnhighlight();
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Unhighlight currently highlighted node.
|
||
|
* Will be done after a delay
|
||
|
*/
|
||
|
Highlighter.prototype.unhighlight = function () {
|
||
|
if (this.locked) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var me = this;
|
||
|
if (this.node) {
|
||
|
this._cancelUnhighlight();
|
||
|
|
||
|
// do the unhighlighting after a small delay, to prevent re-highlighting
|
||
|
// the same node when moving from the drag-icon to the contextmenu-icon
|
||
|
// or vice versa.
|
||
|
this.unhighlightTimer = setTimeout(function () {
|
||
|
me.node.setHighlight(false);
|
||
|
me.node = undefined;
|
||
|
me.unhighlightTimer = undefined;
|
||
|
}, 0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Cancel an unhighlight action (if before the timeout of the unhighlight action)
|
||
|
* @private
|
||
|
*/
|
||
|
Highlighter.prototype._cancelUnhighlight = function () {
|
||
|
if (this.unhighlightTimer) {
|
||
|
clearTimeout(this.unhighlightTimer);
|
||
|
this.unhighlightTimer = undefined;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Lock highlighting or unhighlighting nodes.
|
||
|
* methods highlight and unhighlight do not work while locked.
|
||
|
*/
|
||
|
Highlighter.prototype.lock = function () {
|
||
|
this.locked = true;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Unlock highlighting or unhighlighting nodes
|
||
|
*/
|
||
|
Highlighter.prototype.unlock = function () {
|
||
|
this.locked = false;
|
||
|
};
|
||
|
|
||
|
module.exports = Highlighter;
|