Skip to content

Commit

Permalink
drag
Browse files Browse the repository at this point in the history
  • Loading branch information
nightwing committed Feb 15, 2011
1 parent 5a5b955 commit 574bf9e
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 4 deletions.
3 changes: 2 additions & 1 deletion demo/demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,8 @@ exports.launch = function(env) {
});

event.addListener(container, "drop", function(e) {
try {
return
try {
var file = e.dataTransfer.files[0];
} catch(e) {
return event.stopEvent();
Expand Down
176 changes: 173 additions & 3 deletions lib/ace/mouse_handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,45 @@
define(function(require, exports, module) {

var event = require("pilot/event");
/**pilot*/
event.addMultiMouseDownListener = function(el, button, count, timeout, callback) {
var clicks = 0;
var startX, startY;

var listener = function(e) {
clicks += 1;
if (clicks == 1) {
startX = e.clientX;
startY = e.clientY;

setTimeout(function() {
clicks = 0;
}, timeout || 600);
}

if (event.getButton(e) != button
|| Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5)
clicks = 0;

if (clicks == count) {
clicks = 0;
callback(e);
return event.preventDefault(e);
}
console.log(clicks)
};

event.addListener(el, "mousedown", listener);
};
/**pilot*/


var MouseHandler = function(editor) {
this.editor = editor;
var self = this;
event.addListener(editor.container, "mousedown", function(e) {
editor.focus();
return event.preventDefault(e);
return self.dragState == 'mousedown' || event.preventDefault(e);
});
event.addListener(editor.container, "selectstart", function(e) {
return event.preventDefault(e);
Expand All @@ -54,6 +87,81 @@ var MouseHandler = function(editor) {
event.addMultiMouseDownListener(mouseTarget, 0, 2, 500, this.onMouseDoubleClick.bind(this));
event.addMultiMouseDownListener(mouseTarget, 0, 3, 600, this.onMouseTripleClick.bind(this));
event.addMouseWheelListener(mouseTarget, this.onMouseWheel.bind(this));


event.addListener(mouseTarget, "drop", function(e) {
var pageX = event.getDocumentX(e);
var pageY = event.getDocumentY(e);
var pos = editor.renderer.screenToTextCoordinates(pageX, pageY);
console.log(self.dragState,'*******')
if (self.dragState == 'dragstart'){
var range = editor.getSelectionRange()
var l = range.compare(pos.row, pos.column)
console.log(l)
if (l==0){
editor.focus()
editor.selection.clearSelection(pos.row, pos.column);
editor.moveCursorToPosition(pos);
self.dragState = 'drop'
return event.preventDefault(e);
}

if (e.dataTransfer.dropEffect == 'move'&& l<0)
editor.session.remove(range)
}

self.dragState = 'drop'

var text = e.dataTransfer.getData('text/plain')

editor.moveCursorToPosition(pos);
editor.selection.clearSelection(pos.row, pos.column);
editor.insert(text)
if (l>0 && e.dataTransfer.dropEffect == 'move')
editor.session.remove(range)
editor.selection.setSelectionAnchor(pos.row, pos.column);
editor.focus()

return event.preventDefault(e);
});
event.addListener(editor.container, "dragstart", function(e){
e.dataTransfer.setData('text/plain', editor.getCopyText());
self.dragState = 'dragstart';
e.dataTransfer.addElement(self.proxy)
});

var pageX, pageY
event.addListener(mouseTarget, "dragover", function(e) {
pageX = event.getDocumentX(e);
pageY = event.getDocumentY(e);
return event.preventDefault(e);
});/*
event.addListener(mouseTarget, "dragenter", function(e) {
console.log("dragenter",pageX,pageY)
event.preventDefault(e)
var dropIndicator = editor.renderer.$cursorLayer.cursor
var onSelectionInterval = function() {
if (pageX === undefined || pageY === undefined)
return;
var cursor = editor.renderer.screenToTextCoordinates(pageX, pageY);
var cl = editor.renderer.$cursorLayer
cl.position = cursor
cl.cursor.style.visibility = "visible";
var pixelPos = cl.getPixelPosition(true);
//console.log(pixelPos, cursor)
cl.cursor.style.left = pixelPos.left + "px";
cl.cursor.style.top = pixelPos.top + "px";
};
var timerId = setInterval(onSelectionInterval, 20);
var onDragLeave = function(e) {
console.log("dragleave")
event.removeListener(mouseTarget, "dragleave", onDragLeave)
clearInterval(timerId);
}
event.addListener(mouseTarget, "dragleave", onDragLeave)
});*/
};

(function() {
Expand All @@ -66,6 +174,62 @@ var MouseHandler = function(editor) {
this.getScrollSpeed = function() {
return this.$scrollSpeed;
};



this.prepareToDrag = function(e, pos){
var pageX = event.getDocumentX(e);
var pageY = event.getDocumentY(e);
var editor = this.editor;
var self = this;

this.dragState = 'mousedown';
var t=e.target
t.setAttribute("draggable", true);
if(!this.proxy){
this.proxy = document.createElement('div')
this.proxy.style.cssText = 'position:fixed'
editor.container.appendChild(this.proxy)
}
var onDragEnd = function(e){
if(self.dragState == 'drop')
self.dragState = ''
else if(e.dataTransfer.dropEffect == 'move'){
editor.moveCursorToPosition(editor.session.remove(editor.getSelectionRange()));
editor.clearSelection();
}
endDrag(e)
}

var mousePageX, mousePageY;
function onMouseMove(e) {
mousePageX = event.getDocumentX(e);
mousePageY = event.getDocumentY(e);
e.stopPropagation();
}

function endDrag(e) {
document.removeEventListener("mousemove", onMouseMove, true);
document.removeEventListener("mouseup", endDrag, true);
event.removeListener(self.proxy, "dragend", onDragEnd)
onMouseMove(e)
if(self.dragState == 'mousedown'){
if (mousePageX !== undefined && mousePageY !== undefined)
pos = editor.renderer.screenToTextCoordinates(mousePageX, mousePageY);
editor.moveCursorToPosition(pos)
editor.selection.clearSelection(pos.row, pos.column);
console.log(pos)
}
self.dragState = ''
t && t.removeAttribute("draggable")
}

document.addEventListener("mousemove", onMouseMove, true);
document.addEventListener("mouseup", endDrag, true);

event.addListener(this.proxy, "dragend", onDragEnd)

};

this.onMouseDown = function(e) {
var pageX = event.getDocumentX(e);
Expand All @@ -76,8 +240,8 @@ var MouseHandler = function(editor) {
pos.row = Math.max(0, Math.min(pos.row, editor.session.getLength()-1));

var button = event.getButton(e)
var isEmpty = editor.selection.isEmpty()
if (button != 0) {
var isEmpty = editor.selection.isEmpty()
if (isEmpty) {
editor.moveCursorToPosition(pos);
}
Expand All @@ -90,6 +254,10 @@ var MouseHandler = function(editor) {

if (e.shiftKey)
editor.selection.selectToPosition(pos)
else if(!isEmpty && editor.getSelectionRange().contains(pos.row, pos.column)) {
this.prepareToDrag(e, pos)
return event.stopPropagation(e);
}
else {
editor.moveCursorToPosition(pos);
if (!editor.$clickSelection)
Expand Down Expand Up @@ -147,11 +315,13 @@ var MouseHandler = function(editor) {
this.onMouseDoubleClick = function(e) {
this.editor.selection.selectWord();
this.$clickSelection = this.editor.getSelectionRange();
this.dragState = '';
};

this.onMouseTripleClick = function(e) {
this.editor.selection.selectLine();
this.$clickSelection = this.editor.getSelectionRange();
this.dragState = '';
};

this.onMouseWheel = function(e) {
Expand All @@ -165,4 +335,4 @@ var MouseHandler = function(editor) {
}).call(MouseHandler.prototype);

exports.MouseHandler = MouseHandler;
});
});

0 comments on commit 574bf9e

Please sign in to comment.