240 lines
5.9 KiB
JavaScript
240 lines
5.9 KiB
JavaScript
/*
|
|
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
|
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
|
see: http://dojotoolkit.org/license for details
|
|
*/
|
|
|
|
|
|
if(!dojo._hasResource["dijit.tree.dndSource"]){
|
|
dojo._hasResource["dijit.tree.dndSource"]=true;
|
|
dojo.provide("dijit.tree.dndSource");
|
|
dojo.require("dijit.tree._dndSelector");
|
|
dojo.require("dojo.dnd.Manager");
|
|
dojo.declare("dijit.tree.dndSource",dijit.tree._dndSelector,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(_1,_2){
|
|
if(!_2){
|
|
_2={};
|
|
}
|
|
dojo.mixin(this,_2);
|
|
this.isSource=typeof _2.isSource=="undefined"?true:_2.isSource;
|
|
var _3=_2.accept instanceof Array?_2.accept:["text","treeNode"];
|
|
this.accept=null;
|
|
if(_3.length){
|
|
this.accept={};
|
|
for(var i=0;i<_3.length;++i){
|
|
this.accept[_3[i]]=1;
|
|
}
|
|
}
|
|
this.isDragging=false;
|
|
this.mouseDown=false;
|
|
this.targetAnchor=null;
|
|
this.targetBox=null;
|
|
this.dropPosition="";
|
|
this._lastX=0;
|
|
this._lastY=0;
|
|
this.sourceState="";
|
|
if(this.isSource){
|
|
dojo.addClass(this.node,"dojoDndSource");
|
|
}
|
|
this.targetState="";
|
|
if(this.accept){
|
|
dojo.addClass(this.node,"dojoDndTarget");
|
|
}
|
|
this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];
|
|
},checkAcceptance:function(_4,_5){
|
|
return true;
|
|
},copyState:function(_6){
|
|
return this.copyOnly||_6;
|
|
},destroy:function(){
|
|
this.inherited("destroy",arguments);
|
|
dojo.forEach(this.topics,dojo.unsubscribe);
|
|
this.targetAnchor=null;
|
|
},_onDragMouse:function(e){
|
|
var m=dojo.dnd.manager(),_7=this.targetAnchor,_8=this.current,_9=this.currentWidget,_a=this.dropPosition;
|
|
var _b="Over";
|
|
if(_8&&this.betweenThreshold>0){
|
|
if(!this.targetBox||_7!=_8){
|
|
this.targetBox=dojo.position(_8,true);
|
|
}
|
|
if((e.pageY-this.targetBox.y)<=this.betweenThreshold){
|
|
_b="Before";
|
|
}else{
|
|
if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){
|
|
_b="After";
|
|
}
|
|
}
|
|
}
|
|
if(_8!=_7||_b!=_a){
|
|
if(_7){
|
|
this._removeItemClass(_7,_a);
|
|
}
|
|
if(_8){
|
|
this._addItemClass(_8,_b);
|
|
}
|
|
if(!_8){
|
|
m.canDrop(false);
|
|
}else{
|
|
if(_9==this.tree.rootNode&&_b!="Over"){
|
|
m.canDrop(false);
|
|
}else{
|
|
if(m.source==this&&(_8.id in this.selection)){
|
|
m.canDrop(false);
|
|
}else{
|
|
if(this.checkItemAcceptance(_8,m.source,_b.toLowerCase())&&!this._isParentChildDrop(m.source,_8)){
|
|
m.canDrop(true);
|
|
}else{
|
|
m.canDrop(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.targetAnchor=_8;
|
|
this.dropPosition=_b;
|
|
}
|
|
},onMouseMove:function(e){
|
|
if(this.isDragging&&this.targetState=="Disabled"){
|
|
return;
|
|
}
|
|
this.inherited(arguments);
|
|
var m=dojo.dnd.manager();
|
|
if(this.isDragging){
|
|
this._onDragMouse(e);
|
|
}else{
|
|
if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>=this.dragThreshold||Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){
|
|
var n=this.getSelectedNodes();
|
|
var _c=[];
|
|
for(var i in n){
|
|
_c.push(n[i]);
|
|
}
|
|
if(_c.length){
|
|
m.startDrag(this,_c,this.copyState(dojo.isCopyKey(e)));
|
|
}
|
|
}
|
|
}
|
|
},onMouseDown:function(e){
|
|
this.mouseDown=true;
|
|
this.mouseButton=e.button;
|
|
this._lastX=e.pageX;
|
|
this._lastY=e.pageY;
|
|
this.inherited("onMouseDown",arguments);
|
|
},onMouseUp:function(e){
|
|
if(this.mouseDown){
|
|
this.mouseDown=false;
|
|
this.inherited("onMouseUp",arguments);
|
|
}
|
|
},onMouseOut:function(){
|
|
this.inherited(arguments);
|
|
this._unmarkTargetAnchor();
|
|
},checkItemAcceptance:function(_d,_e,_f){
|
|
return true;
|
|
},onDndSourceOver:function(_10){
|
|
if(this!=_10){
|
|
this.mouseDown=false;
|
|
this._unmarkTargetAnchor();
|
|
}else{
|
|
if(this.isDragging){
|
|
var m=dojo.dnd.manager();
|
|
m.canDrop(false);
|
|
}
|
|
}
|
|
},onDndStart:function(_11,_12,_13){
|
|
if(this.isSource){
|
|
this._changeState("Source",this==_11?(_13?"Copied":"Moved"):"");
|
|
}
|
|
var _14=this.checkAcceptance(_11,_12);
|
|
this._changeState("Target",_14?"":"Disabled");
|
|
if(this==_11){
|
|
dojo.dnd.manager().overSource(this);
|
|
}
|
|
this.isDragging=true;
|
|
},itemCreator:function(_15,_16,_17){
|
|
return dojo.map(_15,function(_18){
|
|
return {"id":_18.id,"name":_18.textContent||_18.innerText||""};
|
|
});
|
|
},onDndDrop:function(_19,_1a,_1b){
|
|
if(this.containerState=="Over"){
|
|
var _1c=this.tree,_1d=_1c.model,_1e=this.targetAnchor,_1f=false;
|
|
this.isDragging=false;
|
|
var _20=dijit.getEnclosingWidget(_1e);
|
|
var _21;
|
|
var _22;
|
|
_21=(_20&&_20.item)||_1c.item;
|
|
if(this.dropPosition=="Before"||this.dropPosition=="After"){
|
|
_21=(_20.getParent()&&_20.getParent().item)||_1c.item;
|
|
_22=_20.getIndexInParent();
|
|
if(this.dropPosition=="After"){
|
|
_22=_20.getIndexInParent()+1;
|
|
}
|
|
}else{
|
|
_21=(_20&&_20.item)||_1c.item;
|
|
}
|
|
var _23;
|
|
dojo.forEach(_1a,function(_24,idx){
|
|
var _25=_19.getItem(_24.id);
|
|
if(dojo.indexOf(_25.type,"treeNode")!=-1){
|
|
var _26=_25.data,_27=_26.item,_28=_26.getParent().item;
|
|
}
|
|
if(_19==this){
|
|
if(typeof _22=="number"){
|
|
if(_21==_28&&_26.getIndexInParent()<_22){
|
|
_22-=1;
|
|
}
|
|
}
|
|
_1d.pasteItem(_27,_28,_21,_1b,_22);
|
|
}else{
|
|
if(_1d.isItem(_27)){
|
|
_1d.pasteItem(_27,_28,_21,_1b,_22);
|
|
}else{
|
|
if(!_23){
|
|
_23=this.itemCreator(_1a,_1e,_19);
|
|
}
|
|
_1d.newItem(_23[idx],_21,_22);
|
|
}
|
|
}
|
|
},this);
|
|
this.tree._expandNode(_20);
|
|
}
|
|
this.onDndCancel();
|
|
},onDndCancel:function(){
|
|
this._unmarkTargetAnchor();
|
|
this.isDragging=false;
|
|
this.mouseDown=false;
|
|
delete this.mouseButton;
|
|
this._changeState("Source","");
|
|
this._changeState("Target","");
|
|
},onOverEvent:function(){
|
|
this.inherited(arguments);
|
|
dojo.dnd.manager().overSource(this);
|
|
},onOutEvent:function(){
|
|
this._unmarkTargetAnchor();
|
|
var m=dojo.dnd.manager();
|
|
if(this.isDragging){
|
|
m.canDrop(false);
|
|
}
|
|
m.outSource(this);
|
|
this.inherited(arguments);
|
|
},_isParentChildDrop:function(_29,_2a){
|
|
if(!_29.tree||_29.tree!=this.tree){
|
|
return false;
|
|
}
|
|
var _2b=_29.tree.domNode;
|
|
var ids={};
|
|
for(var x in _29.selection){
|
|
ids[_29.selection[x].parentNode.id]=true;
|
|
}
|
|
var _2c=_2a.parentNode;
|
|
while(_2c!=_2b&&(!_2c.id||!ids[_2c.id])){
|
|
_2c=_2c.parentNode;
|
|
}
|
|
return _2c.id&&ids[_2c.id];
|
|
},_unmarkTargetAnchor:function(){
|
|
if(!this.targetAnchor){
|
|
return;
|
|
}
|
|
this._removeItemClass(this.targetAnchor,this.dropPosition);
|
|
this.targetAnchor=null;
|
|
this.targetBox=null;
|
|
this.dropPosition=null;
|
|
},_markDndStatus:function(_2d){
|
|
this._changeState("Source",_2d?"Copied":"Moved");
|
|
}});
|
|
}
|