[ Index ]
 

Code source de Dotclear 2.0-beta6

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/plugins/widgets/ -> dragdrop.js (source)

   1  ToolMan._coordinatesFactory.inside = function(item,container) {
   2      var iTL = this.topLeftOffset(item);
   3      var iBR = this.bottomRightOffset(item);
   4      var cTL = this.topLeftOffset(container);
   5      var cBR = this.bottomRightOffset(container);
   6      
   7      return (iTL.x >= cTL.x && iTL.x <= cBR.x && iTL.y >= cTL.y && iTL.y <= cBR.y)
   8      || (iBR.x >= cTL.x && iBR.x <= cBR.x && iBR.y >= cTL.y && iBR.y <= cBR.y);
   9  }
  10  
  11  ToolMan._dragdropFactory = {
  12      firstContainer: null,
  13      lastContainer: null,
  14      
  15      makeDragable: function(item) {
  16          var group = ToolMan.drag().createSimpleGroup(item);
  17          group.register('dragstart',this._onDragStart);
  18          group.register('dragmove', this._onDragMove);
  19          group.register('dragend', this._onDragEnd);
  20          
  21          item.isOutside = false;
  22          item.started = false;
  23          
  24          return group;
  25      },
  26      
  27      makeListContainer: function(list,name) {
  28          // each container becomes a linked list node
  29          if (this.firstContainer == null) {
  30              this.firstContainer = this.lastContainer = list;
  31              list.previousContainer = null;
  32              list.nextContainer = null;
  33          } else {
  34              list.previousContainer = this.lastContainer;
  35              list.nextContainer = null;
  36              this.lastContainer.nextContainer = list;
  37              this.lastContainer = list;
  38          }
  39          
  40          var helpers = ToolMan.helpers();
  41          var coordinates = ToolMan.coordinates();
  42          
  43          //var children = list.childNodes;
  44          var items = new Array();
  45          for (var i=0; i<list.childNodes.length; i++) {
  46              if (list.childNodes[i].nodeType == 1 &&
  47              list.childNodes[i].nodeName.toLowerCase() == name.toLowerCase()) {
  48                  items.push(list.childNodes[i]);
  49              }
  50          }
  51          
  52          // these functions are called when an item is draged over
  53          // a container or out of a container bounds.  onDragOut
  54          // is also called when the drag ends with an item having
  55          // been added to the container
  56          list.onDragOver = new Function();
  57          list.onDragOut = new Function();
  58          list.onDragEnd = new Function();
  59          
  60          if (list.factory == undefined) {
  61              list.factory = false;
  62          }
  63          
  64          var This = this;
  65          helpers.map(items, function(item) {
  66              var dragGroup = This.makeDragable(item);
  67              dragGroup.setThreshold(4);
  68          });
  69          for (var i = 2, n = arguments.length; i < n; i++) {
  70              helpers.map(items, arguments[i]);
  71          }
  72      },
  73      
  74      _onDragStart: function(dragEvent) {
  75          var container = ToolMan._dragdropFactory.firstContainer;
  76          var item = dragEvent.group.element;
  77          var coordinates = ToolMan.coordinates();
  78          
  79          // Factory is a sort of assembly pieces, we want to keep them
  80          if (item.parentNode.factory) {
  81              var origin = item.cloneNode(true);
  82              item.parentNode.insertBefore(origin,item.nextSibling);
  83              ToolMan._dragdropFactory.makeDragable(origin);
  84          }
  85          
  86          while (container != null) {
  87              container.topLeft = coordinates.topLeftOffset(container);
  88              container.bottomRight = coordinates.bottomRightOffset(container);
  89              container = container.nextContainer;
  90          }
  91          
  92          // item starts out over current parent
  93          item.started = true;
  94          item.parentNode.onDragOver();
  95      },
  96      
  97      _onDragMove: function(dragEvent) {
  98          var helpers = ToolMan.helpers();
  99          var coordinates = ToolMan.coordinates();
 100  
 101          var item = dragEvent.group.element;
 102          var xmouse = dragEvent.transformedMouseOffset;
 103          var moveTo = null;
 104          
 105          // Check if we are nowhere
 106          if (item.isOutside) {
 107              var container = ToolMan._dragdropFactory.firstContainer;
 108              while (container != null) {
 109                  if (coordinates.inside(item,container) && !container.factory) {
 110                      container.onDragOver();
 111                      item.isOutside = false;
 112                      
 113                      // since isOutside was true, the current parent is a
 114                      // temporary clone of some previous container node and
 115                      // it needs to be removed from the document
 116                      var tempParent = item.parentNode;
 117                      tempParent.removeChild(item);
 118                      container.appendChild(item);
 119                      //tempParent.parentNode.removeChild(tempParent);
 120                      
 121                      break;
 122                  }
 123                  container = container.nextContainer;
 124              }
 125              
 126              if (this.isOutside) {
 127                  return;
 128              }
 129          }
 130          // Outside the parent node
 131          else if (!coordinates.inside(item,item.parentNode)) {
 132              item.parentNode.onDragOut();
 133              item.isOutside = true;
 134              var container = ToolMan._dragdropFactory.firstContainer;
 135              while (container != null) {
 136                  if (coordinates.inside(item,container) && !container.factory) {
 137                      container.onDragOver();
 138                      item.isOutside = false;
 139                      container.appendChild(item);
 140                      break;
 141                  }
 142                  container = container.nextContainer;
 143              }
 144              // if we're not in any container now, make a temporary clone of
 145              // the previous container node and add it to the document
 146              if (this.isOutside) {
 147                  var tempParent = item.parentNode.cloneNode(false);
 148                  item.parentNode.removeChild(item);
 149                  tempParent.appendChild(item);
 150                  document.body.appendChild(tempParent);
 151                  return;
 152              }
 153          }
 154          
 155          // if we get here, we're inside some container bounds, so we do
 156          // everything the original dragsort script did to swap us into the
 157          // correct position
 158          
 159          if (item.parentNode.factory) {
 160              return;
 161          }
 162          
 163          var moveTo = null
 164  
 165          var previous = helpers.previousItem(item, item.nodeName)
 166          while (previous != null) {
 167              var bottomRight = coordinates.bottomRightOffset(previous)
 168              if (xmouse.y <= bottomRight.y && xmouse.x <= bottomRight.x) {
 169                  moveTo = previous
 170              }
 171              previous = helpers.previousItem(previous, item.nodeName)
 172          }
 173          if (moveTo != null) {
 174              helpers.moveBefore(item, moveTo)
 175              return
 176          }
 177  
 178          var next = helpers.nextItem(item, item.nodeName)
 179          while (next != null) {
 180              var topLeft = coordinates.topLeftOffset(next)
 181              if (topLeft.y <= xmouse.y && topLeft.x <= xmouse.x) {
 182                  moveTo = next
 183              }
 184              next = helpers.nextItem(next, item.nodeName)
 185          }
 186          if (moveTo != null) {
 187              helpers.moveBefore(item, helpers.nextItem(moveTo, item.nodeName))
 188              return
 189          }
 190      },
 191      
 192      _onDragEnd: function(dragEvent) {
 193          var item = dragEvent.group.element;
 194          
 195          if (!item.started) {
 196              return;
 197          }
 198          
 199          if (item.isOutside || item.parentNode.factory) {
 200              item.parentNode.removeChild(item);
 201              return;
 202          }
 203          
 204          item.parentNode.onDragEnd.call(item);
 205          ToolMan.coordinates().create(0, 0).reposition(dragEvent.group.element);
 206      }
 207  };
 208  
 209  ToolMan.dragdrop = function() {
 210      return ToolMan._dragdropFactory;
 211  };


Généré le : Fri Feb 23 22:16:06 2007 par Balluche grâce à PHPXref 0.7