96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
define("dijit/form/_ListMouseMixin", [
|
|
"dojo/_base/declare", // declare
|
|
"dojo/_base/event", // event.stop
|
|
"dojo/touch",
|
|
"./_ListBase"
|
|
], function(declare, event, touch, _ListBase){
|
|
|
|
/*=====
|
|
var _ListBase = dijit.form._ListBase;
|
|
=====*/
|
|
|
|
// module:
|
|
// dijit/form/_ListMouseMixin
|
|
// summary:
|
|
// a mixin to handle mouse or touch events for a focus-less menu
|
|
|
|
return declare( "dijit.form._ListMouseMixin", _ListBase, {
|
|
// summary:
|
|
// a Mixin to handle mouse or touch events for a focus-less menu
|
|
// Abstract methods that must be defined externally:
|
|
// onClick: item was chosen (mousedown somewhere on the menu and mouseup somewhere on the menu)
|
|
// tags:
|
|
// private
|
|
|
|
postCreate: function(){
|
|
this.inherited(arguments);
|
|
this.connect(this.domNode, touch.press, "_onMouseDown");
|
|
this.connect(this.domNode, touch.release, "_onMouseUp");
|
|
this.connect(this.domNode, "onmouseover", "_onMouseOver");
|
|
this.connect(this.domNode, "onmouseout", "_onMouseOut");
|
|
},
|
|
|
|
_onMouseDown: function(/*Event*/ evt){
|
|
event.stop(evt);
|
|
if(this._hoveredNode){
|
|
this.onUnhover(this._hoveredNode);
|
|
this._hoveredNode = null;
|
|
}
|
|
this._isDragging = true;
|
|
this._setSelectedAttr(this._getTarget(evt));
|
|
},
|
|
|
|
_onMouseUp: function(/*Event*/ evt){
|
|
event.stop(evt);
|
|
this._isDragging = false;
|
|
var selectedNode = this._getSelectedAttr();
|
|
var target = this._getTarget(evt);
|
|
var hoveredNode = this._hoveredNode;
|
|
if(selectedNode && target == selectedNode){
|
|
this.onClick(selectedNode);
|
|
}else if(hoveredNode && target == hoveredNode){ // drag to select
|
|
this._setSelectedAttr(hoveredNode);
|
|
this.onClick(hoveredNode);
|
|
}
|
|
},
|
|
|
|
_onMouseOut: function(/*Event*/ /*===== evt ====*/){
|
|
if(this._hoveredNode){
|
|
this.onUnhover(this._hoveredNode);
|
|
if(this._getSelectedAttr() == this._hoveredNode){
|
|
this.onSelect(this._hoveredNode);
|
|
}
|
|
this._hoveredNode = null;
|
|
}
|
|
if(this._isDragging){
|
|
this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires
|
|
}
|
|
},
|
|
|
|
_onMouseOver: function(/*Event*/ evt){
|
|
if(this._cancelDrag){
|
|
var time = (new Date()).getTime();
|
|
if(time > this._cancelDrag){
|
|
this._isDragging = false;
|
|
}
|
|
this._cancelDrag = null;
|
|
}
|
|
var node = this._getTarget(evt);
|
|
if(!node){ return; }
|
|
if(this._hoveredNode != node){
|
|
if(this._hoveredNode){
|
|
this._onMouseOut({ target: this._hoveredNode });
|
|
}
|
|
if(node && node.parentNode == this.containerNode){
|
|
if(this._isDragging){
|
|
this._setSelectedAttr(node);
|
|
}else{
|
|
this._hoveredNode = node;
|
|
this.onHover(node);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
});
|