]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dijit/tree/dndSource.js
update dojo to 1.7.3
[tt-rss.git] / lib / dijit / tree / dndSource.js
index 4fc4660cc7fff718d7e55541567e7a2d2eb41b1c..a68af56c4ec2c0c6716a5eed917f36c908168a60 100644 (file)
@@ -1,544 +1,2 @@
-/*
-       Copyright (c) 2004-2011, 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"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree.dndSource"] = true;
-dojo.provide("dijit.tree.dndSource");
-dojo.require("dijit.tree._dndSelector");
-dojo.require("dojo.dnd.Manager");
-
-
-/*=====
-dijit.tree.__SourceArgs = function(){
-       // summary:
-       //              A dict of parameters for Tree source configuration.
-       // isSource: Boolean?
-       //              Can be used as a DnD source. Defaults to true.
-       // accept: String[]
-       //              List of accepted types (text strings) for a target; defaults to
-       //              ["text", "treeNode"]
-       // copyOnly: Boolean?
-       //              Copy items, if true, use a state of Ctrl key otherwise,
-       // dragThreshold: Number
-       //              The move delay in pixels before detecting a drag; 0 by default
-       // betweenThreshold: Integer
-       //              Distance from upper/lower edge of node to allow drop to reorder nodes
-       this.isSource = isSource;
-       this.accept = accept;
-       this.autoSync = autoSync;
-       this.copyOnly = copyOnly;
-       this.dragThreshold = dragThreshold;
-       this.betweenThreshold = betweenThreshold;
-}
-=====*/
-
-dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
-       // summary:
-       //              Handles drag and drop operations (as a source or a target) for `dijit.Tree`
-
-       // isSource: [private] Boolean
-       //              Can be used as a DnD source.
-       isSource: true,
-
-       // accept: String[]
-       //              List of accepted types (text strings) for the Tree; defaults to
-       //              ["text"]
-       accept: ["text", "treeNode"],
-
-       // copyOnly: [private] Boolean
-       //              Copy items, if true, use a state of Ctrl key otherwise
-       copyOnly: false,
-
-       // dragThreshold: Number
-       //              The move delay in pixels before detecting a drag; 5 by default
-       dragThreshold: 5,
-
-       // betweenThreshold: Integer
-       //              Distance from upper/lower edge of node to allow drop to reorder nodes
-       betweenThreshold: 0,
-
-       constructor: function(/*dijit.Tree*/ tree, /*dijit.tree.__SourceArgs*/ params){
-               // summary:
-               //              a constructor of the Tree DnD Source
-               // tags:
-               //              private
-               if(!params){ params = {}; }
-               dojo.mixin(this, params);
-               this.isSource = typeof params.isSource == "undefined" ? true : params.isSource;
-               var type = params.accept instanceof Array ? params.accept : ["text", "treeNode"];
-               this.accept = null;
-               if(type.length){
-                       this.accept = {};
-                       for(var i = 0; i < type.length; ++i){
-                               this.accept[type[i]] = 1;
-                       }
-               }
-
-               // class-specific variables
-               this.isDragging = false;
-               this.mouseDown = false;
-               this.targetAnchor = null;       // DOMNode corresponding to the currently moused over TreeNode
-               this.targetBox = null;  // coordinates of this.targetAnchor
-               this.dropPosition = ""; // whether mouse is over/after/before this.targetAnchor
-               this._lastX = 0;
-               this._lastY = 0;
-
-               // states
-               this.sourceState = "";
-               if(this.isSource){
-                       dojo.addClass(this.node, "dojoDndSource");
-               }
-               this.targetState = "";
-               if(this.accept){
-                       dojo.addClass(this.node, "dojoDndTarget");
-               }
-
-               // set up events
-               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")
-               ];
-       },
-
-       // methods
-       checkAcceptance: function(source, nodes){
-               // summary:
-               //              Checks if the target can accept nodes from this source
-               // source: dijit.tree.dndSource
-               //              The source which provides items
-               // nodes: DOMNode[]
-               //              Array of DOM nodes corresponding to nodes being dropped, dijitTreeRow nodes if
-               //              source is a dijit.Tree.
-               // tags:
-               //              extension
-               return true;    // Boolean
-       },
-
-       copyState: function(keyPressed){
-               // summary:
-               //              Returns true, if we need to copy items, false to move.
-               //              It is separated to be overwritten dynamically, if needed.
-               // keyPressed: Boolean
-               //              The "copy" control key was pressed
-               // tags:
-               //              protected
-               return this.copyOnly || keyPressed;     // Boolean
-       },
-       destroy: function(){
-               // summary:
-               //              Prepares the object to be garbage-collected.
-               this.inherited("destroy",arguments);
-               dojo.forEach(this.topics, dojo.unsubscribe);
-               this.targetAnchor = null;
-       },
-
-       _onDragMouse: function(e){
-               // summary:
-               //              Helper method for processing onmousemove/onmouseover events while drag is in progress.
-               //              Keeps track of current drop target.
-
-               var m = dojo.dnd.manager(),
-                       oldTarget = this.targetAnchor,                  // the TreeNode corresponding to TreeNode mouse was previously over
-                       newTarget = this.current,                               // TreeNode corresponding to TreeNode mouse is currently over
-                       oldDropPosition = this.dropPosition;    // the previous drop position (over/before/after)
-
-               // calculate if user is indicating to drop the dragged node before, after, or over
-               // (i.e., to become a child of) the target node
-               var newDropPosition = "Over";
-               if(newTarget && this.betweenThreshold > 0){
-                       // If mouse is over a new TreeNode, then get new TreeNode's position and size
-                       if(!this.targetBox || oldTarget != newTarget){
-                               this.targetBox = dojo.position(newTarget.rowNode, true);
-                       }
-                       if((e.pageY - this.targetBox.y) <= this.betweenThreshold){
-                               newDropPosition = "Before";
-                       }else if((e.pageY - this.targetBox.y) >= (this.targetBox.h - this.betweenThreshold)){
-                               newDropPosition = "After";
-                       }
-               }
-
-               if(newTarget != oldTarget || newDropPosition != oldDropPosition){
-                       if(oldTarget){
-                               this._removeItemClass(oldTarget.rowNode, oldDropPosition);
-                       }
-                       if(newTarget){
-                               this._addItemClass(newTarget.rowNode, newDropPosition);
-                       }
-
-                       // Check if it's ok to drop the dragged node on/before/after the target node.
-                       if(!newTarget){
-                               m.canDrop(false);
-                       }else if(newTarget == this.tree.rootNode && newDropPosition != "Over"){
-                               // Can't drop before or after tree's root node; the dropped node would just disappear (at least visually)
-                               m.canDrop(false);
-                       }else if(m.source == this && (newTarget.id in this.selection)){
-                               // Guard against dropping onto yourself (TODO: guard against dropping onto your descendant, #7140)
-                               m.canDrop(false);
-                       }else if(this.checkItemAcceptance(newTarget.rowNode, m.source, newDropPosition.toLowerCase())
-                                       && !this._isParentChildDrop(m.source, newTarget.rowNode)){
-                               m.canDrop(true);
-                       }else{
-                               m.canDrop(false);
-                       }
-
-                       this.targetAnchor = newTarget;
-                       this.dropPosition = newDropPosition;
-               }
-       },
-
-       onMouseMove: function(e){
-               // summary:
-               //              Called for any onmousemove events over the Tree
-               // e: Event
-               //              onmousemouse event
-               // tags:
-               //              private
-               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 nodes = this.getSelectedTreeNodes();
-                               if(nodes.length){
-                                       if(nodes.length > 1){
-                                               //filter out all selected items which has one of their ancestor selected as well
-                                               var seen = this.selection, i = 0, r = [], n, p;
-                                               nextitem: while((n = nodes[i++])){
-                                                       for(p = n.getParent(); p && p !== this.tree; p = p.getParent()){
-                                                               if(seen[p.id]){ //parent is already selected, skip this node
-                                                                       continue nextitem;
-                                                               }
-                                                       }
-                                                       //this node does not have any ancestors selected, add it
-                                                       r.push(n);
-                                               }
-                                               nodes = r;
-                                       }
-                                       nodes = dojo.map(nodes, function(n){return n.domNode});
-                                       m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e)));
-                               }
-                       }
-               }
-       },
-
-       onMouseDown: function(e){
-               // summary:
-               //              Event processor for onmousedown
-               // e: Event
-               //              onmousedown event
-               // tags:
-               //              private
-               this.mouseDown = true;
-               this.mouseButton = e.button;
-               this._lastX = e.pageX;
-               this._lastY = e.pageY;
-               this.inherited(arguments);
-       },
-
-       onMouseUp: function(e){
-               // summary:
-               //              Event processor for onmouseup
-               // e: Event
-               //              onmouseup event
-               // tags:
-               //              private
-               if(this.mouseDown){
-                       this.mouseDown = false;
-                       this.inherited(arguments);
-               }
-       },
-
-       onMouseOut: function(){
-               // summary:
-               //              Event processor for when mouse is moved away from a TreeNode
-               // tags:
-               //              private
-               this.inherited(arguments);
-               this._unmarkTargetAnchor();
-       },
-
-       checkItemAcceptance: function(target, source, position){
-               // summary:
-               //              Stub function to be overridden if one wants to check for the ability to drop at the node/item level
-               // description:
-               //              In the base case, this is called to check if target can become a child of source.
-               //              When betweenThreshold is set, position="before" or "after" means that we
-               //              are asking if the source node can be dropped before/after the target node.
-               // target: DOMNode
-               //              The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to
-               //              Use dijit.getEnclosingWidget(target) to get the TreeNode.
-               // source: dijit.tree.dndSource
-               //              The (set of) nodes we are dropping
-               // position: String
-               //              "over", "before", or "after"
-               // tags:
-               //              extension
-               return true;
-       },
-
-       // topic event processors
-       onDndSourceOver: function(source){
-               // summary:
-               //              Topic event processor for /dnd/source/over, called when detected a current source.
-               // source: Object
-               //              The dijit.tree.dndSource / dojo.dnd.Source which has the mouse over it
-               // tags:
-               //              private
-               if(this != source){
-                       this.mouseDown = false;
-                       this._unmarkTargetAnchor();
-               }else if(this.isDragging){
-                       var m = dojo.dnd.manager();
-                       m.canDrop(false);
-               }
-       },
-       onDndStart: function(source, nodes, copy){
-               // summary:
-               //              Topic event processor for /dnd/start, called to initiate the DnD operation
-               // source: Object
-               //              The dijit.tree.dndSource / dojo.dnd.Source which is providing the items
-               // nodes: DomNode[]
-               //              The list of transferred items, dndTreeNode nodes if dragging from a Tree
-               // copy: Boolean
-               //              Copy items, if true, move items otherwise
-               // tags:
-               //              private
-
-               if(this.isSource){
-                       this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
-               }
-               var accepted = this.checkAcceptance(source, nodes);
-
-               this._changeState("Target", accepted ? "" : "Disabled");
-
-               if(this == source){
-                       dojo.dnd.manager().overSource(this);
-               }
-
-               this.isDragging = true;
-       },
-
-       itemCreator: function(/*DomNode[]*/ nodes, target, /*dojo.dnd.Source*/ source){
-               // summary:
-               //              Returns objects passed to `Tree.model.newItem()` based on DnD nodes
-               //              dropped onto the tree.   Developer must override this method to enable
-               //              dropping from external sources onto this Tree, unless the Tree.model's items
-               //              happen to look like {id: 123, name: "Apple" } with no other attributes.
-               // description:
-               //              For each node in nodes[], which came from source, create a hash of name/value
-               //              pairs to be passed to Tree.model.newItem().  Returns array of those hashes.
-               // returns: Object[]
-               //              Array of name/value hashes for each new item to be added to the Tree, like:
-               // |    [
-               // |            { id: 123, label: "apple", foo: "bar" },
-               // |            { id: 456, label: "pear", zaz: "bam" }
-               // |    ]
-               // tags:
-               //              extension
-
-               // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and
-               // make signature itemCreator(sourceItem, node, target) (or similar).
-
-               return dojo.map(nodes, function(node){
-                       return {
-                               "id": node.id,
-                               "name": node.textContent || node.innerText || ""
-                       };
-               }); // Object[]
-       },
-
-       onDndDrop: function(source, nodes, copy){
-               // summary:
-               //              Topic event processor for /dnd/drop, called to finish the DnD operation.
-               // description:
-               //              Updates data store items according to where node was dragged from and dropped
-               //              to.   The tree will then respond to those data store updates and redraw itself.
-               // source: Object
-               //              The dijit.tree.dndSource / dojo.dnd.Source which is providing the items
-               // nodes: DomNode[]
-               //              The list of transferred items, dndTreeNode nodes if dragging from a Tree
-               // copy: Boolean
-               //              Copy items, if true, move items otherwise
-               // tags:
-               //              protected
-               if(this.containerState == "Over"){
-                       var tree = this.tree,
-                               model = tree.model,
-                               target = this.targetAnchor,
-                               requeryRoot = false;    // set to true iff top level items change
-
-                       this.isDragging = false;
-
-                       // Compute the new parent item
-                       var targetWidget = target;
-                       var newParentItem;
-                       var insertIndex;
-                       newParentItem = (targetWidget && targetWidget.item) || tree.item;
-                       if(this.dropPosition == "Before" || this.dropPosition == "After"){
-                               // TODO: if there is no parent item then disallow the drop.
-                               // Actually this should be checked during onMouseMove too, to make the drag icon red.
-                               newParentItem = (targetWidget.getParent() && targetWidget.getParent().item) || tree.item;
-                               // Compute the insert index for reordering
-                               insertIndex = targetWidget.getIndexInParent();
-                               if(this.dropPosition == "After"){
-                                       insertIndex = targetWidget.getIndexInParent() + 1;
-                               }
-                       }else{
-                               newParentItem = (targetWidget && targetWidget.item) || tree.item;
-                       }
-
-                       // If necessary, use this variable to hold array of hashes to pass to model.newItem()
-                       // (one entry in the array for each dragged node).
-                       var newItemsParams;
-
-                       dojo.forEach(nodes, function(node, idx){
-                               // dojo.dnd.Item representing the thing being dropped.
-                               // Don't confuse the use of item here (meaning a DnD item) with the
-                               // uses below where item means dojo.data item.
-                               var sourceItem = source.getItem(node.id);
-
-                               // Information that's available if the source is another Tree
-                               // (possibly but not necessarily this tree, possibly but not
-                               // necessarily the same model as this Tree)
-                               if(dojo.indexOf(sourceItem.type, "treeNode") != -1){
-                                       var childTreeNode = sourceItem.data,
-                                               childItem = childTreeNode.item,
-                                               oldParentItem = childTreeNode.getParent().item;
-                               }
-
-                               if(source == this){
-                                       // This is a node from my own tree, and we are moving it, not copying.
-                                       // Remove item from old parent's children attribute.
-                                       // TODO: dijit.tree.dndSelector should implement deleteSelectedNodes()
-                                       // and this code should go there.
-
-                                       if(typeof insertIndex == "number"){
-                                               if(newParentItem == oldParentItem && childTreeNode.getIndexInParent() < insertIndex){
-                                                       insertIndex -= 1;
-                                               }
-                                       }
-                                       model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex);
-                               }else if(model.isItem(childItem)){
-                                       // Item from same model
-                                       // (maybe we should only do this branch if the source is a tree?)
-                                       model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex);
-                               }else{
-                                       // Get the hash to pass to model.newItem().  A single call to
-                                       // itemCreator() returns an array of hashes, one for each drag source node.
-                                       if(!newItemsParams){
-                                               newItemsParams = this.itemCreator(nodes, target.rowNode, source);
-                                       }
-
-                                       // Create new item in the tree, based on the drag source.
-                                       model.newItem(newItemsParams[idx], newParentItem, insertIndex);
-                               }
-                       }, this);
-
-                       // Expand the target node (if it's currently collapsed) so the user can see
-                       // where their node was dropped.   In particular since that node is still selected.
-                       this.tree._expandNode(targetWidget);
-               }
-               this.onDndCancel();
-       },
-
-       onDndCancel: function(){
-               // summary:
-               //              Topic event processor for /dnd/cancel, called to cancel the DnD operation
-               // tags:
-               //              private
-               this._unmarkTargetAnchor();
-               this.isDragging = false;
-               this.mouseDown = false;
-               delete this.mouseButton;
-               this._changeState("Source", "");
-               this._changeState("Target", "");
-       },
-
-       // When focus moves in/out of the entire Tree
-       onOverEvent: function(){
-               // summary:
-               //              This method is called when mouse is moved over our container (like onmouseenter)
-               // tags:
-               //              private
-               this.inherited(arguments);
-               dojo.dnd.manager().overSource(this);
-       },
-       onOutEvent: function(){
-               // summary:
-               //              This method is called when mouse is moved out of our container (like onmouseleave)
-               // tags:
-               //              private
-               this._unmarkTargetAnchor();
-               var m = dojo.dnd.manager();
-               if(this.isDragging){
-                       m.canDrop(false);
-               }
-               m.outSource(this);
-
-               this.inherited(arguments);
-       },
-
-       _isParentChildDrop: function(source, targetRow){
-               // summary:
-               //              Checks whether the dragged items are parent rows in the tree which are being
-               //              dragged into their own children.
-               //
-               // source:
-               //              The DragSource object.
-               //
-               // targetRow:
-               //              The tree row onto which the dragged nodes are being dropped.
-               //
-               // tags:
-               //              private
-
-               // If the dragged object is not coming from the tree this widget belongs to,
-               // it cannot be invalid.
-               if(!source.tree || source.tree != this.tree){
-                       return false;
-               }
-
-
-               var root = source.tree.domNode;
-               var ids = source.selection;
-
-               var node = targetRow.parentNode;
-
-               // Iterate up the DOM hierarchy from the target drop row,
-               // checking of any of the dragged nodes have the same ID.
-               while(node != root && !ids[node.id]){
-                       node = node.parentNode;
-               }
-
-               return node.id && ids[node.id];
-       },
-
-       _unmarkTargetAnchor: function(){
-               // summary:
-               //              Removes hover class of the current target anchor
-               // tags:
-               //              private
-               if(!this.targetAnchor){ return; }
-               this._removeItemClass(this.targetAnchor.rowNode, this.dropPosition);
-               this.targetAnchor = null;
-               this.targetBox = null;
-               this.dropPosition = null;
-       },
-
-       _markDndStatus: function(copy){
-               // summary:
-               //              Changes source's state based on "copy" status
-               this._changeState("Source", copy ? "Copied" : "Moved");
-       }
-});
-
-}
+//>>built
+define("dijit/tree/dndSource",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/on","dojo/touch","dojo/topic","dojo/dnd/Manager","./_dndSelector"],function(_1,_2,_3,_4,_5,_6,on,_7,_8,_9,_a){return _3("dijit.tree.dndSource",_a,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(_b,_c){if(!_c){_c={};}_6.mixin(this,_c);this.isSource=typeof _c.isSource=="undefined"?true:_c.isSource;var _d=_c.accept instanceof Array?_c.accept:["text","treeNode"];this.accept=null;if(_d.length){this.accept={};for(var i=0;i<_d.length;++i){this.accept[_d[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){_4.add(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_4.add(this.node,"dojoDndTarget");}this.topics=[_8.subscribe("/dnd/source/over",_6.hitch(this,"onDndSourceOver")),_8.subscribe("/dnd/start",_6.hitch(this,"onDndStart")),_8.subscribe("/dnd/drop",_6.hitch(this,"onDndDrop")),_8.subscribe("/dnd/cancel",_6.hitch(this,"onDndCancel"))];},checkAcceptance:function(){return true;},copyState:function(_e){return this.copyOnly||_e;},destroy:function(){this.inherited(arguments);var h;while(h=this.topics.pop()){h.remove();}this.targetAnchor=null;},_onDragMouse:function(e){var m=_9.manager(),_f=this.targetAnchor,_10=this.current,_11=this.dropPosition;var _12="Over";if(_10&&this.betweenThreshold>0){if(!this.targetBox||_f!=_10){this.targetBox=_5.position(_10.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_12="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_12="After";}}}if(_10!=_f||_12!=_11){if(_f){this._removeItemClass(_f.rowNode,_11);}if(_10){this._addItemClass(_10.rowNode,_12);}if(!_10){m.canDrop(false);}else{if(_10==this.tree.rootNode&&_12!="Over"){m.canDrop(false);}else{var _13=this.tree.model,_14=false;if(m.source==this){for(var _15 in this.selection){var _16=this.selection[_15];if(_16.item===_10.item){_14=true;break;}}}if(_14){m.canDrop(false);}else{if(this.checkItemAcceptance(_10.rowNode,m.source,_12.toLowerCase())&&!this._isParentChildDrop(m.source,_10.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_10;this.dropPosition=_12;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=_9.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 _17=this.getSelectedTreeNodes();if(_17.length){if(_17.length>1){var _18=this.selection,i=0,r=[],n,p;nextitem:while((n=_17[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(_18[p.id]){continue nextitem;}}r.push(n);}_17=r;}_17=_1.map(_17,function(n){return n.domNode;});m.startDrag(this,_17,this.copyState(_2.isCopyKey(e)));}}}},onMouseDown:function(e){this.mouseDown=true;this.mouseButton=e.button;this._lastX=e.pageX;this._lastY=e.pageY;this.inherited(arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited(arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(){return true;},onDndSourceOver:function(_19){if(this!=_19){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=_9.manager();m.canDrop(false);}}},onDndStart:function(_1a,_1b,_1c){if(this.isSource){this._changeState("Source",this==_1a?(_1c?"Copied":"Moved"):"");}var _1d=this.checkAcceptance(_1a,_1b);this._changeState("Target",_1d?"":"Disabled");if(this==_1a){_9.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_1e){return _1.map(_1e,function(_1f){return {"id":_1f.id,"name":_1f.textContent||_1f.innerText||""};});},onDndDrop:function(_20,_21,_22){if(this.containerState=="Over"){var _23=this.tree,_24=_23.model,_25=this.targetAnchor;this.isDragging=false;var _26;var _27;_26=(_25&&_25.item)||_23.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_26=(_25.getParent()&&_25.getParent().item)||_23.item;_27=_25.getIndexInParent();if(this.dropPosition=="After"){_27=_25.getIndexInParent()+1;}}else{_26=(_25&&_25.item)||_23.item;}var _28;_1.forEach(_21,function(_29,idx){var _2a=_20.getItem(_29.id);if(_1.indexOf(_2a.type,"treeNode")!=-1){var _2b=_2a.data,_2c=_2b.item,_2d=_2b.getParent().item;}if(_20==this){if(typeof _27=="number"){if(_26==_2d&&_2b.getIndexInParent()<_27){_27-=1;}}_24.pasteItem(_2c,_2d,_26,_22,_27);}else{if(_24.isItem(_2c)){_24.pasteItem(_2c,_2d,_26,_22,_27);}else{if(!_28){_28=this.itemCreator(_21,_25.rowNode,_20);}_24.newItem(_28[idx],_26,_27);}}},this);this.tree._expandNode(_25);}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);_9.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=_9.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_2e,_2f){if(!_2e.tree||_2e.tree!=this.tree){return false;}var _30=_2e.tree.domNode;var ids=_2e.selection;var _31=_2f.parentNode;while(_31!=_30&&!ids[_31.id]){_31=_31.parentNode;}return _31.id&&ids[_31.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor.rowNode,this.dropPosition);this.targetAnchor=null;this.targetBox=null;this.dropPosition=null;},_markDndStatus:function(_32){this._changeState("Source",_32?"Copied":"Moved");}});});
\ No newline at end of file