2010-11-26 12 views
0

Je sais comment faire glisser de la liste et déposer dans le contrôle d'entrée de texte. Mais je ne sais pas comment insérer le texte dans textinput sous la position du curseur. Par exemple, j'ai le texte qwerty dans textinput. Et j'ai besoin de laisser tomber le mot asdf dans le textinput. En conséquence, je veux obtenir le texte qweasdfrty ou qasdfwerty, ou tout ce que je veux en fonction de la position du curseur.Comment puis-je supprimer le texte de la liste à la position d'entrée de texte spécifique (sous le curseur)?

Voici le code simplifié de ce que je l'ai déjà:

<?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> 

Y at-il des moyens d'y parvenir?

Répondre

2

Voici un exemple complet. Cela nécessitait malheureusement l'accès à l'espace de noms mx_internal, mais cela devrait être bon. La raison pour laquelle il a dû utiliser mx_internal est d'avoir accès à la référence 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

J'ai déjà résolu le problème avec l'aide de la classe TextLineMetrics. Mais merci, votre variante est plus facile et meilleure. –

+0

Mais il y a un problème quand textWidth est plus grand que textInput.width et qu'une partie du texte est cachée. L'index char est erroné dans ce cas. –

+0

Tout est OK. –