2010-11-26 8 views
0

私はlistからドラッグして、textinputコントロールにドロップする方法を知っています。しかし、私はどのようにカーソルの位置の下にテキストインプットにテキストを挿入するのか分からない。たとえば、私はテキストqwertyをtextinputに持っています。そして、私はテキスト入力にasdfという単語をドロップする必要があります。その結果、私はテキストqweasdfrtyまたはqasdfwertyを取得したい、またはカーソルの位置に応じて必要なものを取得したい。ここでリストから特定のテキスト入力位置(カーソル下)にテキストをドロップするにはどうすればよいですか?

は、私がすでに持っているものの単純化されたコードです:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       layout="absolute" 
       minWidth="955" 
       minHeight="600"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 

      private function init():void 
      { 
       horList.dataProvider=new ArrayCollection(["Reading", "Television", "Movies"]); 
      } 

      import mx.managers.DragManager; 
      import mx.core.DragSource; 
      import mx.events.DragEvent; 
      import flash.events.MouseEvent; 

      private function dragEnterHandler(event:DragEvent):void { 
       if (event.dragSource.hasFormat("items")) 
        DragManager.acceptDragDrop(TextInput(event.currentTarget)); 
      } 

      private function dragOverHandler(event:DragEvent):void 
      { 
       if (event.dragSource.hasFormat("items")) 
        DragManager.showFeedback(DragManager.COPY); 
      } 

      private function dragDropHandler(event:DragEvent):void { 
       if (event.dragSource.hasFormat("items")) 
       { 
        var draggedText:Array = event.dragSource.dataForFormat("items") as Array; 

        var textInput : TextInput = TextInput(event.currentTarget); 

        // here i want to insert the text from (draggedText[0] as String) into textInput 

       }     
      } 
     ]]> 
    </fx:Script> 
    <mx:HorizontalList id="horList" 
         x="10" 
         y="10" 
         width="625" 
         dragEnabled="true" 
         creationComplete="init()"> 
    </mx:HorizontalList> 
    <mx:TextInput id="destTextInput" 
        x="100" 
        y="117" 
        dragEnter="dragEnterHandler(event);" 
        dragOver="dragOverHandler(event);" 
        dragDrop="dragDropHandler(event);"/> 

</mx:Application> 

は、これを達成するための任意の方法はありますか?

答えて

2

完全な例です。残念ながら、mx_internal名前空間へのアクセスが必要でしたが、うまく保持する必要があります。 mx_internalを使用しなければならない理由は、IUITextField参照にアクセスするためです。

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.core.IUITextField; 

     //Note use of mx_internal namespace 
     import mx.core.mx_internal; 
     use namespace mx_internal; 

     private function init():void 
     { 
      horList.dataProvider=new ArrayCollection(["Reading", "Television", "Movies"]); 
     } 

     import mx.managers.DragManager; 
     import mx.core.DragSource; 
     import mx.events.DragEvent; 
     import flash.events.MouseEvent; 

     private function dragEnterHandler(event:DragEvent):void { 
      if (event.dragSource.hasFormat("items")) 
       DragManager.acceptDragDrop(TextInput(event.currentTarget)); 
     } 

     private function dragOverHandler(event:DragEvent):void 
     { 
      if (event.dragSource.hasFormat("items")) 
       DragManager.showFeedback(DragManager.COPY); 
     } 

     private function dragDropHandler(event:DragEvent):void { 
      if (event.dragSource.hasFormat("items")) 
      { 
       var draggedText:Array = event.dragSource.dataForFormat("items") as Array; 

       var textInput : TextInput = TextInput(event.currentTarget); 

       // here i want to insert the text from (draggedText[0] as String) into textInput 

       //Using mx_internal namespace to gain access to internal textfield 
       var tf:IUITextField = textInput.getTextField(); 
       var charIndex:int = tf.getCharIndexAtPoint(textInput.contentMouseX, textInput.contentMouseY); 

       //dropped after end of text 
       if(charIndex == -1 && mouseX > tf.textWidth) 
       { 
        tf.appendText(draggedText[0]); 
       } 
       //Dropped at beginning of field (only happens when it is empty) 
       else if(charIndex == -1 && mouseX < tf.textWidth) 
       { 
        tf.text = draggedText[0]; 
       } 
       //dropped inline to text 
       else 
       { 
        tf.replaceText(charIndex, charIndex, draggedText[0]); 
       } 
      }     
     } 
    ]]> 
</fx:Script> 
<mx:HorizontalList id="horList" 
        x="10" 
        y="10" 
        width="625" 
        dragEnabled="true" 
        creationComplete="init()"> 
</mx:HorizontalList> 
<mx:TextInput id="destTextInput" 
       x="100" 
       y="117" 
       dragEnter="dragEnterHandler(event);" 
       dragOver="dragOverHandler(event);" 
       dragDrop="dragDropHandler(event);"/> 

+0

私はすでにTextLineMetricsクラスにの助けを借りて問題を解決しました。しかし、あなたの変種はより簡単でより良いです。 –

+0

しかし、textWidthがtextInput.widthより大きく、テキストの一部が隠されているときに問題があります。その場合、charインデックスは間違っています。 –

+0

すべては問題ありません。 –

関連する問題