2008-11-13 4 views
4

그래서 데이터 공급자로서 xmllistcollection이있는 플렉스 트리 구성 요소가 있습니다. 드래그 앤 드롭으로 나무의 잎과 가지를 재 배열 할 수 있기를 바랍니다. 드롭 영역을 드래그중인 항목의 현재 수준으로 제한하려고합니다. 플렉스 3의 현재 노드에서 트리 노드가 드래그되는 것을 어떻게 제한합니까?

 
     branch 
     branch 0 
     leaf 1 
     leaf 2 
     branch x 
     leaf a 
     leaf b 
    
그래서 처럼, 지점 x는 지점 0 리프에서 이동할 수 없습니다 여기 this Flex Quick Starts article의 마지막 예에 따라,이 작업을 수행하는 아주 간단한 방법, 지점 0

답변

4

좋아 아래로 이동 할 수 없습니다. 드래그 할 때 마우스 아래에있는 항목을 선택하는 대신 "적절한"놓기 표시 (항목 사이의 줄)를 사용하여이 기능을 향상시켜야합니다.

가장 관련성이 높은 부분은 onDragOver() 방법이며 항목을 삭제할 수있는 위치를 제한합니다.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 

      import mx.events.DragEvent; 
      import mx.managers.DragManager; 
      import mx.core.DragSource; 
      import mx.core.UIComponent; 
      import mx.controls.Tree; 

      private var _draggedItem:XML = null; 


      private function onDragEnter(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       var ds:DragSource = event.dragSource; 
       var items:Array = ds.dataForFormat("treeItems") as Array; 
       if (items != null && items.length > 0 && (items[0] is XML)) 
        _draggedItem = items[0]; 

       DragManager.acceptDragDrop(UIComponent(event.currentTarget)); 
      } 

      private function onDragOver(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       tree.selectedIndex = tree.calculateDropIndex(event); 
       var node:XML = tree.selectedItem as XML; 

       // restrict drag & drop to nodes within same parent 
       if (_draggedItem.parent() != node.parent()) 
       { 
        DragManager.showFeedback(DragManager.NONE); 
        return; 
       } 

       DragManager.showFeedback(DragManager.MOVE); 
      } 

      private function onDragDrop(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       tree.selectedIndex = tree.calculateDropIndex(event); 
       var node:XML = tree.selectedItem as XML; 

       var addToIndex:int = node.childIndex(); 
       if ((_draggedItem.parent() == node.parent()) && (addToIndex != _draggedItem.childIndex())) 
       { 
        tree.dataDescriptor.removeChildAt(node.parent(), _draggedItem, _draggedItem.childIndex()); 
        tree.dataDescriptor.addChildAt(node.parent(), _draggedItem, addToIndex); 
       } 
      } 

      private function onDragComplete(event:DragEvent) : void 
      { 
       tree.selectedIndex = -1; 
      }  
     ]]> 
    </mx:Script>  
    <mx:XML id="treeData" xmlns=""> 
     <root> 
      <node label="Massachusetts" type="state" data="MA"> 
       <node label="Boston" type="city" > 
        <node label="Smoke House Grill" type="restaurant" /> 
        <node label="Equator" type="restaurant" /> 
        <node label="Aquataine" type="restaurant" /> 
        <node label="Grill 23" type="restaurant" /> 
       </node> 
       <node label="Provincetown" type="city" > 
        <node label="Lobster Pot" type="restaurant" /> 
        <node label="The Mews" type="restaurant" /> 
       </node> 
      </node> 
      <node label="California" type="state" data="CA"> 
       <node label="San Francisco" type="city" > 
        <node label="Frog Lane" type="restaurant" /> 
       </node> 
      </node> 
     </root> 
    </mx:XML> 
    <mx:Tree width="100%" height="100%" id="tree" 
     labelField="@label" 
     dataProvider="{treeData.node}" 
     allowMultipleSelection="false" 
     dragEnabled="true" 
     dropEnabled="true" 
     dragMoveEnabled="false" 
     dragEnter="onDragEnter(event)" 
     dragOver="onDragOver(event)" 
     dragDrop="onDragDrop(event)" 
     dragComplete="onDragComplete(event)"> 
    </mx:Tree>   
</mx:Application> 
+0

고마워요. 그것은 위대한 작품. – smartdirt

관련 문제