165 lines
4.5 KiB
JavaScript
165 lines
4.5 KiB
JavaScript
define("dijit/tree/_dndContainer", [
|
|
"dojo/aspect", // aspect.after
|
|
"dojo/_base/declare", // declare
|
|
"dojo/dom-class", // domClass.add domClass.remove domClass.replace
|
|
"dojo/_base/event", // event.stop
|
|
"dojo/_base/lang", // lang.mixin lang.hitch
|
|
"dojo/on",
|
|
"dojo/touch"
|
|
], function(aspect, declare,domClass, event, lang, on, touch){
|
|
|
|
// module:
|
|
// dijit/tree/_dndContainer
|
|
|
|
/*=====
|
|
var __Args = {
|
|
// 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
|
|
};
|
|
=====*/
|
|
|
|
return declare("dijit.tree._dndContainer", null, {
|
|
|
|
// summary:
|
|
// This is a base class for `dijit/tree/_dndSelector`, and isn't meant to be used directly.
|
|
// It's modeled after `dojo/dnd/Container`.
|
|
// tags:
|
|
// protected
|
|
|
|
/*=====
|
|
// current: DomNode
|
|
// The currently hovered TreeNode.rowNode (which is the DOM node
|
|
// associated w/a given node in the tree, excluding it's descendants)
|
|
current: null,
|
|
=====*/
|
|
|
|
constructor: function(tree, params){
|
|
// summary:
|
|
// A constructor of the Container
|
|
// tree: Node
|
|
// Node or node's id to build the container on
|
|
// params: __Args
|
|
// A dict of parameters, which gets mixed into the object
|
|
// tags:
|
|
// private
|
|
this.tree = tree;
|
|
this.node = tree.domNode; // TODO: rename; it's not a TreeNode but the whole Tree
|
|
lang.mixin(this, params);
|
|
|
|
// class-specific variables
|
|
this.current = null; // current TreeNode's DOM node
|
|
|
|
// states
|
|
this.containerState = "";
|
|
domClass.add(this.node, "dojoDndContainer");
|
|
|
|
// set up events
|
|
this.events = [
|
|
// Mouse (or touch) enter/leave on Tree itself
|
|
on(this.node, touch.enter, lang.hitch(this, "onOverEvent")),
|
|
on(this.node, touch.leave, lang.hitch(this, "onOutEvent")),
|
|
|
|
// switching between TreeNodes
|
|
aspect.after(this.tree, "_onNodeMouseEnter", lang.hitch(this, "onMouseOver"), true),
|
|
aspect.after(this.tree, "_onNodeMouseLeave", lang.hitch(this, "onMouseOut"), true),
|
|
|
|
// cancel text selection and text dragging
|
|
on(this.node, "dragstart", lang.hitch(event, "stop")),
|
|
on(this.node, "selectstart", lang.hitch(event, "stop"))
|
|
];
|
|
},
|
|
|
|
destroy: function(){
|
|
// summary:
|
|
// Prepares this object to be garbage-collected
|
|
|
|
var h;
|
|
while(h = this.events.pop()){ h.remove(); }
|
|
|
|
// this.clearItems();
|
|
this.node = this.parent = null;
|
|
},
|
|
|
|
// mouse events
|
|
onMouseOver: function(widget /*===== , evt =====*/){
|
|
// summary:
|
|
// Called when mouse is moved over a TreeNode
|
|
// widget: TreeNode
|
|
// evt: Event
|
|
// tags:
|
|
// protected
|
|
this.current = widget;
|
|
},
|
|
|
|
onMouseOut: function(/*===== widget, evt =====*/){
|
|
// summary:
|
|
// Called when mouse is moved away from a TreeNode
|
|
// widget: TreeNode
|
|
// evt: Event
|
|
// tags:
|
|
// protected
|
|
this.current = null;
|
|
},
|
|
|
|
_changeState: function(type, newState){
|
|
// summary:
|
|
// Changes a named state to new state value
|
|
// type: String
|
|
// A name of the state to change
|
|
// newState: String
|
|
// new state
|
|
var prefix = "dojoDnd" + type;
|
|
var state = type.toLowerCase() + "State";
|
|
//domClass.replace(this.node, prefix + newState, prefix + this[state]);
|
|
domClass.replace(this.node, prefix + newState, prefix + this[state]);
|
|
this[state] = newState;
|
|
},
|
|
|
|
_addItemClass: function(node, type){
|
|
// summary:
|
|
// Adds a class with prefix "dojoDndItem"
|
|
// node: Node
|
|
// A node
|
|
// type: String
|
|
// A variable suffix for a class name
|
|
domClass.add(node, "dojoDndItem" + type);
|
|
},
|
|
|
|
_removeItemClass: function(node, type){
|
|
// summary:
|
|
// Removes a class with prefix "dojoDndItem"
|
|
// node: Node
|
|
// A node
|
|
// type: String
|
|
// A variable suffix for a class name
|
|
domClass.remove(node, "dojoDndItem" + type);
|
|
},
|
|
|
|
onOverEvent: function(){
|
|
// summary:
|
|
// This function is called once, when mouse is over our container
|
|
// tags:
|
|
// protected
|
|
this._changeState("Container", "Over");
|
|
},
|
|
|
|
onOutEvent: function(){
|
|
// summary:
|
|
// This function is called once, when mouse is out of our container
|
|
// tags:
|
|
// protected
|
|
this._changeState("Container", "");
|
|
}
|
|
});
|
|
});
|