Formats de données Clipboard

Flash Player 10 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les formats de Clipboard décrivent les données placées dans un objet Clipboard. Flash Player ou AIR traduit automatiquement les formats de données standard entre types de données ActionScript et formats de Presse-papiers système. De surcroît, les objets application peuvent être transférés au sein des applications basées sur ActionScript et entre celles-ci à l’aide des formats définis par les applications.

Un objet Clipboard peut contenir des représentations des mêmes informations dans différents formats. Par exemple, un objet Clipboard représentant un sprite pourrait inclure un format de référence pour un usage au sein de la même application, un format sérialisé pour un usage par une autre application qui s’exécuterait dans Flash Player ou AIR, un format bitmap pour un usage par un éditeur d’images et un format liste de fichiers (peut-être avec un rendu différé pour coder un fichier PNG) pour permettre une copie ou un glissement d’une représentation du sprite vers le système de fichiers.

Formats de données standard

Les constantes qui définissent les noms des formats standard sont fournies par la classe ClipboardFormats :

Constante

Description

TEXT_FORMAT

Les données au format texte sont transposées en provenance et à destination de la classe String dans ActionScript.

HTML_FORMAT

Texte avec balisage HTML.

RICH_TEXT_FORMAT

Les données au format RTF sont transposées en provenance et à destination de la classe ByteArray d’ActionScript. Le balisage RTF n’est ni interprété ni transposé de quelque façon que ce soit.

BITMAP_FORMAT

(AIR uniquement) Les données au format bitmap sont transposées en provenance et à destination de la classe BitmapData d’ActionScript.

FILE_LIST_FORMAT

(AIR uniquement) Les données au format liste de fichiers sont transposées en provenance et à destination d’un tableau des objets File d’ActionScript.

URL_FORMAT

(AIR uniquement) Les données au format URL sont transposées en provenance et à destination de la classe String d’ActionScript.

Lorsqu’il s’agit de copier et de coller des données en réponse à un événement copy , cut ou paste dans un contenu HTML hébergé dans une application AIR, il faut utiliser des types MIME à la place des chaînes ClipboardFormat. Les types MIME de données valides sont les suivants :

Type MIME

Description

Texte

"text/plain"

URL

"text/uri-list"

Image bitmap

"image/x-vnd.adobe.air.bitmap"

Liste de fichiers

"application/x-vnd.adobe.air.file-list"

Remarque : les données RTF ne sont pas disponibles depuis la propriété clipboardData de l’objet événement envoyé à la suite d’un événement paste au sein d’un contenu HTML.

Formats de données personnalisés

Vous pouvez utiliser des formats personnalisés définis dans les applications pour transférer des objets en tant que références ou des copies sérialisées. Les références ne sont valides que dans l’application d’origine. Les objets sérialisés peuvent être transférés entre applications, mais ne peuvent être utilisés qu’avec des objets qui demeurent valides lorsqu’ils sont sérialisés et désérialisés. Les objets peuvent généralement être sérialisés si leurs propriétés sont soit des types simples, soit des objets sérialisables.

Pour ajouter un objet sérialisé à un objet Clipboard, définissez le paramètre serializable sur true lorsque vous appelez la méthode Clipboard.setData() . Le nom du format peut être celui d’un format standard ou une chaîne arbitraire définie par votre application.

Modes de transfert

Lorsqu’un objet est écrit dans le Presse-papiers dans un format de données personnalisé, les données de l’objet peuvent être lues depuis le Presse-papiers soit comme une référence, soit comme une copie sérialisée de l’objet d’origine. Quatre modes de transfert déterminent si les objets sont transférés en tant que références ou en tant que copies sérialisées :

Mode de transfert

Description

ClipboardTransferModes.ORIGINAL_ONLY

Seule une référence est renvoyée. Si aucune référence n’est disponible, une valeur null est renvoyée.

ClipboardTransferModes.ORIGINAL_PREFFERED

Une référence est renvoyée, si elle est disponible. Sinon, une copie sérialisable est renvoyée.

ClipboardTransferModes.CLONE_ONLY

Seule une copie sérialisable est renvoyée. S’il n’y a pas de copie sérialisée, une valeur « null » est renvoyée.

ClipboardTransferModes.CLONE_PREFFERED

Une copie sérialisable est renvoyée, si elle est disponible. Sinon, une référence est renvoyée.

Lecture et écriture de formats de données personnalisés

Lors de l’écriture d’un objet dans le Presse-papiers, vous pouvez utiliser toute chaîne qui ne commence pas par les préfixes réservés air: ou flash: pour le paramètre format . Utilisez la même chaîne que le format pour lire l’objet. Les exemples suivants illustrent la façon de lire et d’écrire des objets dans le Presse-papiers.

public function createClipboardObject(object:Object):Clipboard{ 
    var transfer:Clipboard = Clipboard.generalClipboard; 
    transfer.setData("object", object, true); 
} 

Pour extraire un objet sérialisé de l’objet Clipboard (à la suite d’une opération déposer ou coller), utilisez le même nom de format et les modes de transfert CLONE_ONLY ou CLONE_PREFFERED .

var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY); 

Une référence est toujours ajoutée à l’objet Clipboard. Pour extraire la référence de l’objet Clipboard (à la suite d’une opération déposer ou coller), utilisez les modes de transfert ORIGINAL_ONLY ou ORIGINAL_PREFFERED en lieu et place de la copie sérialisée.

var transferredObject:Object =  
    clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY); 

Les références ne sont valides que si l’objet Clipboard provient de l’application actuelle. Utilisez le mode de transfert ORIGINAL_PREFFERED pour accéder à la référence lorsqu’elle devient disponible et le clone sérialisé lorsque la référence ne l’est pas.

