1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
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);
}
}
}
}
});
});
|