dijit
Version:
Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible u
94 lines (83 loc) • 2.51 kB
JavaScript
define([
"dojo/_base/declare", // declare
"dojo/on",
"dojo/touch",
"./_ListBase"
], function(declare, on, touch, _ListBase){
// module:
// dijit/form/_ListMouseMixin
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);
// Add flag to use normalized click handling from dojo/touch
this.domNode.dojoClick = true;
this._listConnect("click", "_onClick");
this._listConnect("mousedown", "_onMouseDown");
this._listConnect("mouseup", "_onMouseUp");
this._listConnect("mouseover", "_onMouseOver");
this._listConnect("mouseout", "_onMouseOut");
},
_onClick: function(/*Event*/ evt, /*DomNode*/ target){
this._setSelectedAttr(target, false);
if(this._deferredClick){
this._deferredClick.remove();
}
this._deferredClick = this.defer(function(){
this._deferredClick = null;
this.onClick(target);
});
},
_onMouseDown: function(/*Event*/ evt, /*DomNode*/ target){
if(this._hoveredNode){
this.onUnhover(this._hoveredNode);
this._hoveredNode = null;
}
this._isDragging = true;
this._setSelectedAttr(target, false);
},
_onMouseUp: function(/*Event*/ evt, /*DomNode*/ target){
this._isDragging = false;
var selectedNode = this.selected;
var hoveredNode = this._hoveredNode;
if(selectedNode && target == selectedNode){
this.defer(function(){
this._onClick(evt, selectedNode);
});
}else if(hoveredNode){ // drag to select
this.defer(function(){
this._onClick(evt, hoveredNode);
});
}
},
_onMouseOut: function(/*Event*/ evt, /*DomNode*/ target){
if(this._hoveredNode){
this.onUnhover(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, /*DomNode*/ target){
if(this._cancelDrag){
var time = (new Date()).getTime();
if(time > this._cancelDrag){
this._isDragging = false;
}
this._cancelDrag = null;
}
this._hoveredNode = target;
this.onHover(target);
if(this._isDragging){
this._setSelectedAttr(target, false);
}
}
});
});