Modified drag and drop beads to accommodate dragging between, as well as 
within, Lists. Added simple copy/move dragging property.


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/c6e721f9
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/c6e721f9
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/c6e721f9

Branch: refs/heads/develop
Commit: c6e721f93d0951f1fc3e3913523f308c8335ac54
Parents: ab82aab
Author: Peter Ent <p...@apache.org>
Authored: Wed Jun 28 09:23:59 2017 -0400
Committer: Peter Ent <p...@apache.org>
Committed: Wed Jun 28 09:23:59 2017 -0400

----------------------------------------------------------------------
 .../html/beads/SingleSelectionDragSourceBead.as | 56 +++++++++++++++++---
 .../html/beads/SingleSelectionDropTargetBead.as | 41 +++++++-------
 2 files changed, 66 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c6e721f9/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragSourceBead.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragSourceBead.as
 
b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragSourceBead.as
index 71f5394..72b0a00 100644
--- 
a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragSourceBead.as
+++ 
b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragSourceBead.as
@@ -18,8 +18,10 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.flex.html.beads
 {
+       import org.apache.flex.collections.ArrayList;
        import org.apache.flex.core.IBead;
        import org.apache.flex.core.IDragInitiator;
+       import org.apache.flex.core.IDataProviderModel;
        import org.apache.flex.core.IItemRenderer;
        import org.apache.flex.core.IItemRendererParent;
        import org.apache.flex.core.IParent;
@@ -68,6 +70,16 @@ package org.apache.flex.html.beads
                        return _itemRendererParent;
                }
                
+               private var _dragType:String = "move";
+               public function get dragType():String
+               {
+                       return _dragType;
+               }
+               public function set dragType(value:String):void
+               {
+                       _dragType = value;
+               }
+               
                public function set strand(value:IStrand):void
                {
                        _strand = value;
@@ -83,13 +95,15 @@ package org.apache.flex.html.beads
                        return _strand;
                }
                
