Dotclear

source: plugins/widgets/dragdrop.js @ 0:54703be25dd6

Revision 0:54703be25dd6, 5.9 KB checked in by Dsls <dsls@…>, 14 years ago (diff)

2.3 branch (trunk) first checkin

Line 
1ToolMan._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
11ToolMan._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
209ToolMan.dragdrop = function() {
210     return ToolMan._dragdropFactory;
211};
Note: See TracBrowser for help on using the repository browser.

Sites map