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