Rendu différé

Si la création d’un format de données est coûteuse en ressources informatiques, vous pouvez procéder à un rendu différé en fournissant une fonction qui fournit les données à la demande. La fonction n’est appelée que si le récepteur de l’opération déposer ou coller demande les données dans le format différé.

La fonction de rendu est ajoutée à l’objet Clipboard à l’aide de la méthode setDataHandler() . La fonction doit renvoyer les données dans un format approprié. Par exemple, si vous appelez setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) , alors la fonction writeText() doit renvoyer une chaîne.

Si un format de données de même type est ajouté à l’objet Clipboard avec la méthode setData() , ces données priment sur la version différée (la fonction de rendu n’est jamais appelée). Selon le cas, la fonction de rendu peut être appelée à nouveau ou non si les mêmes données du Presse-papiers sont à nouveau utilisées.

Remarque : sous Mac OS X, le rendu différé ne fonctionne qu’avec des formats de données personnalisés. Avec des formats de données standard, la fonction de rendu est appelée immédiatement.

Collage de texte à l’aide d’une fonction de rendu différé

L’exemple ci-dessous illustre la façon d’implémenter une fonction de rendu.

Lorsque l’utilisateur appuie sur le bouton Copier, l’application vide le Presse-papiers du système pour s’assurer qu’aucune donnée d’opérations de Presse-papiers précédentes ne subsiste. La méthode setDataHandler() définit alors la fonction renderData() comme rendu du Presse-papiers.

Lorsque l’utilisateur choisit la commande Coller du menu contextuel du champ de texte de destination, l’application accède au Presse-papiers et définit le texte de destination. Comme le format des données texte du Presse-papiers a été défini avec une fonction plutôt qu’une chaîne, le Presse-papiers appelle la fonction renderData() . Cette fonction renderData() renvoie le texte dans le texte source qui, lui, est affecté au texte de destination.

Notez que si vous éditez le texte source avant d’appuyer sur le bouton Coller, les modifications se retrouveront dans le texte collé, même lorsque l’édition survient après avoir appuyé sur le bouton Copier. Cette situation existe du fait que la fonction de rendu ne copie pas le texte source tant que l’on n’a pas appuyé sur le bouton Coller. Lorsque vous utilisez le rendu différé dans une véritable application, vous pourriez vouloir stocker ou protéger les données source de manière à éviter ce problème.

Exemple Flash

 package {  
    import flash.desktop.Clipboard; 
    import flash.desktop.ClipboardFormats; 
    import flash.desktop.ClipboardTransferMode; 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.text.TextFieldType; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    public class DeferredRenderingExample extends Sprite  
    {  
         private var sourceTextField:TextField; 
        private var destination:TextField; 
        private var copyText:TextField; 
        public function DeferredRenderingExample():void 
        { 
            sourceTextField = createTextField(10, 10, 380, 90); 
            sourceTextField.text = "Neque porro quisquam est qui dolorem " 
                + "ipsum quia dolor sit amet, consectetur, adipisci velit."; 
                 
            copyText = createTextField(10, 110, 35, 20); 
            copyText.htmlText = "<a href='#'>Copy</a>"; 
            copyText.addEventListener(MouseEvent.CLICK, onCopy); 
 
            destination = createTextField(10, 145, 380, 90); 
            destination.addEventListener(Event.PASTE, onPaste); 
        } 
        private function createTextField(x:Number, y:Number, width:Number, 
                        height:Number):TextField 
        { 
            var newTxt:TextField = new TextField(); 
            newTxt.x = x; 
            newTxt.y = y; 
            newTxt.height = height; 
            newTxt.width = width; 
            newTxt.border = true; 
            newTxt.multiline = true; 
            newTxt.wordWrap = true; 
            newTxt.type = TextFieldType.INPUT; 
            addChild(newTxt); 
            return newTxt; 
        } 
        public function onCopy(event:MouseEvent):void 
        { 
            Clipboard.generalClipboard.clear(); 
            Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, 
                            renderData); 
        } 
        public function onPaste(event:Event):void 
        { 
            sourceTextField.text = 
            Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString; 
        } 
        public function renderData():String 
        { 
            trace("Rendering data"); 
            var sourceStr:String = sourceTextField.text; 
            if (sourceTextField.selectionEndIndex > 
                     sourceTextField.selectionBeginIndex) 
            { 
                return sourceStr.substring(sourceTextField.selectionBeginIndex, 
                                    sourceTextField.selectionEndIndex); 
            } 
            else 
            { 
                return sourceStr; 
            } 
        } 
    } 
}

Exemple Flex

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="326" height="330" applicationComplete="init()"> 
    <mx:Script> 
    <![CDATA[ 
    import flash.desktop.Clipboard; 
    import flash.desktop.ClipboardFormats; 
     
    public function init():void 
    { 
        destination.addEventListener("paste", doPaste); 
    } 
 
    public function doCopy():void 
    { 
        Clipboard.generalClipboard.clear(); 
        Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, renderData); 
    } 
    public function doPaste(event:Event):void 
    { 
        destination.text = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString; 
    } 
     
    public function renderData():String{ 
        trace("Rendering data"); 
        return source.text; 
    } 
    ]]> 
    </mx:Script> 
    <mx:Label x="10" y="10" text="Source"/> 
    <mx:TextArea id="source" x="10" y="36" width="300" height="100"> 
        <mx:text>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.</mx:text> 
    </mx:TextArea> 
    <mx:Label x="10" y="181" text="Destination"/> 
    <mx:TextArea id="destination"  x="12" y="207" width="300" height="100"/> 
    <mx:Button click="doCopy();" x="91" y="156" label="Copy"/> 
</mx:Application>