yzt
2023-05-26 de4278af2fd46705a40bac58ec01122db6b7f3d7
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
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);
            }
        }
    });
});