+               private var indexOfDragSource:int = -1;
+               
                private function handleDragStart(event:DragEvent):void
                {
                        trace("SingleSelectionDragSourceBead received the 
DragStart");
                        
                        var downPoint:Point = new Point(event.clientX, 
event.clientY);//PointUtils.localToGlobal(new Point(event.clientX, 
event.clientY), _strand);
-                       trace("Dragging from this point: "+downPoint.x+", 
"+downPoint.y);
-                       trace("-- find the itemRenderer this object is over");
+                       //trace("Dragging from this point: "+downPoint.x+", 
"+downPoint.y);
+                       //trace("-- find the itemRenderer this object is over");
                        
                        if (itemRendererParent != null) {
                                var n:Number = itemRendererParent.numElements;
@@ -97,15 +111,14 @@ package org.apache.flex.html.beads
                                        var child:UIBase = 
itemRendererParent.getElementAt(i) as UIBase;
                                        if (child != null) {
                                                var childPoint:Point = 
PointUtils.localToGlobal(new Point(child.x,child.y), itemRendererParent);
-                                               trace("-- child "+i+": 
"+childPoint.x+" - "+(childPoint.x+child.width)+" x "+childPoint.y+" - 
"+(childPoint.y+child.height));
+                                               //trace("-- child "+i+": 
"+childPoint.x+" - "+(childPoint.x+child.width)+" x "+childPoint.y+" - 
"+(childPoint.y+child.height));
                                                var rect:Rectangle = new 
Rectangle(childPoint.x, childPoint.y, child.width, child.height);
                                                if 
(rect.containsPoint(downPoint)) {                                               
     
                                                        var ir:IItemRenderer = 
child as IItemRenderer;
                                                        
-                                                       trace("-- dragging this 
child, " + i + ", at "+childPoint.x+", "+childPoint.y);
+                                                       //trace("-- dragging 
this child, " + i + ", at "+childPoint.x+", "+childPoint.y);
+                                                       indexOfDragSource = i;
                                                        
-                                                       //var dragImage:Label = 
new Label();
-                                                       //dragImage.text = 
ir.data.toString();
                                                        var dragImage:UIBase = 
new Group();
                                                        dragImage.className = 
"DragImage";
                                                        dragImage.width = 
child.width;
@@ -114,7 +127,7 @@ package org.apache.flex.html.beads
                                                        label.text = 
ir.data.toString();
                                                        
dragImage.addElement(label);
                                                        
-                                                       DragEvent.dragSource = 
{index:i, data:ir.data}; // needs to be the data from the child, but we'll get 
to that.
+                                                       DragEvent.dragSource = 
ir.data;
                                                        DragEvent.dragInitiator 
= this;
                                                        
DragMouseController.dragImage = dragImage;
                                                        break;
@@ -129,13 +142,40 @@ package org.apache.flex.html.beads
                public function acceptingDrop(dropTarget:Object, 
type:String):void
                {
                        trace("Accepting drop of type "+type);
+                       if (dragType == "copy") return;
+                       
+                       if (itemRendererParent != null) {
+                               var dataProviderModel:IDataProviderModel = 
_strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
+                               if (dataProviderModel.dataProvider is Array) {
+                                       var dataArray:Array = 
dataProviderModel.dataProvider as Array;
+                                       
+                                       // remove the item being selected
+                                       dataArray.splice(indexOfDragSource,1);
+                                       
+                                       // refresh the dataProvider model
+                                       var newArray:Array = dataArray.slice()
+                                       dataProviderModel.dataProvider = 
newArray;
+                               }
+                               else if (dataProviderModel.dataProvider is 
ArrayList) {
+                                       var dataList:ArrayList = 
dataProviderModel.dataProvider as ArrayList;
+                                       
+                                       // remove the item being selected
+                                       
dataList.removeItemAt(indexOfDragSource);
+                                       
+                                       // refresh the dataProvider model
+                                       var newList:ArrayList = new 
ArrayList(dataList.source);
+                                       dataProviderModel.dataProvider = 
newList;
+                               }
+                       }
                }
                
                public function acceptedDrop(dropTarget:Object, 
type:String):void
                {
                        trace("Accepted drop of type "+type);
                        var value:Object = DragEvent.dragSource;
-                       trace(" -- index: "+value.index+" of data: 
"+value.data);
+                       trace(" -- index: "+indexOfDragSource+" of data: 
"+value.toString());
+                       
+                       indexOfDragSource = -1;
                }
                
        }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c6e721f9/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDropTargetBead.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDropTargetBead.as
 
b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDropTargetBead.as
index 0049bc0..9f85fef 100644
--- 
a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDropTargetBead.as
+++ 
b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDropTargetBead.as
@@ -87,8 +87,7 @@ package org.apache.flex.html.beads
                
                private function handleDragEnter(event:DragEvent):void
                {
-                       var myX:Number = event.clientX;
-                       trace("SingleSelectionDropTargetBead received 
DragEnter"+", at "+myX);
+                       trace("SingleSelectionDropTargetBead received 
DragEnter");
                        
                        _dropController.acceptDragDrop(event.target as IUIBase, 
DropType.COPY);
                }
@@ -100,8 +99,7 @@ package org.apache.flex.html.beads
                
                private function handleDragOver(event:DragEvent):void
                {
-                       var myX:Number = event.clientX;
-                       trace("SingleSelectionDropTargetBead over 
"+event.target.toString()+" at "+myX);
+                       trace("SingleSelectionDropTargetBead received 
DragOver");
                }
                
                private function handleDragDrop(event:DragEvent):void
@@ -110,8 +108,8 @@ package org.apache.flex.html.beads
                        trace("SingleSelectionDropTargetBead received 
DragDrop!");
                        
                        var downPoint:Point = new Point(event.clientX, 
event.clientY); 
-                       trace("Dropping at this point: "+downPoint.x+", 
"+downPoint.y);
-                       trace("-- find the itemRenderer this object is over");
+                       //trace("Dropping at this point: "+downPoint.x+", 
"+downPoint.y);
+                       //trace("-- find the itemRenderer this object is over");
                        
                        var targetIndex:int = -1; // indicates drop beyond 
length of items
                        
@@ -121,12 +119,12 @@ package org.apache.flex.html.beads
                                        var child:UIBase = 
itemRendererParent.getElementAt(i) as UIBase;
                                        if (child != null) {
                                                var childPoint:Point = new 
Point(child.x, child.y); 
-                                               trace("-- child "+i+": 
"+childPoint.x+" - "+(childPoint.x+child.width)+" x "+childPoint.y+" - 
"+(childPoint.y+child.height));
+                                               //trace("-- child "+i+": 
"+childPoint.x+" - "+(childPoint.x+child.width)+" x "+childPoint.y+" - 
"+(childPoint.y+child.height));
                                                var rect:Rectangle = new 
Rectangle(childPoint.x, childPoint.y, child.width, child.height);
                                                if 
(rect.containsPoint(downPoint)) {                                               
     
                                                        var ir:IItemRenderer = 
child as IItemRenderer;
                                                        targetIndex = i;
-                                                       trace("-- Found this 
item: "+i);
+                                                       //trace("-- Found this 
item: "+i);
                                                        break;
                                                }
                                        }
@@ -136,6 +134,8 @@ package org.apache.flex.html.beads
                                        targetIndex--;
                                }
                                
+                               // Let the dragInitiator know that the drop was 
accepted so it can do
+                               // whatever it needs to do to prepare the data 
or structures.
                                if (DragEvent.dragInitiator) {
                                        
DragEvent.dragInitiator.acceptingDrop(_strand, "object");
                                }
@@ -145,17 +145,14 @@ package org.apache.flex.html.beads
                                var dataProviderModel:IDataProviderModel = 
_strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
                                if (dataProviderModel.dataProvider is Array) {
                                        var dataArray:Array = 
dataProviderModel.dataProvider as Array;
-                                       
-                                       // remove the item being selected
-                                       dataArray.splice(dragSource.index,1);
-                                       
+
                                        // insert the item being dropped
                                        if (targetIndex == -1) {
                                                // append to the end
-                                               dataArray.push(dragSource.data);
+                                               dataArray.push(dragSource);
                                        } else {
                                                // insert before targetIndex
-                                               dataArray.splice(targetIndex, 
0, dragSource.data);
+                                               dataArray.splice(targetIndex, 
0, dragSource);
                                        }
                                        
                                        var newArray:Array = dataArray.slice()
@@ -164,24 +161,22 @@ package org.apache.flex.html.beads
                                else if (dataProviderModel.dataProvider is 
ArrayList) {
                                        var dataList:ArrayList = 
dataProviderModel.dataProvider as ArrayList;
                                        
-                                       // remove the item being selected
-                                       dataList.removeItemAt(dragSource.index);
-                                       
                                        // insert the item being dropped
                                        if (targetIndex == -1) {
                                                // sppend to the end
-                                               
dataList.addItem(dragSource.data);
+                                               dataList.addItem(dragSource);
                                        } else {
                                                // insert before target index
-                                               
dataList.addItemAt(dragSource.data, targetIndex);
+                                               dataList.addItemAt(dragSource, 
targetIndex);
                                        }
                                        
                                        var newList:ArrayList = new 
ArrayList(dataList.source);
                                        dataProviderModel.dataProvider = 
newList;
-                                       
-                                       if (DragEvent.dragInitiator) {
-                                               
DragEvent.dragInitiator.acceptedDrop(_strand, "object");
-                                       }
+                               }
+                               
+                               // Let the dragInitiator know the drop has been 
completed.
+                               if (DragEvent.dragInitiator) {
+                                       
DragEvent.dragInitiator.acceptedDrop(_strand, "object");
                                }
                        }
                }

Reply via email to