summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/mdnd/dropMode/OverDropMode.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/mdnd/dropMode/OverDropMode.js')
-rw-r--r--js/dojo/dojox/mdnd/dropMode/OverDropMode.js307
1 files changed, 307 insertions, 0 deletions
diff --git a/js/dojo/dojox/mdnd/dropMode/OverDropMode.js b/js/dojo/dojox/mdnd/dropMode/OverDropMode.js
new file mode 100644
index 0000000..36d13d7
--- /dev/null
+++ b/js/dojo/dojox/mdnd/dropMode/OverDropMode.js
@@ -0,0 +1,307 @@
+//>>built
+define("dojox/mdnd/dropMode/OverDropMode", ["dojo/_base/kernel","dojo/_base/declare","dojo/_base/connect","dojo/_base/html",
+ "dojo/_base/array","dojox/mdnd/AreaManager"],function(dojo){
+ var odm = dojo.declare(
+ "dojox.mdnd.dropMode.OverDropMode",
+ null,
+ {
+ // summary:
+ // Default class to find the nearest target only if the mouse is over an area.
+
+ // _oldXPoint: Integer
+ // used to save a X position
+ _oldXPoint: null,
+
+ // _oldYPoint: Integer
+ // used to save a Y position
+ _oldYPoint: null,
+
+ // _oldBehaviour: Integer
+ // see getDragpoint()
+ _oldBehaviour: "up",
+
+ constructor: function(){
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: constructor");
+ this._dragHandler = [
+ dojo.connect(dojox.mdnd.areaManager(), "onDragEnter", function(coords, size){
+ var m = dojox.mdnd.areaManager();
+ if(m._oldIndexArea == -1){
+ m._oldIndexArea = m._lastValidIndexArea;
+ }
+ })
+ ];
+
+ },
+
+ addArea: function(/*Array*/areas, /*Object*/object){
+ // summary:
+ // Add a D&D Area into an array sorting by the x position.
+ // areas:
+ // array of areas
+ // object:
+ // data type of a DndArea
+ // returns:
+ // a sorted area
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: addArea");
+ var length = areas.length,
+ position = dojo.position(object.node, true);
+ object.coords = {'x':position.x, 'y':position.y};
+ if(length == 0){
+ areas.push(object);
+ }
+ else{
+ var x = object.coords.x;
+ for(var i = 0; i < length; i++){
+ if(x < areas[i].coords.x){
+ for(var j = length-1; j >= i; j--)
+ areas[j + 1] = areas[j];
+ areas[i] = object;
+ break;
+ }
+ }
+ if(i == length){
+ areas.push(object);
+ }
+ }
+ return areas; // Array
+ },
+
+ updateAreas: function(/*Array*/areaList){
+ // summary:
+ // refresh areas position and size to determinate the nearest area to drop an item
+ // description:
+ // the area position (and size) is equal to the postion of the domNode associated.
+ // areaList:
+ // array of areas
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: updateAreas");
+ var length = areaList.length;
+ for(var i = 0; i < length; i++){
+ this._updateArea(areaList[i]);
+ }
+ },
+
+ _updateArea : function(/*Object*/area){
+ // summary:
+ // update the D&D area object (i.e. update coordinates of its DOM node)
+ // area:
+ // the D&D area.
+ // tags:
+ // protected
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: addArea");
+ var position = dojo.position(area.node, true);
+ area.coords.x = position.x;
+ area.coords.x2 = position.x + position.w;
+ area.coords.y = position.y;
+ },
+
+ initItems: function(/*Object*/area){
+ // summary:
+ // initialize the horizontal line in order to determinate the drop zone.
+ // area:
+ // the D&D area.
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: initItems");
+ dojo.forEach(area.items, function(obj){
+ //get the vertical middle of the item
+ var node = obj.item.node;
+ var position = dojo.position(node, true);
+ var y = position.y + position.h/2;
+ obj.y = y;
+ });
+ area.initItems = true;
+ },
+
+ refreshItems: function(/*Object*/area, /*Integer*/indexItem, /*Object*/size, /*Boolean*/added){
+ // summary:
+ // take into account the drop indicator DOM element in order to compute horizontal lines
+ // area:
+ // a D&D area object
+ // indexItem:
+ // index of a draggable item
+ // size:
+ // dropIndicator size
+ // added:
+ // boolean to know if a dropIndicator has been added or deleted
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: refreshItems", area, indexItem, size, added);
+ if(indexItem == -1){
+ return;
+ }
+ else if(area && size && size.h){
+ var height = size.h;
+ if(area.margin){
+ height += area.margin.t;
+ }
+ var length = area.items.length;
+ for(var i = indexItem; i < length; i++){
+ var item = area.items[i];
+ if(added){
+ item.y += height;
+ }
+ else{
+ item.y -= height;
+ }
+ }
+ }
+ },
+
+ getDragPoint: function(/*Object*/coords, /*Object*/size, /*Object*/mousePosition){
+ // summary:
+ // return coordinates of the draggable item.
+ // - For X point : the x position of mouse
+ // - For Y point : the y position of mouse
+ // returns:
+ // an object of coordinates
+ // examples:{'x':10,'y':10}
+ // coords:
+ // an object encapsulating X and Y position
+ // size:
+ // an object encapsulating width and height values
+ // mousePosition:
+ // coordinates of mouse
+
+ //console.log("dojox.mdnd.OverDropMode ::: getDragPoint");
+ return { // Object
+ 'x': mousePosition.x,
+ 'y': mousePosition.y
+ }
+ },
+
+
+ getTargetArea: function(/*Array*/areaList, /*Object*/ coords, /*integer*/currentIndexArea ){
+ // summary:
+ // get the nearest D&D area.
+ // areaList:
+ // a list of D&D areas objects
+ // coords:
+ // coordinates [x,y] of the dragItem (see getDragPoint())
+ // currentIndexArea:
+ // an index representing the active D&D area
+ //returns:
+ // the index of the D&D area
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: getTargetArea");
+ var index = 0;
+ var x = coords.x;
+ var y = coords.y;
+ var end = areaList.length;
+ var start = 0, direction = "right", compute = false;
+ if(currentIndexArea == -1 || arguments.length < 3){
+ // first time : Need to search the nearest area in all areas.
+ compute = true;
+ }
+ else{
+ // check if it's always the same area
+ if(this._checkInterval(areaList, currentIndexArea, x, y)){
+ index = currentIndexArea;
+ }
+ else{
+ if(this._oldXPoint < x){
+ start = currentIndexArea + 1;
+ }
+ else{
+ start = currentIndexArea - 1;
+ end = 0;
+ direction = "left";
+ }
+ compute = true;
+ }
+ }
+ if(compute){
+ if(direction === "right"){
+ for(var i = start; i < end; i++){
+ if(this._checkInterval(areaList, i, x, y)){
+ index = i;
+ break;
+ }
+ }
+ if(i == end){
+ index = -1;
+ }
+ }
+ else{
+ for(var i = start; i >= end; i--){
+ if(this._checkInterval(areaList, i, x, y)){
+ index = i;
+ break;
+ }
+ }
+ if(i == end-1){
+ index = -1;
+ }
+ }
+ }
+ this._oldXPoint = x;
+ return index; // Integer
+ },
+
+ _checkInterval: function(/*Array*/areaList, /*Integer*/index, /*Coord*/x, /*Coord*/y){
+ // summary:
+ // check if the dragNode is in the interval.
+ // returns:
+ // true if the dragNode is in intervall
+ // areaList:
+ // a list of D&D areas objects
+ // index:
+ // index of a D&D area (to get the interval)
+ // x:
+ // coordinate x, of the dragNode (see getDragPoint())
+ // tags:
+ // protected
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: _checkInterval");
+ var area = areaList[index];
+ var node = area.node;
+ var coords = area.coords;
+ var startX = coords.x;
+ var endX = coords.x2;
+ var startY = coords.y;
+ var endY = startY + node.offsetHeight;
+ if(startX <= x && x <= endX && startY <= y && y <= endY){
+ return true;
+ }
+ return false; // Boolean
+ },
+
+ getDropIndex: function(/*Object*/ targetArea, /*Object*/ coords){
+ // summary:
+ // Return the index where the drop has to be placed.
+ // targetArea:
+ // a D&D area object.
+ // coords:
+ // coordinates [x,y] of the draggable item.
+ // returns:
+ // a number or -1 if the area has no children or the drop index represents the last position in to the area
+
+ //console.log("dojox.mdnd.dropMode.OverDropMode ::: getDropIndex");
+ var length = targetArea.items.length;
+ var coordinates = targetArea.coords;
+ var y = coords.y;
+ if(length > 0){
+ // course all children in the target area.
+ for(var i = 0; i < length; i++){
+ // compare y value with y value of children
+ if(y < targetArea.items[i].y){
+ return i; // integer
+ }
+ else{
+ if(i == length-1){
+ return -1; // integer
+ }
+ }
+ }
+ }
+ return -1; //integer
+ },
+
+ destroy: function(){
+ dojo.forEach(this._dragHandler, dojo.disconnect);
+ }
+ });
+
+ dojox.mdnd.areaManager()._dropMode = new dojox.mdnd.dropMode.OverDropMode();
+ return odm;
+}); \ No newline at end of file