📄 atlasuidragdrop.js
字号:
//-----------------------------------------------------------------------
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------
// AtlasUIDragDrop.js
// Atlas Drag and Drop UI Framework.
Web.UI._DragDropManager = function() {
var _instance;
this._getInstance = function() {
if (_instance == null) {
if (Web.Application.get_type() == Web.ApplicationType.InternetExplorer) {
_instance = new Web.UI.IEDragDropManager();
}
else {
_instance = new Web.UI.GenericDragDropManager();
}
_instance.initialize();
}
return _instance;
}
this.startDragDrop = function(dragSource, dragVisual, context) {
this._getInstance().startDragDrop(dragSource, dragVisual, context);
}
this.registerDropTarget = function(target) {
this._getInstance().registerDropTarget(target);
}
this.unregisterDropTarget = function(target) {
this._getInstance().unregisterDropTarget(target);
}
}
Web.UI.DragDropManager = new Web.UI._DragDropManager();
Web.UI.IDragSource = function() {
this.get_dataType = Function.abstractMethod;
this.get_data = Function.abstractMethod;
this.get_dragMode = Function.abstractMethod;
this.onDragStart = Function.abstractMethod;
this.onDrag = Function.abstractMethod;
this.onDragEnd = Function.abstractMethod;
}
Type.registerInterface('Web.UI.IDragSource');
Web.UI.IDropTarget = function() {
this.get_dropTargetElement = Function.abstractMethod;
this.canDrop = Function.abstractMethod;
this.drop = Function.abstractMethod;
this.onDragEnterTarget = Function.abstractMethod;
this.onDragLeaveTarget = Function.abstractMethod;
this.onDragInTarget = Function.abstractMethod;
}
Type.registerInterface('Web.UI.IDropTarget');
Web.UI.DragMode = Web.Enum.create('Copy', 'Move');
Web.UI.IEDragDropManager = function() {
Web.UI.IEDragDropManager.initializeBase(this);
var _dropTargets;
var _radius = 10;
var _activeDragVisual;
var _activeContext;
var _activeDragSource;
var _underlyingTarget;
var _oldOffset;
var _potentialTarget;
var _isDragging = false;
var _mouseUpHandler;
var _documentMouseMoveHandler;
var _documentDragOverHandler;
var _dragStartHandler;
var _mouseMoveHandler;
var _dragEnterHandler;
var _dragLeaveHandler;
var _dragOverHandler;
var _dropHandler;
this.initialize = function() {
Web.UI.IEDragDropManager.callBaseMethod(this, 'initialize');
_mouseUpHandler = Function.createDelegate(this, mouseUpHandler);
_documentMouseMoveHandler = Function.createDelegate(this, documentMouseMoveHandler);
_documentDragOverHandler = Function.createDelegate(this, documentDragOverHandler);
_dragStartHandler = Function.createDelegate(this, dragStartHandler);
_mouseMoveHandler = Function.createDelegate(this, mouseMoveHandler);
_dragEnterHandler = Function.createDelegate(this, dragEnterHandler);
_dragLeaveHandler = Function.createDelegate(this, dragLeaveHandler);
_dragOverHandler = Function.createDelegate(this, dragOverHandler);
_dropHandler = Function.createDelegate(this, dropHandler);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, 'initialize');
this.dispose = function() {
for (var i = 0; i < _dropTargets; i++) {
this.unregisterDropTarget(_dropTargets[i]);
}
Web.UI.IEDragDropManager.callBaseMethod(this, 'dispose');
}
Web.UI.IEDragDropManager.registerBaseMethod(this, 'dispose');
this.startDragDrop = function(dragSource, dragVisual, context) {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
if (_isDragging) {
return;
}
_underlyingTarget = null;
_activeDragSource = dragSource;
_activeDragVisual = dragVisual;
_activeContext = context;
var mousePosition = { x: ev.clientX, y: ev.clientY };
dragVisual.originalPosition = dragVisual.style.position;
if (dragVisual.style.position.length == 0) {
dragVisual.originalPosition = dragVisual.style.position = "absolute";
}
document._lastPosition = mousePosition;
dragVisual.startingPoint = mousePosition;
var scrollOffset = this.getScrollOffset(dragVisual, true);
dragVisual.startingPoint = this.addPoints(dragVisual.startingPoint, scrollOffset);
if (dragVisual.style.position == "absolute") {
dragVisual.startingPoint = this.subtractPoints(dragVisual.startingPoint, Web.UI.Control.getLocation(dragVisual));
}
else {
var left = parseInt(dragVisual.style.left);
var top = parseInt(dragVisual.style.top);
if (isNaN(left)) left = "0";
if (isNaN(top)) top = "0";
dragVisual.startingPoint = this.subtractPoints(dragVisual.startingPoint, { x: left, y: top });
}
this._prepareForDomChanges();
dragSource.onDragStart();
this._recoverFromDomChanges();
this._wireEvents();
this._drag( true);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, 'startDragDrop');
this._stopDragDrop = function(cancelled) {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
if (_activeDragSource != null) {
this._unwireEvents();
if (!cancelled) {
cancelled = (_underlyingTarget == null);
}
if (!cancelled && _underlyingTarget != null) {
_underlyingTarget.drop(_activeDragSource.get_dragMode(), _activeDragSource.get_dataType(),
_activeDragSource.get_data(_activeContext));
}
_activeDragSource.onDragEnd(cancelled);
_activeDragVisual.style.position = _activeDragVisual.originalPosition;
_activeDragSource = null;
_activeContext = null;
_activeDragVisual = null;
_isDragging = false;
_potentialTarget = null;
ev.returnValue = false;
}
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_stopDragDrop');
this._drag = function(isInitialDrag) {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
var mousePosition = { x: ev.clientX, y: ev.clientY };
document._lastPosition = mousePosition;
var scrollOffset = this.getScrollOffset(_activeDragVisual, true);
var position = this.addPoints(this.subtractPoints(mousePosition, _activeDragVisual.startingPoint), scrollOffset);
if (!isInitialDrag && parseInt(_activeDragVisual.style.left) == position.x && parseInt(_activeDragVisual.style.top) == position.y) {
return;
}
Web.UI.Control.setLocation(_activeDragVisual, position);
this._prepareForDomChanges();
_activeDragSource.onDrag();
this._recoverFromDomChanges();
_potentialTarget = this._findPotentialTarget(_activeDragSource, _activeDragVisual);
var movedToOtherTarget = (_potentialTarget != _underlyingTarget || _potentialTarget == null);
if (movedToOtherTarget && _underlyingTarget != null) {
this._leaveTarget(_activeDragSource, _underlyingTarget);
}
if (_potentialTarget != null) {
if (movedToOtherTarget) {
_underlyingTarget = _potentialTarget;
this._enterTarget(_activeDragSource, _underlyingTarget);
}
else {
this._moveInTarget(_activeDragSource, _underlyingTarget);
}
}
else {
_underlyingTarget = null;
}
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_drag');
this._wireEvents = function() {
document.attachEvent("onmouseup", _mouseUpHandler);
document.attachEvent("onmousemove", _documentMouseMoveHandler);
document.body.attachEvent("ondragover", _documentDragOverHandler);
_activeDragVisual.attachEvent("ondragstart", _dragStartHandler);
_activeDragVisual.attachEvent("ondragend", _mouseUpHandler);
_activeDragVisual.attachEvent("ondrag", _mouseMoveHandler);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_wireEvents');
this._unwireEvents = function() {
_activeDragVisual.detachEvent("ondrag", _mouseMoveHandler);
_activeDragVisual.detachEvent("ondragend", _mouseUpHandler);
_activeDragVisual.detachEvent("ondragstart", _dragStartHandler);
document.body.detachEvent("ondragover", documentDragOverHandler);
document.detachEvent("onmousemove", _documentMouseMoveHandler);
document.detachEvent("onmouseup", _mouseUpHandler);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_unwireEvents');
this.registerDropTarget = function(dropTarget) {
if (_dropTargets == null) {
_dropTargets = [];
}
_dropTargets.add(dropTarget);
this._wireDropTargetEvents(dropTarget);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, 'registerDropTarget');
this.unregisterDropTarget = function(dropTarget) {
this._unwireDropTargetEvents(dropTarget);
_dropTargets.remove(dropTarget);
dropTarget.dispose();
}
Web.UI.IEDragDropManager.registerBaseMethod(this, 'unregisterDropTarget');
this._wireDropTargetEvents = function(dropTarget) {
var associatedElement = dropTarget.get_dropTargetElement();
associatedElement._dropTarget = dropTarget;
associatedElement.attachEvent("ondragenter", _dragEnterHandler);
associatedElement.attachEvent("ondragleave", _dragLeaveHandler);
associatedElement.attachEvent("ondragover", _dragOverHandler);
associatedElement.attachEvent("ondrop", _dropHandler);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_wireDropTargetEvents');
this._unwireDropTargetEvents = function(dropTarget) {
var associatedElement = dropTarget.get_dropTargetElement();
associatedElement._dropTarget = null;
associatedElement.detachEvent("ondragenter", _dragEnterHandler);
associatedElement.detachEvent("ondragleave", _dragLeaveHandler);
associatedElement.detachEvent("ondragover", _dragOverHandler);
associatedElement.detachEvent("ondrop", _dropHandler);
}
Web.UI.IEDragDropManager.registerBaseMethod(this, '_unwireDropTargetEvents');
function dragStartHandler() {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
document.selection.empty();
var dt = ev.dataTransfer;
var dataType = _activeDragSource.get_dataType().toLowerCase();
var data = _activeDragSource.get_data(_activeContext);
if (data != null) {
if (dataType != "text" && dataType != "url") {
dataType = "text";
if (data.innerHTML != null) {
data = data.innerHTML;
}
}
dt.effectAllowed = "move";
dt.setData(dataType, data.toString());
}
}
function mouseUpHandler() {
this._stopDragDrop(false);
}
function documentMouseMoveHandler() {
this._dragDrop();
}
function documentDragOverHandler() {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
ev.returnValue = (_potentialTarget == null);
}
function mouseMoveHandler() {
this._drag();
}
function dragEnterHandler() {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
if (_isDragging) {
ev.returnValue = false;
}
else {
var dataObjects = Web.UI.IEDragDropManager._getDataObjectsForDropTarget(this._getDropTarget(ev.srcElement));
for (var i = 0; i < dataObjects.length; i++) {
this._dropTarget.onDragEnterTarget(Web.UI.DragMode.Copy, dataObjects[i].type, dataObjects[i].value);
}
}
}
function dragLeaveHandler() {
var ev = window.event;
if (window.testEvent) {
ev = window.testEvent;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -