123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- 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;
- });
|