mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
152 lines
4.0 KiB
JavaScript
152 lines
4.0 KiB
JavaScript
|
/*!
|
||
|
* jQuery UI Mouse 1.8rc3
|
||
|
*
|
||
|
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
|
||
|
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||
|
* and GPL (GPL-LICENSE.txt) licenses.
|
||
|
*
|
||
|
* http://docs.jquery.com/UI/Mouse
|
||
|
*
|
||
|
* Depends:
|
||
|
* jquery.ui.widget.js
|
||
|
*/
|
||
|
(function($) {
|
||
|
|
||
|
$.widget("ui.mouse", {
|
||
|
options: {
|
||
|
cancel: ':input,option',
|
||
|
distance: 1,
|
||
|
delay: 0
|
||
|
},
|
||
|
_mouseInit: function() {
|
||
|
var self = this;
|
||
|
|
||
|
this.element
|
||
|
.bind('mousedown.'+this.widgetName, function(event) {
|
||
|
return self._mouseDown(event);
|
||
|
})
|
||
|
.bind('click.'+this.widgetName, function(event) {
|
||
|
if(self._preventClickEvent) {
|
||
|
self._preventClickEvent = false;
|
||
|
event.stopImmediatePropagation();
|
||
|
return false;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
this.started = false;
|
||
|
},
|
||
|
|
||
|
// TODO: make sure destroying one instance of mouse doesn't mess with
|
||
|
// other instances of mouse
|
||
|
_mouseDestroy: function() {
|
||
|
this.element.unbind('.'+this.widgetName);
|
||
|
},
|
||
|
|
||
|
_mouseDown: function(event) {
|
||
|
// don't let more than one widget handle mouseStart
|
||
|
// TODO: figure out why we have to use originalEvent
|
||
|
event.originalEvent = event.originalEvent || {};
|
||
|
if (event.originalEvent.mouseHandled) { return; }
|
||
|
|
||
|
// we may have missed mouseup (out of window)
|
||
|
(this._mouseStarted && this._mouseUp(event));
|
||
|
|
||
|
this._mouseDownEvent = event;
|
||
|
|
||
|
var self = this,
|
||
|
btnIsLeft = (event.which == 1),
|
||
|
elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
|
||
|
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
this.mouseDelayMet = !this.options.delay;
|
||
|
if (!this.mouseDelayMet) {
|
||
|
this._mouseDelayTimer = setTimeout(function() {
|
||
|
self.mouseDelayMet = true;
|
||
|
}, this.options.delay);
|
||
|
}
|
||
|
|
||
|
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
||
|
this._mouseStarted = (this._mouseStart(event) !== false);
|
||
|
if (!this._mouseStarted) {
|
||
|
event.preventDefault();
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// these delegates are required to keep context
|
||
|
this._mouseMoveDelegate = function(event) {
|
||
|
return self._mouseMove(event);
|
||
|
};
|
||
|
this._mouseUpDelegate = function(event) {
|
||
|
return self._mouseUp(event);
|
||
|
};
|
||
|
$(document)
|
||
|
.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
||
|
.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
||
|
|
||
|
// preventDefault() is used to prevent the selection of text here -
|
||
|
// however, in Safari, this causes select boxes not to be selectable
|
||
|
// anymore, so this fix is needed
|
||
|
($.browser.safari || event.preventDefault());
|
||
|
|
||
|
event.originalEvent.mouseHandled = true;
|
||
|
return true;
|
||
|
},
|
||
|
|
||
|
_mouseMove: function(event) {
|
||
|
// IE mouseup check - mouseup happened when mouse was out of window
|
||
|
if ($.browser.msie && !event.button) {
|
||
|
return this._mouseUp(event);
|
||
|
}
|
||
|
|
||
|
if (this._mouseStarted) {
|
||
|
this._mouseDrag(event);
|
||
|
return event.preventDefault();
|
||
|
}
|
||
|
|
||
|
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
||
|
this._mouseStarted =
|
||
|
(this._mouseStart(this._mouseDownEvent, event) !== false);
|
||
|
(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
|
||
|
}
|
||
|
|
||
|
return !this._mouseStarted;
|
||
|
},
|
||
|
|
||
|
_mouseUp: function(event) {
|
||
|
$(document)
|
||
|
.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
||
|
.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
||
|
|
||
|
if (this._mouseStarted) {
|
||
|
this._mouseStarted = false;
|
||
|
this._preventClickEvent = (event.target == this._mouseDownEvent.target);
|
||
|
this._mouseStop(event);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
_mouseDistanceMet: function(event) {
|
||
|
return (Math.max(
|
||
|
Math.abs(this._mouseDownEvent.pageX - event.pageX),
|
||
|
Math.abs(this._mouseDownEvent.pageY - event.pageY)
|
||
|
) >= this.options.distance
|
||
|
);
|
||
|
},
|
||
|
|
||
|
_mouseDelayMet: function(event) {
|
||
|
return this.mouseDelayMet;
|
||
|
},
|
||
|
|
||
|
// These are placeholder methods, to be overriden by extending plugin
|
||
|
_mouseStart: function(event) {},
|
||
|
_mouseDrag: function(event) {},
|
||
|
_mouseStop: function(event) {},
|
||
|
_mouseCapture: function(event) { return true; }
|
||
|
});
|
||
|
|
||
|
})(jQuery);
|