Repository: flex-asjs Updated Branches: refs/heads/develop fd4ffd905 -> 49831cb0c
Created specialized bead for DataGrid drag and drop operations so that column re-order can work with DataGrids that also want to do drag and drop. Added events to the SingleSelection drag and drop beads. Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/49831cb0 Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/49831cb0 Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/49831cb0 Branch: refs/heads/develop Commit: 49831cb0ca178fa3f5e10044ddc5c93f1fde3948 Parents: fd4ffd9 Author: Peter Ent <p...@apache.org> Authored: Wed Sep 27 10:56:52 2017 -0400 Committer: Peter Ent <p...@apache.org> Committed: Wed Sep 27 10:56:52 2017 -0400 ---------------------------------------------------------------------- .../org/apache/flex/html/beads/DataGridView.as | 2 + .../flex/org/apache/flex/utils/PointUtils.as | 24 +- .../DragDrop/src/main/flex/DragDropClasses.as | 2 + .../flex/html/beads/ButtonBarReorderBead.as | 7 +- .../flex/html/beads/DataGridDragDropBead.as | 243 +++++++++++++++++++ .../html/beads/SingleSelectionDragImageBead.as | 6 +- .../html/beads/SingleSelectionDragSourceBead.as | 77 +++++- .../html/beads/SingleSelectionDropTargetBead.as | 90 +++++++ .../beads/controllers/DragMouseController.as | 118 +++++---- .../beads/controllers/DropMouseController.as | 74 +++--- .../src/main/resources/basic-manifest.xml | 2 + 11 files changed, 533 insertions(+), 112 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/Basic/src/main/flex/org/apache/flex/html/beads/DataGridView.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Basic/src/main/flex/org/apache/flex/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/flex/org/apache/flex/html/beads/DataGridView.as index 5f58cf5..6497e4d 100644 --- a/frameworks/projects/Basic/src/main/flex/org/apache/flex/html/beads/DataGridView.as +++ b/frameworks/projects/Basic/src/main/flex/org/apache/flex/html/beads/DataGridView.as @@ -200,6 +200,8 @@ package org.apache.flex.html.beads host.addEventListener("widthChanged", handleSizeChanges); host.addEventListener("heightChanged", handleSizeChanges); + + host.dispatchEvent(new Event("dataGridViewCreated")); } /** http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/PointUtils.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/PointUtils.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/PointUtils.as index a3bf905..c8dbfa7 100644 --- a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/PointUtils.as +++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/PointUtils.as @@ -24,14 +24,14 @@ package org.apache.flex.utils import flash.geom.Point; import flash.display.Stage; } - + import org.apache.flex.core.IUIBase; import org.apache.flex.geom.Point; /** * The PointUtils class is a collection of static functions that convert * Points between coordinate spaces. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -46,13 +46,13 @@ package org.apache.flex.utils { throw new Error("PointUtils should not be instantiated."); } - + /** * Converts a point from global coordinates to local coordinates - * + * * @param point The point being converted. * @param local The component used as reference for the conversion. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -71,13 +71,13 @@ package org.apache.flex.utils var x:Number = pt.x; var y:Number = pt.y; var element:HTMLElement = local.element as HTMLElement; - + do { x -= element.offsetLeft; y -= element.offsetTop; if (local['parent'] !== undefined) { local = local.parent; - element = local.element as HTMLElement; + element = local ? local.element as HTMLElement : null; } else { element = null; } @@ -87,13 +87,13 @@ package org.apache.flex.utils } } - + /** * Converts a point from local coordinates to global coordinates - * + * * @param point The point being converted. * @param local The component used as reference for the conversion. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -116,12 +116,12 @@ package org.apache.flex.utils var x:Number = pt.x; var y:Number = pt.y; var element:HTMLElement = local.element as HTMLElement; - + if ( element.getBoundingClientRect ) {// TODO take scrollbar widths into account var rect:Object = element.getBoundingClientRect(); x = rect.left + x; y = rect.top + y; - } else { // for older browsers, but offsetParent is soon to be deprecated from from chrome + } else { // for older browsers, but offsetParent is soon to be deprecated from from chrome do { x += element.offsetLeft; y += element.offsetTop; http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/DragDropClasses.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/DragDropClasses.as b/frameworks/projects/DragDrop/src/main/flex/DragDropClasses.as index c62250d..1c09aac 100644 --- a/frameworks/projects/DragDrop/src/main/flex/DragDropClasses.as +++ b/frameworks/projects/DragDrop/src/main/flex/DragDropClasses.as @@ -45,6 +45,8 @@ internal class DragDropClasses import org.apache.flex.html.beads.DataGridColumnReorderView; DataGridColumnReorderView; import org.apache.flex.html.beads.ButtonBarReorderBead; ButtonBarReorderBead; + import org.apache.flex.html.beads.DataGridDragDropBead; DataGridDragDropBead; + } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/ButtonBarReorderBead.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/ButtonBarReorderBead.as b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/ButtonBarReorderBead.as index cc66ba7..866be8c 100644 --- a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/ButtonBarReorderBead.as +++ b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/ButtonBarReorderBead.as @@ -82,16 +82,21 @@ package org.apache.flex.html.beads /** * @private + * @flexjsignoretypecoercion org.apache.flex.events.IEventDispatcher */ public function set strand(value:IStrand):void { _strand = value; - dropDirection = "horizontal"; + dropDirection = "vertical"; _dragController = new DragMouseController(); _strand.addBead(_dragController); + IEventDispatcher(_strand).removeEventListener(DragEvent.DRAG_START, handleDragStart); + IEventDispatcher(_strand).removeEventListener(DragEvent.DRAG_MOVE, handleDragMove); + IEventDispatcher(_strand).removeEventListener(DragEvent.DRAG_END, handleDragEnd); + IEventDispatcher(_strand).addEventListener(DragEvent.DRAG_START, handleDragStart); IEventDispatcher(_strand).addEventListener(DragEvent.DRAG_MOVE, handleDragMove); IEventDispatcher(_strand).addEventListener(DragEvent.DRAG_END, handleDragEnd); http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/DataGridDragDropBead.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/DataGridDragDropBead.as b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/DataGridDragDropBead.as new file mode 100644 index 0000000..439fe53 --- /dev/null +++ b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/DataGridDragDropBead.as @@ -0,0 +1,243 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.html.beads +{ + import org.apache.flex.core.IBead; + import org.apache.flex.core.IChild; + import org.apache.flex.core.IDataProviderModel; + import org.apache.flex.core.IStrand; + import org.apache.flex.core.IItemRenderer; + import org.apache.flex.core.UIBase; + import org.apache.flex.events.Event; + import org.apache.flex.events.EventDispatcher; + import org.apache.flex.events.IEventDispatcher; + import org.apache.flex.events.DragEvent; + import org.apache.flex.html.DataGrid; + import org.apache.flex.html.supportClasses.DataGridColumn; + import org.apache.flex.html.beads.IDataGridView; + import org.apache.flex.html.beads.SingleSelectionDragImageBead; + import org.apache.flex.html.beads.SingleSelectionDragSourceBead; + import org.apache.flex.html.beads.SingleSelectionDropTargetBead; + import org.apache.flex.html.beads.SingleSelectionDropIndicatorBead; + import org.apache.flex.html.beads.DataGridWithDrawingLayerLayout; + import org.apache.flex.html.beads.DataGridDrawingLayerBead; + + /** + * The DataGridDragDropBead bead should be added to the DataGrid when + * drag and drop operations are required. Rather than using the drag and + * drop beads individually, this bead will add them as needed and monitor + * events to insure the drag and drop operations are handled property + * for the DataGrid. + * + * @viewbead + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public class DataGridDragDropBead extends EventDispatcher implements IBead + { + /** + * constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function DataGridDragDropBead() + { + super(); + } + + private var _dragType:String = "move"; + + /** + * The type of drag operation to perform: move or copy. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function get dragType():String + { + return _dragType; + } + public function set dragType(value:String):void + { + _dragType = value; + } + + private var _allowDrag:Boolean = true; + + /** + * Sets whether or not to allow the DataGrid to be the source + * of a drag operation. The default is true. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function get allowDrag():Boolean + { + return _allowDrag; + } + public function set allowDrag(value:Boolean):void + { + _allowDrag = value; + } + + private var _allowDrop:Boolean = true; + + /** + * Sets whether or not to allow the DataGrid to be the target + * of a drag/drop operation. The default is true. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function get allowDrop():Boolean + { + return _allowDrop; + } + public function set allowDrop(value:Boolean):void + { + _allowDrop = value; + } + + + private var _strand:IStrand; + private var _listArea: UIBase; + + + /** + * @copy org.apache.flex.core.IBead#strand + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function set strand(value:IStrand):void + { + _strand = value; + + // need to add the layout bead early on to prevent the + // default layout from being used. + layoutBead = new DataGridWithDrawingLayerLayout(); + _strand.addBead(layoutBead); + + drawingLayerBead = new DataGridDrawingLayerBead(); + _strand.addBead(drawingLayerBead); + + IEventDispatcher(_strand).addEventListener("dataGridViewCreated", handleViewCreated); + } + + private var dragSourceBead: SingleSelectionDragSourceBead; + private var dropTargetBead: SingleSelectionDropTargetBead; + private var dragImageBead: SingleSelectionDragImageBead; + private var dropIndicatorBead: SingleSelectionDropIndicatorBead; + private var drawingLayerBead: DataGridDrawingLayerBead; + private var layoutBead: DataGridWithDrawingLayerLayout; + + private var continueDragOperation: Boolean = true; + + /** + * @private + */ + protected function handleViewCreated(event:Event):void + { + var host:DataGrid = _strand as DataGrid; + var view:IDataGridView = host.view as IDataGridView; + + _listArea = view.listArea; + + if (allowDrag) { + dragSourceBead = new SingleSelectionDragSourceBead(); + dragSourceBead.dragType = dragType; + dragSourceBead.addEventListener("start", handleDragStart); + _strand.addBead(dragSourceBead); + + dragImageBead = new SingleSelectionDragImageBead(); + _strand.addBead(dragImageBead); + } + + if (allowDrop) { + dropTargetBead = new SingleSelectionDropTargetBead(); + dropTargetBead.addEventListener("enter", handleDragOver); + dropTargetBead.addEventListener("exit", handleDragOver); + dropTargetBead.addEventListener("over", handleDragOver); + dropTargetBead.addEventListener("drop", handleDrop); + _strand.addBead(dropTargetBead); + + dropIndicatorBead = new SingleSelectionDropIndicatorBead(); + _strand.addBead(dropIndicatorBead); + } + } + + /** + * @private + */ + private function handleDragStart(event:Event):void + { + var data:Object = DragEvent.dragSource; + + // In general, the DataGrid can accept anything because it does not + // know about the structure of the data. Only when that data has been + // dropped into it and it tries to incorporate it (or rather, its + // itemRenderers try to display it) will it be discovered if the + // data is compatible. However, some types of data are obvious that + // they cannot be accepted. + + if (data is DataGridColumn) { + continueDragOperation = false; + } else if ((data is String) || (data is Number) || (data is Date)) { + continueDragOperation = false; + } else { + continueDragOperation = true; + } + + if (!continueDragOperation) { + event.preventDefault(); + } + } + + /** + * @private + */ + private function handleDragOver(event:Event):void + { + if (!continueDragOperation) { + event.preventDefault(); + } + } + + private function handleDrop(event:Event):void + { + if (!continueDragOperation) { + event.preventDefault(); + } + } + } +} + http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragImageBead.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragImageBead.as b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragImageBead.as index 5eca009..7262cc6 100644 --- a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragImageBead.as +++ b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/SingleSelectionDragImageBead.as @@ -18,7 +18,7 @@ //////////////////////////////////////////////////////////////////////////////// package org.apache.flex.html.beads { - + import org.apache.flex.collections.ArrayList; import org.apache.flex.core.IBead; import org.apache.flex.core.IChild; @@ -45,7 +45,7 @@ package org.apache.flex.html.beads import org.apache.flex.utils.PointUtils; import org.apache.flex.utils.getParentOrSelfByType; - COMPILE::JS + COMPILE::JS { import org.apache.flex.core.WrappedHTMLElement; } @@ -140,7 +140,7 @@ package org.apache.flex.html.beads /** * @private - * + * */ private function handleDragStart(event:DragEvent):void { http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/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 d23e7d4..c8f465a 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 @@ -44,6 +44,41 @@ package org.apache.flex.html.beads import org.apache.flex.utils.UIUtils; import org.apache.flex.utils.getParentOrSelfByType; + /** + * The start event is dispatched when a DragStart event happens. The DragEvent.dragSource + * is set before this event is dispatched. A listener for this event can then decide if + * if the drag-drop action should continue or not. If not, the event should be cancelled. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="start", type="org.apache.flex.events.Event")] + + /** + * The accept event is dispatched when the drop happens but just before the data being + * dragged as been incorporated into the drop target's data source. Cancelling this event + * prevents that from happening. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="accept", type="org.apache.flex.events.Event")] + + /** + * The complete event is dispatched when the entire drag-and-drop operation has completed + * from the drag source's perspective. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="complete", type="org.apache.flex.events.Event")] + /** * The SingleSelectionDragSourceBead brings drag capability to single-selection List components. @@ -78,6 +113,7 @@ package org.apache.flex.html.beads private var _strand:IStrand; private var _dragController:DragMouseController; + private var continueDragOperation:Boolean = true; private var _dragType:String = "move"; @@ -113,7 +149,21 @@ package org.apache.flex.html.beads IEventDispatcher(_strand).addEventListener(DragEvent.DRAG_END, handleDragEnd); } - private var indexOfDragSource:int = -1; + private var _dragSourceIndex:int = -1; + + /** + * The index into the dataProvider of the strand's model where the dragSource + * can be found. If -1, the dragSource is not in the dataProvider. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + public function get dragSourceIndex():int + { + return _dragSourceIndex; + } /** * @private @@ -130,9 +180,15 @@ package org.apache.flex.html.beads if (itemRenderer) { var p:UIBase = itemRenderer.itemRendererParent as UIBase; - indexOfDragSource = p.getElementIndex(itemRenderer as IChild); + _dragSourceIndex = p.getElementIndex(itemRenderer as IChild); DragEvent.dragSource = (itemRenderer as IItemRenderer).data; } + + var newEvent:Event = new Event("start", false, true); + dispatchEvent(newEvent); + if (newEvent.defaultPrevented) { + continueDragOperation = false; + } } /** @@ -140,6 +196,7 @@ package org.apache.flex.html.beads */ protected function handleDragMove(event:DragEvent):void { + // ignored for now } /** @@ -147,6 +204,7 @@ package org.apache.flex.html.beads */ protected function handleDragEnd(event:DragEvent):void { + // ignored for now } /* IDragInitiator */ @@ -161,7 +219,13 @@ package org.apache.flex.html.beads */ public function acceptingDrop(dropTarget:Object, type:String):void { + if (!continueDragOperation) return; + trace("SingleSelectionDragSourceBead accepting drop of type "+type); + var newEvent:Event = new Event("accept", false, true); + dispatchEvent(newEvent); + if (newEvent.defaultPrevented) return; + if (dragType == "copy") return; var dataProviderModel:IDataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel; @@ -169,7 +233,7 @@ package org.apache.flex.html.beads var dataArray:Array = dataProviderModel.dataProvider as Array; // remove the item being selected - DragEvent.dragSource = dataArray.splice(indexOfDragSource,1)[0]; + DragEvent.dragSource = dataArray.splice(_dragSourceIndex,1)[0]; // refresh the dataProvider model var newArray:Array = dataArray.slice() @@ -179,7 +243,7 @@ package org.apache.flex.html.beads var dataList:ArrayList = dataProviderModel.dataProvider as ArrayList; // remove the item being selected - DragEvent.dragSource = dataList.removeItemAt(indexOfDragSource); + DragEvent.dragSource = dataList.removeItemAt(_dragSourceIndex); // refresh the dataProvider model var newList:ArrayList = new ArrayList(dataList.source); @@ -199,9 +263,10 @@ package org.apache.flex.html.beads { trace("SingleSelectionDragSourceBead accepted drop of type "+type); var value:Object = DragEvent.dragSource; - trace(" -- index: "+indexOfDragSource+" of data: "+value.toString()); - indexOfDragSource = -1; + _dragSourceIndex = -1; + + dispatchEvent(new Event("complete")); } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/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 c4facda..3c36e1b 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 @@ -41,6 +41,65 @@ package org.apache.flex.html.beads /** + * The enter event is dispatched when a DragEnter has been detected in the drop target + * strand. This event can be used to determine if the strand can and will accept the data + * being dragged onto it. If the data cannot be used by the drop target strand this event + * should be cancelled. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="enter", type="org.apache.flex.events.Event")] + + /** + * The exit event is sent when the drag goes outside of the drop target space. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="exit", type="org.apache.flex.events.Event")] + + /** + * The over event is dispatched while the drag is happening over the drop target space. This + * event may be cancelled if that particular area of the drop target cannot accept the + * drag source data. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="over", type="org.apache.flex.events.Event")] + + /** + * The drop event is dispatched just prior to incorporating the drag source data into the drop + * target's dataProvider. This event may be cancelled to prevent that from happening. + * Note that a "exit" event always precedes this event to allow any drag-drop graphics + * to be cleared. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="drop", type="org.apache.flex.events.Event")] + + /** + * The complete event is dispatched when the drop operation has completed from the drop + * target's perspective. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ + [Event(name="complete", type="org.apache.flex.events.Event")] + + /** * The SingleSelectionDropTargetBead enables items to be dropped onto single-selection List * components. This bead can be used with SingleSelectionDragSourceBead to enable the re-arrangement * of rows within the same list. @@ -93,6 +152,14 @@ package org.apache.flex.html.beads private var _dropDirection: String = "horizontal"; + /** + * The direction the drop indicator should display. "horizontal" (default) or "vertical". + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.9 + */ public function get dropDirection():String { return _dropDirection; @@ -104,6 +171,9 @@ package org.apache.flex.html.beads protected var _indicatorParent:UIBase; + /** + * @private + */ protected function get indicatorParent():UIBase { if (_indicatorParent == null) { @@ -134,6 +204,10 @@ package org.apache.flex.html.beads private function handleDragEnter(event:DragEvent):void { trace("SingleSelectionDropTargetBead received DragEnter via: "+event.relatedObject.toString()); + var newEvent:Event = new Event("enter", false, true); + dispatchEvent(newEvent); + if (newEvent.defaultPrevented) return; + var pt0:Point; var pt1:Point; var pt2:Point; @@ -169,6 +243,7 @@ package org.apache.flex.html.beads private function handleDragExit(event:DragEvent):void { trace("SingleSelectionDropTargetBead received DragExit via: "+event.relatedObject.toString()); + dispatchEvent(new Event("exit", false, true)); if (indicatorVisible) { if (indicatorParent != null) { @@ -184,6 +259,12 @@ package org.apache.flex.html.beads private function handleDragOver(event:DragEvent):void { trace("SingleSelectionDropTargetBead received DragOver via: "+event.relatedObject.toString()); + var newEvent:Event = new Event("over", false, true); + dispatchEvent(newEvent); + if (event.defaultPrevented) { + return; + } + var pt0:Point; var pt1:Point; var pt2:Point; @@ -213,6 +294,12 @@ package org.apache.flex.html.beads handleDragExit(event); + var newEvent:Event = new Event("drop", false, true); + dispatchEvent(newEvent); + if (newEvent.defaultPrevented) { + return; + } + var targetIndex:int = -1; // indicates drop beyond length of items var itemRendererParent:UIBase; @@ -283,7 +370,10 @@ package org.apache.flex.html.beads DragEvent.dragInitiator.acceptedDrop(_strand, "object"); } + // is this event necessary? isn't "complete" enough? IEventDispatcher(_strand).dispatchEvent(new Event("dragDropAccepted")); + + dispatchEvent(new Event("complete")); } COMPILE::SWF http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DragMouseController.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DragMouseController.as b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DragMouseController.as index 869f031..4bde362 100644 --- a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DragMouseController.as +++ b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DragMouseController.as @@ -22,8 +22,8 @@ package org.apache.flex.html.beads.controllers import flash.display.InteractiveObject; import flash.display.DisplayObjectContainer; } - - + + import org.apache.flex.core.IBead; import org.apache.flex.core.IDragInitiator; import org.apache.flex.core.IPopUpHost; @@ -38,43 +38,43 @@ package org.apache.flex.html.beads.controllers import org.apache.flex.utils.PointUtils; import org.apache.flex.utils.UIUtils; import org.apache.flex.css2.Cursors; - + /** * Indicates that a drag/drop operation is starting. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragStart", type="org.apache.flex.events.DragEvent")] - + /** * Indicates that the mouse is moving during * a drag/drop operation. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragMove", type="org.apache.flex.events.DragEvent")] - + /** * Indicates that a drag/drop operation is ending. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragEnd", type="org.apache.flex.events.DragEvent")] - + /** - * The DragMouseController bead handles mouse events on the + * The DragMouseController bead handles mouse events on the * a component, looking for activity that constitutes the start * of a drag drop operation. - * + * * @flexjsignoreimport org.apache.flex.core.IDragInitiator * * @langversion 3.0 @@ -87,58 +87,58 @@ package org.apache.flex.html.beads.controllers /** * Whether there is a drag operation * in progress. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public static var dragging:Boolean = false; - + /** * The drag image. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public static var dragImage:IUIBase; - + /** * The offset of the drag image. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public static var dragImageOffsetX:Number = 0; - + /** * The offset of the drag image. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public static var dragImageOffsetY:Number = 0; - + /** * The default movement in x and or y that * means a drag should start - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public static var defaultThreshold:int = 4; - + /** * constructor. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -148,23 +148,25 @@ package org.apache.flex.html.beads.controllers { threshold = defaultThreshold; } - + /** * The movement in x and or y that * means a drag should start - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public var threshold:int = 4; - + private var _strand:IStrand; - + + public static var instanceNumber:int = 1; + /** * @copy org.apache.flex.core.IBead#strand - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -173,58 +175,63 @@ package org.apache.flex.html.beads.controllers public function set strand(value:IStrand):void { _strand = value; - + + trace("DragMouseController instance "+DragMouseController.instanceNumber+"; isDragging "+DragMouseController.dragging); + IEventDispatcher(_strand).addEventListener(MouseEvent.MOUSE_DOWN, dragMouseDownHandler); + + DragMouseController.instanceNumber += 100; } - + public function get strand():IStrand { return _strand; } - + private var mouseDownX:Number; private var mouseDownY:Number; - + private var host:IPopUpHost; - + /** * @private */ private function dragMouseDownHandler(event:MouseEvent):void { - trace("DRAG-MOUSE: dragMouseDown"); +// trace("DRAG-MOUSE: dragMouseDown"); IUIBase(_strand).topMostEventDispatcher.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler); IUIBase(_strand).topMostEventDispatcher.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler); mouseDownX = event.screenX; mouseDownY = event.screenY; event.preventDefault(); } - + private function dragMouseMoveHandler(event:MouseEvent):void { var pt:Point; var dragEvent:DragEvent; - trace("DRAG-MOUSE: dragMouseMove"); - +// trace("DRAG-MOUSE: dragMouseMove"); + event.preventDefault(); - + if (!dragging) { - trace("DRAG-MOUSE: not dragging anything else"); +// trace("DRAG-MOUSE: not dragging anything else"); if (Math.abs(event.screenX - mouseDownX) > threshold || Math.abs(event.screenY - mouseDownY) > threshold) - { + { dragEvent = DragEvent.createDragEvent("dragStart", event); dragEvent.clientX = mouseDownX; dragEvent.clientY = mouseDownY; - trace("DRAG-MOUSE: sending dragStart via "+event.target.toString()+" == "+dragImageOffsetX); +// trace("DRAG-MOUSE: sending dragStart via "+event.target.toString()+" == "+dragImageOffsetX); DragEvent.dispatchDragEvent(dragEvent, event.target); dispatchEvent(dragEvent); - + if (DragEvent.dragSource != null) { dragging = true; host = UIUtils.findPopUpHost(_strand as IUIBase); + if (host == null) return; host.addElement(dragImage); pt = PointUtils.globalToLocal(new Point(event.clientX, event.clientY), host); dragImage.x = pt.x + dragImageOffsetX; @@ -243,7 +250,9 @@ package org.apache.flex.html.beads.controllers } else { - trace("DRAG-MOUSE: sending dragMove via " + event.target.toString()+" == "+dragImageOffsetX); + host = UIUtils.findPopUpHost(_strand as IUIBase); + if (host == null) return; +// trace("DRAG-MOUSE: sending dragMove via " + event.target.toString()+" == "+dragImageOffsetX); dragEvent = DragEvent.createDragEvent("dragMove", event); pt = PointUtils.globalToLocal(new Point(event.clientX, event.clientY), host); dragImage.x = pt.x + dragImageOffsetX; @@ -252,37 +261,40 @@ package org.apache.flex.html.beads.controllers dispatchEvent(dragEvent); } } - + private function dragMouseUpHandler(event:MouseEvent):void { trace("DRAG-MOUSE: dragMouseUp"); var dragEvent:DragEvent; - - if (dragging) + + host = UIUtils.findPopUpHost(_strand as IUIBase); + if (dragImage && host) { + host.removeElement(dragImage); + } + + if (dragging && event.target) { trace("DRAG-MOUSE: sending dragEnd via: "+event.target.toString()); - + var screenPoint:Point = new Point(event.screenX, event.screenY); var newPoint:Point = PointUtils.globalToLocal(screenPoint, event.target); dragEvent = DragEvent.createDragEvent("dragEnd", event); dragEvent.clientX = newPoint.x; dragEvent.clientY = newPoint.y; - + DragEvent.dispatchDragEvent(dragEvent, event.target); dispatchEvent(dragEvent); event.preventDefault(); } - + dragging = false; DragEvent.dragSource = null; DragEvent.dragInitiator = null; - if (dragImage && host) - host.removeElement(dragImage); dragImage = null; - + IUIBase(_strand).topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler); - IUIBase(_strand).topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler); + IUIBase(_strand).topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler); } - + } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DropMouseController.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DropMouseController.as b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DropMouseController.as index cc2c7ac..8d9dc6e 100644 --- a/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DropMouseController.as +++ b/frameworks/projects/DragDrop/src/main/flex/org/apache/flex/html/beads/controllers/DropMouseController.as @@ -29,7 +29,7 @@ package org.apache.flex.html.beads.controllers import org.apache.flex.geom.Point; import org.apache.flex.utils.PointUtils; import org.apache.flex.css2.Cursors; - + COMPILE::SWF { import flash.display.InteractiveObject; } @@ -37,62 +37,62 @@ package org.apache.flex.html.beads.controllers /** * Indicates that the mouse has entered the component during * a drag operatino. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragEnter", type="org.apache.flex.events.DragEvent")] - + /** * Indicates that the mouse is moving over a component during * a drag/drop operation. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragOver", type="org.apache.flex.events.DragEvent")] - + /** * Indicates that the mouse is moving out of a component during * a drag/drop operation. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragExit", type="org.apache.flex.events.DragEvent")] - + /** * Indicates that a drop operation should be executed. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ [Event(name="dragDrop", type="org.apache.flex.events.DragEvent")] - + /** - * The DropMouseController bead handles mouse events on the + * The DropMouseController bead handles mouse events on the * a component, looking for events from a drag/drop operation. - * + * * @flexjsignoreimport org.apache.flex.core.IDragInitiator - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 * @productversion FlexJS 0.8 */ public class DropMouseController extends EventDispatcher implements IBead - { + { /** * constructor. - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -101,12 +101,12 @@ package org.apache.flex.html.beads.controllers public function DropMouseController() { } - + private var _strand:IStrand; - + /** * @copy org.apache.flex.core.IBead#strand - * + * * @langversion 3.0 * @playerversion Flash 10.2 * @playerversion AIR 2.6 @@ -115,7 +115,7 @@ package org.apache.flex.html.beads.controllers public function set strand(value:IStrand):void { _strand = value; - + COMPILE::SWF { // consider using [Mixin] and requiring MixinManager @@ -123,22 +123,22 @@ package org.apache.flex.html.beads.controllers } IEventDispatcher(_strand).addEventListener(DragEvent.DRAG_MOVE, dragMoveHandler); } - + public function get strand():IStrand { return _strand; } - + private var inside:Boolean; - + private var dragSource:Object; private var dragInitiator:IDragInitiator; - + public function acceptDragDrop(target:IUIBase, type:String):void { // TODO: aharui: switch icons } - + /** * @private * @flexjsignorecoercion org.apache.flex.events.MouseEvent @@ -154,7 +154,7 @@ package org.apache.flex.html.beads.controllers inside = true; IUIBase(_strand).addEventListener(DragEvent.DRAG_END, dragEndHandler); IUIBase(_strand).addEventListener(MouseEvent.ROLL_OUT, rollOutHandler); - + Cursors.setCursor(_strand as IUIBase, Cursors.MOVE); } else @@ -163,31 +163,31 @@ package org.apache.flex.html.beads.controllers dispatchEvent(dragEvent); } } - + private function rollOutHandler(event:MouseEvent):void { var dragEvent:DragEvent; - + if (inside) { dragEvent = DragEvent.createDragEvent("dragExit", event); dispatchEvent(dragEvent); inside = false; - + Cursors.setCursor(_strand as IUIBase, Cursors.AUTO); } IUIBase(_strand).removeEventListener(DragEvent.DRAG_END, dragEndHandler); - IUIBase(_strand).removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler); + IUIBase(_strand).removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler); } - + /** * @flexjsignorecoercion org.apache.flex.events.MouseEvent */ private function dragEndHandler(event:DragEvent):void { - trace("DROP-MOUSE: dragEnd received for event via: "+event.target.toString()); +// trace("DROP-MOUSE: dragEnd received for event via: "+event.target.toString()); var dragEvent:DragEvent; - + var screenPoint:Point = new Point(event.screenX, event.screenY); var newPoint:Point = PointUtils.globalToLocal(screenPoint, _strand); dragEvent = DragEvent.createDragEvent("dragDrop", event as MouseEvent); @@ -199,15 +199,15 @@ package org.apache.flex.html.beads.controllers COMPILE::JS { dragEvent.relatedObject = event.target; } - - DragEvent.dispatchDragEvent(dragEvent, this); - + + DragEvent.dispatchDragEvent(dragEvent, this); + inside = false; IUIBase(_strand).removeEventListener(DragEvent.DRAG_END, dragEndHandler); - IUIBase(_strand).removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler); - + IUIBase(_strand).removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler); + Cursors.setCursor(_strand as IUIBase, Cursors.AUTO); } - + } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/49831cb0/frameworks/projects/DragDrop/src/main/resources/basic-manifest.xml ---------------------------------------------------------------------- diff --git a/frameworks/projects/DragDrop/src/main/resources/basic-manifest.xml b/frameworks/projects/DragDrop/src/main/resources/basic-manifest.xml index 75f426a..9ffe231 100644 --- a/frameworks/projects/DragDrop/src/main/resources/basic-manifest.xml +++ b/frameworks/projects/DragDrop/src/main/resources/basic-manifest.xml @@ -37,4 +37,6 @@ <component id="DataGridColumnReorderView" class="org.apache.flex.html.beads.DataGridColumnReorderView" /> <component id="ButtonBarReorderBead" class="org.apache.flex.html.beads.ButtonBarReorderBead" /> + <component id="DataGridDragDropBead" class="org.apache.flex.html.beads.DataGridDragDropBead" /> + </componentPackage>